深入探索深入探索Java常量池常量池
主要介绍了深入探索Java常量池,涉及静态常量池和运行时常量池的介绍,常量池的好处,8种基本数据类型的
包装类和常量池等相关内容,具有一定参考价值,需要的朋友可以了解下。
Java的常量池通常分为两种:静态常量池和运行时常量池
静态常量池:class文件中的常量池,class文件中的常量池包括了字符串(数字)字面值,类和方法的信息,占用了class文件的
大部分空间。
运行时常量池:JVM在完成加载类之后将class文件中常量池载入到内存中,并保存在方法区中。平时我们所讲的常量池就是
指方法区中的运行时常量池。其相对于CLass文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有
编译期才能产生,也就是并非预置入CLass文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放
入池中,这种特性被开发人员利用比较多的就是String类的intern()方法。
程序计数器:是程序执行的流水线,指示下一条该执行哪条命令。
本地方法栈:JVM调用操作系统方法使用的栈。
虚拟机栈:JVM执行java代码所使用的栈
虚拟机堆:存放对象的地方,在java程序中new出来的对象都存放在堆中。
方法区:存放了常量、类信息、静态变量,可以理解为class文件在内存中存放的位置。
常量池的好处:常量池的好处:
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。
例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
1.节省内存空间:常量池中的所有字面值相同的字符串常量合并,只占用一个空间
2.节省运行时间:在进行字符串比较时,==比equals()要快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实
际值是否相等。
==对于基本数据类型和对象代表的含义是不同的。
对于基本数据类型:==比较的是基本数据类型的数值对于对象:==比较的是对象在内存中的内存地址
8种基本数据类型的包装类和常量池种基本数据类型的包装类和常量池
Java中基本数据类型的包装类大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean。
Integer i1 = 40;
Integer i2 = 40;
System.out.println(i1==i2);//true
Byte,Short,Integer,Long,Character这5种包装类默认创建了[-128,127]的对应类型的缓存数据存放到常量池中,超过此
范围仍然会创建新的对象。
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)