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。

posted @ 2019-12-16 18:18  前进山峦  阅读(520)  评论(0编辑  收藏  举报