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

9A8C7B1D71782957D36C645AD5479845.jpg

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

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

评论区

JFinal

2019-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 两个变量的内存所在的地址值

cs3230524

2019-01-06 23:17

@JFinal 那为何我直接new一个对象出来这样比较却是true呢?而且我都这样用了很多年了。。。难道我一直用的是假的java?

cs3230524

2019-01-06 23:20

@JFinal 我其他对象这样直接比较都是没问题的又是为什么呢?

cs3230524

2019-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?
}

JFinal

2019-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 无关

cs3230524

2019-01-06 23:24

也就是直接从数据库查询2个相同的对象,比较是true。但是我new出来的对象和数据库查出来的对象就不能这么比。

JFinal

2019-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 基础

JFinal

2019-01-06 23:30

@cs3230524 建议回看一下 Java 基础的自动装箱与拆箱,这个问题与数据库之类的完全无关, 仅仅与 int Integer 之间的装箱与拆箱规则有关

cs3230524

2019-01-06 23:46

@JFinal 好吧,谢谢波总。我哭死了。之前id小没问题,现在id上了几百就出问题了。现在这烂摊子不知道怎么处理了。

JFinal

2019-01-06 23:47

@cs3230524 基础一定要打好,否则会出各种莫名其妙的问题