posts - 17,  comments - 14,  trackbacks - 0

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类。而且,如果直接使用赋值的方式也可以减少堆内存的开销。

posted on 2010-10-16 23:46 Mineralwasser 阅读(2296) 评论(4)  编辑  收藏

FeedBack:
# re: String的两种实例化方式的区别
2011-04-25 17:01 | 曾国泰
笔试碰到了这道题。。悲剧了。。哎。。  回复  更多评论
  
# re: String的两种实例化方式的区别
2012-02-12 10:51 | Ma
你对string分析得很具体,到位.  回复  更多评论
  
# re: String的两种实例化方式的区别
2015-09-25 15:25 | jjx
讲的很好。  回复  更多评论
  
# re: String的两种实例化方式的区别
2016-07-02 11:07 | 小学员
String a=new String();
a="hello";
为何不报错?  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2012年2月>
2930311234
567891011
12131415161718
19202122232425
26272829123
45678910

常用链接

留言簿(1)

文章档案(21)

搜索

  •  

最新评论

阅读排行榜

评论排行榜