自我备忘录
1.Java集合
1.1 级别展示
集合的大分类(本图来自于《Java核心编程技术(第二版)》):、
Java集合详询解释请参考: [https://blog.csdn.net/weixin_37769137/article/details/85269571]
作者:我不是陈浩南
Java集合详询图:
1.2 引用:
1.2.1 Set 集合:
Set集合的特点:
Set集合中的对象无排列顺序,且没有重复的对象。可以把Set集合理解为一个口袋,往里面丢的对象是无顺序的。
对Set集合中成员的访问和操作是通过对集合中对象的引用进行的,所以Set集合不能有重复对象(包括Set的实现类)。
Set判断集合中两个对象相同不是使用"=="运算符,而是根据equals方法。每次加入一个新对象时,如果这个新对象和当前Set中已有对象进行equals方法比较都返回false时,则允许添加对象,否则不允许。
1.2.2 Set集合的主要实现类:
HashSet:按照哈希算法来存储集合中的对象,速度较快。
LinkedHashSet:不仅实现了哈希算法,还实现了链表的数据结构,提供了插入和删除的功能。当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。
TreeSet:实现了SortedSet接口(此接口主要用于排序操作,即实现此接口的子类都属于排序的子类)。
EnumSet:专门为枚举类设计的有序集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。
1.2.3 Set 集合总结
HashSet的性能比TreeSet好(包括添加、查询元素等操作),因为TreeSet需要额外的红黑树算法来维护集合元素的次序。
当需要一个始终保持排序的Set时,才使用TreeSet,否则使用HashSet。
对于LinkedHashSet,普通的插入、删除操作比HashSet要略慢一点,因为维护链表会带来的一定的开销。好处是,遍历比HashSet会更快
EnumSet是所有Set实现类中性能最好的。
HashSet、TreeSet、EnumSet都是"线程不安全"的,可以通过Collections工具类的synchronizedSortedSet方法来"包装"该Set集合。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(…));
HashSet、LinkedHashSet、TreeSet使用区别:
(1)HashSet的输出顺序是无序的,但是它的速度最快;
(2)TreeSet输出顺序是升序排列的;
(3)LinkedHashSet输出顺序是有序的,就是插入时的顺序;
1.3 List 集合
List集合的特点:
集合中的对象按照索引的顺序排序,可以有重复的对象。List与数组相似。
List以线型方式存储,默认按元素的添加顺序设置元素的索引。
List集合的主要实现类:
ArrayList(数组结构):可以理解为长度可变的数组。可以对集合中的元素快速随机访问,但是做插入或删除操作时效率较低。
LinkedList(链表结构):使用链表的数据接口。与ArrayList相反,插入或删除操作时速度快,但是随机访问速度慢。同时实现List接口和Deque接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素,也能将LinkedList当作双端队列使用,自然也可以被当作"栈来使用(可以实现“fifo先进先出,filo后入先出”)。
ArrayList和LinkedList的区别:
(1)ArrayList和LinkedList都是非线程安全的!
(2)由于LinkedList是基于链表的数据结构在做链表之间插入数据 或删除数据会比较方便,但是查询会比较垃圾,因为需要根据开始节点或者尾节点逐步遍历。而它的缺点是ArrayList的优点,优点又同样是ArrayList的缺点!
1.4 Map 集合
Map集合的特点:
Map是一种把键对象(key)和值对象(value)进行映射的集合(kv)。k相当于v的索引,v仍然可以是Map类型(kv)。
key和value都可以是任何引用类型的数据。
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false。
key集的存储形式和Set集合完全相同(即key不能重复)
value集的存储形式和List非常类似(即value可以重复、根据索引来查找)
Map集合的主要实现类:
HashMap:按照哈希算法来存取key,有很好的存取性能,和HashSet一样,要求覆盖equals()方法和hasCode()方法,同时也不能保证集合中每个key-value对的顺序。
LinkedHashMap:使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致。
TreeMap:一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。实现了SortedMap接口,能对key进行排序。TreeMap可以保证所有的key-value对处于有序状态。同样,TreeMap也有两种排序方式(自然排序、定制排序)
1.5 Map 集合总结
Set和Map的关系十分密切,java源码就是先实现了HashMap、TreeMap等集合,然后通过包装一个所有的value都为null的Map集合实现了Set集合类。
HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样。但HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制,但线程不安全。
LinkedHashMap直接继承自HashMap,所以也是数组+链表/红黑树实现。
TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对
使用TreeMap的一个好处就是: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
HashMap、Hashtable、TreeMap、LinkedHashMap的区别:
(1)需要在Map集合中插入、删除、和定位元素,HashMap是最快的。但线程不安全;
(2)需要在Map集合有排序功能,TreeMap是最好的;
(3)需要在Map集合按照插入的顺序存储集合,LinkedHashMap是最好的;