天马行空工作室

 找回密码
 加入天马
搜索
查看: 3149|回复: 0

Java中String的两种实例化方式的区别

[复制链接]
发表于 2012-5-4 22:05:24 | 显示全部楼层 |阅读模式
String是在java编程中用的最多的数据类型,因此也有很多与其他数据类型不同的性质。
String的两种实例化的方式:
(1) String str="abc";//创建str字符串,内容为abc。
(2) String str=new String("abc");//创建str字符串,内容为abc。
虽然两种方法都可以创建,但是却有很大的不同。
分析一下这两句命令:
(1) String str="abc";
这句程序的内存分配情况为:

首先在栈内存中为str开辟空间,然后在堆内存中开辟匿名字符串abc的空间,再由str指向abc的空间。这种方法很简单,也很方便,而且在堆内存中也只开辟了一块内容为abc的空间,没有多余的空间。
如果写语句:String str1="abc";创建一个str1字符串,内容同样为abc,那么内存空间的开辟和指向情况为:


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


这句程序会在堆内存中开辟一块内容为abc的匿名空间,然后再new一块空间,赋值abc,并有str指向这里,这时候匿名空间由于没有栈指向成为垃圾,然后被回收。
      从上面分析可以看出,第二种方式会明显增加内存的浪费,所以在开发中应尽量避免使用这种方式
您需要登录后才可以回帖 登录 | 加入天马

本版积分规则

Archiver|手机版|小黑屋|天马行空工作室 ( 京ICP备12003429号  

GMT+8, 2019-11-14 09:24 , Processed in 1.218998 second(s), 24 queries .

Powered by Discuz! v8

© 2010-2014 Java中String的两种实例化方式的区别 - Java 天马行空工作室

快速回复 返回顶部 返回列表