public class TestString {
public static void main(String[] args){
String n = "I Love Java";
String m = "I Love Java";
String s = new String( "I Love Java") ;
System.out.println(n==m);//这个为什么是true?
System.out.println(n==s);//这个为什么又成了false?
}
}
为什么会有不一样的结果?
使用new关键字,存放在堆中 -- String s = new String( "I Love Java") ;
而此处 String n = "I Love Java";运行时 是先检查常量池中是否有 "I Love Java" 如存在就赋给n 没有就在字符池新建后在赋给
String m = "I Love Java";
m同上
== 判断是否为同一个对象
String n = "I love java";这条语句和String m = "I love java";都是创建了唯一的对象,而对象的内容也相同。
而 String s = "I love java"; 这条语句实际上创建了两个对象。一个是内容是"I love java"的匿名对象 和引用对象s 故而 n==s 是false。 懂了吗?
String n = "I Love Java";这里在堆内存创建了一个字符串对象,类类型变量n存储在栈内存中;此时n中存储的是对象的地址值;若再次定义一个对象 String m = "I Love Java";此时系统不会重新创建对象,而是把已有的对象地址值复制给新的类类型变量m,所以m==n;
而String s = new String( "I Love Java") ;在Java中new就代表重新创建一个实例对象,也就是有一个新的地址值,此时类类型变量s里面就存储了一个不一样的地址,所以s!=n;
需要强调一下String s = new String( "I Love Java") ;实际上有两个对象,即new String()所创建的对象中存储了另一个对象"I Love Java";
n和m比较结果为True是因为:n是一个类类型变量,"I LOVE JAVA"是一个对象。而字符串的特点是一旦初始化就不可改变。
n和s比较结果为false是因为:“I LOVE JAVA”是一对象,s是一个new的新对象。
你如果用equals比较结果就为true了。equals用于判断字符串是否相同。
几句话也说不清,你仔细看看毕向东老师的第13天视频01--String概述就OK了。
string s="I Love Java"只有1个String Object对象。可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈内存中数据的实际情况来决定是否有必要创建新对象.
而对于string s = new string ( "I Love Java") 则在堆内存中创建了新对象,
一个是“I Love Java”,一个是指向“I Love Java”的引用对像s。加重了程序的负担。
class TestString {
public static void main(String[] args){
String n = "I Love Java";
String m = "I Love Java";
String s = new String( "I Love Java") ;
System.out.println(n==m);
System.out.println(n.equals(m));
System.out.println(n==s);
System.out.println(n.equals(m));
}
}
String n = "I Love Java";
String m = "I Love Java";只里面只有一个对象就是字符串常量 "I Love Java",n和m分别指向这个对象,
而new String( "I Love Java");new了一个新的对象,重新分配了一个内存空间,s就指向了另一个对象,但是他们值相等,equals比较时相等。