Java clone()和equals()检查

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)

Era*_*ran 6

cloneArrayList执行浅表复制,也就是说,它并不克隆包含内的元素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不等于原始的.

  • @ user3735871在您链接的问题中,比较的对象是数组,而不是ArrayLists.ArrayList重写Object的`equals`方法,而array不重写.这就是不同行为的原因. (2认同)