首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >串池StringTable与s.intern()方法 、 验证s.intern()方法(基于jdk1.8)(附1.6对比)

串池StringTable与s.intern()方法 、 验证s.intern()方法(基于jdk1.8)(附1.6对比)

作者头像
Miloce
发布2022-09-28 11:03:00
发布2022-09-28 11:03:00
1680
举报
文章被收录于专栏:JoyJoy

验证s.intern()方法(基于jdk1.8)(附1.6对比)

1、在 jdk1.8中 s.intern()方法指的是尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入(和堆中为同一对象)。
  • 最终返回的是串池中的对象(不论放不放入)
  • 如:String s1 = s.intern(); s1指的是串池中的常量对象
2、下面是两个测试横向对比(1.8环境):
两个方法不同之处:
  • 主要在执行String s1 = s.intern() 前后,具体看下面测试方法的注释
  • 导致两个方法中最后一行System.out.println(“ab” == s) 输出不同
测试一:执行String s1 = s.intern() 前放入”ab”
代码语言:javascript
复制
//最终串池中对象StringTable["a", "b", "ab" ]
public static void main(String[] args) {

    //vm调用StringBuild.append("a").append("b").toString() 最终相当于变成 new String("ab")
    String s = new String("a") + new String("b");

    //*****线程此时串池中对象StringTable["a", "b"]

    //堆内存: new String("a")   new String("b")   new String("ab")

    System.out.println("ab" == s);  //false  串池中没有"ab",此次会将 "ab"常量放入串池 因为 s在堆内存中,"ab"在串池中内存地址不同

    //****此时串池中对象StringTable["a", "b", "ab"]

    //s.intern尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入, 最终会返回串池中的对象
    String s1 = s.intern();  //不会放入s,因为串池中已经存在 "ab"

    System.out.println("ab" == s1);  //true   都是串池中的常量对象 ab

    System.out.println("ab" == s);  //false   s为堆内存地址 "ab"为串池中

}
测试二:执行String s1 = s.intern() 后放入”ab”
代码语言:javascript
复制
//最终串池中对象StringTable["a", "b", "ab" ]
@Test
public void test() {
    //vm调用StringBuild.append("a").append("b").toString() 最终相当于变成 new String("ab")
    String s = new String("a") + new String("b");  //简化等同于  String s = new String("ab");

    //*****线程此时串池中对象StringTable["a", "b"]

    //堆内存: new String("a")   new String("b")   new String("ab")

    //s.intern尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入, 最终会返回串池中的对象
    String s1 = s.intern();  //放入s,因为串池中不存在 "ab" 之前代码行中未出现常量 "ab"

    System.out.println("ab" == s1);  //true   都是串池中的常量对象 ab

    //****此时串池中对象StringTable["a", "b", "ab"]

    System.out.println("ab" == s);   //true   s、"ab"为串池中同一个常量
}
3、附:在 jdk1.6中 s.intern()方法指的是尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入时为拷贝一份s对象放入
测试:
代码语言:javascript
复制
//最终串池中对象StringTable["a", "b", "ab" ]
public static void main(String[] args) {

    String s = new String("a") + new String("b");

    //*****线程此时串池中对象StringTable["a", "b"]

    String s1 = s.intern();  //拷贝一份s对象放入

    //*****线程此时串池中对象StringTable["a", "b", "ab"]
    
    System.out.println("ab" == s1);  //true   都是串池中的常量对象 ab

    System.out.println("ab" == s);   //false   s为堆内存地址 "ab"为串池中对象

}
# 总结:
  • 1.6将常量对象放入常量池时拷贝,最终堆中和常量池中对象不同
  • 1.8将常量对象放入常量池时直接将堆内存中对象放入,最终堆中和常量池中对象为同一个
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 验证s.intern()方法(基于jdk1.8)(附1.6对比)
    • 1、在 jdk1.8中 s.intern()方法指的是尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入(和堆中为同一对象)。
    • 2、下面是两个测试横向对比(1.8环境):
    • 3、附:在 jdk1.6中 s.intern()方法指的是尝试将字符串对象s放入串池中 :如果串池中有,则不会放入;若没有,放入时为拷贝一份s对象放入
    • # 总结:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档