String类型创建对象的方式有两种:直接赋值,new 构造方法。
首先声明:String是final类,说明它声明的变量的地址都是不可以修改的,注意是地址已经固定了,改的只是引用指向的值。
1.直接赋值
String a="110"
这种类型就是我们所说的直接赋值,执行“String a = ”110“;”后,JVM在常量池中开辟空间存放一个abc字符串空间(即创建对象)并让a指向该对象;
String a="110";
String b="110";
1、执行“String a = ”110“;”后,JVM在常量池中开辟空间存放一个abc字符串空间并让a指向该对象;
2、执行“String b = ”110“;”时,JVM会先检查常量池中是否已经存在了一内容为110的空间,如果存在就直接让b指向该空间,否则就会在开辟一个新的空间存放该字符串,所以,以上的第二行代码不会创建对象,上面的代码等同于下面代码:
String a="110";
String b=a;
system.out.println(a);
system.out.println(b);
输出:110
110
2.new
new :直接存入堆内存;每new一次就会创建一个新的对象
String address=new String("河南郑州高新区");
String address2=new String("河南郑州高新区");
这两个对象会在堆中开辟两个地址,在栈里存储的是地址,在调用的时候会调用它的地址,所以利用==判断的时候,会输出false,因为他们二者的地址不同。
3.==在String中的使用
==对于直接赋值型创建的对象,==比较的是两个对象的值。
==对于new型创建的对象,==比较的是两个对象的地址。
一些讨论(参考资料)
1. String a=“1”;//毫无疑问,这句话创建了一个对象,这个对象是 【常量对象】:“1”,而引用a指向了常量对象。
2. String b=new String("2");//毫无疑问,这句话建了创两个对象,一个是在new String出来的对象“2”,存在堆上;一个是【常量对象】:“2”,b是引用,指向堆上的对象。
下面重点来了:
接着上面的代码,继续写如下语句
3. String c=“1”;//这个时候,因为上面的第一条语句已经创建了常量对象1,它已经存在常量池里了,所以没有创建对象,引用c指向了常量对象;
4. String d = new String("1");//new String肯定是要创建一个对象在堆上的;而常量对象“1”已经在常量池里了,所以这条语句只创建了一个对象;引用d指向了堆上的对象。