前言: 此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...
一、List接口和Set接口
List接口和Set接口继承自Collection接口,而Map不是继承的Collection接口
Collection表示一组对象,这些对象也称为collection的元素;一些collection允许有重复的元素,而另一些则不允许;
一些collection是有序的,而另一些则是无序的;JDK中不提供此接口的任何直接实现,它提供更具体的子接口(如 Set 和 List)实现;
Map没有继承Collection接口,Map提供key到value的映射;一个Map中不能包含相同key,每个key只能映射一个value;Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射;
二、List接口
List接口有三个实现类:LinkedList,ArrayList,Vector(元素有顺序,元素可重复)
LinkedList: 底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
ArrayList和Vector的区别: ArrayList是非线程安全的,效率高;
Vector是基于线程安全的,效率低
List是一种有序的Collection,可以通过索引访问集合中的数据,List比Collection多了10个方法,主要是有关索引的方法。
1).所有的索引返回的方法都有可能抛出一个IndexOutOfBoundsException异常
2)subList(int fromIndex, int toIndex)返回的是包括fromIndex,不包括toIndex的视图,该列表的size()=toIndex-fromIndex
所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
所有的List中可以有null元素,例如[ tom,null,1 ];
基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作;
三、Set接口
Set接口的元素是无顺序的,不可重复的,为快速查找而设计的Set
四、map接口
map是一个接口,键值对的形式,有hashmap,treemap,linkedHashMap等
五、hashMap,hashTable的区别
都是键值对。HashMap是支持null键和null值的,hashmap是非线程安全。hashtable线程安全,但是不建议使用,已经淘汰了,hashtable的替代品是ConcurrentHashMap,拓展性更好
六、ConcurrentHashMap的底层原理
ConcurrentHashMap是hashtable的替代品,拓展性更好
ConcurrentHashMap:
ConcurrentHashMap的源码和底层原理,应该知道里面的核心思路,就是分段加锁!
把数据分成很多个段,每个段是一个单独的锁,所以多个线程过来并发修改数据的时候,可以并发的修改不同段的数据。不至于说,同一时间只能有一个线程独占修改ConcurrentHashMap中的数据。
这就是为什么ConcurrentHashMap和hashtable都是线程安全,但是ConcurrentHashMap效率更高的原因。
七、总结
list和set都是实现了collection的接口,list和set也是一个接口是collection的子类,包括arrayList,hashSet,linkedList
map是一个接口,不和上面两个有关系,键值对的形式,有hashmap,linkedHashMap
map的默认长度是16,是一个数组链表形式,遍历的时候使用entrySet
如 for (Map.Entry<String, String> entry : map.entrySet()) {}
结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)