JAVA中的String类(详解)

Java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。String是一个类不属于基本数据类型。

JAVA中的String类(详解)

可以从源码中看到,String是一个final类型。

String被设计成不可变(immutable)类,所以它所有的对象都是不可变对象。

String为什么设计成不可变?

String不可变的原因包括: 设计考虑,效率优化问题,以及安全性这三大方面

(以下根据查询的资料,做一份精简化的总结)

1. 字符串常量池的需要字符串常量池(String pool, String intern pool, String保留池) 是Java堆内存中一个特殊的存储区域, 当创建一个String对象时,假如此字符串值已经存在于常量池中,则不会创建一个新的对象,而是引用已经存在的对象。

如下图所示:

JAVA中的String类(详解)

2. 允许String对象缓存HashCode
Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中。

JAVA中的String类(详解)

String类中源码,用来缓存hashCode

3. 安全性
String被许多的Java类(库)用来当做参数,例如 网络连接地址URL,文件路径path,还有反射机制所需要的String参数等, 假若String不是固定不变的,将会引起各种安全隐患。

(来自博客————

翻译人员: 铁锚

翻译日期: 2013年11月18日

原文链接: Why string is immutable in Java ?

那么因为这一特征,我们来了解String的特点

JAVA中的String类(详解)

JAVA中的String类(详解)

String类中“==” 和equals()的比较:

“==”进行的是数值比较,比较的是两个字符串的地址的数值;

equals()进行的是字符串内容的比较。

从结果使用“==”可以看到直接赋值所得为true,使用构造函数所得为false

采用直接赋值:在jvm底层会自动维护一个对象池(可以理解为对象数组),若采用直接赋值的操作,那么该实例化对象(字符串)将自动保存到对象池中,如果下次继续使用直接赋值声明了String类对象,那么如果此时对象池之中存在指定内容,则直接进行引用,若没有,则开辟新的字符串对象,然后将其保存在新的对象池之中以供下次使用。

也就是说,当我再创建另一个字符串,则是取得同一个地方的值。

采用构造方法:String str = new string("hello"):如果使用构造方法则会开辟两块堆内存空间,而且有一块会成为垃圾,且对字符串共享产生影响。

也就是说,当我再创建另一个字符串,原来的值依旧存在堆内存,在此基础上又开辟了一新的块内存。

结论:

所有的语言对于字符串的底层实现都是通过字符数组实现的,所以字符串常量不可改变。我们所见的字符串的变更,是字符串对象的变更

扩展:String与StringBuffer、StringBuilder的区别

  String:适用于少量的字符串操作的情况

  StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

  StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

上一篇:android:launchMode概述


下一篇:vue获取当前对象