JDK源码阅读-StringStringBuilderStringBuffer

Posted 浪师傅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码阅读-StringStringBuilderStringBuffer相关的知识,希望对你有一定的参考价值。

java中关于字符串操作的三个类。

(1)String

String 类是被final修饰的,无法被继承,所以其成员方法也都默认为final方法。

String类的俩个属性,一个是char类型的数组,就是用该数组来保存字符串的,final表示它就是一个常量,是一个在jvm线程共享区的方法区的一个常量,每新建一个字符串的时候,都会先去这个常量池去找有没有已经存在的常量。如果已经有,value直接指向这个常量。

hash属性,就是这个字符串的哈希值,通过hashcode()方法计算的。

JDK源码阅读-String、StringBuilder、StringBuffer

不同的字符串也就有不同的hash值。

关于构造函数

JDK源码阅读-String、StringBuilder、StringBuffer

new关键字一定会产生一个对象,并且这个对象在堆中,只是字符串一定保存在常量池中,堆中只是指向了常量池中的字符串。


覆写了equals方法:

JDK源码阅读-String、StringBuilder、StringBuffer

剩下就是一些功能性的方法了,对字符串进行切割,替换,查找等等。

关于字符串,主要就是对于其不可变性,已经存储的位置和引用的关系。当处理大量字符串的时候,应该知道要咋么处理更好。

(2)StringBuilder

有了String了,为啥还要有StringBuilder呢。因为String是不可变的,每次修改之后都是生成新的对象,大量处理就会很慢。而StringBuilder是可变的字符串对象。StringBuilder的运行速度是最快的.其父类是

AbstractStringBuilder,

可以看到,其属性value字符数组没有被final修饰。

(3)StringBuffer

为啥还要有StringBuffer呢?虽然StringBuilder是可变的,运行速度快了,但是呢,遇到多线程的时候就不安全了。

可见StringBuffer也是继承AbstractStringBuilder的,其value数组可变的。就是在其所有的方法上加了synchronized关键字。所以在多线程的环境下,操作是安全的。、

总结就是:String类合适在少量字符串的操作。StringBuilder适合在单线程大量字符串的操作。StringBuffer适合在多线程中大量字符串的操作。了解这些就差不多了。。

也没啥大用。


以上是关于JDK源码阅读-StringStringBuilderStringBuffer的主要内容,如果未能解决你的问题,请参考以下文章

关于JDK源码:我想聊聊如何更高效地阅读.md

JDK源码阅读指南

idea 导入 jdk源码 解决compile code 后阅读jdk 源码

如何阅读jdk源码?

JDK源码阅读:Object源码分析

JDK1.8源码分析03之idea搭建源码阅读环境