list.add方法的内存原理

leavin521 2010-02-25 02:45:39

public static void testForProblem() {
// 一些朋友在向循环里向列表增加对象的时候
// 经常忘记初始化,造成最终加入的都是同一个对象
List<MyObject> list = new ArrayList<MyObject>();
MyObject obj = new MyObject();
for (int i = 1; i <= 5; i++) {
obj.setName("Name" + i);
list.add(obj);
}
// 里面的数据都是最后一个
showList(list); // [Name5, Name5, Name5, Name5, Name5]

// 正确的做法
List<MyObject> list2 = new ArrayList<MyObject>();
MyObject obj2 = null;
for (int i = 1; i <= 5; i++) {
obj2 = new MyObject();
obj2.setName("Name" + i);
list2.add(obj2);
}
showList(list2); // [Name1, Name2, Name3, Name4, Name5]
}
/**
* 显示List里面的数据。
*
* @param list
*/
private static void showList(List list) {
System.out.println(Arrays.toString(list.toArray()));
}
}

class MyObject {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

/**
* 重写toString方法,输出name
*/
public String toString() {
return name;
}


我想知道 add 方法 在 内存中是如何运行的。
是不是在 new ArrayList 的时候 开辟的一个 空间 , 然后add(obj)的时候,list添加个指针, 就把指针指向obj的地址了?
如果是这样的话 我就理解了。
不是的话 请回答
...全文
520 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leavin521 2010-02-26
  • 打赏
  • 举报
回复
没有人回答啦?
那我结贴了~
xieyueping 2010-02-25
  • 打赏
  • 举报
回复
right 回复内容太短了!
chaozeng 2010-02-25
  • 打赏
  • 举报
回复
首先开辟了数组初始化时的大小空间,然后把引用指向各个地址
leavin521 2010-02-25
  • 打赏
  • 举报
回复

public void add(int index,
E element)

{
rangeCheckForAdd(index);
ensureCapacity(size+1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
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);
}
}
luffyke 2010-02-25
  • 打赏
  • 举报
回复
楼主理解正确,只维护指针就对了
leavin521 2010-02-25
  • 打赏
  • 举报
回复
引用 5 楼 soulx 的回复:
在new ArrayList()时开辟了一个默认是10的ArrayList()空间

如果ADD后的长度大于现有ArrayList SIZE的长度,则增加一部分空间。

source code如下

Java codeint oldCapacity= elementData.length;if (minCapacity> oldCapacity) {
Object oldData[]= elementData;int newCapacity= (oldCapacity*3)/2+1;//增加空间if (newCapacity< minCapacity)
newCapacity= minCapacity;//如果增加的空间还不能满足,则用新的空间(可能是针对ADD(list)的情况) elementData= (E[])new Object[newCapacity];
System.arraycopy(oldData,0, elementData,0, size);
}

看源码好累哦
soulx 2010-02-25
  • 打赏
  • 举报
回复
在new ArrayList()时开辟了一个默认是10的ArrayList()空间

如果ADD后的长度大于现有ArrayList SIZE的长度,则增加一部分空间。

source code如下


int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3)/2 + 1;//增加空间
if (newCapacity < minCapacity)
newCapacity = minCapacity;//如果增加的空间还不能满足,则用新的空间(可能是针对ADD(list)的情况)
elementData = (E[])new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
z649010333 2010-02-25
  • 打赏
  • 举报
回复
楼主理解是对滴
new ArrayList 的时候 开辟的一个 空间 , 然后add(obj)的时候,list添加个指针, 就把指针指向obj的地址了
wanli209 2010-02-25
  • 打赏
  • 举报
回复
指针啊 不是C里面的概念吗

leavin521 2010-02-25
  • 打赏
  • 举报
回复
引用 1 楼 norwolfli 的回复:
是这样的!只维护引用就好了!

Tks
南南北北 2010-02-25
  • 打赏
  • 举报
回复
是这样的!只维护引用就好了!

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧