课时45:String对象常量池
摘要:本次课程的主要讨论了对象池的概念及其在Java开发中的应用。首先,介绍了静态常量池和运行时常量池的区别。讨论了静态常量池和运行时常量池在实际开发中的作用,以及如何理解和应用这些概念。
1. 常量池的分类
2. 静态常量池和运行时常量池的区别
对象池也称为常量池,其主要目的是实现数据的共享处理。以String对象池为例,里面的主要内容就是为了重用,而重用实际上就属于共享设计。
严格来讲,对象池所描述的就是共享。而对于正常的开发情况而言,字符串对象池的数据可以针对于所有对象进行使用。但是,在java 之中,对象池可以分为两种,第一个叫做是静态常量池,第二个叫运行时常量池。
01. 常量池的分类
静态常量池指的是程序(*.class)在加载的时候会自动将此程序之中保存的字符串,还有一些普通的类和方法的信息等,全部进行分配。即所有静态描述的数据都是在程序类加载的时候静态分配好的。
运行时常量池指的是当一个程序(*.class)加载之后,里面可能有一些变量,此时提供的常量池称为运行时常量池。
02. 静态常量池和运行时常量池的区别
范例:观察程序(静态常量池):如果此时进行对象的地址比较,那么结果如何?编译执行程序结果如图。
public class StringDemo { public static void main(String args[]) { String strA=“www.mldn.cn”; String strB="www."+"mldn"+".cn"; System.out.println(strA=strB); // true } }
此时程序结果为ture,本程序之中所给出的内容全部都是静态常量数据。字符串常量都是匿名对象,所以在程序加载的时候,会自动帮助开发者处理好相应的连接,即处理完连接之后,内容存在于对象池中。
内存关系图如下。
首先,StrA 会存入“www.mldn.cn
”,但是当进入到这个程序,前一个是程序加载后,第二部分是三个常量相加,按照程序进行处理的时候,会认为内容一致,此时也指向同一内存空间。这是一个典型的静态常量池。
范例:观察程序(运行时常量池):如果此时进行对象的地址比较,那么结果如何?编译执行程序结果如图。
public class StringDemo { public static void main(String args[]) { String info=“mldn”; String strA=“www.mldn.cn”; String strB="www."+ info +".cn"; System.out.println(strA=strB); // true } }
此时代码运行的结果为false, 这个时候之所以是运行结果为 false,是因为程序在加载的时候并不确定 “Info” 是什么内容。因为在进行字符串连接的时候,Info 采用的是变量,其内容是可以修改的,所以不认为最终的 StrB 的结果就是一个所需要的真实的最终结果。整个程序里面这两个部分就会分配在不同的空间。
此时,StrB 存放在运行池的常量池里,所以只要看见变量的数据的时候,即便输入的内容是一样的,那么也有可能出现不等。这就我们之前给大家做过举例,如果有些数据是需要用户来输入,会发现当输入完成之后,比较的结果一定是False。 因为一个是静态常量池,一个是运行时常量池,这就是为什么判断地址不相等的原因。