
Java集合类
不止于代码
这个作者很懒,什么都没留下…
展开
-
HashMap怎样解决散列(hash)冲突?
常用两种方法:链表法和开放寻址法 1、链表法(chaining) 在哈希表中,每一个桶(bucket)或者槽(slot)都会对应一条链表,所有哈希值相同的元素放到相同槽位对应的链表中。 在插入的时候,我们可以通过散列函数计算出对应的散列槽位,将元素插入到对应的链表即可,时间复杂度为O(1);在查找或删除元素时,我们同样通过散列函数计算出对应的散列槽位,然后再通过遍历链表进行查找或删除,时间复杂度...原创 2018-12-12 15:58:10 · 24290 阅读 · 2 评论 -
HashMap为什么不是线程安全的?
HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。对链表而言,新加入的节点会从头结点加入。 javadoc中关于hashmap的一段描述如下: 此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步。(结构上的修改是指添加或删除一个或多个映射关系...转载 2019-02-03 22:28:07 · 898 阅读 · 0 评论 -
Java 用自定义类作为 HashMap 的键
1、Java 用自定义类作为 HashMap 的键需要重写 hashCode ( ) 和 equals ( ) 两个方法。 2、 HashMap 中的比较 key 是先求出 key 的 hashCode 值,比较其是否相等,若相等再通过 equals ( ) 比较其Key值 是否相等 ,若相等则认为他们是相等的。若不相等则认为他们不相等。 自定义类中的 equals ( ) 和 hashCode ...原创 2018-12-17 15:11:36 · 837 阅读 · 1 评论 -
ArrayList和LinkedList的区别
ArrayList: ArrayList的优点: 1、ArrayList 底层是基于动态数组实现的,再加上它实现RandomAccess接口(用来支持快速随机访问),所以它在随机访问查找(get)的时候非常快。 2、ArrayList 在顺序添加的时候也非常方便,因为只是在数组中加上一个元素而已。 ArrayList的缺点: 1、在删除、插入时涉及到一次元素复制,如果需要复制的元素比较多,就会十分...原创 2018-12-10 17:16:44 · 109 阅读 · 0 评论 -
HashMap和Hashtable的区别?
1、继承不同。Hashtable继承陈旧的Dictionary类,而HashMap继承抽象类AbstractMap实现Map接口。 2、线程安全不同。Hashtable是线程安全的,在多线程环境下可以直接使用,而HashMap是非线程安全的,在多线程环境下需要手动进行同步处理。 3、允不允许null值。Hashtable中Key和Value都不允许出现null值,否则会出现NullPoinerEx...原创 2018-12-14 16:34:40 · 134 阅读 · 0 评论 -
为什么HashMap的初始容量一定要设置为16(2的整数次幂)?
HaspMap的数据结构是数组加单链表,把初始容量设置为2的幂有助于HashMap中的元素存放地更均匀,降低了hash碰撞的概率,提高了查找的效率和空间利用率。 最理想的情况是Entry数组中每一个位置都只存放一个元素,这样在查找的时候不用去遍历链表,这时候空间利用率最大,时间复杂度最优。 计算最均匀的是对length取模运算:哈希值%容量=bucketIndex(桶位) /** * Retur...原创 2018-12-14 15:38:39 · 1379 阅读 · 0 评论 -
Java中哪些是线程安全的容器?
同步容器类:使用了synchronized 1.Vector 2.HashTable 并发容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:写时复制 5.CopyOnWriteArraySet:写时复制 Queue: 6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。 (java....转载 2018-12-12 17:53:28 · 2786 阅读 · 0 评论 -
JDK7和JDK8中HashMap实现的区别?
在JDK7中,HashMap是基于一个数组和多个链表的实现**(位桶+链表)**,当遇到散列冲突时,就将对应的元素以链表的形式储存。但是这样子的话HashMap的性能就会比较低,因为如果当数据比较多,发生冲突的元素也会越来越多,这时候链表中就会存储有很多元素,在查找上会消耗O(n)的时间。 因为在最坏的情况,链表的时间复杂度为O(n),而红黑树为O(logn),当链表中的元素达到某个阀值时,使用红...原创 2018-12-12 16:47:01 · 799 阅读 · 0 评论