Java集合基本是Java面试必考必问的,需要重要掌握,今天给大家总结Java集合面试题及答案@mikechen
Java集合框架有哪些?
Java集合类主要由两个根接口Collection和Map派生出来的。
Collection代表一组对象,每一个对象都是它的子元素;
Set不包含重复元素的Collection,包含:HashSet、TreeSet、LinkedHashSet等。
List有顺序的collection,并且可以包含重复元素,常见包含:ArrayList、LinkedList等。
Map可以把键(key)映射到值(value)的对象,键不能重复,常见包含:HashMap、TreeMap、Hashtable等。
Collection框架有哪些?
1)List
List代表了有序可重复集合,可直接根据元素的索引来访问
2)Set
Set代表无序不可重复集合,只能根据元素本身来访问
3)Queue
Queue是队列集合
List集合框架有哪些?
List接口常用的实现类有:ArrayList、LinkedList、Vector。
ArrayList、Vector、LinkedList优劣势比较?
1)ArrayList
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
2)Vector
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
3)LinkedList
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
Java集合常用Set?
Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet
Java集合常用的Map?
常见包含:HashMap、TreeMap、Hashtable等,重点要掌握好HashMap。
HashMap的数据结构
HashMap的数据结构:数组+链表+红黑树(JDK1.8增加了红黑树部分)的数据结构。
如下所示:
为什么HashMap1.8需要引入红黑树(重点)
1.7HashMap集合中,当我们发生了Hash冲突,则会存放在同一个链表中,当链表的查询长度过长,查询效率非常低,因为采用链表存放查询的时间复杂度是为O(n),从头查询到尾部、在JDK1.8开始优化当数组容量>=64且链表长度>8则会将链表转化为改为红黑树,红黑树的时间复杂度为O(logn),性能有所提升。
HashMap1.8链表在什么时候转化成红黑树
当数组的容量大于=64且链表长度大于8则会将链表转化成红黑树。
红黑树查询的时间复杂度是为O(logN)
当红黑树的节点个数<6则将红黑树转换成链表
HashMap如何解决Hash冲突问题
JDK1.7版本的HashMap
1.根据key的hash值,计算该key存放在数组的index位置
2.如果发生index冲突,则会使用单向链表存放
同一个链表中存放的都是hashCode值相同,但是内容值却不同
JDK1.8版本的HashMap
1.根据key的hash值,计算该key存放在数组的index位置
2.如果发生index冲突,则会使用单向链表存放,当数组的容量大于=64且链表长度大于8则会将链表转化成红黑树。
根据链表查询key的时间复杂度就是为O(n)—从头查询到尾部
HashMap与HashTable之间的区别
1.HashMap线程不安全、HashTable线程安全,但是使用HashTable在多线程的情况下效率比较偏低,所以在多线程的情况下使用ConcurrentHashMap;
2.多线程的情况下使用HashTable能够保证数据安全性,是采用synchronized锁将整个HashTable中的数组锁住,在多个线程中只允许一个线程访问Put或者Get,效率非常低。
3.多线程的情况下使用HashMap线程不安全,没有上锁,可能会发生一些数据冲突问题,但是效率比较高的。
4.HashMap可以允许存放key值为null,存放在数组第0个位置、HashTable不允许存放的key为null
补充概念“线程安全问题” 多个线程同时访问一个全局共享变量 可能会发生线程安全问题。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》