当我们定义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;