1.说说List,Set,Map三者的区别你
2.ArrayList与LinkedList区别?
ArrarList和LinkedList区别:
(1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
(2)对于随机访问get和set,ArrayList效率优于LinkedList,因为LinkedList要移动指针。
(3)对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。 这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
3.ArrayList与Vector区别呢?为什么要用ArrayList取代Vector呢?
ArrayList:是线程不安全的动态数组,底层是数组结构,JDK1.7后初始化为空数组,在添加第一个元素时初始化为长度为10的数组,如果容量满了,按照1.5倍扩容。支持foreach和Iterator遍历。
Vector:是线程安全的动态数组,底层是数组结构,初始化为长度为10的数组,如果容量满了,按照2.0倍扩容。除了支持foreach和Iterator遍历,还支持Enumeration迭代。
LinkedList:是双向链表,底层是链表结构。当频繁在集合中插入、删除元素时,效率较高,但是查找遍历的效率较低。
Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
4.说说ArrayList的扩容机制吧
5.HashMap和Hashbable的区别
1.HashTable线程同步,HashMap非线程同步
2.HashTable不允许<key,value>有空值,HashMap允许<Key,value>有空值
3.HashTable使用Iterator和enumeration,HashTable使用Iterator
4.HashTable中hash数组默认长度为11,扩容方式为2n+1.HashMap中hash数组默认长度为16,扩容方式为2n
5.HashTable继承dictionary类,HashMap继承AbstractMap类
6.HashSet如何检查重复 ;
1.先计算元素的哈希值,然后比较哈希值
2.如果哈希值不一样,直接存储
3.如果哈希值一样,再比较元素内容
4.如果哈希值一样,内容不一样,直接存
5.如果哈希值一样,内容也一样,直接去重复,后面的会把前面的覆盖掉
HashSet<String> set = newHashSet<>();
set.add("abc");
set.add("abc");
set.add("通话");
set.add("重地");
set.add("吕布");
set.add("貂蝉");
System.out.println(set);
7.说说HahMap底层实现 ( jdk1.7–>jdk1.8 )
HashMap的底层结构在jdk1.7中由数组+链表实现,在jdk1.8中由数组+链表+红黑树实现,以数组+链表的结构为例。
8.HashMap长度为什么是2的幂次方
HashMap长度为2的幂次方的原因是为了减少Hash碰撞,尽量使Hash算法的结果均匀。
12.我们知道ArrayList是由数组来构建而成,请写一个类(类名List)试着实现题2的方法。
ArrayList底层源码分析
9.Java中的HashMap的工作原理是什么?
10.List,Set,Map是否继承自collection接口?
List,Set是继承于Collection
Map没有继承于Collection其相对是独立的属于Collection类型的对象可以通过构造函数将一个集合构成另一个集合。
12.HashMap在大量哈希冲突该怎么处理?
13.zset的底层数据结构,跳跃表如何实现? (redis)
Redis zset 底层数据结构之跳表
25.链表是如何定义的
26.怎么实现链表的翻转
28.插入链表的时候是前插还是后插。
14.详细说一下 HashMap 的 put 过程
JDK1.8之前Put方法:
**JDK1.8之后Put方法**
15.HashMap 和 TreeMap 的区别
16.HashMap的get方法的原理?
1、首先看源码
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
我们可以看到的是HashMap底层是调用一个getNode的方法。用的三目运算符。如果返回的值等于null,就直接返回null,否则就返回value值。接下来我们看getNode方法。
以下源码:
final Node<K,V> getNode(int hash, Object key) {
Node<K,V>[] tab; Node<K,V> first, e; int n; K k;
if ((tab = table) != null && (n = tab.length) > 0 &&
(first = tab[(n - 1) & hash]) != null) {
if (first.hash == hash && // always check first node
((k = first.key) == key || (key != null && key.equals(k))))
return first;
if ((e = first.next) != null) {
if (first instanceof TreeNode)
return ((TreeNode<K,V>)first).getTreeNode(hash, key);
do {
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
} while ((e = e.next) != null);
}
}
return null;
}
1、首先会判断数组是否不等于null,或者数组的长度是否大于0,如果不满足,就说明HashMap里没有数据,直接返回null。
2、通过tab[(n-1) & hash]来获取当前key的对应的数据节点的hsah槽,在判断首节点是否等于null.如果是就直接返回null。
3、再判断首节点key是否和目标值相同,相同就直接返回。
4、否则再判断首节点.next是否等于null,如果等于null就直接返回。
5、否则在判断是否是首节点是树节点类型,如果是就进入红黑树进行查询。返回结果
6、否则就会进入一个do while循环进行查询。返回结果。
大概流程就是这样,挺简单的,可以自己debug走一遍就会清晰很多,不用去死记硬背。
17.HashMap的底层实现,是否线程安全,如果多线程中一定要使用HashMap,怎么做?
18.集合类的工具类,用过工具类那些方法?
19.ArrayList和HashMap的默认大小是多少,以及扩容机制。
20.集合有哪些, 各自有哪些特点, 各自的API有哪些,Set是如何实现元素的唯一性?
21.hashMap底层是数组+链表,有数组很快了 ,为什么加链表?
21.Arraylist for循环和foreach那个性能快,为什么?
22.遍历集合的方式有哪些?
23hashmap原理,它是线程安全的吗,有什么是线程安全的?
24.线程安全的Map在JDK 1.5及其更高版本环境 有哪几种方法可以实现?
25.Collection 和 Collections的区别。
26.修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法
27.List, Set, Map是否继承自Collection接口?
28.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
29.HashSet存放数据的方式?
30.在jdk1.8中,HashMap的数据结构与1.7相比有什么变化,这些变化的好处在哪里?
之所以用红黑树是因为他能够大大提高查找效率,链表的时间复杂度是O(n)而红黑树的时间复杂度是O(logn),那么为啥要链表长度大于8且数组长度大于64才转成红黑树呢,简单来说就是节点太少的时候没必要转换数据结构,因为不仅转换数据结构需要浪费时间同时也要浪费空间。而为什么不直接一直用红黑树呢?这是因为树的结构太浪费空间,只有节点足够多的情况下用树才能体现出它的优势,而如果在节点数量不够多的情况下用链表的效率更高,占用的空间更小。
31.说说JUC中的concurrenthashmap的原理和作用?
32.hashmap key争夺?
33 .hashmap什么时候转换为红黑树
在链表长度大于 8 并且 表的长度大于 64 的时候会转化红黑树
34.ArrayList和数组的区别
35.集合说一下哪些是线程不安全的
36.set和map的比较
37.在ArrayList中remove方法?
38.为什么用红黑树
39.红黑树的特性是什么
40.为什么有了平衡二叉树,还要选择红黑树这种数据结构?
41.ConcurrentHashMap的底层实现?
42.针对 HashMap 中某个 Entry 链太长,查找的时间复杂度可能达到 O(n),怎么优化?
将链表转换成红黑树,JDK1.8已经实现了
43.Arraylist 如何实现排序
排序方法
130.TreeMap 和 TreeSet 区别和实现原理(阿里)
44.自定义类型可以作为Key么?
如果要以可变对象作为key的话,需要重写hashcode和equal方法来达到这个目的