学习总结:集合

  • hashmap的原理和实现。

Hash是基于Hash算法实现的,通过put (key,value)进行存储,通过get(key)来获取value。传入key时,Hash会根据key的hashCode()计算Hash值,根据hash值将value保存在bucket里面。当计算出的Hash值相同时,就会出现Hash碰撞,HashMap的做法使用链表和红黑树存储相同hash值的value,但桶里面的个数超过8时转为红黑树,少于6个时转为链表。

 

  • Hashtable ConcurrentHashmap HashTable的区别

线程安全方面:HashMap线程不安全,Conccurrent和Hashtable线程安全。

存储:HashMap的key和value都可以存储null,其他两个不可以

使用方面:Hashtable不推荐使用,一般单线程环境使用hashmap,多线程使用ConcurrentHashMap替代。

 

  • Hashtable和HashTable的区别

线程安全方面:HashMap线程不安全,Hashtable线程安全。

存储:HashMap的key和value都可以存储null,hashtable不可以

默认长度和扩容机制:hashmap默认长度是16,扩容是数组长度乘以2,hashtable默认长度是11,增加方式是原来数组*2+1。

哈希值的使用:hashmap重新计算hash值,hashtable直接使用对象的hashcode。

 

 

  • hashmap的put操作过程

1 首先如果HashMap没有被初始化过,就初始化。

2 然后对key求hash值,计算下标

3 如果没有碰撞,直接放入桶中

4 如果碰撞了,以链表的方式链接到后面

5 如果链表长度超过阈值8,就把链表转成红黑树

6 如果链表长度低于6,就把红黑树转回链表

7 如果节点已经存在就会替换旧值

8 最后就是如果桶满了,就需要resize进行扩容2倍。

 

  • hashmap 1.7与1.8版本不同

1.7版本底层是数组+链表

1.8版本底层是数组+链表+红黑树,链表长度超过8时,变为红黑树,少于6时再退化为链表。

 

  • hashmap在并发情况下,会出现什么问题?Hash如果并发put怎么办?

会出现死循环,程序占用100%的CPU。

重启程序调试代码,使用ConcurrentHashMap

 

  • hashmap线程不安全,请问为什么线程不安全?Hashmap多线程中出现的问题,画图解释

并发时会成环。什么时候成环?比如我有两个数据要装入hashmap。

参考 https://blog.csdn.net/zhuqiuhui/article/details/51849692

画图参考 https://blog.csdn.net/minkeyto/article/details/78667944

  • hashmap扩容机制

因为hashmap初始默认桶的容量是16,负载因子是0.75,所以达到负载因子的时候,会进行reszie扩容2倍进行重排。

 

  • hashcode代表什么。作用

hashcode是对key值进行hash操作得到的值,根据hashcode确定元素在表中的位置。

 

  • hashset底层原理

HashSet是基于HashSet实现的,HashSet底层使用使用hashmap来保存所有元素。相关hashset的操作都用调用hashmap的相关方法,hashset不允许重复的值。

 

 

  • HashMap是线程安全的吗,怎么让他线程安全?

不是

一是替换成hashtable,因为hashtable是线程安全的,但是效率比较低

二是用Collections类的SynchronizedMap类包装一下,返回有指定映射支持的同步线程。

三是使用ConcurrentHashMap,用分段锁来保证线程安全。

 

 

  • currenthashmap的原理及实现、如何保证线程安全?

 

Concurrent对Hashtable进行优化,通过将锁细粒度到table的每个元素来提升并发性能。底层是通过链表加数组加红黑树实现。

 

  • Concurrenthashmap1.7版本以及1.8版本的不同

1.7版本 Concurrenthashmap底层由数组+链表,有16个segment,对16个segment进行分段锁,初始化后不可扩容,可以支持16个线程并发读写。

1.8版本,Concurrent底层由数组+链表+红黑树组成。

 

 

  • concurrenthashmap如何上锁。怎么样获取concurrenthashmap的size,size()的具体操作?

1.7 对segment进行上锁,通过size(),分段计算两次,两次结果相同返回,否则对所有段加锁重新计算。

1.8 对桶里面的每个元素进行上锁,size()利用Longadd累加计算。

size参考 https://blog.csdn.net/u012133048/article/details/83144422

 

 

  •  hashmap解决冲突方式

开放定址法,再哈希法,链地址法,建立公共溢出区。

 

  • HashMap能插入null,key为null?value为null?

可以,因为hashmap的key为hash值。其他的key为指针。

 

  • java集合的类层次关系

1 容器分为Collection和Map两大类

2 Collection里面有List,set,queue

list里面有Arraylist;linkedlist;vector

set里面有hashset,treeset,linkedlistset

3 Map里面里面有hashmap,hashtable,treemap

 

  • ArrayList和LinkedList的区别? 适用场景

底层实现方面 Arraylist是动态数组,LinkedLis是双向链表。

随机访问效率,ArrayList比LinkedList访问效率高。

增加和删除效率,在不是头尾的时候,LinkedList比ArrayList效率高。

需要频繁访问集合中的元素时,使用arraylist。插入和删除操作的时候,使用linkedlist。

 

 

  • Collections和Collection的区别

Collection是集合接口,Collections是一个包装类,不能实例化,像一个工具类,比如提供的排序方法,Collections.sort(list);

 

  • Arraylist如何扩容?

新建一个1.5倍的数组,将就数组的内容复制过去。

 

  • map中的key和value可以为null吗?可以有多个null吗?

分情况

hashmap可以,key值只能有一个null,value可以有多个null

hashtable不可以

 

  • treemap了解么。treemap和hashmap区别

TreeMap 则是基于红黑树的一种提供顺序访问的 Map,它的 get、put、remove之类操作都是 O(log(n))的时间复杂度。一般是需要对key集合进行有序的遍历的时候,用TreeMap,其他的一般用hashmap。

 

 

  • 怎样减少hash碰撞,具体方案 

一是扰动函数,促使元素位置分布均匀,减少碰撞作用。

二是使用final对象,并采用合适的equals()对象和hashCode()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值