String是在java编程中用的最多的数据类型,因此也有很多与其他数据类型不同的性质。
创建字符串可以用的命令有:
String str="abc";//创建str字符串,内容为abc。
String str=new String("abc");//创建str字符串,内容为abc。
虽然两种方法都可以创建,但是却有很大的不同。
分析一下这两句命令:
String str="abc";
这句程序的内存分配情况为:
首先在栈内存中为str开辟空间,然后在堆内存中开辟匿名字符串abc的空间,再由str指向abc的空间。这种方法很简单,也很方便,而且在堆内存中也只开辟了一块内容为abc的空间,没有多余的空间。
如果写语句:String str1="abc";创建一个str1字符串,内容同样为abc,那么内存空间的开辟和指向情况为:
可以看到str和str1指向同一块堆内存,这是为什么呢?因为String用的最多,很特殊,因为对于String来讲使用直接赋值的方式会在字符串池中保存内容。如果之后在声明字符串的时候发现内容一样,则不会重新开辟空间,而是从内存池中取出数据继续使用。
String str=new String("abc");
这句程序的内存分配情况为:
这句程序会在堆内存中开辟一块内容为abc的匿名空间,然后再new一块空间,赋值abc,并有str指向这里,这时候匿名空间由于没有栈指向成为垃圾,然后被回收。
可以发现,程序开辟了两个空间,与前一个相比慢多了。所以在开发中绝对不能使用关键字new实例化String类。而且,如果直接使用赋值的方式也可以减少堆内存的开销。
posted on 2010-10-16 23:46
Mineralwasser 阅读(2296)
评论(4) 编辑 收藏