目录
1.java有哪些常用的容器(集合)
Java集合容器分为Collection 和 Map 两大类,他们各自都有很多子类。
2.List 和 Map、Set 的区别
List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
- List中存储的数据是有顺序的,并且值允许重复;
- Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;
- Set中存储的数据是无顺序的,并且不允许重复。
3.ArrayList与Linklist的区别
ArrayList:基于动态数组非线程安全的集合,可以连续内存存储,适合下标访问(随机访问),但是增删元素慢。扩容机制:使用数组实现,无参构造函数默认初始化长度为10,数组扩容是会将原数组中的元素重新拷贝到新数组中,长度为原来的1.5倍(扩容代价高)。
Linklist:基于链表实现的非线程安全的集合,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询。扩容机制::LinkedList不存在扩容问题,新增元素放到集合尾部,修改相应的指针节点即可。
LinkedList比ArrayList更占内存。因为LinkedList为每一个节点存储了两个引用节点。一个指向前一个元素,一个指向下一个元素。
4.ArrayList和Vector的联系与区别
相同点:
底层都使用数组实现。
功能相同,实现增删改查等操作的方法相似。
长度可变的数组结构。
不同点:
Vector是早期JDK版本提供,ArrayList是新版本替代Vector的。
Vector的方法都是同步的,线程安全:ArrayList非线程安全,但性能比Vector好。
默认初始化容量都是10,Vector扩容默认会翻倍,可指定扩容的大小:ArrayList只增加50%。
5.迭代器Iterator是什么
- 首先说一下迭代器模式,它是 Java 中常用的设计模式之一。用于顺序访问集合对象的元素,无需知道集合对象的底层实现。
- Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。
- 缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。
6.HashMap与Hashtable有什么区别
1.区别 :
- HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;
- HashMap允许key和value为null,而HashTable不允许
- 父类不同:HashMap继承自AbstractMap; Hashtable 继承自 Dictionary。
- 扩容机制:它们两个默认初始大小和扩容方式不同。HashMap默认初始大小16.容量必须是2的整数次幂,扩容时将容量变为原来的2倍:Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1
- 计算key的hash值,二次hash然后对数组长度取模,对应到数组下标;
- 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组,
- 如果产生hash冲突,先进行equal比较,相同则取代该元素,不同,则判断链表高度插入链表;
- 链表高度达到8,并且数组长度到64则转变为红黑树,长度低于6则将红黑树转回链表。
7.说一下HashMap的底层原理
- HashMap是Java程序员使用频率最高的用于映射键值对(key和value)处理的数据类型,它是基于Hash算法实现,通过put(key,value)存储,get(key)来获取value;
- 当传入 key时,HashMap会根据key,调用 hash(Object key)方法,计算出hash值,根据 hash 值将value保存在Node对象里,Node对象保存在数组里;
- 当计算出的 hash 值相同时,称之为 hash 冲突,HashMap的做法是用链表和红黑树存储相同hash 值的value;
- 当hash冲突的个数:小于等于8使用链表:大于8且tablength大于等于64时,使用红黑树解决链表查询慢的问题。
8.说一下HashSet的实现原理
- HashSet是基于HashMap实现的查询速度特别快。
- HashMap是支持key为null值的,所以 HashSet支持添加null值。
- HashSet存放自定义类时,自定义类需要重写 hashCode()和equals()方法,确保集合对自定义类的对象的唯一性判断(具体判断逻辑,见 HashMapput()方法,简单概括就是key进行哈希。判断元素hash值是否相等、key是否为同个对象、key是否equals。第1个条件为 true,2、3有一个为true,HashMap即认为 key相同)。
- 无序、不可重复。
9.哪些集合类是线程安全
1、Vector:就比arraylist多了个同步化机制(线程安全),性能低
2、Statck:堆栈类,先进后出。
3、Hashtable:就比hashmap多了个线程安全。
4、enumeration:枚举,相当于迭代器。
10. 如何实现数组与List之间转换
数组转 List:使用 Arrays. asList(array) 进行转换
List 转数组:使用 List 自带的 toArray() 方法。无参toArray方法返回Object数组,传入初始化长度的数组的对象,返回该对象数组。