String 有两种方式赋值,一种是直接赋值,一种是通过构造方法赋值
1.String 第一种赋值方法 ,直接赋值:
String s = "Hello Java";
这种方式赋值,可以看作是”Hello Java”在堆内存中首先开辟了一个空间,在把空间地址赋值给了String s 对象.
也可以把”Hello Java”看作是String类的匿名对象,创建对象s,并把地址值赋给了s,s再指向”Hello Java”.
如下可以验证”Hello Java”是匿名对象
public calss Demo{
public static void main(String [] agrs){
System.out.println("Hello Java".equals("Hello java"));//输出为false
}
}
由此可以看出”Hello Java”为一个匿名对象 因为他可以调用equals()方法
当然用这种方法来赋值最大的好处,是他在堆内存中开辟了一个空间,无论栈空间有多少个String 对象需要引用他都不用在堆内存中重新创建一个新的空间来重新将新的地址给对象
上面解释如下代码
public calss Demo{
public static void main(String [] agrs){
String str = "Hello Java";
String str1 = "Hello Java";
String str2 = "Hello Java";
String str3 = "Hello Java";
System.out.println(str == str1);//true
System.out.println(str1 == str2);//true
System.out.println(str2 == str3);//true
}
}
由此可见他们的地址值都是一样的所有猜都为true.
2.String第二种赋值方法,用new String()构造方法来赋值
具体代码:
public calss Demo{
public static void main(String [] agrs){
String str = new String("Hello Java");
System.out.println(str);//Hello java
}
}
这种方式就是直接用String类的构造方法来赋值,这种方式用了new关键字,所以无论是创建几次对象都是需要重新在堆内存中创建新的内存空间,这样堆内存空间就会被占用很多,并且他们每个对象所引用的地址值都不一样,代码如下:
public calss Demo{
public static void main(String [] agrs){
String str = new String("Hello Java");
String str1 =new String("Hello Java");
String str2 =new String("Hello Java");
String str3 =new String("Hello Java");
System.out.println(str == str1);//false
System.out.println(str1 == str2);//false
System.out.println(str2 == str3);//false
}
}
所以这种方法远不如第一种直接赋值来的直接快速,并且不占用内存空间,所以推荐用第一种赋值方式
补充:
String 类进行操作的时候有个特别重要的特性:
也就是字符串一旦被赋值就不能再被改变,即使是在输出上是被改变了字符串的输出打印,但是内存空间是重新开辟了一个新的字符串空间,以前的字符串并没有被改变,而且以前的字符串还是在内存池中。