Object有哪些方法?
hashcode ,equals ,wait(), tostring
hashcode 和equals有什么关系?
Java中规定,hashcode相同equals不一定相同,equals相同那么hashcode一定相同,如果违反这种规则hashMap和hashSet不能正常使用
wait和sleep有什么区别?
- sleep()方法线程不会释放对象锁,wait()方法线程会释放对象锁
- sleep可以在任何地方使用,而wait只能在同步方法或者同步块中使用
- sleep是Thread线程类的静态方法,而wait是Object顶级类的普通方法
String、StringBuilder和StringBuffer的区别?
- String类是不可变类,String对象一旦创建,其值是不能修改的
- StringBufferr类是可变类,用synchronized同步了,是线程安全的
- StringBuilder类是可变类,是非线程安全的
==和equals的区别?
- ==比较的是对象地址
- equals比较的是对象内容
Arraylist和Linkedlist有什么区别?
Arraylist是基于数组的,在查询效率比较高,插入删除效率比较低
Linkedlist是基于链表的,插入删除效率比较高,查询效率比较低
对于添加和删除的时候,linkedlist优于arraylist,因为arraylist在做数据的添加和删除的时候需要有数据的位置的移动
List数据去重的几种有效方法?
HashSet去重
JDK1.8的distinct去重
BIO、NIO、AIO的区别?
BIO:是同步阻塞式,是传统的IO,使用简单,但是没有办法处理并发
NIO:是同步非阻塞,是传统IO的升级,服务端和客户端通过channel通道,实现一个多路复用
AIO:是NIO的升级,也可以叫NIO2,是异步非阻塞,实现回调机制
重载和重写的区别?
重载是:方法名相同参数列表不同
重写是:方法名和参数列表都相同,一般是子类重写父类的方法
jdk1.7和jdk1.8有什么区别?
- jdk1.8新增了lambda表达式,还有stream流
- HashMap底层做了改进。jdk1.7是数组加链表,jdk1.8是数组加链表加红黑树
- jdk1.8的接口里面可以写默认的方法
对称加密和非对称加密有什么区别?
对称加密:加密和解密必须使用同一个密钥,算法有DES,AES
非对称加密:加密和解密不是同一个密钥,一般有一个公钥,一个私钥,公钥加密,私钥解密,算法有RSA
HashMap底层原理?
Jdk1.7是基于数据加链表实现,jdk1.8是数据加链表,长度大于8转红黑树
发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入
Java的堆和栈分别存的什么
堆里面存的是new的对象
栈地址对象引用地址,8大基本数据类型(int,long,short,byte,char,double,float,boolean),线程运行栈,方法栈
HashMap 和 HashTable 有什么区别
HashMap 是线程不安全的,HashTable 是线程安全的;
由于线程安全,所以 HashTable 的效率比不上 HashMap;
HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而 HashTable不允许;
HashMap 默认初始化数组的大小为16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍 +1
为什么 ConcurrentHashMap 比 HashTable 效率要高?
HashTable 使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞;
ConcurrentHashMap
JDK 1.7 中使用分段锁(ReentrantLock + Segment + HashEntry),相当于把一个 HashMap 分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于 Segment,包含多个 HashEntry。
JDK 1.8 中使用 CAS + synchronized + Node + 红黑树。锁粒度:Node(首结点)(实现 Map.Entry<K,V>)。锁粒度降低了。
HashMap 的 table 的容量如何确定?loadFactor 是什么?该容量如何变化?这种变化会带来什么问题
table 数组大小是由 capacity 这个参数确定的,默认是16,也可以构造时传入,最大限制是1<<30;
loadFactor 是装载因子,主要目的是用来确认table 数组是否需要动态扩展,默认值是0.75,比如 table 数组大小为 16,装载因子为 0.75 时,threshold 就是12,当 table 的实际大小超过 12 时, table就需要动态扩容;
扩容时,调用 resize() 方法,将 table 长度变为原来的两倍(注意是 table 长度,而不是 threshold)
如果数据很大的情况下,扩展时将会带来性能的损失,在性能要求很高的地方,这种损失很可能很致命。
HashMap到jdk1.8为什么到8转红黑树?
之所以选择红黑树是为了解决二叉查找树的缺陷,二叉查找树在特殊情况下会变成一条线性结构(这就跟原来使用链表结构一样了,造成很深的问题),遍历查找会非常慢。
而红黑树在插入新数据后可能需要通过左旋,右旋、变色这些操作来保持平衡,引入红黑树就是为了查找数据快,解决链表查询深度的问题,我们知道红黑树属于平衡二叉树,但是为了保持“平衡”是需要付出代价的,但是该代价所损耗的资源要比遍历线性链表要少,所以当长度大于8的时候,会使用红黑树,如果链表长度很短的话,根本不需要引入红黑树,引入反而会慢。
HashMap负载因子为什么选择0.75?
如果负载因子过高,比如1的情况下,虽然空间开销减少了,提高了空间利用率
如果负载因子过低,例如0.5虽然可以减少时间的成本,但是空间利率用低
主要是时间和空间做一个权衡
Hashmap 与 ConcurrentHashMap区别?
hashmap本质是数组+链表 根据key去获取hash值 然后计算出对应的下标,如果有多个key对应同一个下标,就用链表的形式存储
ConcurrentHashMap在hashmap的基础上 ConcurrentHashMap将数据分成了多个数据段(segment 默认是16) 主要是对segment去加锁
hashmap的键值允许null值,但是ConcurrentHashMap不允许
在jdk1.7 ConcurrentHashMap是由segment数组和hashentry数组结构组成
在jdk1.8 ConcurrentHashMap放弃了segment用node+cas+synchronize保证
ConcurrentHashMap是线程安全, hashmap线程不安全
HashMap的线程不安全主要体现在下面两个方面?
1、JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况
2、JDK1.8中,当并发执行put的时候会对数据造成覆盖的情况
HashMap面试问题 https://mp.weixin.qq.com/s/GxD7ZW-meavkNc22bL85Zw
标签:ConcurrentHashMap,八股文,HashMap,jdk1.8,链表,面试,线程,table,JAVA From: https://blog.csdn.net/C1226786216/article/details/142761382