JFinal

登录 注册

这个是bug还是我使用的问题?

9A8C7B1D71782957D36C645AD5479845.jpg

这个是bug还是我使用的问题?

check和first是相同实体。他们在同一个事务里面。check是new出来之后save获取的。然后first是数据库里面查出来的。他们2个的数据是一样的。但直接get方式比较就是false。

评论

  • 01-06 23:13
    这个是 java 基础

    两个 Integer 变量比较需要将其中的一个转成int ,例如:
    Integer a = 123;
    Integer b = 123;

    比较时得这样:
    a.intValue() == b
    或者
    a == b.intValue()
    或者
    a.intValue() == b.intValue()

    如果不做上面的转换,实际比较的是 a、b 两个变量的内存所在的地址值
  • 01-06 23:17
    @JFinal 那为何我直接new一个对象出来这样比较却是true呢?而且我都这样用了很多年了。。。难道我一直用的是假的java?
  • 01-06 23:20
    @JFinal 我其他对象这样直接比较都是没问题的又是为什么呢?
  • 01-06 23:21
    public static void main(String[] args) {
    GPostCheck first=new GPostCheck();
    first.setId(1);
    GPostCheck check=new GPostCheck();
    check.setId(1);

    System.out.println(first.getId()==check.getId());//为什么这个又是true?
    }
  • 01-06 23:22
    @cs3230524 因为你 new 出来的对象数值很小,java 在处理比较小的整型数据时是从缓存中取的 int 值,所以比较出来就是 true

    你可以通过 new 两个比较大的 Integer 对象来验证,例如:
    Integer a = new Integer(3000);
    Integer b = new Integer(3000);
    System.out.print(a == b);

    仍然是 java 基础, 与 jfinal 无关
  • 01-06 23:24
    也就是直接从数据库查询2个相同的对象,比较是true。但是我new出来的对象和数据库查出来的对象就不能这么比。
  • 01-06 23:28
    注意你代码中的下面两行代码:
    int x = first.getId();
    int y = check.getId();
    接收变量的类型是 int ,而不是 Integer,所以上面两行代码相当于是调用了 first.getId().intValue(),只不过是 java 帮你隐式的做了这个动作,这个叫所谓的自动拆箱

    相应的:
    Integer a = 123;
    java 会将 123 这个 int 做一个 "自动装箱" 动作,将 int 自动装箱成 Integer

    仍然是 java 基础
  • 01-06 23:30
    @cs3230524 建议回看一下 Java 基础的自动装箱与拆箱,这个问题与数据库之类的完全无关, 仅仅与 int Integer 之间的装箱与拆箱规则有关
  • 01-06 23:46
    @JFinal 好吧,谢谢波总。我哭死了。之前id小没问题,现在id上了几百就出问题了。现在这烂摊子不知道怎么处理了。
  • 01-06 23:47
    @cs3230524 基础一定要打好,否则会出各种莫名其妙的问题
  • 发送