1.为什么要使用集合?
当我们需要存储一组类型相同的数据的时,我们首先想到的存储容器就是数组,但是使用数组存储对象的话就存在一定的弊端,因为在实际的开发过程中,我们需要存储的数据类型是多种多样的,而数组的缺点也是十分明显的,其一数组的长度一旦声明不可改变,其二声明数组时的数据类型直接会直接决定该数组将要存储的数据的类型,其三数组存储的数据时有序可重复的。但是集合就不一样了,集合的类型多种多样,存储数据也是十分灵活,Java集合可以存储有序可重复的元素,也可以存储有序不可重复的元素,也可以存储无序不可重复的元素,也可以存储键值对类型的元素,还可以存储不同类型不同数量的对象。
2.33Array和ArrayList有何区别?什么时候更适合用Array?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
1.如果列表的大小已经指定,大部分情况下是存储和遍历它们。
2.对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
3.如果你要使用多维数组,使用[][]比List<List<>>更容易。
3.ArrayList和LinkedList有何区别?
ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。
1.ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。
2.与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。
3.LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。
4.哪些集合类是线程安全的?
Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。