Java| 什么是字符串常量池( String Pool )?

顾名思义,Java 中的字符常量串池( String Pool )是一个存储在 Java 堆内存中的字符串池。 我们知道 String 是 java 中的特殊类,我们可以使用 new 操作创建 String 对象,也可以使用双引号来创建 String 对象.


字符串常量池在哪里?

字符串常量池 ( String Pool )存在于方法区
在分析字符串常量池的位置时,首先了解一下堆、栈、方法区:
在这里插入图片描述


  • 存储的是对象,每个对象都包含一个与之对应的class
    JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
    对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定


  • 每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)
    每个栈中的数据(原始类型和对象引用)都是私有的
    栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
    数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失

  • 方法区
    静态区,跟堆一样,被所有的线程共享
    方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量


哪些String对象存放在字符串常量池( String Pool )中?

  • 1.字面值字符串
  • 2.字符串赋值常量表达式
  • 3.使用 intern 方法对String对象进行操作返回的String对象
String st1 = "yveshe1";
String st2 = new String("yveshe2");

String st = st1 + "hello";
String internStr = st.intern();

System.out.println(st == internStr);

分析:
首先,字面值字符串有: yveshe2 , hello
其次,使用字符串赋值表达式有:String st1=yveshe1
最后,使用intern方法的有:String internStr = yveshe1hello

对象st1 在常量池中
对象st2 不在常量池中
对象st 不在常量池中
对象internStr JDK6在常量池中,JDK7则是使用的st的实际地址,只在常量池中保存了引用.

输出结果: JDK6输出结果为false,JDK7输出结果为true.


相关: String的intern()方法的作用是什么?
相关: 深入解析String#intern(JDK6和JDK7的异同)

参考:
https://segmentfault.com/a/1190000009888357#articleHeader0
http://www.importnew.com/10756.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值