学习
实践
活动
专区
工具
TVP
写文章

Java基础-String字符串(1)

Java中的String类应该是大家在Java中使用最频繁的类之一了。虽然String使用起来很方便,可要是使用的不恰当,会给程序带来许多潜在的bug。我们今天便来好好聊聊String。

在C语言中没有String类,操作字符串都是用的char[],对程序员很不友好。因此Java便自己封装了一个String类,供程序员使用。其实String底层也是用的char[],只不过对外屏蔽了操作的细节,只提供了操作String的API。

先来看下Java中定义String的几种方式

第一种是在常量池创建,第二种是在堆中创建(关于什么是常量池这里先不展开,有兴趣可以深入了解)。2种创建方式的区别在于字符串的内存地址不同。常量池中创建的String只会创建一次,之后如果继续创建相同的字符串,则会直接引用之前创建好的String。而堆中创建的String每次创建都会生成不同的String对象。可以用一段代码验证一下。

代码运行结果第一行是true,第二行是false。因为==比较的是内存地址,证实了前面的解释。可以用一张图来表示这4个字符串在内存中的分布情况。

可以看到,s1和s2指向的都是常量池中的hello,因此它们的内存地址是相同的。s3和s4指向的是堆中2个不同的对象,因此它们的内存地址是不同的。

说到这不得不提起String的intern()方法。该方法的作用是返回String在在常量池中的引用。如果String不在常量池,则创建一个String在常量池中。

运行结果为true。s1是在堆中的对象,调用intern方法后由于常量池中不存在hello字符串,因此会创建hello字符串。而第二行的s2引用的正是常量池中的hello字符串,因此2个变量的内存地址是相等的。

由于String在虚拟机中有好几种存在方式,因此在对字符串比较的时候千万不要用==操作符,会出现一些意想不到的bug。最好全部统一使用equals方法进行比较。此时比较的就是字符串的值而不是它们的内存地址了。

关于String还有一部分没讲完,放下篇继续讲吧。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190217A0HVMM00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

关注

腾讯云开发者公众号
10元无门槛代金券
洞察腾讯核心技术
剖析业界实践案例
腾讯云开发者公众号二维码

扫码关注腾讯云开发者

领取腾讯云代金券