黑马程序员技术交流社区

标题: 关于字节码进行"=="比较的问题 [打印本页]

作者: yufeng47    时间: 2013-4-9 14:30
标题: 关于字节码进行"=="比较的问题
本帖最后由 yufeng47 于 2013-4-18 19:02 编辑
  1. package cn.itcast.day1;

  2. public class ArrayCLass
  3. {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args)
  8.         {
  9.                 int [] a1 = {1,2,3};
  10.                 int [] a2 = new int[4];
  11.                 int[][] a3 = new int[2][3];
  12.                 String [] a4 = {"a","b","c"};
  13.                 System.out.println(a1.getClass() == a2.getClass());
  14.                
  15. //1                System.out.println(a1.getClass() == a4.getClass());
  16. //2                System.out.println(a1.getClass() == a3.getClass());
  17.                
  18.                 System.out.println(a1.getClass().equals(a3.getClass()));
  19.                 System.out.println(a1.getClass().equals(a4.getClass()));
  20.         }

  21. }
复制代码
/*        System.out.println(a1.getClass() == a4.getClass());
        System.out.println(a1.getClass() == a3.getClass());               
        System.out.println(a1.getClass().equals(a3.getClass()));
        System.out.println(a1.getClass().equals(a4.getClass()))
  问题:前面两句在张孝祥老师的视屏中就不会报错,为什么在我的机子上就会报错呢?只有改成后面两句才OK。我的机子装的是JDK1.7的。
作者: 心弦上的景致    时间: 2013-4-9 15:45
我只知道==和equals()方法的区别 你遇到的问题我没遇到过
我用JDK1.6打开JDK1.7的包就有问题  当时老师也没有解决 大概和JDK的版本有关系
只要代码的语法和逻辑不出问题 这样的边缘错误 不用太纠结
作者: 李罡    时间: 2013-4-9 16:36
你这个问题我也遇到过,我用的Myeclipse是10版本的,里面的JDK是1.7的,张老师用的是JDK1.6的。这个应该是版本的问题吧~
作者: 王潇男    时间: 2013-4-9 19:17
http://bbs.itheima.com/thread-39425-1-1.html 这个帖子情况跟你的类似,数组对象数据类型不一样,放在一块不能比较
作者: Keith    时间: 2013-4-9 21:06
我一开始也以为是引用类型不对,没法比较,就像boolean和int比较一样编译不会通过
但是我刚才看eclipse源码中equals的实现是  
public boolean equals(Object obj) {
        return (this == obj);
    }
这也是比较的对象引用啊 这不就是和第一二是一样的吗? 同样迷惑了,求解

作者: Keith    时间: 2013-4-9 21:11
楼主瞅瞅这
http://bbs.itheima.com/thread-44858-1-1.html
作者: 陈丽莉    时间: 2013-4-9 21:30
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~

点进自己的帖子,编辑->标题左侧有下拉菜单->改变分类->保存~
作者: lyg2013    时间: 2013-4-9 23:43
如下是JDK1.7新增的部分特性,可以研究一下:
1.新增对二进制整数的直接操作。(在开发游戏时,可以利用这一特性直接操作内存中的整数)
2.新增大数值表示时,可用下划线分割,增加大数值的可读性。
3.switch分支,支持String类型
4.JDK1.7增强包装类(Wrapper Class)
5.新增Objects工具类,提供空指针安全的静态方法。
6.新增ThreadLocalRandom类减少多线程资源竞争,保证系统具有更好的线程安全性。
7.新增泛型“菱形”语法,简化泛型编程。
8.异常处理增加多异常捕获。
9.异常处理新增自动关闭资源的try语句。
10.增强throw语句。
11.JDK1.7的Swing组件层次变化。
12.增强的JColorChooser类。
13.新增JLayer装饰组件
14.创建透明、不规则形状窗口。
15.增强的RowSetFactory和RowSet。
16.离线RowSet和离线RowSet的分页查询。
17.Annotation中新增“堆污染”警告和@SafeVarargs
18.JDK1.7的NIO.2
19.新增ForkJoinPool类,充分利用多核CPU资源,分解计算任务。
20.新增AIO实现非阻塞通信。
作者: yufeng47    时间: 2013-4-18 18:49
Keith 发表于 2013-4-9 21:11
楼主瞅瞅这
http://bbs.itheima.com/thread-44858-1-1.html

这个贴子回答的好
作者: yufeng47    时间: 2013-4-18 18:57
Keith 发表于 2013-4-9 21:06
我一开始也以为是引用类型不对,没法比较,就像boolean和int比较一样编译不会通过
但是我刚才看eclipse源码中 ...

程序中比较的是字节码,两种不同类型的字节码比较的时候编译器会通不过。而this==obj这个就像你说的是比较的引用是不是指向同一个地址。
我题中的解决办法是可以将a1~a4的字节码都用Class类来标记,那么他们就可以参与比较了,这样编译器会认为我们比较的是同一个Class类型的引用
  1. Class aa1 = a1.getClass();
  2. Class aa2 = a2.getClass();
  3. Class aa3 = a3.getClass();
  4. Class aa4 = a4.getClass();
  5. System.out.println(aa1 == aa4);
  6. System.out.println(aa1 == aa3);
  7. System.out.println(aa1 == aa2);
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2