字符串创建与存储机制

1.字符串创建与存储的机制:

Java中字符串声明与初始化主要有两种情况:

1)String s1 = "abc"语句与String s2 = "abc"语句

     在JVM中存在着一个字符串常量池,其中保存了着很多String 对象,s1,s2引用的是同一个常量池中的对象。当创建一个字符串常量时,例如String s1 = "abc",会首先在字符串常量池中查找是否已经有相同的字符串被定义,若已经定义,则直接获取对其的引用,此时不需要创建字符串常量"abc",如果没有定义,则首先创建字符串常量"abc",然后把它加入到字符串池中,再将引用返回。

2)String s3 = new String("abc")与String s4 = new String("abc")语句                                                                                      执行String s3 = new String("abc")语句(假设未执行1中的两个创建语句),字符串池中不存在"abc",则会创建一个字符串常量"abc",并将它添加到字符串常量池中,然后new String()会在堆中创建一个新的对象,s3指向堆中的String对象。紧接着创建String s4 = new String("abc")语句,因为字符串常量池中已经有了字符串常量"abc",所以不会再创建"abc",直接new String()在堆中创建一个新的对象,然后使用s4指向这个对象,所以s3与s4指向堆中的不同String对象,地址自然也不相同。

例子1:

String s1 = "abc";//在常量区里面创建一个"abc"字符串对象,s1获取对其的引用

String s2 = "abc";//发现在常量区已经有了"abc",s2直接获取对其的引用

例子2:

String s3 = new String("abc");   //先查找常量区有无"abc"常量,若无,则常见字符串常量"abc",将其添加到常量区,在创建在堆中创建对象,将s3指向堆中的对象。

String s4 = new String("abc");    //发现在常量区已经有了"abc",在创建在堆中创建对象,将s4指向堆中的对象。

2."=="和equals的区别

1)"=="运算符用来比较两个变量的值是否相等,要比较两个基本类型的数据或两个引用变量是否相等,只能使用"=="运算符。对于基本数据类型,可以直接使用"=="运算符比较器对应值是否相等,如果两个变量指向的数据是对象,因为这两个变量存放的是对应对象在堆中的地址,那么"=="判断的是这两对象的存放地址是否相等,如果要比较对象的内容是否相等,那么用"=="就无法实现了。

2)equals是Object提供的方法,如果一个类没有重写equals方法,那个它默认的equals方法(从Object中继承),就是使用"=="运算符,此时使用equals和"=="会得到相同的结果。如果在类中覆盖了equals方法,例如String类的equals方法是比较两个独立对象的内容是否相同,即堆中的内容是否相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值