Java Collection体系

Collection 接口

宏观图

 

快速使用

import java.util.*;

public class Demo {
    public static void main(String[] args) throws Exception{
        Collection collection = new ArrayList();
        // 添加
        collection.add("小明");
        collection.add("小红");
        collection.add("小红");

        // 遍历:使用增强for
        for (Object obj: collection) {
            String str = obj.toString();
            System.out.println(str);
        }

        // 遍历:使用迭代器
        Iterator iter = collection.iterator();
        while (iter.hasNext()){
            String str = iter.next().toString();
            System.out.println(str);
        }

        // 删除
        collection.remove("小红");

        // 其它
        System.out.println(collection.size()); // 2
    }
}

 

常用方法

boolean add(Object obj) 添加一个对象
boolean addAll(Collection o) 将一个集合中的所有对象添加到此集合
int size() 返回该集合的长度
void clear() 清空此集合的所以对象
boolean remove(Object obj) 移除集合中的 obj 对象
boolean removeAll(c) 移除此集合中,c中包含的元素
boolean retainAll(c) 移除此集合中,c没有包含的元素(交集)
boolean contains(Object obj) 该集合是否存再 obj 这个对象
boolean equals(Object obj) 该集合是否与obj集合相等
boolean isEmpty() 该集合是否为空
Object[] toArray() 将此集合转换成数组
Iterator iterator() 迭代器

 

List 接口

List 接口继承了 Collection 接口。

有序,有索引,可重复。

快速使用

import java.util.*;

public class Demo {
    public static void main(String[] args) throws Exception{
        List list= new ArrayList();
        // 可根据索引添加
        list.add("two");
        list.add(0,"one");
        list.add("three");

        // 可根据索引删除
        list.remove(2);

        // 根据取值
        System.out.println(list.get(0)); // one
        System.out.println(list.get(1)); // two

        // 重新赋值
        list.set(0, "first");
        list.set(1, "second");

        // 生成子列表
        List subList = list.subList(0, list.size());
        System.out.println(subList); // [first, second]

        // 遍历: 因为列表有索引,可以使用普通的for
        for (int i = 0; i < list.size(); i++) {
            String arg = list.get(i).toString();
        }

        // 遍历: 使用列表迭代器
        ListIterator iter = list.listIterator();
        while (iter.hasNext()){
            String  arg = iter.next().toString();
        }
    }
}

 

常用方法

继承方法,请看 Collection。

add(int index, Object e) 根据索引添加元素
get(int index) 根据索引取元素
set(int index, Object e) 根据索引重新赋值
remove(int index) 根据索引删除元素
indexOf(Object e) 获取该元素的索引
subList(int fromIndex, int toIndex) 根据范围,取该列表的元素,重新生成的新的列表
listIterator() 列表生成器

 

List 实现类

下面三个类,都采用 List 接口实现。Vector 开发中在基本不再使用。

 

Set 接口

Set 接口继承了 Collection 接口。并没有添加的新的方法。

无序,无索引,自动去重。 

 

快速使用

package com.demo.study3;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Demo {
    public static void main(String[] args){
        // 由于接口,只能调用实现类
        Set<String> student = new HashSet<>();

        // 添加元素
        student.add("小明");
        student.add("小红");
        student.add("小明");
        student.add("小军");
        System.out.println(student); // [小明, 小军, 小红]

        // 删除元素
        student.remove("小军");
        
        // 遍历 1. 增强for
        for (String name:
             student) {
            System.out.println(name);
        }
        // 遍历 2. 生成器
        Iterator iterator = student.iterator();
        while (iterator.hasNext()){
            System.out.println("iter: " + iterator.next());
        }
        
        // 其它
        System.out.println(student.size()); // 数量 
        System.out.println(student.contains("小明")); // 是否存在
        student.clear(); // 清空
    }
}

 

Set 实现类

 

 

HashSet 存储过程

过程

  1. 根据 hasCode 计算保存位置,如果此位置为空直接保存,不为空看步骤2
  2. 再执行 equals 方法,如果 equals 方法为 true 则去重,否则形成链表并保存

 

实例

我们添加了三个Person对象,两个是相同的数据,结果没有去重。

package com.demo.study4;

import java.util.HashSet;
import java.util.Objects;

public class Demo {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        // 实例化对象
        Person p1 = new Person("小明", 18);
        Person p2 = new Person("小智", 35);
        Person p3 = new Person("小智", 35);
        // 添加对象
        set.add(p1);
        set.add(p2);
        set.add(p3);
        // 输出个数
        System.out.println(set.size()); // 3
    }
}

 

那如果去重呢,那就是 Person 类进行重写 hasCode,equals 方法。

package com.demo.study4;

import java.util.HashSet;
import java.util.Objects;

public class Demo {
    public static void main(String[] args) {
        HashSet set = new HashSet();
        // 实例化对象
        Person p1 = new Person("小明", 18);
        Person p2 = new Person("小智", 35);
        Person p3 = new Person("小智", 35);
        // 添加对象
        set.add(p1);
        set.add(p2);
        set.add(p3);
        // 输出个数
        System.out.println(set.size()); // 3
    }
}

class Person{
    String name;
    int age;
    // 构造方法
    Person(String name, int age){
        this.name = name;
        this.age = age;
    }
    // 重写 equals 方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }
    // 重写 hasCode 方法
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

TreeSet

快速使用

你需要使用接口(comparable)进行定义比较规则,也可以先定义这样就不需要使用借口了。String 内部已实现无需使用接口。

import java.util.TreeSet;

public class Demo {
    public static void main(String[] args) {
        // 创建 TreeSet 对象
        TreeSet<Student> treeSet = new TreeSet<>();
        // 创建 Student 对象
        Student student1 = new Student("kidd", 16);
        Student student2 = new Student("tom", 20);
        Student student3 = new Student("kidd", 18);
        Student student4 = new Student("kidd", 18);
        // 将 Student 对象添加到 TreeSet 集合当中
        treeSet.add(student1);
        treeSet.add(student2);
        treeSet.add(student3);
        treeSet.add(student4);

        System.out.println(treeSet.toString()); // [Student{name='kidd', age=16}, Student{name='kidd', age=18}, Student{name='tom', age=20}]
    }
}

class Student implements Comparable<Student>{
    // 定义属性
    String name;
    int age;

    // 构造方法
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }

    // Object 的 toString 方法重写
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    // 使用Comparable接口的compareTo进行该如何比较。
    @Override
    public int compareTo(Student o) {
        int i1 = this.name.compareTo(o.name);
        int i2 = this.age - o.age;
        return i1==0 ? i2:i1;
    }
}

 

posted @ 2020-12-14 21:01  Sun先生  Views(123)  Comments(0Edit  收藏  举报