集合面试题

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接口?

ListSet是继承于Collection 
Map没有继承于Collection其相对是独立的属于Collection类型的对象可以通过构造函数将一个集合构成另一个集合。

12.HashMap在大量哈希冲突该怎么处理?

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里没有数据,直接返回null2、通过tab[(n-1) & hash]来获取当前key的对应的数据节点的hsah槽,在判断首节点是否等于null.如果是就直接返回null3、再判断首节点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那个性能快,为什么?

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方法来达到这个目的

45.HashTable,HashMap,ConcurrentHashMap 底层实现原理与线程安全问题(建议熟悉 jdk 源码,才能从容应答)

底层原理及线程安全

46.对Spring的理解,说说里面用到的设计模式

46.TreeSet的数据结构

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java集合面试题52共有52个问题,具体问题如下: 1. Java集合框架的核心接口是什么? 2. ArrayList和LinkedList的区别是什么? 3. HashSet和TreeSet的区别是什么? 4. HashMap和Hashtable的区别是什么? 5. ConcurrentHashMap和Hashtable的区别是什么? 6. 如何实现一个线程安全的集合? 7. 如何遍历一个ArrayList? 8. 如何遍历一个LinkedList? 9. 如何遍历一个HashSet? 10. 如何遍历一个TreeSet? 11. 如何遍历一个HashMap的Key? 12. 如何遍历一个HashMap的Value? 13. 如何遍历一个HashMap的Entry? 14. 如何遍历一个Hashtable的Key? 15. 如何遍历一个Hashtable的Value? 16. 如何遍历一个Hashtable的Entry? 17. 如何遍历一个ConcurrentHashMap的Key? 18. 如何遍历一个ConcurrentHashMap的Value? 19. 如何遍历一个ConcurrentHashMap的Entry? 20. 如何使用Collections类对List进行排序? 21. 如何使用Collections类对Set进行排序? 22. 如何使用Collections类对Map的Key进行排序? 23. 如何使用Collections类对Map的Value进行排序? 24. 如何使用Comparator接口对对象进行排序? 25. 如何使用Comparable接口对对象进行排序? 26. 如何使用Iterator遍历集合? 27. 迭代器的remove()方法和集合remove()方法有什么区别? 28. 什么是Fail-Fast机制? 29. 什么是Fail-Safe机制? 30. 如何使用ListIterator进行双向遍历? 31. 如何使用Enumeration进行遍历? 32. 如何使用Iterator进行并发修改的安全遍历? 33. 如何使用并发集合类进行并发操作? 34. 如何使用CopyOnWriteArrayList进行并发操作? 35. 如何使用CopyOnWriteArraySet进行并发操作? 36. 如何使用ConcurrentSkipListSet进行并发操作? 37. 如何使用BlockingQueue进行并发操作? 38. 如何使用LinkedBlockingQueue进行并发操作? 39. 如何使用ArrayBlockingQueue进行并发操作? 40. 如何使用PriorityBlockingQueue进行并发操作? 41. 如何使用SynchronousQueue进行并发操作? 42. 如何使用ConcurrentLinkedQueue进行并发操作? 43. 如何使用DelayQueue进行并发操作? 44. 如何使用ConcurrentHashMap进行并发操作? 45. 如何使用ConcurrentSkipListMap进行并发操作? 46. 如何使用CountDownLatch进行并发操作? 47. 如何使用CyclicBarrier进行并发操作? 48. 如何使用Semaphore进行并发操作? 49. 如何使用Exchanger进行并发操作? 50. 如何使用Lock和Condition进行并发操作? 51. 如何使用ReadWriteLock进行并发操作? 52. 如何使用AtomicInteger进行并发操作? 相关问题: 1. Java基础知识面试题有哪些? 2. Java多线程面试题有哪些? 3. Java异常处理面试题有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值