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

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


如果按照楼上的 n1 == n1 当然是结果是true了

3.Re:求助,这段程序是怎么回事? [Re: huahua325] Copy to clipboard
Posted by: winterlord
Posted on: 2005-08-16 11:39

轉一段,也許會對你有幫助:

再來看一個,先看看程式,您以為結果是如何?

Integer i1 = 100;
Integer i2 = 100;

if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");



以自動裝箱與拆箱的機制來看,我想您會覺得結果是顯示"i1 == i2",您是對的!那麼下面這個您覺得結果是什麼?

Integer i1 = 200;
Integer i2 = 200;

if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");



結果是顯示"i1 != i2",這有些令人訝異,語法完全一樣,只不過改個數值而已,結果卻相反。

其實這與'=='運算子的比較有關,'=='可用來比較兩個基本型態的變數值是否相等,事實上'=='也用於判斷兩個物件變數名稱是否參考至同一個物件。

所以'=='可以比較兩個基本型態的變數值是否相等,也可以判斷兩個物件變數的參考物件是否相同,當您如前兩個程式的方式撰寫時,編譯器不知道您實際上要比較的是哪一種?所以對於值從-128到127之間的值,它們被裝箱為Integer物件後,會存在記憶體之中被重用,所以當值在100,使用'=='進行比較時,i1 與 i2實際上參考至同一個物件。

如果超過了從-128到127之間的值,被裝箱後的Integer物件並不會被重用,即相當於每次都新建一個Integer物件,所以當值在 200,使用'=='進行比較時,i1與i2參考的是不同的物件。

所以不要過份依賴自動裝箱與拆箱,您還是必須知道基本型態與物件的差異,上面的程式最好還是依正規的方式來寫,而不是依賴編譯蜜糖(Compiler sugar),例如當值為200時,必須改寫為以下才是正確的。

Integer i1 = 200;
Integer i2 = 200;

if (i1.equals(i2))
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");



結果這次是顯示"i1 == i2"了,使用這樣的寫法,相信您也會比較放心一些,總之一個原則:如果您不確定就不要用。

4.Re:求助,这段程序是怎么回事? [Re: huahua325] Copy to clipboard
Posted by: whyuaou
Posted on: 2005-08-16 12:25

huahua325 wrote:
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


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,没什么问题啊~ Smile

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:
轉一段,也許會對你有幫助:

再來看一個,先看看程式,您以為結果是如何?

Integer i1 = 100;
Integer i2 = 100;

if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");



以自動裝箱與拆箱的機制來看,我想您會覺得結果是顯示"i1 == i2",您是對的!那麼下面這個您覺得結果是什麼?

Integer i1 = 200;
Integer i2 = 200;

if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");

......

所以不要過份依賴自動裝箱與拆箱,您還是必須知道基本型態與物件的差異,上面的程式最好還是依正規的方式來寫,而不是依賴編譯蜜糖(Compiler sugar),例如當值為200時,必須改寫為以下才是正確的。

Integer i1 = 200;
Integer i2 = 200;

if (i1.equals(i2))
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");



結果這次是顯示"i1 == i2"了,使用這樣的寫法,相信您也會比較放心一些,總之一個原則:如果您不確定就不要用。

果真如此吗?
huahua325 wrote:
回复 winterlord
不对啊,我安你的方法试了试,结果都是相等啊
问题应该是出在
Integer n1 = 100这种赋值方式上

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

支持楼上!!!敢于指出的精神!Smile 也希望回帖子的仔细看好在给大家回复,不然的话.想我们这些初学者很容易弄糊涂了!
大家交流经验共同提高嘛!!!!!

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:
支持whyuaou的说法····
问题确实出在了定义上面···
用Integer a=100;与Integer a=new Integer(100);
大有不同··


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:
其实 winterlord 说的是对的 在jdk 1.5 里是可以这么写的 :Integer i1 = 100 系统会自动帮你进行转换 这是在1.5里新增的特性 ,就是所谓的“自动装箱


最好表这样写,虽然对,但是反映一个问题:概念模糊。

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