Java之String重点解析 (3)

String s3 = s2 + object; 字符串拼接也是支持直接拼接一个普通的对象,这个时候会调用该对象的toString方法返回一个字符串来进行拼接。toString方法是Object类的方法,若子类没有重写,则会调用Object类的toString方法,该方法默认输出类名+引用地址。这看起来没有什么问题,但是有一个大坑:切记不要在toString方法中直接使用+拼接自身 。如下代码

@Override public String toString() { return this+"abc"; }

这里直接拼接this会调用this的toString方法,从而造成了无限递归。

Java对+拼接字符串进行了优化:

可以直接拼接普通对象

字面量直接拼接会合成一个字面量

普通拼接会使用StringBuilder来进行优化

但同时也有注意这些优化是有限度的,我们需要在合适的场景选择合适的拼接方式来提高性能。

编码问题

在Java中,一般情况下,一个char对象可以存储一个字符,一个char的大小是16位。但随着计算机的发展,字符集也在不断地发展,16位的存储大小已经不够用了,因此拓展了使用两个char,也就是32位来存储一些特殊的字符,如emoij。一个16位称为一个 代码单元 ,一个字符称为 代码点 ,一个代码点可能占用一个代码单元,也可能是两个。

在一个字符串中,当我们调用String.length() 方法时,返回的是代码单元的数目, String.charAt() 返回也是对应下标的代码单元。这在正常情况下并没有什么问题。而如果允许输入特殊字符时,这就有大问题了。要获得真正的代码点数目,可以调用 String .codePointCount 方法;要获得对应的代码点,可调用 String.codePointAt 方法。以此来兼容拓展的字符集。

一个字符为一个代码点,一个char称为一个代码单元。一个代码点可能占据一个或两个代码单元。若允许输入特殊字符,则必须使用代码点为单位来操作字符串。

总结

到此,关于String的一些重点问题就分析完毕了,文章开头的问题读者应该也都知道答案了。这些是面试常考题,也是String的重点。除此之外,关于正则表达式、输入与输出、常用api等等也是String相关很重要的内容,有兴趣的读者可自行学习。

希望文章对你有帮助。

参考资料

《Java编程思想》 java工程师皆知的神书,详细讲解了如何更好运用java来编程,感受编程思想。

《Java核心技术卷一》 入门书籍,主要讲解如何使用String的api以及一些注意的点。

《深入理解JVM》对于理解方法区以及常量池有非常大的帮助。

深入解析String#intern美团技术团队的一篇分析String.intern方法的文章。

感谢网络其他博客的贡献。

全文到此,原创不易,觉得有帮助可以点赞收藏评论转发。
笔者才疏学浅,有任何想法欢迎评论区交流指正。
如需转载请评论区或私信交流。

另外欢迎光临笔者的个人博客:传送门

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssdsx.html