`
bloodwolf_china
  • 浏览: 131307 次
社区版块
存档分类
最新评论

ArrayList,LinkedList使用场景及性能说明

 
阅读更多
   Java面试中关于容器类List,Set是必问题目。但在我的面试经历中很难遇到满意的答复。大部分只能了解其大概使用方法,对其内部结构缺乏了解,错误的使用方式会导致性能大幅下降。
   首先介绍ArrayList,顾名思义内部数据结构是数组
   private transient Object[] elementData;
   private int size;
   public ArrayList(int initialCapacity){
   }

   在增加元素时,若容量不足进行扩充
    public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1;
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
	}
    }

   新数组大小为之前数组大小*1.5+1 ,加上1保证oldCapacity为1的情况也能扩充为2
  (类似分页时总页数=(总记录数+ (每页记录数-1))/每页记录数算法)

   删除元素时通过 System.arraycopy把删除位置后的所有元素前移一个位置实现
public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved);
	elementData[--size] = null; // Let gc do its work

	return oldValue;
    }

 
 
  LinkedList大家都知道是通过链表实现,内部是一个双向链表
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    private transient Entry<E> header = new Entry<E>(null, null, null);
    private transient int size = 0;
}
private static class Entry<E> {
	E element;
	Entry<E> next;
	Entry<E> previous;
}

插入和删除都只要改动前后节点的next和previous实现

总结特点如下:
类型内部结构顺序遍历速度随机遍历速度追加代价插入代价删除代价占用内存
ArrayList数组
LinkedList双向链表

所以:
  • 一般顺序遍历情况下使用ArrayList,但注意构造函数中设置初始大小
  • 尽量不对ArrayList进行插入或删除操作(删除尾部除外),若有多次删除/插入操作又有随机遍历的需求,可以再构建一个ArrayList,把复合条件的对象放入新ArrayList,而不要频繁操作原ArrayList
  • 经常有删除/插入操作而顺序遍历列表的情况下最适合使用LinkedList


 
分享到:
评论

相关推荐

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、...而Vector虽然提供了线程安全,但其性能通常低于ArrayList和LinkedList,更适合于多线程环境且对性能要求不那么敏感的应用。在实际开发中,选择哪种数据结构应根据具体需求来决定。

    ArrayList LinkedList Vector区别

    LinkedList、ArrayList、Vector 都实现了 List 接口,它们在实际应用中有不同的使用场景。LinkedList 可以被用作堆栈、队列或双向队列,ArrayList 可以用于实现大规模数据存储,Vector 可以用于实现线程安全的数据...

    ArrayList LinkedList Vector性能对比

    5. **API使用**:ArrayList和LinkedList提供了相似的操作方法,如add、remove、get等,但在内部实现上有所不同,这可能影响到它们在不同场景下的性能表现。 在实际开发中,应根据应用需求和性能测试结果来选择最...

    ArrayList和Linkedlist1

    总的来说,理解ArrayList和LinkedList的基本特性和应用场景,以及如何处理与之相关的安全性问题,是Java程序员必备的知识。通过深入学习和实践,可以更好地利用这些数据结构提升程序效率和质量。

    ArrayList和LinkedList区别及使用场景代码解析

    ArrayList和LinkedList都是Java集合框架中的重要成员,它们都是List接口的实现类,但它们在实现机制、性能和使用场景等方面存在着很大的差异。 ArrayList ArrayList是基于数组实现的,其构造函数为: ```java ...

    关于arraylist和linkedList的区别

    ### 关于ArrayList与LinkedList的区别 在Java编程语言中,`ArrayList`与`...综上所述,在选择使用`ArrayList`还是`LinkedList`时,需要根据具体的使用场景和需求来决定,以便在内存占用、操作速度等方面达到最佳平衡。

    Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度1

    在 Java 中,ArrayList 和 LinkedList 是两种常用的集合类,它们各自具有不同的特性和适用场景,主要体现在数据结构、访问效率和操作性能上。 1. 数据结构: - ArrayList 实现了一个动态数组,它内部是一个 Object...

    51. ArrayList LinkedList Set HashMap介绍.txt

    - **性能**:由于 `Vector` 的同步机制,它的性能通常低于 `ArrayList`。除非特别需要线程安全性,否则推荐使用 `ArrayList`。 - **扩容策略**:`Vector` 默认的扩容比例是 2 倍,而 `ArrayList` 是 1.5 倍。这意味...

    合理运用ArrayList与LinkedList

    在Java的集合框架中,ArrayList和LinkedList是两种常用的列表实现,它们都实现了List接口,但它们在内存管理和操作效率上存在显著差异。了解这些差异并根据具体应用场景选择合适的列表类型,能够有效提升J2EE应用...

    Java中ArrayList和LinkedList区别

    在Java编程语言中,ArrayList和LinkedList...总之,ArrayList和LinkedList各有优缺点,选择哪种取决于具体的应用场景和性能需求。在实际开发中,理解这两种数据结构的特性并据此进行选择,可以显著提高代码的执行效率。

    比较ArrayList、LinkedList、Vector1

    【ArrayList、LinkedList、Vector对比...以上就是ArrayList、LinkedList和Vector的主要特性及使用场景的对比。在实际应用中,应根据具体需求来选择适合的数据结构。在处理大量数据或频繁操作时,性能差异会更加显著。

    ArrayList Vector LinkedList 区别与用法.

    本文将深入探讨ArrayList、Vector和LinkedList三种集合类的特点与使用场景,帮助开发者更好地理解它们之间的差异。 #### 一、ArrayList与Vector **1. 存储方式** - **ArrayList** 和 **Vector** 都采用动态数组的...

    arraylist-linkedlist-test.zip

    通过"arraylist-linkedlist-test.zip"中的测试结果,我们可以量化分析两种数据结构在不同场景下的性能表现,以帮助选择在实际项目中更适合的集合类型。在选择ArrayList或LinkedList时,应根据应用的需求(如插入、...

    ArrayList-LinkedList-源码.rar

    本篇将深入探讨ArrayList和LinkedList的内部实现机制,通过源码分析来揭示它们在性能、使用场景以及内存管理上的差异。 ArrayList是基于动态数组实现的,它的底层数据结构是一个Object[]数组。当我们向ArrayList中...

    java 中ArrayList与LinkedList性能比较

    ArrayList与LinkedList性能比较在java中 ArrayList和LinkedList是java中两个常用的实现List接口的类,它们之间的性能比较是一个非常重要的知识点。 首先,让我们来了解ArrayList和LinkedList的实现原理。ArrayList...

    对比Vector、ArrayList、LinkedList1

    在Java集合框架中,Vector、ArrayList和LinkedList是三种常见的List接口实现类,它们各自具有不同的特点和适用场景。下面我们将详细对比这三个类的区别。 1. **Vector** - **线程安全**:Vector是线程安全的,因为...

    Map+List+ArrayList+LinkedList Java源码

    Java编程语言中的`Map`, `List`, `ArrayList` 和 `LinkedList` 是四个核心的数据结构,它们在实际开发中被广泛使用。了解它们的源码对于深入理解Java集合框架的内部工作原理至关重要,尤其是对初学者而言,这有助于...

    ArrayList 和LinkedList各自的特点是什么

    ### ArrayList与LinkedList的特点详解 #### 一、ArrayList的特点 **1. 内部结构:** - **基于数组实现**:`ArrayList`本质上是基于动态数组实现的集合类,内部使用了一个`Object[]`类型的数组来存储元素。这种...

Global site tag (gtag.js) - Google Analytics