JAVA中的值传递和引用传递,String的值传递特性

来源:互联网 发布:信捷xc3编程电缆接线 编辑:程序博客网 时间:2024/05/22 09:21
String的两种实例化方式的区别

String是在java编程中用的最多的数据类型,因此也有很多与其他数据类型不同的性质。

创建字符串可以用的命令有:

String str="abc";//创建str字符串,内容为abc。

String str=new String("abc");//创建str字符串,内容为abc。

虽然两种方法都可以创建,但是却有很大的不同。

分析一下这两句命令:

String str="abc";

这句程序的内存分配情况为:

16

首先在栈内存中为str开辟空间,然后在堆内存中开辟匿名字符串abc的空间,再由str指向abc的空间。这种方法很简单,也很方便,而且在堆内存中也只开辟了一块内容为abc的空间,没有多余的空间。

如果写语句:String str1="abc";创建一个str1字符串,内容同样为abc,那么内存空间的开辟和指向情况为:

17

可以看到str和str1指向同一块堆内存,这是为什么呢?因为String用的最多,很特殊,因为对于String来讲使用直接赋值的方式会在字符串池中保存内容。如果之后在声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。

String str=new String("abc");

这句程序的内存分配情况为:

18

19

这句程序会在堆内存中开辟一块内容为abc的匿名空间,然后再new一块空间,赋值abc,并有str指向这里,这时候匿名空间由于没有栈指向成为垃圾,然后被回收。

可以发现,程序开辟了两个空间,与前一个相比慢多了。所以在开发中绝对不能使用关键字new实例化String类。而且,如果直接使用赋值的方式也可以减少堆内存的开销。

转自:http://blog.csdn.net/zhujianli1314/article/details/39135325


原创粉丝点击