0 0

关于java 中ArrayList愿码的不理解5

    
    public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!!调用ensureCapacity
	elementData[size++] = e;
	return true;
    }

    
      public void ensureCapacity(int minCapacity) {
	modCount++;
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object oldData[] = elementData;//为什么要用到oldDAte[]
	    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);
	}
    }


Object oldData[] = elementData我觉得没有必要啊?大家觉得呢?还是为了什么性能问题?
2009年4月21日 18:04

3个答案 按时间排序 按投票排序

0 0

采纳的答案

调用ensureCapacity  方法应该好理解的,就是说arraylist的内部实现其实也是数组。这样的话在动态的增长的话,一定要看看是不是会越界,要是有大于界点就要增大数组的长度,这样才能继续放更多的东西进来。ensureCapacity  正是实现了这种思想。

Object oldData[] = elementData;//为什么要用到oldDAte[]

乍一看来后面并没有用到关于oldData, 这句话显得多此一举!但是这是一个牵涉到内存管理的类, 所以要了解内部的问题。 而且为什么这一句还在if的内部,这跟elementData = Arrays.copyOf(elementData, newCapacity); 这句是有关系的,下面这句Arrays.copyOf的实现时新创建了newCapacity大小的内存,然后把老的elementData放入。好像也没有用到oldData,有什么问题呢。问题就在于旧的内存的引用是elementData, elementData指向了新的内存块,如果有一个局部变量oldData变量引用旧的内存块的话,在copy的过程中就会比较安全,因为这样证明这块老的内存依然有引用,分配内存的时候就不会被侵占掉,然后copy完成后这个局部变量的生命期也过去了,然后释放才是安全的。不然在copy的的时候万一新的内存或其他线程的分配内存侵占了这块老的内存,而copy还没有结束,这将是个严重的事情。

2009年4月21日 19:37
0 0

楼上的,学习了!哈哈!

2009年4月21日 20:50
0 0

为什么不要这行代码,
Object oldData[] = elementData;这行用来存放当前的数组,
ensureCapacity()用来增加数组的容量,
要知道elementData数组对象是定长的,长度不可变,

2009年4月21日 18:45

相关推荐

    关于java的ArrayList的小例子

    关于java的ArrayList的小例子

    Java中ArrayList的使用方法以及与vector的对比

    Java 中 ArrayList 的使用方法以及与 Vector 的对比 ArrayList 是 Java 中的一种动态数组,它提供了很多有用的特性,例如动态地增加和减少元素,实现了 ICollection 和 IList 接口,灵活的设置数组的大小等。下面...

    Java中ArrayList的removeAll方法详解

    例如,在上面的示例代码中,removeAll方法的执行时间需要4分钟左右,这是不可接受的。 3. 优化removeAll方法 为了优化removeAll方法的性能,可以使用迭代器遍历ArrayList中的元素,然后使用HashSet的contains方法...

    java中ArrayList 、LinkList区别.doc

    在Java编程语言中,ArrayList和LinkedList都是集合框架中两种重要的数据结构,它们分别基于不同的底层实现,具有不同的特性和性能特点。以下是对这两个类的详细分析: 1. **ArrayList 实现**: - ArrayList 实现了...

    java中ArrayList的用法

    ### Java中ArrayList的用法详解 #### 一、概述 `ArrayList`是Java集合框架中的一个动态数组类,它能够存储任意类型的对象,并且在运行时动态调整其大小。这使得`ArrayList`成为处理数量未知的数据集合时的一个非常...

    java中对ArrayList进行排序

    java中对ArrayList进行排序的方法参考

    Java中ArrayList的使用方法简单介绍

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,属于List接口的实现类。ArrayList主要用于存储一组有序的、可变大小的对象序列。它的特点是允许快速的随机访问,但插入和删除元素时效率相对较低,因为...

    模拟java ArrayList Iterator

    在Java编程语言中,ArrayList是集合框架中的一种重要数据结构,它是一个动态数组,可以存储任意类型的对象。ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们...

    Java中ArrayList类的用法.docx

    ### Java中ArrayList类的用法详解 #### 一、ArrayList的概念 `ArrayList`是Java集合框架中的一个重要组成部分,它提供了一种类似于数组的数据结构,但与传统的数组相比,`ArrayList`具有更多的灵活性。它可以动态地...

    Java中ArrayList类的用法.pdf

    Java中的ArrayList类是Java集合框架的一部分,它是基于数组实现的可变大小的列表。ArrayList类在编程中扮演着重要角色,因为它提供了动态增加和减少元素的能力,这比传统的固定大小的数组更加灵活。ArrayList实现了...

    试谈Java中ArrayList类的使用.pdf

    "Java 中 ArrayList 类的使用" Java 中的 ArrayList 类是一种常用的数据结构,它可以实现可变长度的数组。ArrayList 类提供了多种方法来操作数组中的元素,包括添加、删除、获取、设置、查找等。 构造方法 ...

    用java自己实现的arrayList

    用java自己实现的arrayList,比较详细,有助于初学者理解arrayList的基本概念和基础用法

    跟我学Java-day14-ArrayList集合.pdf

    1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 底层是数组实现的,长度可以变化 泛型的使用 用于约束集合中存储元素的数据类型 ...

    Java中ArrayList和Vector的区别共2页.p

    在Java编程语言中,ArrayList和Vector是两种常用的动态数组实现,它们都属于集合框架的一部分,用于存储和操作对象。虽然它们在用途上相似,但在性能、线程安全性和同步机制等方面存在显著区别。以下是关于ArrayList...

    jni操作arraylist对象

    首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小的有序对象列表。ArrayList通过数组来存储元素,因此可以快速访问任意位置的元素,但插入...

    Java员工管理系统,ArrayList存储

    这个“Java员工管理系统,ArrayList存储”的项目是一个很好的实践案例,可以帮助开发者深入理解Java集合框架,特别是ArrayList的使用,同时也能提升面向对象编程和系统设计的能力。通过完成这个项目,开发者可以学习...

    java关键字ArrayList详解

    ArrayList是Java集合框架中的一种重要实现,它是List接口的一个具体类,主要特点是基于数组实现,提供了灵活的元素存储和操作。ArrayList支持动态扩容,可以根据需要自动增加数组的大小,这使得在不知道确切元素数量...

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

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

    java ArrayList集合的应用

    用java语言编写一个程序实现学员成绩管理,每个学员包括3门课的成绩,从键盘输入学员信息, 包括学号、姓名、三门课成绩,计算出学员的平均成绩,按照学员平均成绩由大到小排序 插入功能:在排序后的学员成绩表中...

Global site tag (gtag.js) - Google Analytics