详述如何创建String对象
在研究String是如何创建对象之前,我们先来看一下基本数据类型和引用类型是如何赋值的。
关系运算符 “==”,判断值是否相等。基本数据类型:由于变量与值同在栈中,所以比较的是值是否相等。引用数据类型:因为变量存的是对象的地址,所以比较的是地址是否相等。
public class Test {
public static void main(String[] args) {
int a = 12;
int b = 12;
System.out.println(a == b);
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1 == obj2);
}
}
String是引用数据类型,所以String类型的变量存的是所创建对象的地址。
创建String对象
String创建对象有两种方式
1、直接赋值
语法格式如下:
2、构造方法实现其实例化
语法格式如下:
String类两种创建对象的方式的区别:
1、直接赋值,这种方式会出现常量池数据共享现象
常量池是在java用于保存在编译期已确定的,已编译的class文件中的一份数据。常量池存在于堆中。
public class StringTest {
public static void main(String[] args) {
String str1 = "abc";
String str2 = "abc";
String str3 = "def";
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str1 == str2);
}
}
当执行到“String str1 = “abc”;”时,JVM在常量池开辟一个空间存放字符串“abc”,并让str1存放该对象的地址。执行“String str2 = “abc”;”时,JVM会先检查常量池中是否存在一个空间其中存放字符串“abc”,如果有,则直接让str2指向改地址,如果没有,就再开辟一个空间存放该字符串。因此变量str1和ser2存放的地址相同。执行“String str3 = “def”;”时,JVM检查发现常量池中不存在一个空间存放字符串“def”,于是便开辟一个空间存放该字符串并让str3指向该空间。
2、通过创建对象,调用构造方法赋值。
public class StringTest {
public static void main(String[] args) {
String str1 = new String("abc");
String str2 = new String("abc");
String str3 = new String("def");
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
System.out.println(str1 == str2);
}
}
执行“String str1 = new String(“abc”);”时,JVM直接在堆中创建一个对象,并让str1指向该对象,同理,执行“String str2 = new String(“abc”);”时,JVM在堆中创建一个新的对象,并让str2指向该对象.因此变量str1与变量str2存放的地址不同。