📚集合

接口名:Collection
父接口:Iterable
单列集合
由一个或多个确定的元素所构成的整体。

Collection Set List Vector ArrayList LinkedList TreeSet HashSet 继承 继承 继承 继承 继承 继承 继承


从上面的图中可以得知 Collection 接口继承了 Iterabe 接口,通过 Iterabe 接口源码的描述 Returns an iterator over elements of type {@code T}. 返回一个迭代器,迭代器对象可以通过遍历获取集合的元素。图中最底层的类都实现了 Collection 接口,因此可以说最底层的类也有 Iterable 接口的特性想要获取元素就需要通过迭代的方式。

Collection set = new ArrayList();
set.add("hjh");
set.add(1903);

首先实例化 ArrayList 类,然后添加两个用于测试的数据。

Iterator iter = set.iterator();	// 实例化 Itr 类
while(iter.hasNext()){			// 判断是否存在元素
    Object o = iter.next();		// 取出元素
    System.out.println(o);
}

调用 ArrayList 类的 iterator 方法,这个方法会实例化 Itr 类。该 Itr 类实现了 Iterator 接口并提供了一些方法来操作这个迭代器,例如上面使用 hasNext 方法和 next 方法配合来获取集合里面的元素。

for(Object o : set){		// 强制 for 隐式地执行了上面的方法
    System.out.println(o);
}

这个方法也和上面一样会进入 ArrayList 类并实例化 Itr 类后面完全一致了。

通过上面两种方式,可以看得出来都是通过实例化 Itr() 类,然后再通过该类的方法去获取集合的元素,唯一不同的是 while 用于更多的操作空间,例如使用 remove 来移除元素,利用属性 cursor 获取当前迭代器的游标等等。

📕List 接口

列表接口
元素可重复
有下标
添加元素的顺序和取出元素的顺序一致

类名底层实现线程安全扩容倍数
ArrayList可变数组不安全1.5
Vector可变数组安全2
LinkedList双向链表不安全-
  • ArrayList 单线程时效率是高于 Vector
  • Vector 适用于多线程,因为它的方法都是用 synchronized 修饰
  • LinkedList 单线程时对集合元素进行增删操作的效率是高于 ArrayList
  • ArrayList 单线程时对集合元素进行改查操作的效率高于 LinkedList

增查改删(CRUD)操作:add、get、set、remove

💡性能对照表

类名增/2000000查/2000000改/2000000删/100000
ArrayList31ms6ms6ms432ms
Vector48ms42ms42ms432ms
LinkedList99ms194ms199ms3ms
  • LinkedList 查改的速度随着索引越靠后越慢

📕set 接口

集合接口
元素不可重复
无下标
添加元素的顺序可能和取出元素的顺序不一致

类名数据结构元素顺序线程安全null
HashSet哈希表无序不安全允许
TreeSet二叉树排序不安全不允许
  • HashSet 基于 HashMap 来实现的
  • HashSet 以 hashcode 码作为标识
    这也就是为什么相同内容的 String,只会有一个会存放在集合里面,因为他们的 hashcode 相同。
  • TreeSet 是 SortedSet 接口的唯一实现类
  • HashSet 存储性能优于 TreeSet

如果你是无意刷到这篇文章并看到这里,希望你给我的文章来一个赞赞👍👍。如果你不同意其中的内容或有什么问题都可以在下方评论区留下你的想法或疑惑,谢谢你的支持!!😀😀

参考文献

  1. 【零基础 快速学Java】韩顺平 零基础30天学会Java_哔哩哔哩_bilibili
  2. Java 集合框架 | 菜鸟教程 (runoob)

更多推荐

【韩顺平 零基础30天学会Java】集合