java的深浅拷贝 String与数组

前面我们介绍了String的其中一种命名方法,今天我们结合数组来看一下java的深拷贝与浅拷贝。

首先我们来看一下String的另一种命名方法, new 实例化对象。

String s1 = new String("123");

String s2 = new String("123");

此时我们实例化了两个字符串对象,new方法在堆中申请内存空间,也就是说“即使都是123”,在堆中占据了两个不同的内存空间,s1与s2两个不同的指向,指向了2个“123”。那么现在我们 s1==s2 答案就是“false”,因为它们指向了不同的地址。

String s3 = "123";

String s4 = "123";

前面我们介绍过 s3==s4,答案是ture。因为是在常量池的“123”,s3与s4有着共同的指向。

String s5 =s1;

此时 声明一个s5 ,它与s1有着共同指向,通俗地说s5和s1一样,直接把s1的值给了s5,不过这种复制拷贝是一种浅拷贝,也就是说s1==s5是“true”,也是一个指向。

现在我们引入浅拷贝的概念,也就是我们的拷贝并没有申请新的空间,仅仅只是指向了同一块空间罢了,用了同一个地址。这并不是我们想要的拷贝。

我们来看一下数组的浅拷贝。

int[] a = {1,2,3};

int[] b =a;

b[2]=4;

System.out.println(a[2]);

输出的值为“4”,也就是我们在操作b数组的时候,改变了a数组的值,b数组跟a数组的数值一样,是因为指向了同一块内存区域。但是我们这种操作不希望看到的,我们不想在操作b数组时,对a数组的值进行了修改。完成拷贝后,a、b应该是相互独立的。

这就引出了我们需要思考的深拷贝,这种拷贝不单单只是地址的拷贝,而是先申请了内存,把需要拷贝的数据放进去。与别拷贝者也就是数据相同,别的毫无关系。值得一提的是在java中8种 基本类型的拷贝都是我们要讲的深拷贝。

int[] c = new int[5];

c[2]=2;

int[] d = new int[c.length];

d[2]=6;

System.out.println(c[2]);

这时输出值为2,d数组的操作已经与c数组毫无干系,也就是实现了深拷贝。

此外,java对数组的深拷贝提供了方法 Arrays.cofy(被拷贝的数组,被拷贝数组的长度)。

数组:1.初始化 数字数组为0,boolean数组为false,对象数组则为null。 

2.数组的长度一旦确定,便不可以改变大小。

你可能感兴趣的:(java)