开发手册中第一部份 编程规约 中第(4)部份OOP规约中第7小条中,关于“对于 Integer var = ? 在-128 至 127 之间的赋值,Integer 对象是在 IntegerCache.cache 产生,
会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断”的表述,只适用于单机程序,在分布式条件下并不能得到预期的结果。
例子,一个spark程序:
public class Constants { public static final Integer STATE = 1; }
int state = 1; Integer state1 = 1; Integer state2 = new Integer(1); Integer state3 = Integer.valueOf(1); SparkSession session = SparkSession.builder().appName("Validate").getOrCreate(); Long count = session.read().limf("/path").select("vin").map(new MapFunction<Row, String>() { @Override public String call(Row value) throws Exception { System.out.println("1 hashcode :" + System.identityHashCode(state1)+" 2:"+System.identityHashCode(state2)+" 3:"+System.identityHashCode(state3)+" constant = " + System.identityHashCode(Constants.STATE.hashCode())); System.out.println((state == Constants.STATE) + " 1:" + (state1 == Constants.STATE) + " 2:" + (state2 == Constants.STATE) + " 3:" + (state3 == Constants.STATE)); Thread.sleep(100000); return value.mkString(); } }, Encoders.STRING()) //whatever action .count();
测试结果如下:
并没有得到预期的结果
4条答案
按热度按时间qncylg1j1#
不需要这么麻烦 直接
System.out.println(new Integer(1) == new Integer(1))
就足够说明问题了吧……mklgxw1f2#
new Integer(1) == new Integer(1)
两块内存地址当然false
我想表达的重点是
Integer state1= 1;
Integer state2 = 1;
单机模式下state1 == state2为ture
但是上面模式下,state1和state2分属两个JVM,返回false,这种情况比较容易忽略和误用。
kqqjbcuj3#
我司老代码就是直接比较的 == ,也是分布式,目前还没啥问题,标记一下
sg24os4d4#
@gujin520 看下