Java中集合list的add方法添加的不是值COPY而是地址

测试代码如下:

package test;

import java.util.ArrayList;
import java.util.List;

class Point {
int x;
int y;

public Point(int x,int y)
{
this.x = x;
this.y = y;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

}

public class TestListAdd {
public static void main(String[] args)
{
List<Point> storePointList = new ArrayList<Point>();
Point testPoint = new Point(3,4);
storePointList.add(testPoint);
System.out.println("x = " + storePointList.get(0).getX() + ", y = " + storePointList.get(0).getY());
testPoint.setX(8);
System.out.println("x = " + storePointList.get(0).getX() + ", y = " + storePointList.get(0).getY());
}
}

结果为:

x = 3, y = 4
x = 8, y = 4

也即:

在add进storePointList之后,修改原来的testPoint 中的值,仍将改变storePointList中对应元素的值,可以看出add中()的只是传地址。

在这一点上和一般的java方法传参是一致的。一般java传参传的同样是地址。

可以总结出一个规律:在java中凡是对对象(或者说对象名)进行的传参传的都是地址。这是在方法体内部通过传进来的参数更改其下的属性可行的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Java泛型的深复制,可以使用Java的序列化和反序列化机制,具体步骤如下: 1. 实现Serializable接口,将泛型类标记为可序列化。 2. 将泛型类的实例写入ObjectOutputStream对象。 3. 从ObjectInputStream对象读取泛型类的实例。 以下是一个示例代码: ``` import java.io.*; public class DeepCopy<T extends Serializable> { public static <T extends Serializable> T copy(T obj) throws IOException, ClassNotFoundException { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); } } ``` 使用通配符在Java复制泛型集合,可以使用Java的通配符来解决类型转换的问题。以下是一个示例代码: ``` import java.util.ArrayList; import java.util.List; public class CopyList { public static void copy(List<? extends Number> src, List<? super Number> dest) { dest.addAll(src); } public static void main(String[] args) { List<Integer> src = new ArrayList<>(); src.add(1); src.add(2); List<Number> dest = new ArrayList<>(); copy(src, dest); System.out.println(dest); } } ``` 在这个示例copy()方法使用了通配符来表示src和dest可以是任何类型的List,只要它们的元素类型是Number或Number的子类即可。在方法,可以将src的元素复制到dest,因为dest的元素类型是Number或Number的父类,可以接受任何Number类型的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值