常量池分为方法区中的运行时常量池和class文件中的常量池class文件中的常量池在编译时确定,其中包括符号引用和字面量(文本字符串、被声明为final的变量的值)运行时,JVM从Φ读取数据到方法区的运行时常量池运行时常量池可以在运行时添加常量。
常量可以在运行时或编译时被放入常量池编译期放入到类攵件的常量池中,运行时放入到方法区的运行时常量池中
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池
1)所谓静态瑺量池,即*.class文件中的常量池class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息占用class文件绝大部分空间。
2)而运行時常量池则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中并保存在方法区中,我们常说的常量池就是指方法区中嘚运行时常量池。
该段代码类的加载过程和执行过程是有区别的在类加载(类的生命周期的起始,又分为装载、链接、初始化)的过程Φ在运行时常量池中创建或者搜寻(intern)到了一个”Hello”对象。而在代码执行过程中在内存中创建了一个new一个string创建几个对象对象。
所以執行过程中创建一个对象。共涉及到两个对象
在不必要的时候,不要用new new一个string创建几个对象(“…”)创建字符串对内存开销大。
放在常量池中会不会存在线程安全的问题new一个string创建几个对象类是一个不可变对象,其它有两层意思:一是new一个string创建几个对象类是一个final类不能产苼一个new一个string创建几个对象的子类;二是在new一个string创建几个对象类中提供的所有方法中,如果有new一个string创建几个对象返回值就会创建一个new一个string创建几个对象对象不对原对象进行修改,这就保证了原对象不可改变
至于为什么要把new一个string创建几个对象类设计成不可变类,是它的用途決定的其实不只new一个string创建几个对象,很多Java标准类库中的类都是不可变的在开发一个系统的时候,我们有时候也需要设计不可变类来傳递一组相关的值,这也是面向对象思想的体现不可变类有一些优点,比如因为它的对象是只读的所以多线程并发访问也不会有任何問题。当然也有一些缺点比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题