Java集合中常见的面试题 (收藏+保存+offer拿到手软)
Posted 小吴吃肉啦~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java集合中常见的面试题 (收藏+保存+offer拿到手软)相关的知识,希望对你有一定的参考价值。
* collection和collections之间的区别
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
- Set和List子接口(数据结构叫做ADT)
* List和数组比较
相似点:都有角标
不同点:
* 数组一定是物理连续的,List根据实现可以分成物理或逻辑连续的
* List是动态容量,数组是静态容量
* List也是放置相似的元素,但是由于JAVA语言的规定,List只能放置类型对象,数组可以放置基础数据类型
* List申明元素类型使用的是泛型,数组直接使用类型[]
* List如果要放置基础数据类型,必须使用包装类
* ArrayList查询速度快,LinkedList插入和删除速度快
* List的实现类
-
ArrayList:底层使用数组实现
ArrayaList扩容机制
> 源码里面调用add方法,确保里面能放下最小值,放置第一个元素时,容量变成10,当放置第11的元素,调用 grow方法,将会扩容1.5倍 源码里面是这么讲的newCapacity = oldCapacity + (oldCapacity >> 1), 所以他是 1.5倍,放完以后判断,有没有超过他的最大值,没有超过,用arrayscopy 将其扩容,原来的值复制过去
* capacity大小,默认,每次扩容条件,扩容后capacity大小,capacity和size区别
> capacity是容器的大小 size是存放元素的大小
-
LinkedList:底层使用双向链表实现
- 没有扩容机制
- 如果查找的内容在后半段,从后往前查找
-
CopyOnWriteArrayList:线程安全的ArrayList
-
所有对数据有修改的操作都在副本中进行
-
完成后使用CAS替换到原本中
-
底层使用了可重入锁来实现
缺点:内存占用问题,由于他的写 复制机制,会在内存中驻扎俩个对象的内存
CopyOnWrite容器不能保证数据的一致性,可能读取到旧数据
-
-
Collections.synchronizedList();
- 这个方法也可以创建一个线程安全的List,他创建的方式方法是通过对List中的所有方法进行Synchronized的操作
-
List常用方法
- 定位、求长、替换
-
Set和List之间的比较
- 相同点:都是动态容量
- 不同点:
- Set没有角标
- Set不能放置重复内容
- Set的遍历过程只能使用迭代器
- 大部分Set是有顺序的,但是部分Set是没有顺序的(规律比较难找)
-
Set实现:
- HashSet:底层使用一个HashMap,通俗的讲,我们说HashSet是没有顺序的,但是其实只是顺序比较难找而已(和元素的hashCode值有关系)
- TreeSet:升序排序,要求元素必须实现comparable接口
- LinkedHashSet:放入顺序
-
额外:Vector向量 线程安全的ArrayList,所有的方法加了锁
-
Map:顶层接口
- 存的是K-V对
- 五个实现类:Hashtable、HashMap、TreeMap、LinkedHashMap、ConcurrentHashMap
* HashMap底层原理
* DEFAULT_CAPCITY=1<<4 //aka16
* DEFAULT_LOAD_FACTORY = 0.75f
* 树化因子:8
* 塌缩因子:6
* 最大树化容量:64
* 底层实现:数组+链表+红黑树 -->拉链法
* 扩容规则:先算hashcode,确定桶角标,如果头有内容,则继续向下查找后续内容,如果是空,则放置。完成以后,判断两个条件,满足任何一个就需要扩容:第一个条件:元素个数超过容量*加载因子,需要扩容,第二个条件,单链长度大于等于8,同时容量不够64则需要扩容,扩容过程有一个点需要注意:rehash过程。如果单链长度大于等于8但是容量已经到64,则将表中元素转换成树节点,并进化成红黑树
* HashMap的节点使用尾插法,1.7使用头插法,但是多线程操作可能引起环
* 为什么扩容是2倍== :方便计算 与 (16 . 32) ,hashmap效率就会提高(放置rehash和放置的效率提高,rehash的速率也会快)**,查找桶的速度提高
* ConcurrentHashMap底层原理
* 线程并同时兼顾效率的HashMap,在JUC包中
* 底层实现基本和HashMap一致,但是引入sync和CAS来保证了线程并发时的数据安全性。
* sync在头节点有值的使用sync,头节点没有值的时候,使用CAS
* 1.7使用的是分段锁,1.8使用sync和CAS
以上是关于Java集合中常见的面试题 (收藏+保存+offer拿到手软)的主要内容,如果未能解决你的问题,请参考以下文章