ArrayList与LinkedList常见的问题
Posted caoxixi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList与LinkedList常见的问题相关的知识,希望对你有一定的参考价值。
Question1: 常见的List类有哪些,它们分别有什么区别?
答:常见的有ArrayList,Vector,LinkedList等。ArrayList底层是数组组成,Vector是线程安全的ArrayList类。LinkedList底层是由链表组成。ArrayList与Vector的区别,扩容上面ArrayList是扩容1.5倍,而Vector是扩容两倍。Vector是线程安全的使用synchronized关键字来保证线程安全,但是效率更低。
Question2: ArrayList是如何增加容量的?
答: 当存入数据到ArrayList中去的时候,都需要检查容量是否够,如果够的话,直接存入即可。如果不够的话,就会启动扩容机制,首先扩容至原容量的1.5倍大小,判断是否足够,如果不够就按照当前的容量扩容。当前的容量需要判断是否小于最大的容量(Integer.MAX_VALUE-8),如果不小于,则扩容至最大的容量,Integer的最大值。
Question3:ArrayList和LinkedList在实际应用中应该如何选择?
答:ArrayList实现了RandomAccess接口,支持快速随机访问,访问的速度很快,而ArrayList在增加和删除元素的时候,每次增加或者删除一个元素,由于是数组实现的,所有的数据都需要移动n次(就是用System.arrayCopy实现的),这是一种极为消耗资源的操作。但是LinkedList就不同,LinkedList底层是链表实现的,增加和删除元素较快,查找的话比较慢。所以一般在实际应用中,如果涉及到大量的查找的话,使用ArrayList,涉及到大量的增删操作的话,建议使用LinkedList。
ArrayList与LinkedList都允许存储null也允许存储重复元素。不要使用for循环遍历LinkedList,效率很低。
Question5: Arrays.asList之后获得的集合能够扩容吗?
答:不能扩容,因为这样获取到的一个集合是final的。所以不能够扩容或者修改
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
Question6:LinkedList与ArraysList对比有哪些不足?
答: 除了查找比较慢之外,在LinkedList中每个元素都存有一个向前的指针和一个向后的引用,更占用内存。
Question7:数组Array与ArrayList有什么区别,分别适用什么场景?
答: Array是长度不能改变的数组,ArrayList是长度可以改变的数组,Array中可以存储基本类型和对象,ArrayList中只能存储对象。如果知道数组容量的大小可以使用Array,如果不知道容量的话,可以使用ArrayList。
以上是关于ArrayList与LinkedList常见的问题的主要内容,如果未能解决你的问题,请参考以下文章
ArrayList 和 LinkedList 到底有哪些区别?