Java浅拷贝和深拷贝的区别和原因

7 篇文章 0 订阅

摘要

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的间接操纵,简单却不得不意识到);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值