java中long(Long)与int(Integer)之间的转换方式
我就废话不多说了,大家还是直接看代码吧~
publicstaticvoidmain(String[]args){ //1、将long型转化为int型,其中int、long是基础类型 longa=10; intb=(int)a; System.out.println("1、将long型转化为int型:"+b); //2、将int型转化为long型,其中int、long都是基础类型 inta1=10; longb1=a1; System.out.println("2、将int型转化为long型:"+b1); //3、将Long型转换为int型的,其中Long型是包装类型 Longa2=10l; intb2=a2.intValue(); System.out.println("3、将Long型转换为int型:"+b2); //4、将Integer型转化为long型,其中Integer型是包装类型,long型是基础类型 Integera3=10; longb3=a3.longValue(); System.out.println("4、将Integer型转化为long型:"+b3); //5、将Integer型转化为Long型,其中Integer、Long型都是包装类型 Integera4=10; Longb4=a4.longValue(); System.out.println("5、将Integer型转化为Long型:"+b4); }
输出结果:
1、将long型转化为int型:10
2、将int型转化为long型:10
3、将Long型转换为int型:10
4、将Integer型转化为long型:10
5、将Integer型转化为Long型:10
补充知识:JAVA中Long与Integer比较容易犯的错误
今天使用findbugs扫描项目后发现很多高危漏洞,其中非常常见的一个是比较两个Long或Integer时直接使用的==来比较。其实这样是错误的。
因为Long与Ineger都是包装类型,是对象。而不是普通类型long与int,所以它们在比较时必须都应该用equals,或者先使用longValue()或intValue()方法来得到他们的基本类型的值然后使用==比较也是可以的。
但是有一种特殊情况,其实Long与Integer都将-128~127这些对象缓存了。可以看看Long类型源码里面有一个LongCache类,代码如下:
privatestaticclassLongCache{ privateLongCache(){} staticfinalLongcache[]=newLong[-(-128)+127+1]; static{ for(inti=0;i先看看这个例子:
publicclassTest05{ publicstaticvoidmain(String[]args){ Longa=5L; Longb=5L; System.out.println("a==b?"+(a==b)); Longc=129L; Longd=129L; System.out.println("c==d?"+(c==d)); } }打印的结果是:
a==b?true
c==d?false
原因
首先来看看Longa=5L;它是如何将一个基本类型long包装成一个对象Long的。
可以写一个测试类,然后反编译一下,看看java它是如何解析Longa=5L这样一条命令的。
测试类如下:
publicclassTest06{ Longl=3L; }然后使用javap-verboseTest06就能看到反编译的结果了,下面是输出的部分:
{ java.lang.Longl; publiccom.spring.test.Test06(); Code: Stack=3,Locals=1,Args_size=1 0:aload_0 1:invokespecial#10;//Methodjava/lang/Object."":()V 4:aload_0 5:ldc2_w#12;//long3l 8:invokestatic#14;//Methodjava/lang/Long.valueOf:(J)Ljava/lang/Long; 11:putfield#20;//Fieldl:Ljava/lang/Long; 14:return LineNumberTable: line3:0 line5:4 line3:14 LocalVariableTable: StartLengthSlotNameSignature 0150thisLcom/spring/test/Test06; } 从Code中的8可以看出调用了Long的一个类方法Long.valueOf(Long),所以可以得到的结论是Longa=5L实际上等于Longa=Long.valueOf(5);
然后再看看Long.valueOf()方法是如何定义的:
publicstaticLongvalueOf(longl){ finalintoffset=128; if(l>=-128&&l<=127){//willcache returnLongCache.cache[(int)l+offset]; } returnnewLong(l); }一目了然,会先判断基本类型的值如果在-128~127之间,就会直接从LongCache里面取出缓存的对象返回,否则就new一个新的Long对象返回。
现在就不难理解Test05程序执行得到的结果了,因为a与b等于5,在-127~128之内,所以都是直接从LongCache里面返回的一个Long对象,所以他们在使用==比较的时候,就是相等的(对于对象类型来说,==比较的是两个对象的引用指向堆中的地址),而c与d等于129,不在-127~128之间,所以他们他们是分别new出来的两个新的Long对象,使用==来比较自然是不相等的了。
Long重写了equals方法:
publicbooleanequals(Objectobj){ if(objinstanceofLong){ returnvalue==((Long)obj).longValue(); } returnfalse; }它是先通过.longValue()方法获取Long对象的基本类型long的值之后再做比较的。
所以对于Integer与Long的比较,最好是使用equals来比较才能确保得到我们想要的结果。
Integer与Long一样,这里就不举例了。
以上这篇java中long(Long)与int(Integer)之间的转换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。