前人栽树,后人乘凉,吃水不忘挖井人
原创作者:Java比较两个对象并获取其中不相等的字段.
原创作者:彻底理解Java深克隆和浅克隆的原理及实现.
1.Java对象比较
原创提倡我们,复杂繁琐的问题就要简单化,少加班,老婆孩子热炕头
这个包和原创的名字有点眼熟,😄😄
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>equator</artifactId>
<version>1.0.3</version>
</dependency>
准备好了吗,开撸
Equator equator = new GetterBaseEquator();
User user1 = new User(...);
User user2 = new User(...);
// 判断属性是否完全相等
equator.isEquals(user1, user2);
// 获取不同的属性
List<FieldInfo> diff = equator.getDiffFields(user1, user2);
————————————————
版权声明:本文为CSDN博主「dadiyang」的原创文章
2.浅克隆(ShallowClone)和深克隆(DeepClone)
这个图,超级Nice
核心思想
浅克隆是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深克隆不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
2.1浅克隆代码
import lombok.Data;
@Data
public class Address implements Cloneable {
private int id;
private String address;
public Address() {
}
public Address(int id, String address) {
this.id = id;
this.address = address;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
import lombok.Data;
@Data
public class Person implements Cloneable{
private int id;
private String name;
private Address address;
public Person() {
}
public Person(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
public Object clone() throws CloneNotSupportedException {
Person person = (Person)super.clone();
return person;
}
}
测试
@Test
void contextLoads() throws CloneNotSupportedException {
Address address = new Address(1,"广东省东莞市");
Person person = new Person(1,"Tom",address);
Person person1 = (Person)person.clone();
person1.setId(2);
person1.getAddress().setId(2);
System.out.println(person);
System.out.println(person1);
}
Pserson有克隆,但是引用没克隆,一旦修改,将原来的也改变了
Person(id=1, name=Tom, address=Address(id=2, address=广东省东莞市))
Person(id=2, name=Tom, address=Address(id=2, address=广东省东莞市))
2.2深克隆代码
深克隆就是多了一步,将他的引用也要克隆
Address类和测试代码公用
@Data
public class Person implements Cloneable{
private int id;
private String name;
private Address address;
public Person() {
}
public Person(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
public Object clone() throws CloneNotSupportedException {
Person person = (Person)super.clone();
person.setAddress((Address) person.getAddress().clone());
return person;
}
}
Person和Address都有克隆,没有改变原来的
Person(id=1, name=Tom, address=Address(id=1, address=广东省东莞市))
Person(id=2, name=Tom, address=Address(id=2, address=广东省东莞市))