【java开发底层原理篇】之List接口、Set接口和Map接口的区别

275 阅读3分钟

前言: 此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...

一、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大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)