String 和new String 的区别

String 和new String 的区别

JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池。

1.String str = “xxx”

String str = “test”;

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象,如果存在,直接把实例池中"test"的地址返回给str。如果不存在,则会在实例池中创建"test"对象,并把该对象的地址返回给str。

String s = "hello";
String s2 = "hello";
System.out.println(s == s2);//true

2.String str = new String(“xxx”);

String str = new String(“test”);

以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象,若不存在则会在实例池中创建"test"对象,同时在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。若实例池存在则直接在堆中创建"test"这个对象,然后将堆中的这个对象的地址返回赋给引用str。

String s1 = new String("hello");
String s3 = new String("hello");
System.out.println(s1 == s3);//false

总结:其实就是说无论用哪个方式创建,最后我们得到的都是一个String对象,无非就是程序内部是否创建了新的对象空间,在哪创建的。

如果用第一种方式(String =),那么可能出现两种情况:

  • 第一种情况:就是如果常量池已经有这个值的对象了,那么直接将地址赋值过去就好了。
  • 第二种情况:就是没有这个值,那么就在字符串实例池中创建对象,进行赋值。

切记这里无论找没找到都不会再堆里创建对象!要不然就不创建对象,要不然就在实例池中创建一个对象,也就是说我们得到的地址一定是从字符串实例池中取到的!不是从堆里取到的!

如果用第二种方式(new String),也是有两种情况:

  • 第一种情况:如果字符串实例池中没有,那么就同时在实例池和堆中同时创建对象,将堆中的这个对象地址进行赋值,这里要注意同时在两个不同的地方创建了两个对象!
  • 第二种情况:如果字符串实例池中有,那么就直接在堆中创建对象,将堆中的地址进行赋值!

切记这里有可能创建了两个对象,在实例池和堆中,但是最终得到的地址一定是从堆中得到的!

小问题:

String x1 = "queen";
String x2 = new String("queen");
System.out.println(x1 == x2);//false

所以这里为什么是False就显而易见了,因为x1的地址是从实例池中的对象得到的,而x2的地址则是在堆中得到的!

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值