Java从入门到精通—String类【String对象池(常量池)】
一、 String对象池简介
对象池主要目的是实现数据的共享处理(即重用)
Java之中常量池分为两种:
- 静态常量池: 指的是程序(*.class)在加载的时候会自动将此程序之中保存的字符串、普通常量、类和方法的信息等等全部进行分配。
- 运行时常量池: 一个程序加载之后,里面有一些变量,这个时候提供的常量池是运行时常量池。
二、示例
静态常量池
【Stringdemo1 .java】
//静态常量池
public class Stringdemo1 {
//本程序之中所给出的内容全部都是常量数据(字符串的常量都是匿名对象),
public static void main(String[] args) {
String strA = "www.mldn.cn";
String strB = "www."+"mldn"+".cn";
System.out.println(strA == strB); //true
}
}
【运行结果】
【分析】
strB字符串虽然是由+
连接的字符串组成,但由于都是常量,在程序运行的时候会自动将strB进行连接并存储到静态常量池中,此时在池中找到了需要存放的常量,那么这时候就直接将该常量的引用赋给strB,而不是另外开辟一个内存空间指向strB,因此trA与strB村的地址是一样的。
运行时常量池
【Stringdemo2 .java】
//运行时常量池
public class Stringdemo2 {
public static void main(String[] args) {
String info = "mldn";
String strA = "www.mldn";
String strB = "www."+info+".cn";
System.out.println(strA == strB);
}
}
【运行结果】
【分析】
这个程序之所以是一个false,是因为程序在加载的时候并不确定info是什么内容。程序加载的时候进行字符串连接info采用的是变量,变量的内容是可以修改的,所以程序不认为最终的strB的结果就是一个所需要的最终的结果,不会在一开始的时候进行字符串连接处理。
这里的strB存入的是运行时常量池里去了,没用复用strA,所以地址不一样
三、总结
💡Tips
在开发中,如果有些数据需要我们后面输入的,作为一个变量定义的。如果用==
比较,一定是false,因为一个是静态常量池,一个是运行时常量池。所以应该用equals来比较。
喜欢的话记得点赞收藏哟😊
Java从入门到精通博文专栏持续更新!