Iterator是集合的总接口,其他的集合接口都继承于它,它定义了集合的遍历操作。collection继承了Iterator,是次接口,定义了集合的一些通用操作。(Map集合独立存在)。
集合:一个存放数据的容器,准确来说是存放对象引用的容器。
List:有序,可重复,查询快,插入,删除慢。
Set:无序,不可重复。
Map:键值对,键唯一,值多个。
1.List和Set是继承collection集合,Map不是。
2.Set不可重复,重复的会被覆盖掉,虽然元素放入Set是无序,但是其位置其实是固定的,是由HashCode决定的。加入Set的元素必须定义equals()方法。
3.List可以重复,可以用for根据下标循环遍历,也可以用迭代器,但是Set只能使用迭代器,因为他无法通过下标取得想要的元素。
4.Set和List对比:
Set:查询元素慢,插入、删除元素快,插入删除不会改变元素位置;
List:查询快,插入删除慢,因为插入删除会改变元素位置。类似数组,可以动态增长。
5.Map适合存储键值对数据。
6.线程安全和非线程安全集合:
LinkedList,ArrayList,HashSet是非线程安全集合,Vocter是线程安全的;
HashMap是非线程安全的,HashTable是线程安全的;
StringBuilder是非线程安全的,StringBuffer是线程安全的。
这些类的具体使用介绍:
1.ArrayList和LinkedList的区别;
ArrayList是基于动态数组实现的,因此地址是连续的,查询比较快,而插入删除需要移动数据,因此效率较慢。
LinkedList是基于链表结构实现的,地址是离散的,所以查询较慢,插入删除不会改变其他数据的位置,因此效率较快。
2.ArrayList和LinkedList的扩容机制:
ArrayList:
初始化大小是0,当add第一个元素的时候,大小才变成10。当新增时候发现容量不够用了,就会去动态扩容,扩容机制是:扩容后大小 = 原始大小 * 1.5。(例如:原始大小是10,那么扩容后大小就是15 = 10 * 1.5。)
LinkedList:
因为LinkedList是链表实现的,是双向链表,没有初始化大小,可以直接新增,不存在扩容机制。
3.ArrayList和Vocter的区别:
1.ArryList是线程不安全的,Vocter是多线程安全的。Vocter类的方法中很多都有同步锁,这也导致了它的效率不如ArryList。
2.两者都是线性连续空间储存元素,当空间充足时,两者添加方式是不一样的。
3.Vocter可以设置增长因子,ArrayList不可以;
4.Vocter是较老的动态数组,是线程同步的,效率很低,一般不建议使用。
使用场景:
1.不考虑线程安全,效率要高的时候选择ArryList,在乎线程安全的时候选择Vocter。
2.在数据量比较大,需要扩容的时候,Vocter有一定的优势,因为它扩容增加一倍。
4.HashSet和TreeSet的区别和使用场景:
1.TreeSet是二叉树(红黑树的数据结构)实现的,TreeSet中的数据是自动排好序的,不允许填入null。
2.HashSet是哈希表结构实现的,无序,且可以放入null,但是只能放一个。因为两者都是不允许重复的。
3.放入HashSet的对象,必须实现HashCode()方法,放入的对象是以hashcode码标识的。而且具有相同内容的String对象的标识码是一样的。所以放入的内容不能重复,但是同一个类的不同实例可以放入。
适用场景:
HashSet是为了快速查询设计的,比TreeSet效率高。一般建议使用HashSet,只有需要排序的时候,才会使用TreeSet。
5.HashMap和TreeMap、HashTable的区别和适用场景:
HashMap是线程不安全的,是基于哈希表(散列表)实现的。为了优化HashMap的空间使用,你可以调优初始容量和负载因子,
其中散列表的冲突处理主分两种,一种是开放定址法,一种是链表法。HashMap实现中使用的是链表法。
TreeMap是非线程安全的,基于红黑树实现的。不支持调优,因为该树总处于平衡状态。
适用场景:
HashMap相较于HashTable去掉了contain方法,但是新增了containsVaule()和containsKey()方法。HashTable是线程同步的,HashMap是线程异步的。HashMap的性能好于HashTable,HashMap的键和值可以为null,但是HashTable不允许为null。
此外两者都是无序的。
两者的底层数据结构:都是数组+链表结构实现的(jdk8之前)。
HashMap:适合删除,插入,定位元素。
TreeMap:适合按自然顺序或者自定义顺序遍历键(Key)。
详细请访问:https://juejin.im/post/5e5c5c52f265da575f4e7558#heading-23