
java集合
ThunderWay
北京工业大学计算机研究生就读
展开
-
ConcurrentHashMap和HashTable的区别?
ConcurrentHashMap和HashTable的区别主要体现在实现线程安全的方式上的不同:底层数据结构:jdk7之前的ConcurrentHashMap底层采用的是分段的数组+链表实现,jdk8之后采用的是数组+链表/红黑树;HashTable采用的是数组+链表,数组是主体,链表是解决hash冲突存在的。实现线程安全的方式:1. jdk8以前,ConcurrentHashMap采用分段锁,对整个数组进行了分段分割,每一把锁只锁容器里的一部分数据,多线程访问不同数据段里的数据,就不会存在锁竞争原创 2020-10-11 17:16:47 · 626 阅读 · 0 评论 -
ConcurrentHashMap线程安全的具体实现⽅式/底层具体实现
JDK8以前,ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他段访问。Segment是一种数组+链表结构,实现了ReentrantLock接口,是一种可重入锁;HashEntry存储键值对数据。JDK8以后,ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized保证并发安全。数据结构采用数组+链表/红原创 2020-10-11 16:52:25 · 504 阅读 · 0 评论 -
集合框架底层数据结构总结
Collection1. List: ArrayList:Object数组 Vector:Object数组 LinkedList:双向链表2. Set: HashSet:无序,唯一,底层是HashMap LinkedHashSet:底层依赖LinkedHashMap实现。 TreeSet:有序,唯一Map HashMap:jdk8以前是数组+链表,jdk8以后是数组+链表/红黑树 LinkedHashMap:有序...原创 2020-10-10 16:55:09 · 158 阅读 · 0 评论 -
HashSet如何检查重复?
当把对象加入HashSet的时候,HashSet会先计算对象的hashCode值来判断对象加入的位置,同时与其他加入的对象的hashcode值作比较,如果没有相同的,则加入该对象,如果有相同的hashcode值,则调用equals方法判断是不是同一个对象,如果不是则加入;如果相同,则加入不成功;...原创 2020-10-10 16:35:47 · 304 阅读 · 0 评论 -
List,Set,Map三者的区别?
List:存储有序的对象Set:不允许重复的集合,独一无二Map:使用键值对存储,Key是唯一的。原创 2020-10-10 16:08:15 · 279 阅读 · 0 评论 -
HashSet和HashMap的区别
1.一个继承Set接口,存储对象;一个继承Map接口,存储键值对。2. 两个的底层都是hashmap哈希表,hashmap通过key直接算出hash值,而hashset需算出通过hashcode方法算法hash值,如果一样,再通过equals方法比较是不是同一个对象。3. hashmap快,hashset慢。...原创 2020-07-20 21:18:43 · 1286 阅读 · 0 评论 -
HashMap 的长度为什么是2的幂次方
为了提高HashMap的效率,减少数据的碰撞,使数据分布平均,用之前需要用hash值对数组进行求余运算,算出在数组中的位置,这个计算方法是(length-1)&hash,与hash对数组长度求余结果是一样的,这样效率更高,因为2的n次方是1后边n个0,2的n次方-1,就是n个1,所以为了减少数据碰撞,使分布均匀,需要使得hashmap的长度是2的n次方。...原创 2020-07-20 21:15:16 · 384 阅读 · 0 评论 -
HashMap 和 Hashtable 的区别
1. 线程是否安全: HashMap不是线程安全的,不同步;HashTable是线程安全的,所有方法都用了synchronized修饰(如果要线程安全,用ConcurrentHashMap);2. 效率:HashMap更快,效率更高。HashTable已经被淘汰了不用了。3. 底层数据结构:JDK8以后,HashMap的底层数据结构转变成数组+链表/红黑树,当链表长度大于8就会转变为红黑树,而HashTable不会。4. 是否允许空值:HashMap的key可以是null值,只能出现一次,va.原创 2020-07-20 21:02:07 · 80 阅读 · 0 评论 -
HashMap的底层实现
JDK8以前,HashMap底层是数组+链表,HashMap算出key的hash值,对数组长度进行求余(length-1)&hash,算出该值在数组中的位置,看这个位置是否存在元素,如果存在再看hash值和key是不是同一个,如果是同一个就覆盖,如果不是就在链表中加入解决冲突;JDK8以后,HashMap底层是数组+链表/红黑树,当链表长度大于阈值8的时候,将链表转化内红黑树减少搜索时间。...原创 2020-07-20 20:47:34 · 102 阅读 · 0 评论 -
ArrayList 与 Vector 区别
ArrayList不是同步的,线程不安全,但速度较快,Vector是同步的,速度慢,但已经被ArrayList代替。原创 2020-07-20 20:43:39 · 80 阅读 · 0 评论 -
Arraylist 与 LinkedList 异同
1. 是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全。2. 底层数据结构: Arraylist 底层使用的是Object数组;LinkedList 底层使用的是双向链表数据结构。3. 是否支持快速随机访问: LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。4. 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素 位置的影响。② LinkedList转载 2020-07-20 20:42:11 · 143 阅读 · 0 评论