下面是源代碼(存為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 s
=
;
String s
=
;
System
out
println(
String s
= \
\
String s
= \
\
);
System
out
println(
s
==s
:
+ (s
==s
));
System
out
println(
s
equals(s
):
+ s
equals(s
));
System
out
println(
s
hashCode()==s
hashCode():
+ (s
hashCode()==s
hashCode()));
//讓s
的引用變一下
s
=
;
System
out
println(
s
= \
\
;
);
System
out
println(
s
==s
:
+ (s
==s
));
System
out
println(
s
equals(s
):
+ s
equals(s
));
System
out
println(
s
hashCode()==s
hashCode():
+ (s
hashCode()==s
hashCode()));
//原來都是true
都是引用的常量池
如果這樣呢?
s
= new String(
);
System
out
println(
s
= new String(\
\
);
);
System
out
println(
s
==s
:
+ (s
==s
));
System
out
println(
s
equals(s
):
+ s
equals(s
));
System
out
println(
s
hashCode()==s
hashCode():
+ (s
hashCode()==s
hashCode()));
//new 方法在堆中創建了一個新的對象
而s
引用了它
不再是原來引用的常量池了
//看看這個結果
s
= new String();
System
out
println(s
);
//這個語句相當於s
= new String(
);和下面的不一樣
String s
= null;
System
out
println(s
);
//再來看看intern方法
說明了什麼??
String s
= new String();
System
out
println(
use intern method s
==s
intern()
>
+ (s
==s
intern()));
//new 在堆創建了了個
對象
當然和常量池的
不一樣了啊
}
}本文出自
CTO
COM技術博客
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25812.html