1.Java中常见的集合及其关系?
2.ArrayList、LinkedList、Vector的区别?
- LinkedList、ArrayList、Vector都是List接口的子类;LinkedList基于双向链表实现,ArrayList、Vector基于数组实现。
- ArrayList采用懒加载模式,在第一次添加元素时,初始化内部数组,初始大小为10,扩容大小为原先为1.5倍,采用异步处理,线程不安全,性能较高,在大部分场景下适用。
- Vector在产生对象时,初始化一个大小为10的内部数组、扩容为原先的2倍,采用synchronized修饰常用的crud方法,线程安全,性能较低(读读互斥)。
- ArrayList和LinkedList由于实现原理的不同(双向链表和数组),常见的插入删除在尾部时使用ArrayList比较快,在指定位置的时候使用LinkedList。
3.通过Collections.SynchornizedList、Vector的区别?
- 通过Collections.synchronizedList()方法可以将线程不安全的List转成线程安全的List。
- Collections.SynchronizedList使用了委托(delegation),实质上存储使用的是构造时传入的list,只是将list作为底层存储。Collections.SynchronizedList使用synchronized代码块对mutex对象加锁,mutex对象可以通过构造函数传入,也就是可以指定锁定的对象。
- Vector则是对整个方法使用了synchronized,所以不能对同步进行细粒度的控制。而且同步方法加锁的是this对象,没办法控制锁定的对象。
- 由于Collections.SynchronizedList比Vector多了一层封装,所以Vecgor比Collections.SynchronizedList的效率略高。
4.Set和List的区别?
- List允许插入重复的元素,Set不允许重复元素。
- List是有序集合,会保留元素插入时的顺序,Set是无序集合。
- List可以通过下标来访问,Set不能。
5.Set是如何保证元素不重复的?
Set根据实现方式主要分为两大类,HashSet和TreeSet。
- HashSet是由哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
- TreeSet是由二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。
6.Collection和Collections的区别
- java.util.Collection是一个集合接口(集合类的顶级接口)。提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
- Collections则是集合类的一个工具类,提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
7.Arrays.asList获得的List使用时有什么需要注意的?
- 在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException。因为Arrays.asList()返回的是java.util.Arrays$ArrayList而不是ArrayList。
- ArraysArrayList则是保留了默认实现抛出java.lang.UnsupportedOperationException。
附言
- 转载请注明出处
- 更多文章,请关注公众号《百育科技》,公众号会定期按系列整理文章