Discussion:
[問題] 初學者的幾點小疑問
(时间太久无法回复)
war3rd
2007-01-21 12:21:55 UTC
Permalink
以下這二支小程式....

程式一:

public static void main (String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);


Integer i1 = 47;
Integer i2 = 47;
System.out.println(i1==i2);

Integer p1 = 147;
Integer p2 = 147;
System.out.println(p1==p2);

}

}

因為小弟剛接觸java(自修) 如果覺得問題太蠢還請見諒

問題1:為何n1==n2(結果:false)而i1==i2(結果:true) 他們的值不是都相等嗎?
還是Integer oo = new Integer (xx) 與 Integer oo = xx 二種方式有哪不同嗎?

問題2: 那又為啥同樣是 Integer oo = xx 的方式
i1==i2(ture) 而p1==p2(false) 這又是為啥?我只不過數字修正了一下

程式二:
class Letter {
char c;
}
public class test{
static void f(Letter y) {
y.c='Z';
}
public static void main (String[] args){
Letter x= new Letter();
x.c= 'a';
System.out.println("1:x.c: "+x.c);
f(x);
System.out.println("2:x.c: "+x.c);
}

}
問題3: 為何第二次的輸出 x.c的字元是Z 而不是a 呢?

ps: 如果有有違反板規請告知 我會自d的(因為不知算不算是作業文^^u)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.192.32.25
愚人
2007-01-21 12:48:44 UTC
Permalink
※ 引述《war3rd (war3rd)》之銘言:
: 以下這二支小程式....
: 程式一:
: public static void main (String[] args){
: Integer n1 = new Integer(47);
: Integer n2 = new Integer(47);
: System.out.println(n1==n2);
: Integer i1 = 47;
: Integer i2 = 47;
: System.out.println(i1==i2);
: Integer p1 = 147;
: Integer p2 = 147;
: System.out.println(p1==p2);
: }
: }
: 因為小弟剛接觸java(自修) 如果覺得問題太蠢還請見諒
: 問題1:為何n1==n2(結果:false)而i1==i2(結果:true) 他們的值不是都相等嗎?
: 還是Integer oo = new Integer (xx) 與 Integer oo = xx 二種方式有哪不同嗎?
: 問題2: 那又為啥同樣是 Integer oo = xx 的方式
: i1==i2(ture) 而p1==p2(false) 這又是為啥?我只不過數字修正了一下

這是 autoboxing & unboxing 的功能,
至於為什麼改了數字就不一樣了,
因為 autoboxing 後在某一段會做 value cached
(減輕產生物件的 cost)

http://java.sun.com/developer/JDCTechTips/2005/tt0405.html
<%
Autoboxing is guaranteed to return the same object for integral values in the
range [-128, 127], but an implementation may, at its discretion, cache values
outside of that range. It would be bad style to rely on this caching in your
code.
%>

不過上面的值域會依變數型態不同而不同,但還是以 jvm 實作的為準
http://javaonnet.blogspot.com/
<%
Advantage of autoboxing and auto-unboxing is concise code. But careless use
might result in poor performance of the code. Certain primitives are cached
and autoboxing returns same wrapper objects. This value may depend on jvm
used, normally this value are:
1. The boolean values true and false.
2. The byte values.
3. The short and int values between -128 and 127.
4. The char values in the range '\u0000' to '\u007F'.
%>

其實再挖挖,有人在討論這倒底是不是一個 bad style !?
http://forum.java.sun.com/thread.jspa?forumID=316&threadID=536731
(解決了舊問題,產生了新問題)

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.26.34.247
P***@mobbs.stut.edu.tw
2007-01-21 13:18:00 UTC
Permalink
Post by war3rd
以下這二支小程式....
public static void main (String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
Integer i1 = 47;
Integer i2 = 47;
System.out.println(i1==i2);
Integer p1 = 147;
Integer p2 = 147;
System.out.println(p1==p2);
}
}
因為小弟剛接觸java(自修) 如果覺得問題太蠢還請見諒
問題1:為何n1==n2(結果:false)而i1==i2(結果:true) 他們的值不是都相等嗎?
還是Integer oo = new Integer (xx) 與 Integer oo = xx 二種方式有哪不同嗎?
問題2: 那又為啥同樣是 Integer oo = xx 的方式
i1==i2(ture) 而p1==p2(false) 這又是為啥?我只不過數字修正了一下
基本上...Integer是個物件,物件的比較要用.equals

例如:i1.equals(i2);
Post by war3rd
class Letter {
char c;
}
public class test{
static void f(Letter y) {
y.c='Z';
}
public static void main (String[] args){
Letter x= new Letter();
x.c= 'a';
System.out.println("1:x.c: "+x.c);
f(x);
System.out.println("2:x.c: "+x.c);
}
}
問題3: 為何第二次的輸出 x.c的字元是Z 而不是a 呢?
ps: 如果有有違反板規請告知 我會自d的(因為不知算不算是作業文^^u)
因為方法f是call by reference (?)
--


赤糸
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-28.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
c***@kkcity.com.tw
2007-01-21 15:23:51 UTC
Permalink
Post by war3rd
以下這二支小程式....
public static void main (String[] args){
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.println(n1==n2);
Integer i1 = 47;
Integer i2 = 47;
System.out.println(i1==i2);
Integer p1 = 147;
Integer p2 = 147;
System.out.println(p1==p2);
}
}
因為小弟剛接觸java(自修) 如果覺得問題太蠢還請見諒
問題1:為何n1==n2(結果:false)而i1==i2(結果:true) 他們的值不是都相等嗎?
還是Integer oo = new Integer (xx) 與 Integer oo = xx 二種方式有哪不同嗎?
問題2: 那又為啥同樣是 Integer oo = xx 的方式
i1==i2(ture) 而p1==p2(false) 這又是為啥?我只不過數字修正了一下
程式二:
class Letter {
char c;
}
public class test{
static void f(Letter y) { <---接收引數把其代入y物件
y.c='Z'; <---用y物件(此時y物件為Letter類別下的東西),故又可指定c的
} 值
public static void main (String[] args){ <---程式從這裡開始執行
Letter x= new Letter(); <---宣告了一個Letter類別的物件x
x.c= 'a'; <--用x物件來指定Letter類別的實體變數c的初值為a
System.out.println("1:x.c: "+x.c); <---第一次輸出c故其值為a
f(x); <---呼叫f方法,引數為x物件,請看f方法的註解
System.out.println("2:x.c: "+x.c); <--第2次輸出c的值,已因呼叫方法而
} 變動為Z
}
Post by war3rd
問題3: 為何第二次的輸出 x.c的字元是Z 而不是a 呢?
ps: 如果有有違反板規請告知 我會自d的(因為不知算不算是作業文^^u)
--
┌─────◆KKCITY◆─────┐  KKBOX◤歌名╱歌手╱歌詞╱專輯◢搜尋 
│ bbs.kkcity.com.tw │   ★ http://www.kkbox.com.tw ★
└──《From:220.138.53.44 》──┘ 超過80家唱片公司合法授權 音樂盡情下載
--

Loading...