• java中String字符串的==解析


    今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解。

    首先,==运算符比较的是两个变量所指向的对象内存地址是否相同,相同则为true,不同则为false,因此问题变为分析字符串的内存地址是否相同;

    (1)堆中的字符串对象和字符串常量池中的字符串

    String s1 = "a";
    String s2 = new String("a");
    System.out.println(s1==s2);

    结果为:false

    原因:s1这种声明方式会在字符串常量池中新增一个“a”字符串对象,s2的声明方式则会在堆中创建一个"a"字符串对象;因此它们的内存地址并不同。

    (2)堆中的两个字符串对象

    String s1 = new String("a");
    String s2 = new String("a");
    System.out.println(s1==s2);
    

    结果为:false

    原因:两个不同对象的内存地址肯定不同。

    (3)两个常量池中的字符串

    String s1 = "a";
    String s2 = "a";
    System.out.println(s1==s2);

    结果为:true

    原因:字符串常量池的设计是这样:当往常量池中添加字符串时会先去判断是否已经有了此字符串,判断的方式为equals;因此s1、s2是引用的同一个字符串,内存地址相同。

    (4)string.intern()方法

    String s1 = "a";
    String s2 = new String("a").intern();
    System.out.println(s1==s2);

    结果为:true

    原因:intern方法会将字符串对象放入到常量池中,因此同(4)。

    (5)变量和字符串相加

    String s1 = "a";
    String s2 = "b";
    String s3 = "ab";
    String s4 = s1+s2;
    System.out.println(s3==s4);

    结果为:false

    原因:当对变量而不是字符串进行相加时,由于只知道字符串引用不知道具体的字符串值,jvm实际上是用StringBuilder的append方法完成的加操作,然后通过toString方法返回字符串的值,toString方法如下:

    public String toString() {
            // Create a copy, don't share the array
            return new String(value, 0, count);
    }

    因此,原因同(1)。

    情况还有就不列举了,只要去看java字节码就能明白为什么是这种情况,说到底,这些除了能帮助人理解java内存模型,其他什么用都没有,哦不,还能装逼。

  • 相关阅读:
    目标跟踪_POI算法
    深度学习-Maxpool
    HOG特征
    R CNN
    颜色空间
    数值分析-非线性方程的数值解法
    数值分析-一些小小的知识点
    数值分析-求微分
    多元统计分析-因子分析
    最优化-可行方向法
  • 原文地址:https://www.cnblogs.com/zhengcj/p/string-equal.html
Copyright © 2020-2023  润新知