String定义的三种格式:
- 直接赋值,例:String str = “abc”;
- 创建对象,例:Stirng str1 = new(“abc”);
- 拼接对象,例:String str2 = “ab” + “c”; 或者为:String str3 = “ab”;String str4 = str3 + “c”;
"=="表示两个字符串是否为同一对象,即在内存中,代表着两个地址是否一样。
他们具体的差别在哪呢?我们可以先看一下代码:
public class Test {
public static void main(String[] args) {
String str1 = "abc"; //直接赋值
String str2 = new String( "abc" ); //创建对象
String str3 = "ab" + "c"; //拼接
String str4 = "ab"; //这也是拼接的一种 但和上面的那一种不一样
String str5 = str4 + "c";
System.out.println( str1 == str2 );
System.out.println( str1 == str3 );
System.out.println( str1 == str5 );
System.out.println("===========分割线============");
System.out.println( str2 == str3 );
System.out.println( str2 == str5 );
System.out.println("===========分割线============");
System.out.println( str3 == str5 );
}
}
在解释这个结果之前,我们得先了解在我们Java程序运行时会维护一个String pool(String池),也叫“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池中,并且创建的对象仅仅存在于方法的堆栈区。
当用户采用直接赋值实例化String对象的时候,如果是第一次定义,则自动的将对象的内容(字符串的内容)保存在字符串对象池中,以后如果有其他的字符串对象依然采用直接赋值的话,可以直接通过对象池取出已经存在的内容继续使用,而不会再重新开辟新的空间。
内存图如下:
看懂这些后,我想上面代码运行结果的原因你也差不多明白了吧如果还有什么不太清楚的,欢迎评价留言哦~