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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 林吉敏 中级黑马   /  2012-12-18 10:42  /  1928 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 林吉敏 于 2012-12-18 13:21 编辑

看到field类那里,下面代码中的字节码比较,为什么用==,不用equals。
视频里的解释还是有点听不太懂,谁能解释的详细一点啊,多谢了。。

private static viod changeStringValue(object obj)
{
    Field[] fields=obj.getClass().getFields();
    for (Field field: fields)
  {
       //if(field.getType().equals(String.class))
        if(field.getType()==String.class){}
  }

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

6 个回复

倒序浏览
. class   是二进制字节码。。他们直接比较二进制字节码,就像 2==3 一样在比。  String.class 的字节码唯一,如果field.getType() ==String.class 则说明 这个field的类型是String。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
equals比较内容,==比较内存地址和内容  不过这是指字符串比较方面
//if(field.getType().equals(String.class))  这里比较的是他们内容是否相同
        if(field.getType()==String.class){}  }比较String和field对象的内存地址(引用地址)是否相同
这是我的理解。你也可以再查阅下其他资料。回答的不是很全面。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
还有一种是这样理解的:
一个是把数据放在堆里面,一个是把数据入在栈里面,
当你用String   str1   =   "aaa ";   String   str2   =   "aaa ";   这种形式是放在堆里面,所以str1   ==   str2   结果是为true的,当你用String   str1   =   new   String( "aaa ");String   str2   =   new   String( "aaa ");,   这种形式是放在栈里面,当你用str1   ==   str2进行比较的其实是地址,所以结果当然为false了,用这种形式时就应当用equals,它是比较指针所指向的内容。
你可以用代码试试!

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 孙辉辉 于 2012-12-18 11:05 编辑

在java程序设计中,经常需要比较两个变量值是否相等。例如
1、简单数据类型比较
a = 10;
b = 10;
if(a == b){
   //写要执行的代码
}
2、引用数据类型比较
ClassA a = new ClassA("abc");
ClassB b = new ClassB("abc");
if(a == b){
//写要执行的代码
}
显然在例1中 a == b的值为true,例2中a == b值为false
你应该有一些java基础吧,下面我用int类型和它的封装类Integer来说明简单类型和封装类型进行比较时的区别:
==和equals()的用法
先看一段代码:
  1. public class TestEqual{
  2.       public static void main(String [ ] args){
  3.             //简单类型比较
  4.        int a = 100;
  5.             int b = 100;

  6.             System.out.println("a == b?" + (a == b));
  7.            //引用类型比较
  8.        Integer c = new Integer(100);
  9.             Integer d = new Integer(100);

  10.            System.out.println("c == d?" + (c == d));           
  11.    }
  12. }
复制代码
可以看出,在引用类型比较中,虽然用了同一个参数“100”来构造两个变量,但他们仍然不同。
why??
要知道,对于这两个引用类型变量c和d,他们指向的是两个不同的对象(只不过两个对象的值都是100),因为是指向两个对象,所以比较这两个变量会得到false的值。
注意啦,重要结论:
对于引用类型变量,运算符“==”比较的是两个变量是否引用同一对象

在java中提供了equals()方法用于比较对象的值。我们把上面引用类型部分的程序稍作修改:

Integer c = new Interger(100);
Integer d = new Interger(100);
System.out.println("c equals d?" + (c.equals(d) ));

运行后可得一个true,这是因为,方法equals()进行的是“深层比较”,他会去比较两个对象的值是否相等

这里显然要判断的是field.getType() 和String.class)是不是同一个,而不是两个里面内容是不是一样,因此要使用==

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
(field.getType().equals(String.class)) :比较的是两者的内容
(field.getType()==String.class)        :比较的是两者的内存地址

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
多谢各位了哈,明白了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马