作爲初級程序員開發階段,很不注意代碼的性能問題,例如:在一個for循環中一直new Object,這樣會佔用內存,new的對象數量少可能看不出來問題所在,如下面的代碼。
- 第一種可能是我們常見的寫法,加入我要在for循環中,有個需求要重複引用對象(次數假如5個),你該怎麼解決?
List<User> userList1 = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
User u1 = new User();
u1.setAge(10);
u1.setName("Tom" + i);
userList1.add(u1);
}
- 難道真就new 5個 對象嗎?看着代碼感覺糙不糙?
List<User> userList1 = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
User u1 = new User();
u1.setAge(10);
u1.setName("Tom" + i);
User u2 = new User();
u2.setAge(10);
u2.setName("Tom" + i);
User u3 = new User();
u3.setAge(10);
u3.setName("Tom" + i);
User u4 = new User();
u4.setAge(10);
u4.setName("Tom" + i);
User u5 = new User();
u5.setAge(10);
u5.setName("Tom" + i);
userList1.add(u1);
userList1.add(u2);
userList1.add(u3);
userList1.add(u4);
userList1.add(u5);
}
其實有個更好的解決辦法,就是利用好java中的淺拷貝,下面看下淺拷貝和深拷貝的區別:
- 淺拷貝(淺克隆)被複制對象的所有變量都含有與原來對象相同的值,而所有的對其他對象的引用仍然只指向原來的對象。
- 深拷貝(深克隆)被複制對象的所有變量都含有與原來的對象相同的值,那些引用其他對象的變量將指向被複制過的新對象,深複製把要複製的對象所引用的對象都複製了一遍。
- 實現拷貝需要實現Cloneable接口並且重寫clone方法。
- 深拷貝是利用對象流,將對象序列化,再反序列化得出新的對象. 因此首先需要實現序列化接口 。
說一下利用淺拷貝來解決
public class User implements Cloneable {
private Integer age;
private String name;
public User() {
}
public User(Integer age) {
this.age = age;
}
public User(Integer age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public Integer getAge() {
return age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public User clone() throws CloneNotSupportedException{
//淺拷貝
return (User)super.clone();
}
}
List<User> userList1 = new ArrayList<>();
User u = new User();
for (int i = 0; i < 100000; i++) {
User u1 = u.clone();
u1.setAge(10);
u1.setName("Tom" + i);
User u2 = u.clone();
u2.setAge(10);
u2.setName("Tom" + i);
User u3 = u.clone();
u3.setAge(10);
u3.setName("Tom" + i);
User u4 = u.clone();
u4.setAge(10);
u4.setName("Tom" + i);
User u5 = u.clone();
u5.setAge(10);
u5.setName("Tom" + i);
userList1.add(u1);
userList1.add(u2);
userList1.add(u3);
userList1.add(u4);
userList1.add(u5);
}
注意:
1.實現Cloneable接口,調用clone方法時,要拋出CloneNotSupportedException。
2. u1 == u2 輸出的是false,hashCode值是不一樣的。