24
2020
03

String字符串比较问题代码


public class TestStringAddress {

 public static void main(String[] args) {

  //1常量池

  String a = "abc";

  String b = new String("def");

  String c = "abc";

  String d = b.intern();

  String e = "def";

  System.out.println(a.hashCode());//96354

  System.out.println(b.hashCode());//99333

  System.out.println(c.hashCode());//96354

  System.out.println(d.hashCode());//99333

  System.out.println(e.hashCode());//99333

  System.out.println(a==c);//true

  System.out.println(b==d);//false,b是堆中String对象,d是直接指向“def”的,而b则是指向b的实例的,两个是不同的实例。

  System.out.println(d==e);//true

  System.out.println(b==e);//false,同理,e也是直接指向def字符串的。

  //2.字符串截取

  String s1 = new String("abcdef");//实质是该方法读取了原来字符串的对象的部分,并返回了新的对象

        String s2 = s1.substring(2, 4);

        System.out.println(Integer.toHexString(s1.hashCode())); // 打印:ab199863

        System.out.println(Integer.toHexString(s2.hashCode()));// 打印:c61, 显然s1和s2不是同一个对象

        //3.编译器做了优化,直接在编译的时候将字符串进行拼接

        String str1 = "hello" + " java";//相当于str1 = "hello java";

        String str2 = "hello java";

        System.out.println(str1 == str2);//true

        String str3 = "hello";

        String str4 = " java";

        String str5 = str3 + str4;//编译的时候不知道变量中存储的是什么,所以没办法在编译的时候优化,拼接时需要拿到具体指向的值

        System.out.println(str2 == str5);//false

 }


}



版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/qq_42755868/article/details/105048987

« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。