总结:String数据类型,通过=“”创建的对象在方法之中传递的常量池之中的常量的引用,通过new String传递的是堆中对象的引用;值得注意的是,一旦在方法之中通过任何方式对String数据类型进行修改,那么方法之中的引用与方法外的引用通过==来判断发生微妙变化;下面是详解
public class TestMain {
static String s2 = "abc";
public static void main(String[] args) {
equal(s2);
}
public static void equal(String s) {
System.out.println(s2 == s);//1 true
s=new String("abc");//2
System.out.println(s2 == s);//3 false
s="abc";//4
System.out.println(s2 == s);//5 true
}
}
在1处传递过去了常量池中的对象“abc”的引用,s2和s指向同一个常量,故相等true;
在2处通过new String改变了引用s指向的String对象,故在3处为false;
在4处通过=“abc“方式再次将引用s指向常量池中对象“abc”,而不是把值“abc”赋给s原来的对象,是以s2和s指向常量池中的的对象“abc”故相等true;
public class TestMain {
static String s2 = new String("abc");
public static void main(String[] args) {
// TODO Auto-generated method stub
equal(s2);
}
public static void equal(String s) {
System.out.println(s2 == s);//1 true
s=new String("abc");//2
System.out.println(s2 == s);//3 false
s="abc";//4
System.out.println(s2 == s);//5 false
}
};
在1处,两个引用指向同一个对象,故相等;
在2处,引用s指向了一个新对象,故3为false
在4处,引用s指向常量池中的对象“abc”,而不是把值“abc”赋给原来的对象,s2和s不指向同一个对象,故为false;
其实:通用的是,不管方法外还是方法内,判断一个引用数据类型是否==,关键的是是否指向同一个对象,不管这个对象是在常量池中,还是堆中;
如此,可以确定的是,在方法外的引用所指向的对象(无论是常量池中的常量还是堆中对象)根本没有发生变化,所以无论在方法之中怎么修改,方法外的引用所指向的对象不会发生变化,通过分析发现其值也没有发生变化。
可以知道是,引用数据类型基本上是传递的引用,当我们想知道这个引用的参数有没有被修改时,关键在于查看是否有在其他地方修改这个引用所指向对象;值得注意的是可能存在一些特殊的赋值方式,让我们误以为发生了改变。