Java从入门到精通—String类【String对象池(常量池)】

Java从入门到精通—String类【String对象池(常量池)】

    • 一、 String对象池简介
    • 二、示例
      • 静态常量池
        • 【Stringdemo1 .java】
        • 【运行结果】
        • 【分析】
      • 运行时常量池
        • 【Stringdemo2 .java】
        • 【运行结果】
        • 【分析】
    • 三、总结

一、 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
	}
}

【运行结果】

Java从入门到精通—String类【String对象池(常量池)】_第1张图片

【分析】

Java从入门到精通—String类【String对象池(常量池)】_第2张图片
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); 
	}
}

【运行结果】

Java从入门到精通—String类【String对象池(常量池)】_第3张图片

【分析】

这个程序之所以是一个false,是因为程序在加载的时候并不确定info是什么内容。程序加载的时候进行字符串连接info采用的是变量,变量的内容是可以修改的,所以程序不认为最终的strB的结果就是一个所需要的最终的结果,不会在一开始的时候进行字符串连接处理。

这里的strB存入的是运行时常量池里去了,没用复用strA,所以地址不一样

三、总结

Tips
在开发中,如果有些数据需要我们后面输入的,作为一个变量定义的。如果用==比较,一定是false,因为一个是静态常量池,一个是运行时常量池。所以应该用equals来比较。


喜欢的话记得点赞收藏哟
Java从入门到精通博文专栏持续更新!

你可能感兴趣的:(Java从入门到精通)