Topic: 求助,这段程序是怎么回事?(== & equals) |
Print this page |
1.求助,这段程序是怎么回事?(== & equals) | Copy to clipboard |
Posted by: huahua325 Posted on: 2005-08-16 09:49 public static void main(String[] args) { Integer n1 = new Integer (47); Integer n2 = new Integer (47); System.out.println(n1 == n1); System.out.println(n1.equals(n1)); } 按理说,这段程序的输出结果是 false true 但是在NetBeans中的输出结果是 true true |
2.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: ww1ww1 Posted on: 2005-08-16 10:42 你的程序搞错了吧 你的程序应该这样写,当然外边还要包一层class
如果按照楼上的 n1 == n1 当然是结果是true了 |
3.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: winterlord Posted on: 2005-08-16 11:39 轉一段,也許會對你有幫助: 再來看一個,先看看程式,您以為結果是如何?
以自動裝箱與拆箱的機制來看,我想您會覺得結果是顯示"i1 == i2",您是對的!那麼下面這個您覺得結果是什麼?
結果是顯示"i1 != i2",這有些令人訝異,語法完全一樣,只不過改個數值而已,結果卻相反。 其實這與'=='運算子的比較有關,'=='可用來比較兩個基本型態的變數值是否相等,事實上'=='也用於判斷兩個物件變數名稱是否參考至同一個物件。 所以'=='可以比較兩個基本型態的變數值是否相等,也可以判斷兩個物件變數的參考物件是否相同,當您如前兩個程式的方式撰寫時,編譯器不知道您實際上要比較的是哪一種?所以對於值從-128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體之中被重用,所以當值在100,使用'=='進行比較時,i1 與 i2實際上參考至同一個物件。 如果超過了從-128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次都新建一個Integer物件,所以當值在 200,使用'=='進行比較時,i1與i2參考的是不同的物件。 所以不要過份依賴自動裝箱與拆箱,您還是必須知道基本型態與物件的差異,上面的程式最好還是依正規的方式來寫,而不是依賴編譯蜜糖(Compiler sugar),例如當值為200時,必須改寫為以下才是正確的。
結果這次是顯示"i1 == i2"了,使用這樣的寫法,相信您也會比較放心一些,總之一個原則:如果您不確定就不要用。 |
4.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: whyuaou Posted on: 2005-08-16 12:25 huahua325 wrote: System.out.println(n1 == n1); 难道n1==n1有问题吗 ? n1==n1当然成立,你说的那个结果应该是 System.out.println(n1 == n2); 这个才是FALSE,拜托大家看清楚再说啊! |
5.Re:求助,这段程序是怎么回事? [Re: whyuaou] | Copy to clipboard |
Posted by: huahua325 Posted on: 2005-08-16 16:22 谢谢,是马虎,把 System.out.println(n1 == n2); System.out.println(n1.equals(n2)); 写成了 System.out.println(n1 == n1); System.out.println(n1.equals(n1)); 实在是对不住了 谢谢 |
6.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: truthawp Posted on: 2005-08-16 16:28 这样不是很对么?System.out.println(n1 == n1), n1和n1当然是同一个对象,所以是true(为什么按理说应该是false?);然后n1和n1的值也相同,又是一个true,没什么问题啊~ |
7.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: huahua325 Posted on: 2005-08-16 17:32 回复 winterlord 不对啊,我安你的方法试了试,结果都是相等啊 问题应该是出在 Integer n1 = 100这种赋值方式上 |
8.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: acl2005 Posted on: 2005-08-16 22:39 书上有这么个例子,意思是:(n1==n2)对比的是里面的两个句丙,所以它们是不同的, 而(n1.equals(n2))这是对比的两个句丙指向的对象. 不知道这样理解对不对!还请高手指点!谢谢 |
9.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: JavaBeginnerPan Posted on: 2005-08-17 17:23 使用new生成对象时,用“==“比较的是两个对象的内存地址,即使两个对象的值相同,地址也不可能相同!而equals比较的是对象的值。不过String对象比较特殊。 |
10.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: acl2005 Posted on: 2005-08-17 22:20 谢谢!JavaBeginnerPan 指点! |
11.Re:求助,这段程序是怎么回事? [Re: winterlord] | Copy to clipboard |
Posted by: whyuaou Posted on: 2005-08-18 14:14 winterlord wrote: 果真如此吗? huahua325 wrote: huahua325的确看出了问题,可惜没有具体说明。 可以肯定,winterlord的帖子有问题,比较结果和取值范围没有关系,并且Integer i1 = 100是错误的初始化。 Integer是类,创建类的实例除了String类外,都要使用 new 类名()的方式来实例化对象,这里i1是个Integer对象,必须使用Integer i1 = iew Integer(100);来初始化。i2也同样初始化,并且i1==i2不可能成立。 如果用int i1=100;int i2=100;来初始化,成立i1==i2,但if(i1.equals(i2))又不合乎语法,所以,winterlord的帖子有问题,希望转贴的时候自己先看看帖子对不对,不要在这糊弄我们了。 |
12.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: acl2005 Posted on: 2005-08-18 22:22 支持楼上!!!敢于指出的精神! 也希望回帖子的仔细看好在给大家回复,不然的话.想我们这些初学者很容易弄糊涂了! 大家交流经验共同提高嘛!!!!! |
13.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: Vilian_Wei Posted on: 2005-08-20 15:25 GGGGGGGG!!!!说得对!!!!我们还有很多要跟你们学的喔!!!! 嘻嘻!初学者! |
14.Re:求助,这段程序是怎么回事? [Re: huahua325] | Copy to clipboard |
Posted by: brianlove Posted on: 2005-08-21 23:53 支持whyuaou的说法···· 问题确实出在了定义上面··· 用Integer a=100;与Integer a=new Integer(100); 大有不同·· |
15.Re:求助,这段程序是怎么回事? [Re: brianlove] | Copy to clipboard |
Posted by: Vilian_Wei Posted on: 2005-08-22 16:11 brianlove wrote: GGGGG!!!!!支持你!!!!!!!!!! |
16.Re:求助,这段程序是怎么回事?(== & equals) [Re: huahua325] | Copy to clipboard |
Posted by: zzw109433 Posted on: 2005-08-23 14:51 其实 winterlord 说的是对的 在jdk 1.5 里是可以这么写的 :Integer i1 = 100 系统会自动帮你进行转换 这是在1.5里新增的特性 ,就是所谓的“自动装箱与拆箱机制” 。这个特性在1.4里是没有的,如果想试一下,就要升级到jdk1.5 。现在最新的版本是 java version "1.5.0_04" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05) Java HotSpot(TM) Client VM (build 1.5.0_04-b05, mixed mode, sharing) PS: winterlord 的例子我试过了,在1.5下没问题。有兴趣的可以试试。 |
17.Re:求助,这段程序是怎么回事?(== & equals) [Re: zzw109433] | Copy to clipboard |
Posted by: ww1ww1 Posted on: 2005-08-23 14:54 zzw109433 wrote: 最好表这样写,虽然对,但是反映一个问题:概念模糊。 Integer i 和 int i 是两码事。 |
18.Re:求助,这段程序是怎么回事?(== & equals) [Re: huahua325] | Copy to clipboard |
Posted by: jigsaw Posted on: 2005-08-23 14:56 笑话。。。whyuaou明明说错了 为什么还得了1分? |
Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1 客服电话 18559299278 客服信箱 714923@qq.com 客服QQ 714923 |