原先对String研究的比较透彻了,今天突然发现又忘了,所以写一个测试的方法。以后忘了就拿出来看看。 下面是原代码。
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 在堆创建了了个""对象,当然和常量池的""不一样了啊。
} }
|
|