字符串常量池
1.Java中两种创建字符串对象的方式的分析
直接用字面量的方式创建一个字符串(String a = "hello"),
这种方式创建的字符串是直接存在字符串常量池中,这种方式会先去字符串常量池中查看"hello"是否存在,
如果存在的话会先去直接返回hello的引用地址给a,
2.通过String的构造方法创建(String a = new String(“hello”))
首先会创建hello对象在堆中,然后在字符串常量池中创建一个对象,该对象指向于hello堆中hello对象,
2.字符串常量池存储的位置
在jdk1.6的时候,字符串常量池是存储在方法区的,然后在jdk1.7的时候,字符串常量池就改为在堆中,
class常量池
java类被编译后,就生成了.class文件,class文件中存在了类的信息,方法。接口。字段等描述,还有一项就是常量池,常量池中存的就是一些字面量(字符串,基本数据类型,final常量),以及符号引用(类路劲,方法和字段的描述符和名称),每一个class文件都有自己的class常量池,
运行时常量池
类加载通过类的全路径找到class文件,然后以二进制流的方式加载class文件,然后经过一系列的验证,连接,解析,初始化等操作解析class文件,在解析的时候class文件中的常量池就会被解析为运行时常量池,运行时常量池其实class常量池被类加载加载后的状态,class常量池中的符号引用,有一些会被解析为直接引用(就是直接引用于对象的位置)
运行时常量池和class常量池的区别就在于其动态性,class常量池又叫做静态常量池,池中的常量是预先设置好的,那么运行时常量池是可以后期动态的向常量池中添加常量,比如String.intern()就是典型的向运行时常量池中添加常量的方法
常量池的好处
1.节省内存空间,同样的字符串在常量中只有一份,并且只会分配一次内存空间
2.避免了频繁的创建和销毁常量对系统带的来性能影响,
网友评论