java面试题
1. collection集合
1.1 List
1.2 Set
hashmap和hashset的区别:
1. map
hashmap 在jdk8中的底层实现原理:
数据结构是:数组 + 链表(或者红黑树)
通过put()和get()方法存储和获取对象。
put()
将键值对传递给put()方法,调用键对象的hashCode()方法,计算hashcode值,找到bucket位置存储值对象。
数组+链表存储值对象。
- 默认数组长度是16,后边会按照2的倍数进行扩容
- 链表长度是8,超过之后会转换成红黑树(平衡二叉树)
计算出hashcode值,用拉链发处理冲突,放到链表或者红黑树中。
get()
通过键对象的equals()方法找到正确的键值对,返回
红黑树
定义
为啥叫红黑树呢?
查找树,是为了解决二叉查找树的线性查找问题(也就是单分支树的情况),提高查找效率。
操作
(插入结点的一定是红色,所以要变色调整红黑结点)
- 变色
- 左旋
- 右旋
性质
- 平衡二叉排序树
- 根节点是黑色
- 叶子结点是黑色,是空节点不存储数据
- 不能重复出现两个红色结点
- 某个结点出发到叶子结点的简单路径上的黑色结点个数相同
常见的面试问题
“你知道HashMap的工作原理吗?”
HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Entry。
“当两个对象的hashcode相同会发生什么?(冲突)”
HashMap中的碰撞探测(collision detection)以及碰撞的解决方法。
采用拉链法处理hashcode冲突问题。因为hashcode相同,所以它们的bucket位置相同,‘碰撞’会发生。因为HashMap使用链表存储对象,这个Entry(包含有键值对的Map.Entry对象)会存储在链表中。
“如果两个键的hashcode相同,你如何获取值对象?”
找到bucket(数组中的某个元素,桶)位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。
如果两个对象存在同一个bucket中,怎么找对应的值对象呢?
get(key)方法中使用hashCode()方法得到hashcode,然后找到bucket,里边存的是键值对《键,值》,使用keys.equals()方法找对应的值对象。