Java String对象
package org.onepiece; import java.lang.String; public class Main { public static void main(String[] args) { //常量 String str1 = "abc"; String str2 = "abc"; //变量 String newStr1 = new String("abc"); String newStr2 = new String("abc"); //String == 操作符比较的是:引用地址(内存)是否一致 println( str1 == str2 ); //true println( str1 == newStr2 ); //false println( newStr1 == newStr2 ); //false //String equals()方法比较的是:比较值是否相等 println( str1.equals(str2) ); //true println( str1.equals(newStr2) ); //true println( newStr1.equals(newStr2) );//true } private static void println(Object obj) { System.out.println(obj); //sout } }
String str1 = "abc" ;定义的是一个常量。
在常量池(堆空间)中开辟了一块空间,在其中存放了字符串"abc",并通过str1对象指向这个常量对象。
String newStr1 = new String("abc");通过 new 关键字,定义了一个变量。
在堆空间中通过 new关键字开辟了一块内存,在其中存放字符串"abc",并把内存的地址(引用地址)赋予newStr变量。
str1 和 str2 两个常量,它们是存放在常量池中。Java虚拟机会对常量池进行优化。
str1 和 str2 这两个常量的值相同,因此它们是存放在一个空间中的。也就是说 str1 和 str2 这两个引用是指向同一块内存。
str1 和 newStr1 分别处在常量池和堆空间中,因此它们的内存地址不可能一致。
如果通过 new关键字来创建字符串,即使它们的值是一致的,但是它们是处在内存的两个不同的空间中。
package org.onepiece; import java.lang.String; public class Main { public static void main(String[] args) { String str = "abc"; //常量 String a = "a"; //常量 String b = a + "bc"; //变量 String c = "a" + "bc"; //常量 println(str == b); //false println(str == c); //true println(b == c); //false println(str.equals(b));//true println(str.equals(c));//true println(b.equals(c));//true } private static void println(Object obj) { System.out.println(obj); //sout } }
String a = "a";定义了一个常量a,它的值是"a"。
String b = a + "bc";是一个字符串的连接操作。引用的a对象已经是一个变量,所以b是变量。
String c = "a" + "bc";执行了两个常量的连接操作,根据Java虚拟机的优化操作,c对象是一个常量。
结论:
1、String常量存放在常量池中,Java虚拟机出于优化的考虑,会让内容一致的对象共享共享内存块。
但变量是放在堆空间中的,new 定义的不同变量内存地址不会相同。
2、String常量连接常量,依然用常量池管理,但变量连接变量就是变量。

浙公网安备 33010602011771号