(二十四)字符串创建与存储的机制是什么

在java中字符串的声明与初始化有如下几种方式: 
1. String a = new String("abc"); 
2. String b = "abc" 
这两种方式结果都是一样的,但是实现机制却不相同,接着往下看:

String a = "hello";
String b = "hello"

String c = new String("hello");
String d = new String ("hello");
 
请问 
a==b true or false? c==d true or false? 
a.equlas(b) true or false? c.equals(d) true or false?

java中在new时,总会产生一个新的对象,而新对象则需要分配新的内存,所以即使两个对象的内容是相同的,但是在内存中的首地址是不同的,即c,d中存储的数值是不相同的,所以表达式c==d将返回false。 

而a==b=true 是因为在JVM中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,a,b引用的是同一个常量池中的对象,当创建一个字符串常量时,会首先在字符串常量池中查找是否已经有相同的字符串被定义(其判断依据是String类的equals方法的返回值),若已经定义则直接获取对其的引用,此时不需要创建对象;若没有定义,则需要创建这个对象,然后将其加入到字符串池中,再将它的引用返回。(由于String是不可变类,一旦创建好了就不能被修改,因此String对象可以被共享且不会导致程序的混乱)。
String s=new String("abc")语句执行可以分解成两个过程:①创建对象new String("abc")②赋值 String s=

其中①中调用构造函数,等价于"abc"和new String()两个操作。若字符串池中不存在"abc",则会创建一个字符串常量“abc”,并将其添加到字符串池中;若存在,则不创建,然后new String()会在堆中创建新的对象。

 

Q1:对于String类型的变量s,赋值语句s=null与s=" "是否相同?

答:s=null,其中s是一个字符串类型的引用,它不指向任何字符串。而s=“ ”,它指向空字符串,两者不同

Q2:new String("abc")创建了一个对象

答:1个或两个。若常量池中有"abc",则创建一个对象,否则两个

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值