摘要
Java中自动管理内存,大原则是同样的内容一般默认为指针指向的(除非复制是类似new string(),.clone, systemCopeOf这样的明确新建内存的,并且要分情况),这种指针指向而不立即开辟内存可以省空间;但是在安全方面会有许多问题(外部的赋值如果变了,内部储存值接着变当然是很恐怖的,比如你提电子单向银行app存100块,如果你自己修改客户端为100万,银行也设为100万那就完了,所以银行内部的数据库自然不能关联-链接到你的存钱变量上)。所以业务代码要区分他们,一般导入外部参数,需要内部“新建内存的变量”而非引用复制,这就成为深复制(** 深拷贝 **);
code示例
public class StringJav {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "Cui pf";
String s2 = new String(new char[]{'C','u','i',' ','p','f'});
System.out.println("first init " + s1);
System.out.println("Second init " + s2);
System.out.println("Equal " + s1==s2);//==比较的是对象的地址,而非本身;
System.out.println("Equal " + s1.equals(s2));
int score[] = new int[]{10,100,40,80};
Score sc = new Score(score);
sc.printSc();
score[2]=89;//change the value of external array score;
sc.printSc();
}
}
class Score{
private int[] sc;
public Score(int[] sc){
//this.sc = sc;//light copy, not safe;
this.sc = sc.clone();//deep copy
}
public void printSc(){
System.out.println(Arrays.toString(sc));
}
}
项目 | 对比 |
---|---|
浅拷贝 | 深拷贝 |
倒数第7行,注释倒数第8行 | 倒数第8行,注释第7行 |
结果如表格下面 | 说明: |
外部数组改变影响了内部学生成绩的数据 | 外部改变无法攻击到内部 |
浅拷贝
Second init Cui pf
false
Equal true
[10, 100, 40, 80]
[10, 100, 89, 80]
深拷贝
Second init Cui pf
false
Equal true
[10, 100, 40, 80]
[10, 100, 40, 80]
另外,第一二三行,也显示了new string()不是指向原本的一个引用而是新开辟内存了,所以表示指针比较的==是false;而表示** 内容比较的equals **是True;(说白了这就是浅拷贝和深拷贝的根本区别,很简单但对于Java编程很重要; C就不一样了,因为自己管内存,指针复制或new malloc都是明确开发者直接操控的,Java的间接操纵,简单却不得不意识到);