当前位置: 首页 > 科技观察

漫画:Integer有4种比较方式?

时间:2023-03-20 00:28:05 科技观察

本文转载自微信公众号“Java中文社区”,作者雷哥。转载本文请联系Java中文社区公众号。代码测试publicclassIntegerTest{publicstaticvoidmain(String[]args){Integeri1=127;Integeri2=127;System.out.println(i1==i2);Integeri3=128;Integeri4=128;System.out.println(i3==i4);}}上面代码的执行结果为:truefalse首先,当我们将上面的测试代码编译成字节码(.class)时,编码后的代码如下:publicclassIntegerTest{publicstaticvoidmain(String[]paramArrayOfString){Integerinteger1=Integer.valueOf(127);Integerinteger2=Integer.valueOf(127);System.out.println((integer1==integer2));Integerinteger3=Integer.valueOf(128);Integerinteger4=Integer.valueOf(128);System.out.println((integer3==integer4));}}可见在创建Integer时使用了valueOf,其实现源码如下:publicstaticIntegervalueOf(inti){if(i>=IntegerCache.low&&i<=IntegerCache.high)returnIntegerCache.cache[i+(-IntegerCache.low)];returnnewInteger(i);}从上面的源码可以看出,该方法中使用了IntegerCache。IntegerCache的源码如下:privatestaticclassIntegerCache{staticfinalintlow=-128;staticfinalinthigh;staticfinalIntegercache[];static{//highvaluemaybeconfiguredbypropertyinth=127;StringintegerCacheHighPropValue=sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if(integerCacheHighPropValue!=null){try{inti=parseInt(integerCacheHighPropValue);i=Math.max(i,127);//最大数组大小为Integer.MAX_VALUEh=Math.min(i,Integer.MAX_VALUE-(-low)-1);}catch(NumberFormatExceptionnfe){//如果属性不能解析成an??int,忽略它。}}high=h;cache=newInteger[(high-low)+1];intj=low;for(intk=0;k=127;}privateIntegerCache(){}}从上面的源码可以看出,当Integer的值在-128到127之间时,会重用已有的对象,所以在i1(127)和i2中使用==只有比较值时才为真,当值变为128时,执行结果为假。其实在阿里巴巴的里面也有相应的规定,规定内容如下:【强制】所有整数包装类的对象之间的值比较使用equals方法进行比较。注意:对于Integervar=?-128到127之间,在IntegerCache.cache中生成Integer对象,现有对象会被重用。这个范围内的Integer值可以直接用==判断,但是这个范围内除,以外的所有数据都会在堆上生成,现有对象不会被重用。这是个大坑,推荐使用equals方法判断。不仅如此,当我们使用newInteger时,无论值是什么,都不能使用==比较。示例代码如下:publicclassIntegerTest{publicstaticvoidmain(String[]args){Integeri1=newInteger(127);Integeri2=newInteger(127);System.out.println(i1==i2);}}上面的代码是:false这是因为newInteger方法没有使用IntegerCache,而是直接创建了一个新的对象,所以不能和==比较起来。Tips:==用于直接比较两个对象的引用是否相同,而equals用于比较两个对象的值是否相同。其他比较方法compareTo由于Integer类实现了Comparable接口,我们可以使用compareTo来比较两个值的大小。实现源码如下:publicfinalclassIntegerextendsNumberimplementsComparable{//忽略其他内容}compareTo的使用如下:publicclassIntegerTest{publicstaticvoidmain(String[]args){Integeri1=newInteger(128);Integeri2=newInteger(128);System.out.println(i1.compareTo(i2));}}上述代码执行结果为:0compareTo源码如下:publicintcompareTo(IntegeranotherInteger){returncompare(this.value,anotherInteger.value);}publicstaticintcompare(intx,inty){return(x

最新推荐
猜你喜欢