测试用==比较String字符串

当我们定义String的变量S1的值为X的时候,jdk首先在常量池中寻找有没有X这个值,如果有这个值直接将常量池中的地址赋给S1,没有的话将在池中开辟新的空间存储X。

1.测试1

        String a="hello";
        String b="he"+new String("llo");
        System.out.println(a==b);

当代码执行到第一行的时候,JVM检测这个字符串,这里我们认为没有内容为hello的对象存在。JVM通过字符串常量池查找不到内容为hello的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量a。

执行到第二行的时候,由于b+上了一个new出来的llo,因为new llo在常量池中又开辟了新的空间,随便b也是hello,但引用的不是同一个字符串对象,所以

输出结果为false;

2.测试2

        String c="hello";
        String d=new String("hello");
        System.out.println(c==d);

当代码执行到第一行的时候,JVM检测这个字符串,这里我们认为没有内容为hello的对象存在。JVM通过字符串常量池查找不到内容为hello的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给c。

当代码执行到第二行的时候,因为new,d的引用是新开辟出来的hello的引用,不是第一个c的引用,所以

输出结果也是false;

3.测试3

        String e="hello";
        String f="he";
        String g="llo";
        String h=f+g;
        System.out.println(e==h);

当代码执行到第一行的时候,JVM检测这个字符串,这里我们认为没有内容为hello的对象存在。JVM通过字符串常量池查找不到内容为hello的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给e。

因为h的值是由f+g的值,而h=f+g,这里创建了两个对象,所以引用的地址也不一样

输出结果为false;

4.测试4

        String a1="hello";
        String a2="llo";
        String a3="he"+a2;
        System.out.println(a1==a3);

当代码执行到第一行的时候,JVM检测这个字符串,这里我们认为没有内容为hello的对象存在。JVM通过字符串常量池查找不到内容为hello的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给a1。

当代码执行到第二行的时候,因为JVM在常量池中没有找到llo这个字符串,那么JVM就在常量池中新建了一个,并把引用返回给a2

所以a3=“he”+a2的引用也和a1不一样

输出结果为false;

5.测试5

        String c1=new String("hello");
        String c2=new String("hello");
        System.out.println(c1==c2);

两个都是new出来的对象,肯定不会一样

输出结果为false;

6.测试6

        String a11="hello";
        String a22="he"+"llo";
        System.out.println(a11==a22);

输出结果为true;

猜你喜欢

转载自blog.csdn.net/qq_38146131/article/details/82227314