A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林豪 中级黑马   /  2012-5-2 14:37  /  2846 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看了==的帖子,说的是==判断的是同一对象时才返回真,我自己尝试了下:
class Demo
{
        public static void main(String[] args)
        {
                int a=10,b=10;
                Ci c=new Ci();
                Di d=new Di();
                System.out.println(a==b);
                System.out.println(a==c.c);
                System.out.println(c.c==d.d);
                System.out.println(a==d.d);
        }
}
class Ci
{
        int c=10;
}
class Di
{
        int d=10;
}
结果全部是true  这是为什么呢?不是说同一对象才返回true吗?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

10 个回复

倒序浏览
System.out.println(a==b);
System.out.println(a==c.c);
System.out.println(c.c==d.d);
System.out.println(a==d.d);
你以上都是变量之间比较

你试试用  s==d 就知道啦!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
这个问题涉及到了,“==”与“equals”之间的区别。int型数据是通过“==”来判断相当的,就是这里的同一个int的值10,在内存中值开辟一个地址。所以,你上面看到的就全是true
回复 使用道具 举报
你没有写 c==d 呢,这个是false
你比较的都是基本数据类型,只是比较值是否相等

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨志 于 2012-5-2 19:20 编辑

首先!你应该知道JAVA中的数据类型是可以去分为:
基本数据数据类型和对象数据类型的。
关于这两种的数据类型他们在内存中的存放方式是不一样的。
对于这些基本数据类型如(int,double,float,byte,long,shot,char),他们是直接去存在栈区中的。
这样的话,那么不管你是用的什么比较,都会是去比较他们的值。
但是对于对象数据类型,那么在栈区中保留的只是对象的引用,或者说是地址。
那么,用== 则会是去比较他们的地址值。用equals则比较他们自身的值。
比如说:
  1. String a = new String("abc");
  2. String b = new String("abc");
  3. System.out.println(a == b);
  4. System.out.println(a.equals(b));
复制代码
这里第一个就是比较的地址,那么虽然值一样,但是在栈中保存的地址是不一们的。所以为false.
第二个比较的是值,那个肯定是就是true;
不知道能不能帮上你!谢谢!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
您判断的全是int类型的值,不是对象,当然返回true
回复 使用道具 举报
本帖最后由 黑马我来了 于 2012-5-2 18:04 编辑

还是那句那老话,==比较的是内存地址!int a=10,b=10;都是局部变量分配到栈中,他们的值都为10,内存地址值一样,所以为true,
System.out.println(a==c.c);
而你这里c.c引用对象边c是存在栈中, Ci c=new Ci(); c是放在栈中的,new Ci();是放在堆中的!
局部函数,局部成员变量,都放在栈中,实例对象和对象数组都放在堆中!

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马我来了 于 2012-5-2 18:05 编辑
杨志 发表于 2012-5-2 15:20
首先!你应该知道JAVA中的数据类型是可以去分为:
基本数据数据类型和对象数据类型的。
关于这两种的数据类 ...

兄弟第一个a==b应该为true吧 String a和String b值都为"abc",内存地址值一样!
回复 使用道具 举报
个人认为,楼主以偏概全了哈,
“==”可以用于数值间比较,只要值相等就返回true;
也可以用于引用间比较,这时只有指向同一对象才返回true,
还可以进行逻辑型比较,两边都是true或者false返回true.

楼主代码里进行的都是数值间比较,所以值相等就返回true了
而你说“不是说同一对象才返回true吗?”是指引用间比较啦,比如你代码中的c和d比的话就是了
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
1. 相等性的比较 (== )
    a  对于原生数据类型来说,比较的是左右两边的值是否相等。
   b  对于引用类型来说,比较左右两边的引用是否指向同一个对象,或者说左右两边的引用地址是否相同。
class Demo
{
         public static void main(String[] args)
         {
                 int a=10,b=10;
                 Ci c=new Ci();
                 Di d=new Di();
                 System.out.println(a==b);   // 这里比较的是原生数据类型,所以是比较两边的值是否相等
           System.out.println(a==c.c);   // 这里比较的是原生数据类型,所以是比较两边的值是否相等

           System.out.println(c.c==d.d);// 这里比较的是原生数据类型,所以是比较两边的值是否相等

           System.out.println(a==d.d);// 这里比较的是原生数据类型,所以是比较两边的值是否相等

         }
}
class Ci
{
         int c=10;
}
class Di
{
         int d=10;
}
2   你这些全都是比较原生数据类型  所以返回的当然全都是true 了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
黑马我来了 发表于 2012-5-2 17:53
兄弟第一个a==b应该为true吧 String a和String b值都为"abc",内存地址值一样!

嗯嗯!我表示我写错了!
  1. 应该是这样
  2. String a = new String("abc");
  3. String b = new String("abc");
  4. System.out.println(a ==b);
复制代码
这样才是false;
上面的那样的结果是true;
多谢指正!谢谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马