zoukankan      html  css  js  c++  java
  • String -- intern 方法详解

    这个intern()官方说法的作用是返回字符串对象的规范化表示... 然而不明觉厉...

    用我通俗一点说法其实就是,拿到一个字符串,那它到字符串常量池中去执行equals方法,如果返回为true,就代表,有相同的则返回字符串常量池里面的那个引用,若没有,则在字符串常量池里面创建一个这样的常量,这里就会包含运行时常量池的知识了,然后再返回新创建的在字符串常量池里面的引用

    下面我po出些例子来

    public class InternOfString {
        public static void main(String[] args) {
            String s1 = "a";
            String s2 = "b";
            String s3 = "ab";
            String s4 = s1+s2;
            String s5 = new String("ab");
            String s6 = "a" + "b";
            String s7 = "a"+s2;
            System.out.println(s3.equals(s5));
            System.err.println(s5.equals(s4));
            System.out.println(s5.intern() == s3);
            System.out.println(s3 == s5);
            System.out.println(s4 == s5);
            System.out.println(s4 == s3);
            System.out.println(s4.intern() == s3);
            System.out.println(s3 == s6);
            System.out.println(s7 == s3);
            
            String s8 = new String("abc");
            String s9 = new String("abc");
            System.out.println(s8.equals(s9));
            System.out.println(s8.intern() == s9);
            
        }
    }

    依次的结果为 :

       true

     true

     true

       false 

      false

      false

      true

      true

      false

      true

      false

    怎么说,字符串的equals 和 == 算是老生常谈的话题了,无非就是被分配的VM 区域不同的问题,

      一点足以:只要字符串初始化中含有引用的,就肯定不会是被分配在字符串常量池中,而是会在类加载时,随机分配在方法区中,往大里说就是heap中,

          ,纯字符串的结合,例如 s1,s2, s3, s6,就会直接在字符串常量池中被分配。。。

    剩下的intern方法就是去字符串找长得和自己一样的顶上去,equals就是看前后两个是不是相等,==则看是不是自己

      

  • 相关阅读:
    VUE入门
    搭建内网穿透服务
    nacos集群配置安装
    jenkins入门
    Linux系统管理与自动化运维
    SVN
    JAR包启动
    服务器rm -rf 恢复案例 好文章
    docker入门到放弃
    CentOS7安装图形界面及报错处理
  • 原文地址:https://www.cnblogs.com/AmoryWang-JavaSunny/p/6407996.html
Copyright © 2011-2022 走看看