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






测试代码:

public class Equal {
	public static void main(String[] args)
	{
		String a = "Hello";
		String b = "Hello";	
		String c = new String("Hello");
		String d = new String("Hello");
				
		System.out.println(a==b); //true
		System.out.println("\n");
		System.out.println(c==d); //false
		System.out.println("\n"); 
		System.out.println(a==c); //false	
	}
}





截图:

170448_diJ7_1791074.jpg










问题:栈为什么比堆要快?

答:参考!(看了那么多的文章、帖子、书,还是不太明白——下次有机会应该问下面试官!)

1.http://wenku.baidu.com/link?url=uoa3l9gQuMPlrr4N9t1BchzeWY5Jrr0DK0m3gJg1C3gEaxPeqeW7dXpGTgI_mCIENNNoHcZ0Qzj1iwI26Q3lWHOzQmnRndUOHyugcv-wF0K

2.http://java-true.iteye.com/blog/1181663

3.http://bbs.csdn.net/topics/390220569

转载于:https://my.oschina.net/u/1791074/blog/314861

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值