本文共 1043 字,大约阅读时间需要 3 分钟。
1.字符型常量和字符串常量的区别
- 形式上:字符常量是由一对单引号引起的一个字符,字符串常量是由双引号引起的若干字符
- 含义上:字符串常量相当于一个整型的ASCII值,可以参加表达式运算,字符串常量代表一个地址值(该字符串在内存中存放的位置)
- 占内存大小:字符常量只占一个字节,字符串常量占若干字节
2.什么是字符串常量池
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串
在创建字符串时,JVM首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回它的引用 3.String有什么特性
- 不变性:String只是只读字符串,是一个典型的immutable(不可变类型)对象,对它进行任何操作,其实都是创建一个新的对象,再把引用指向该对象。不变模式的主要作用就是在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性
- 常量池优化:String对象创建之后,会再字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用
- final:使用final来定义String类,表示String类不能被继承,提高了系统的安全性
4.String为什么是final的
String类首先用final修饰,表示是不可继承的,其次在主体部分的数组的定义为:private final char[] value。
首先让我们来分析String类为什么用final修饰:一个类使用final修饰,表示该类不可被继承,这样就保证了String类没有子类,这样就避免了子类中的方法对String类的成员变量进行修改,保证了线程安全
其次,对于String类的主体:private final char[] value,
final修饰表示了数组的地址是不能被改变的(这里需要注意的是,final只是限制数组的引用地址不变,并不代表数组本身不会变),同时private保证了不能被外部方法进行修改,保证了不可变性 这样设计的目的主要有以下三方面的目的:
- 为了实现字符串常量池:当我们对字符串进行大量的操作时,实现字符串常量池可以节省内存空间,提高效率
- 为了线程安全:在并发场景下,当多个线程对同一个资源进行读操作时,是不会引发线程安全问题的,但是如果对资源进行修改操作,就会引发线程安全问题,所以只有不可变对象不能被写,保证线程安全
- 为了实现String可以创建HashCode不可变性
转载地址:http://gmjmb.baihongyu.com/