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