Java面试整理-基础篇8.集合1

1.Java中常见的集合及其关系?


Java面试整理-基础篇8.集合1


2.ArrayList、LinkedList、Vector的区别?

1. LinkedList、ArrayList、Vector都是List接口的子类;LinkedList基于双向链表实现,ArrayList、Vector基于数组实现。

2. ArrayList采用懒加载模式,在第一次添加元素时,初始化内部数组,初始大小为10,扩容大小为原先为1.5倍,采用异步处理,线程不安全,性能较高,在大部分场景下适用。

3. Vector在产生对象时,初始化一个大小为10的内部数组、扩容为原先的2倍,采用synchronized修饰常用的crud方法,线程安全,性能较低(读读互斥)。

4. ArrayList和LinkedList由于实现原理的不同(双向链表和数组),常见的插入删除在尾部时使用ArrayList比较快,在指定位置的时候使用LinkedList。


3.通过Collections.SynchornizedList、Vector的区别?

1. 通过
Collections.synchronizedList()方法可以将线程不安全的List转成线程安全的List。

2.
Collections.SynchronizedList使用了委托(delegation),实质上存储使用的是构造时传入的list,只是将list作为底层存储。
Collections.SynchronizedList使用synchronized代码块对mutex对象加锁,mutex对象可以通过构造函数传入,也就是可以指定锁定的对象。

3. Vector则是对整个方法使用了synchronized,所以不能对同步进行细粒度的控制。而且同步方法加锁的是this对象,没办法控制锁定的对象。

4. 由于
Collections.SynchronizedList比Vector多了一层封装,所以Vecgor比
Collections.SynchronizedList的效率略高。


4.Set和List的区别?

1. List允许插入重复的元素,Set不允许重复元素。

2. List是有序集合,会保留元素插入时的顺序,Set是无序集合。

3. List可以通过下标来访问,Set不能。


5.Set是如何保证元素不重复的?

Set根据实现方式主要分为两大类,HashSet和TreeSet。

1. HashSet是由哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。

2. TreeSet是由二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。


6.Collection和Collections的区别

1. java.util.Collection是一个集合接口(集合类的顶级接口)。提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

2. Collections则是集合类的一个工具类,提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。


7.Arrays.asList获得的List使用时有什么需要注意的?

1. 在使用Arrays.asList()后调用add,remove这些method时出现
java.lang.UnsupportedOperationException。因为Arrays.asList()返回的是java.util.Arrays$ArrayList而不是ArrayList。

2. Arrays$ArrayList和ArrayList都继承AbstractList,而remove,add等method在AbstractList中默认实现仅有`throw new
UnsupportedOperationException();`而不做其他处理。ArrayList继承AbstractList后重写(override)了这些方法,而Arrays$ArrayList则是保留了默认实现抛出
java.lang.UnsupportedOperationException。
## 附言

* 转载请注明出处

* 更多文章,请关注公众号《百育科技》,公众号会定期按系列整理文章



分享到:


相關文章: