下面是源代码(存为Java文件,编译运行,推敲下结果):
public class DosShell {
public static void main(String[] args) {
// 开始测试了。
System.out.println("Hello world");
//定义两个对象,并初始化。
String c = "Check equal method";
String d ="Check ";
//这样d 和 c是一样的麽?
d += "equal method";
System.out.println("c.equals(d)的结果并不表示c和d到底是不是引用的一个对象,因为它被重载了.结果:"+ (c.equals(d)));
System.out.println("c==d的结果表示c和d到底是不是引用的一个对象.结果:"+ (c==d));
//intern方法是干什么的呢?原来是返回 常量池 中的常量的引用(如果没有就创建一个)。那么下面的结果是什么呢?
System.out.println("use intern method c==c.intern()-->" + (c==c.intern()));
System.out.println("use intern method d==c.intern()-->" + (d==c.intern()));
System.out.println("use intern method c==d.intern()-->" + (c==d.intern()));
System.out.println("use intern method d==d.intern()-->" + (d==d.intern()));
//原来c直接是引用的常量池中,而d不是。难怪c!=d;
//下面这个简单
String s1 = "123";
String s2 = "345";
System.out.println("String s1 = \"123\";String s2 = \"345\"");
System.out.println("s1==s2: " + (s1==s2));
System.out.println("s1.equals(s2): " + s1.equals(s2));
System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
//让s2的引用变一下
s2 = "123";
System.out.println("s2 = \"123\";");
System.out.println("s1==s2: " + (s1==s2));
System.out.println("s1.equals(s2): " + s1.equals(s2));
System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
//原来都是true,都是引用的常量池,如果这样呢?
s2 = new String("123");
System.out.println("s2 = new String(\"123\");");
System.out.println("s1==s2: " + (s1==s2));
System.out.println("s1.equals(s2): " + s1.equals(s2));
System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
//new 方法在堆中创建了一个新的对象,而s2引用了它,不再是原来引用的常量池了。
//看看这个结果
s2 = new String();
System.out.println(s2);
//这个语句相当于s2 = new String("");和下面的不一样。
String s3 = null;
System.out.println(s3);
//再来看看intern方法,说明了什么??
String s4 = new String();
System.out.println("use intern method s4==s4.intern()-->" + (s4==s4.intern()));
//new 在堆创建了了个""对象,当然和常量池的""不一样了啊。
}
}
本文出自 51CTO.COM技术博客