java 集合体系

java集合体系

集合分为两组(单列集合,双列集合)

单列:Collection

主要子接口:List(有序可重复)、Set(无序)

image-20220222194247536

双列:Map

主要实现类:HashTable、HashMap、TreeMap

image-20220222194310753


单列

List(有序可重复)

所有实现类:image-20220222210205248

主要实现类:Vector、ArrayList、LinkedList

List的特征

  1. List是有序可重复的
  2. 支持索引

List的遍历方法

  1. 迭代器遍历
  2. 增强for遍历
  3. 普通for遍历
public class Demo {
    public static void main(String[] args) {
        List list = new ArrayList<>();

        list.add(new Dog("Dog1", 12));
        list.add(new Dog("Dog2", 13));
        list.add(new Dog("Dog3", 14));

        // 1.迭代器遍历
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }

        // 2.增强for遍历
        for (Object dog : list) {
            System.out.println(dog);
        }

        // 3.普通for遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

class Dog {
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

练习:List的冒泡排序

public class ListDemo {
    public static void main(String[] args) {
        // 实例化一个List
        List list = new ArrayList<>();
        // 实例化三本书
        Book b1 = new Book("红楼梦", 12, "曹雪芹");
        Book b2 = new Book("西游记", 13, "吴承恩");
        Book b3 = new Book("水浒传", 10, "施耐庵");
        // 添加
        list.add(b1);
        list.add(b2);
        list.add(b3);

        // 调用冒泡排序
        sort(list);

        System.out.println("排序后:");
        for (Object o : list) {
            System.out.println(o);
        }
    }

    // 静态排序方法(冒泡排序)
    // 价格从小到大
    public static void sort(List list) {
        int size = list.size();
        for (int i = 0; i < size - 1; i++) {
            for (int j = 0; j < size - 1 - i; j++) {
                // 取出对象
                Book book1 = (Book) list.get(j);
                Book book2 = (Book) list.get(j + 1);
                if (book1.getPrice() > book2.getPrice()) {
                    // 交换
                    list.set(j, book2);
                    list.set(j + 1, book1);
                }
            }
        }
    }
}

ArrayList

  1. 底层是Object[]
  2. ArrayList可以放null值
  3. 可以放多个null值
  4. 由数组来实现的
  5. 基本等同于Vector
  6. ArrayList是线程不安全的
  7. 但是执行效率高
  8. 源码分析:ArrayList扩容源码分析 - CoderDreams - 博客园 (cnblogs.com)

Vector

  1. 底层也是Object[]
  2. 线程安全的
  3. 源码分析:Vector源码分析 - CoderDreams - 博客园 (cnblogs.com)

LinkedList

  1. 底层是一个双向链表
  2. 可添加任何元素,包括null
  3. 线程不安全的
  4. 源码分析:LinkedList源码分析 - CoderDreams - 博客园 (cnblogs.com)


Set(无序不可重复)

所有实现类:

image-20220223152810800

主要实现类:HashSet、TreeSet

Set的特征

  1. 无序(取出的顺序和存入的顺序不一致,但是取出的顺序是固定的)
  2. 不可重复(最多一个null值)
  3. 没有索引

Set的遍历方法

  1. 迭代器遍历
  2. 增强for遍历
  3. 不可以普通for遍历(因为没有索引)

HashSet

  1. 实现Set接口
  2. 底层实际上是HashMap()
  3. 源码分析:HashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)

无参构造器:

private transient HashMap<E,Object> map;

public HashSet() {
    // 实际上是实例化了一个HashMap
    map = new HashMap<>();
}

LinkedHashSet

  1. LinkedHashSet是HashSet的子类
  2. 底层是一个LinkedHashMap(HashMap的子类),维护了一个数组加双向链表
  3. 根据hashCode值决定元素的存储位置,同时使用链表维护元素的次序,使得元素看起来是以插入顺序保存的
  4. 不允许添加重复元素
  5. 源码分析:LinkedHashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)

双列

Map的特点

  1. 保存具有映射关系的数据:Key-Value(双列元素)
  2. Key和Value都可以是任何引用类型的数据,会封装到HashMap$Node对象中
  3. Key不允许重复
  4. Value可以重复
  5. Key可以为null,但是不能多个null,Value可以为null并且可以多个
  6. 3-5的原因可见:HashSet源码分析 - CoderDreams - 博客园 (cnblogs.com)

未写完,待续

posted @ 2022-02-27 15:46  CoderCatIce  阅读(103)  评论(0编辑  收藏  举报