1. HashMap的底层实现
HashMap的底层数据结构是数组+链表的方式,在jdk1.8之后变成数组+链表+红黑树的形式;
数组的初始长度是16,负载因子默认为0.75,达到当前长度乘以负载因子长度时,进行扩容,每次扩容为原来的2倍;
当调用put方法时,通过对key进行hash运算,得到数组位置,判断是否有值,没有的话,直接放进去,有值的话,以单向链表的方式插入进去。当链表长度大于8个的时候,转化为红黑树,小于6个的时候会再转化为链表。
HashMap允许有一个key为null,多个value为null;
HashMap非线程安全的,可以使用Collections的synchronizedMap方法转为线程安全的Map,或者使用juc包下的ConcurrentHashMap;
new HashMap时,在已知大概的数据量的情况下,最好给上初始值,省去rehash的过程。
2. HashMap和Hashtable区别
HashMap非线程安全,key和值都允许为null;
Hashtable线程安全,key和值都不允许为null,大部分方法都加了synchronized,性能上要比HashMap低。
3. ConcurrentHashMap的底层实现
ConcurrentHashMap 在1.7采用分段锁,使用若干个Segment来实现减小锁粒度。1.8之后摒弃了segment的设计,直接针对的是Node[]数组的每一个桶。采用synchronized和cas来保证线程安全。sizeCtl来表示不同的状态,来控制table的初始化和扩容操作。
4. HashSet的底层实现
HashSet的底层就是HashMap,存放的值为HashMap的key,value存放一个固定的new Object()对象。
5. TreeSet的底层实现
TreeSet是Set子接口SortedSet的实现,可以保证元素的排序。主要依赖于元素实现Comparable接口或者Comparaor接口里面的方法来进行排序。
6. ArrayList和LinkedList的区别
两者都实现了List接口,都是非线程安全的。
ArrayList底层使用的是数组,LinkedList底层使用的是双向链表。相比之下,ArrayList查询快,增删慢、LinkedList增删快,查询慢。
ArrayList实现了RandomAccess空接口,代表具有快速随机访问的特点。
ArrayList的初始长度为10,每次扩容为原来的1.5倍;LinkedList为链表,没有初始长度。
ArrayList总体所占空间更大,因为数组上有空值。而LinkedList每个元素所占的空间更大,因为除了本节点的值以外,还有上一个和下一个节点的指针。
7. ArrayList和Vector的区别
ArrayList非线程安全的,Vector是线程安全的。
8. 数组、ArrayList怎么互转
数组转ArrayList:for循环、Arrays.asList(String[])、Collections.addAll(list,String[]);
ArrayList转数组:for循环、(String[]) list.toArray(new String[0])
9. ArrayList的自定义排序
实现comparable接口,重写compareTo方法,调用Collections.sort(list)方法;
实现comparaor接口,重写compare方法,直接当参数传入Collections.sort(list, new Comparator(){compare})方法中。
compareTo和compare方法里面参数,升序返正数;
10. Comparable和Comparator 接口是干什么的?列出它们的区别
Comparable在java.lang包下,实现了该接口的类,需要重写compareTo()方法,比较的逻辑放在类的代码中,会强制自然排序;
Comparator在java.util包下,需要重写compare()方法,比较的逻辑在Comparator实现类中,不在需要比较的类本身代码中。
11. 什么是迭代器(Iterator)?
Collention接口继承了Iterable接口,所有的集合都实现了该接口的iterator()方法,返回一个Iterator对象,可以用来遍历、删除集合中的元素。
12. Iterator 和 ListIterator 的区别是什么?
Iterator能遍历Set和List,ListIterator只能遍历List;
Iterator只能向前遍历元素,ListIterator继承了Iterator,除了向前遍历元素外,还有向后遍历、增加元素和替换元素。
13. 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
快速失败的迭代器会抛出 ConcurrentModificationException 异常,而安全失败的迭代器,是基于对底层集合做拷贝,不受源集合上修改的影响,永远不会抛出这样的异常。
14. 高并发中的集合有哪些问题
高并发的场景中,使用非线程安全的集合,会导致数据有异常问题。
除了用java.util下的Vector、Hashtable等线程安全的集合类、或者用Collections.synchronizedList/Map/Set方法外,更推荐使用JUC包下的线程安全的集合类。
List --> CopyOnWriteArrayList
Map --> ConcurrentHashMap
Set --> CopyOnWriteArraySet
等等
java集合
最新推荐文章于 2024-11-06 09:46:16 发布