String对象的内部常量池

你给出的两个字符串对象体现不这两种定义的区别,当然也是有区别的。

如果是:String str_1="abc"; String str_2=new String("abc");就明显了。

---------------------------------------------
先说几个概念吧

1.常量池

  指的是在编译期确定,并被保存在已编译的字节码文件中的一些数据,它包括类、方法、接口等中的常量,也包括字符串常量。

2.==: 比较是否是同一个对象

3.equals(): 比较的是对象里的内容

---------------------------------------------
下面我开始说区别

第1种:

  String a="abc";
  String b="abc";
  System.out.print(a==b);
 
  结果:true

  原因:编译时,这两个"abc"被认为是同一个对象保存到了常量池中;运行时JVM则认为这两个变量赋的是同一个对象,所以返回true。

---------------------
第2种:

  String a=new String("abc");
  String b=new String("abc");
  System.out.print(a==b);

  结果:false

  原因:用构造器创建的对象,是不会被放入常理池中的,也很明显这完全是两个对象,只是内容相同罢了,结果当然为false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。


------------------------------
第3种

  String a="abc";
  String b=new String("abc");
  System.out.print(a==b);

  结果:false

  原因:同上

---------------------------
第4种

  String a="abcdef";
  System.out.print(a=="abcdef");

  结果:true

  原因:运行出现的字符串常量,若是在常量池中出现过,则JVM会认为同一个对象,以节省内存开销,所以这两个字符串会被认为是同一个对象。

-------------------------------------------
第5种

  String a="abcdef";
  String b="";
  String c=a+b;
  System.out.print(c=="abcdef");

  结果:false

  原因:编译时,先将"abcedf"放在常量池中,而c的值则是在运行时在堆里创建的。所以为false。

---------------------------------------------------------------------
其它太明显的区别不在赘述。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值