zoukankan      html  css  js  c++  java
  • 字符串、常量池、StringBuilder之间的微妙关系

    例子:
    public static void main(String[] args) throws IOException{
            String s1 = "Programming";
            String s2 = new String("Programming");
            String s3 = "Program";
            String s4 = "ming";
            String s5 = "Program" + "ming";
            String s6 = s3 + s4;
            System.out.println(s1 == s2);  //false
            System.out.println(s1 == s5);  //true
            System.out.println(s1 == s6);  //false
            System.out.println(s1 == s6.intern());  // true
            System.out.println(s2 == s2.intern());  // false
    }

    为什么?

    我们先看看反编译后的代码:

      public static void main(String[] paramArrayOfString) throws IOException {
        String str1 = "Programming";
        String str2 = new String("Programming");
        String str3 = "Program";
        String str4 = "ming";
        String str5 = "Programming";
        String str6 = str3 + str4;
        System.out.println(str1 == str2);
        System.out.println(str1 == str5);
        System.out.println(str1 == str6);
        System.out.println(str1 == str6.intern());
        System.out.println(str2 == str2.intern());
      }

    在解答之前先复习一下:

    1.==判断的是对象的内存地址,而equals判断的是对象内容;

    2. String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;

    解答:

    1.s1与s2内存地址不一致,故:System.out.println(s1 == s2); //false

    2.从反编译的代码看出,s5是直接赋值字符串"Programming",因为"Programming"已存在常量池中,就直接使用常量池中的字符串,故:System.out.println(s1 == s5); //true

    3.实际String s6=(new StringBuilder(s3)).append(s4).toString(),是一个新的String对象,故:System.out.println(s1 == s6); //false

    4.s6.intern() 意思是拿到s6字符串对象在常量池中对应的版本的引用,由于常量池中已存在"Programming"并且是在初始化s1时生成的,故:System.out.println(s1 == s6.intern()); // true

    5.同理,s2.intern()返回的的字符串引用同样等于s1,故: System.out.println(s2 == s2.intern()); // false

     

  • 相关阅读:
    病毒写法,资源的释放.
    MinHook库的使用 64位下,过滤LoadLibraryExW
    系统权限远程线程注入到Explorer.exe
    【Unity】4.5 树木创建器
    【Unity】4.4 添加角色控制器
    【Unity】4.3 地形编辑器
    【Unity】4.2 提升开发效率的捷径--导入 Unity 5.3.4 自带的资源包
    【Unity】4.1 创建组件
    【Unity】4.0 第4章 创建基本的游戏场景
    【Unity】3.6 导入图片资源
  • 原文地址:https://www.cnblogs.com/anquing/p/14565494.html
Copyright © 2011-2022 走看看