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的地址了?
如果是这样的话 我就理解了。
不是的话 请回答
解决方案 »
- jsp文件下载,不提示“文件下载”对话框,直接打开下载文件!急。。。
- struts2 工程在 MyEclipse中可以,在Eclipse中不行,谁遇到过吗?
- 把项目从svn上下载硬盘再导进myEclipse就连不上svn什么
- 最新15个javaEE判断题2(T/F)
- 如果DAO实现的方法超出了Interface的方法该如何处理?
- 如何实现域名的范解析
- weblogic8.1+struts中文件上传的奇怪问题!
- 我都蒙了!
- 打包问题!怎样把n个EJB的jar包打到一个大包里,怎样在jbuilder中打ear的包?
- 请教一个j2ee的三层问题
- 505页面,怎么用jsp取到浏览器地址栏url?
- Java 反编译工具能准确无误的还原源代码吗?
new ArrayList 的时候 开辟的一个 空间 , 然后add(obj)的时候,list添加个指针, 就把指针指向obj的地址了
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);
}
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);
}
}