use*_*871 4 java clone equals arraylist object
对于下面的类,我理解c1.equals(c3)返回false c1.clone()会创建指向同一对象的不同引用.但为什么carList1.equals(carList2)回归真实?为什么它不同c1.equals(c3)?提前谢谢了!
class Car implements Cloneable {
private String plate;
private double maxSpeed;
public Car(String lp, double max) {
license = lp;
maxSpeed = max;
}
public static void main(String[] args) throws Exception{
Car c1 = new Car("ABC123", 150.0);
Car c2 = new Car("ABC123", 150.0);
Car c3 = (Car) c1.clone();
ArrayList<Car> carList1 = new ArrayList<Car>();
carList1.add(c1);
carList1.add(c2);
ArrayList carList2 = (ArrayList) carList1.clone();
}
}
Run Code Online (Sandbox Code Playgroud)
clone的ArrayList执行浅表复制,也就是说,它并不克隆包含内的元素ArratList,它只是复制引用.这就是为什么equals返回true,因为它不比较ArrayList对象的引用,它比较列表中的元素.
public Object clone()
返回此ArrayList实例的浅表副本.(元素本身不会被复制.)
public boolean equals(Object o)
将指定对象与此列表进行比较以获得相等性.当且仅当指定的对象也是列表时,返回true,两个列表具有相同的大小,并且两个列表中的所有对应元素对都相等.(如果(e1 == null?e2 == null:e1.equals(e2)),则两个元素e1和e2相等.)换句话说,如果两个列表包含相同顺序的相同元素,则它们被定义为相等.
另一方面,Car假设你没有覆盖它的equals方法只是比较成员,使用Object :: equals的默认实现,它比较对象引用,因此克隆的Car不等于原始的.
| 归档时间: |
|
| 查看次数: |
2513 次 |
| 最近记录: |