1. Java容器都有哪些?
Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
1. Collection:Java集合框架的根接口,定义了集合的基本操作。
2. List:有序、可重复的元素集合,支持索引访问。
3. ArrayList:基于动态数组实现的List,查询速度快,增删慢。
4. LinkedList:基于双向链表实现的List,增删速度快,查询慢。
5. Vector:类似于ArrayList,但线程安全,性能较差。
6. Stack:栈结构,先进后出。
7. Set:无序、不可重复的元素集合。
8. HashSet:基于HashMap实现的Set,元素无序、不重复。
9. LinkedHashSet:基于LinkedHashMap实现的Set,元素有序、不重复。
10. TreeSet:基于TreeMap实现的Set,元素有序、不重复,按自然顺序或自定义顺序排序。
11. Map:键值对集合,每个键对应一个值。
12. HashMap:基于哈希表实现的Map,键无序、不重复。
13. LinkedHashMap:基于哈希表和链表实现的Map,键有序、不重复。
14. TreeMap:基于红黑树实现的Map,键有序、不重复,按自然顺序或自定义顺序排序。
15. ConcurrentHashMap:线程安全的HashMap,支持高并发。
16. Hashtable:类似于HashMap,但线程安全,性能较差。
2. Collection 和 Collections 有什么区别?
Collection是Java集合框架的根 接口,所有的集合都是它的子类(如set、list这些),定义了基本的集合操作方法,如添加、删除、遍历 等。
Collections是一个有静态方法(不能被实例化)的包装类(就像一个工具类),操作方法有排序、查找等。
3. List、Set、Map 之间的区别是什么?
List是有序集合,允许存储重复元素;
Set是无序集合,不允许存储重复元素;
Map是键值对的映射,其中键值对是一一对应关系,一个键对应一个值。
map键不可以重复,值允许重复
4. HashMap 和 Hashtable 有什么区别?
HashMap是非线程安全的,允许有null键和值,效率较高
HashTable是线程安全的,不允许有null键和值,效率相对较低。
在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用 ,
推荐在单线程环境下使用HashMap替代,多线程使用ConcurrentHashMap 替代。
如何决定使用 HashMap 还是 TreeMap?
HashMap是用于 无序、高效的键值对存储。
TreeMap是用于按键有序存储,它能根据键的自然顺序或指定的比较器进行排序。
5. 说一下 HashMap 的实现原理?
HashMap基于Hash 算法实现的,通过 put(key,value)存储,get(key)来获取。
内部使用一个数组来存储对象,通过键的哈希码确定数组位置
当多个键映射到同一个位置时,也就是hash值相同的情况,称为hash冲突,可以使用链表或红黑树解决
当链表的长度大于8,且数组的长度大于64时,就会转成红黑树解决。
如果数组长度小于64时,会进行扩容操作,不会转成红黑树。
因为数组的长度较小,应该尽量避开红黑树。因为红黑树需要进行左旋,右旋,变色操作来保持平衡,所以当数组长度小于64,使用数组加链表比使用红黑树查询速度要更快、效率要更高。
6. ArrayList 和 LinkedList 的区别是什么?
ArrayList是基于动态数组(的数据结构)实现,通过索引访问元素 速度快,插入和删除元素较慢(影响数组内的其他数据的下标);
LinkedList是基于双向链表(的数据结构)实现,插入和删除元素速度快,但访问元素较慢(需要移动指针从前往后依次查找)。
也就是说,频繁读取的话,使用ArrayList,增加和删除比较多的话使LinkedList。
7. 如何实现数组和 List 之间的转换?
数组转 List:使用 Arrays. asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。
8. ArrayList 和 Vector 的区别是什么?
ArrayList是非线程安全的,在高并发环境下性能较好;
Vector是线程安全的,通过synchronized同步锁来保证线程安全,性能相对较低。
ArrayList 和 Vector 都会根据实际的需要动态的调整容量,Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
9. 集合Array和数组 ArrayList 有何区别?
Array 的空间大小是固定的,而 ArrayList 空间大小是自动扩展的。
Array 可以存储基本数据类型和对象,ArrayList 只能存储对象。
ArrayList的内置方法比Array多,比如添加、删除、遍历这些。
10. 哪些集合类是线程安全的?
Vector、Hashtable、Stack
Collections类下synchronized方法 生成的集合(synchronizedList、synchronizedSet、synchronizedMap),
以及在JDK1.5之后的ConcurrentHashMap这些
都是java中线程安全的集合类。
(像HashMap是非线程安全的,在JDK1.5之后随着Java. util. concurrent 并发包的出现,它们也有 了 自 己 对 应 的 线 程 安 全 类 , 比 如 HashMap 对 应 的 线 程 安 全 类 就 是ConcurrentHashMap)
11. 迭代器 lterator 是什么?
迭代器iterator是一种用于遍历集合元素的接口,允许调用者在迭代过程中移除元素。
取代了 Java 集合框架中的 Enumeration。
12. lterator 怎么使用?有什么特点?
通过调用集合的iterator()方法获取迭代器对象,然后使用hasNext()判断是否有下一个元素,使用next()获取下一个元素。
迭代器的特点是 只能单向遍历,不支持修改操作。更加安全,因为它可以确保,在当前遍历的集合元素被更改的时候,就会抛出ConcurrentModificationException 异常。
13. lterator 和 Listlterator 有什么区别?
iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
iterator 只能 单向遍历 集合,不支持 修改 操作;
ListIterator 是iterator的扩展,可以 双向遍历(向前/后遍历) 集合,支持在遍历中修改集合,还有添加、替换、获取前面或后面元素的索引位置。
14. 怎么确保一个集合不能被修改?
可以使用 Collections. unmodifiableCollection(Collection c) 方法创建一个只读集合,
这样改变集合的任何操作都会抛出 Java. lang. UnsupportedOperationException 异常。