java 保存字符串_java中字符串的存储

在java中,不同的字符串赋值方法,其所在的地址可能不同也就导致,两个字符串的值看似相等可是在s1==s2操作时,其结果返回的却是false

例:

String s1 = "Programming";

String s2 = new String("Programming");

String s5 = "Program" + "ming";

System.out.println(s1 == s2); //返回值为false

System.out.println(s1 == s5);//返回值为true

其原因就与java中内存分配的机制有关:而当一个字符串被定义时,会先到常量池中寻找,如果常量池中有这个字符串,则地址直接指向常量池中字符串,如常量池中不存在则将其放入到常量池中;

关于java的内存分配机制:

https://www.cnblogs.com/dingyingsi/p/3760730.htmlhttp://blog.csdn.net/tutngfei1129287460/article/details/7383480

例:

//常量池中本来就不含有jva字符,所以new的jva会放入常量池,属于同一个对象,返回true 先new一个SringBuffer对象,此时单独开辟一个区域,然后调用append方法

//拼接字符串(相当于对字符串的拼接而不是new的对象了),将拼接完成的字符串放入常量池,此时new出来的对象就是需要放入常量池的,返回true

String s1 = new StringBuilder("j").append("va").toString();

System.out.println(s1.intern()==s1);//true

//常量池中本身就有字符串java所以返回的并不是同一个字符串 s2.intern()返回常量池中的

//java s2为new的字符所以不相等返回false

String s2 = new StringBuilder("ja").append("va").toString();

System.out.println(s2.intern()==s2);//false

//返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同和

String s3 = new StringBuilder("Programming").toString();

System.out.println(s3.intern()==s3);//false

public static void main(String[] args){

String s1 = "Programming";

String s2 = new String("Programming");

String s3 = "Program";

String s4 = "ming";

String s5 = "Program" + "ming";

String s6 = s3 + s4;

String s7 = new StringBuilder("Programming").toString();

String s8 = new StringBuilder("Program").append("ming").toString();

System.out.println(s1 == s2); //false s1被赋予字符串Programming后发现常量池中并没有这一字符串,就将其

//放入常量池

System.out.println(s1 == s5);//true //字符串的+操作其本质是创建了StringBuilder对象进行append操作,

//然后将拼接后的StringBuilder对象用toString方法处理成String对象,s5拼接完成后发现常量池中已经有字符串Programming

//所以s5直接取常量池中的字符串所以返回true

System.out.println(s1 == s6);//false 这个暂时没搞懂

System.out.println(s1 == s5.intern());//true

System.out.println(s1 == s6.intern());//true

System.out.println(s2 == s2.intern());//false 因为s2 new了一个字符串对象,在堆中单独开辟一块区域,并不是常量池

//中对象 所以返回false

System.out.println(s7.intern()==s7);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同

System.out.println(s8.intern()==s8);///false 这个单独执行时是true 放在这里一起执行是false,个人推测

//是因为常量池中已经存在字符串Programming,而s8是new出来的,他拼接完成之后,其地址与常量池中字符串的地址

//不同,返回false

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值