java中l(wèi)ong(Long)與int(Integer)之間的轉(zhuǎn)換方式
我就廢話不多說了,大家還是直接看代碼吧~
public static void main(String[] args) {
// 1、將long型轉(zhuǎn)化為int型,其中int、long是基礎(chǔ)類型
long a = 10;
int b = (int) a;
System.out.println("1、將long型轉(zhuǎn)化為int型:" + b);
// 2、將int型轉(zhuǎn)化為long型,其中int、long都是基礎(chǔ)類型
int a1 = 10;
long b1 = a1;
System.out.println("2、將int型轉(zhuǎn)化為long型:" + b1);
// 3、將Long型轉(zhuǎn)換為int型的,其中Long型是包裝類型
Long a2 = 10l;
int b2 = a2.intValue();
System.out.println("3、將Long型轉(zhuǎn)換為int型:" + b2);
//4、將Integer型轉(zhuǎn)化為long型,其中Integer型是包裝類型,long型是基礎(chǔ)類型
Integer a3=10;
long b3=a3.longValue();
System.out.println("4、將Integer型轉(zhuǎn)化為long型:"+b3);
//5、將Integer型轉(zhuǎn)化為Long型,其中Integer、Long型都是包裝類型
Integer a4=10;
Long b4=a4.longValue();
System.out.println("5、將Integer型轉(zhuǎn)化為Long型:"+b4);
}
輸出結(jié)果:
1、將long型轉(zhuǎn)化為int型:10
2、將int型轉(zhuǎn)化為long型:10
3、將Long型轉(zhuǎn)換為int型:10
4、將Integer型轉(zhuǎn)化為long型:10
5、將Integer型轉(zhuǎn)化為Long型:10
補充知識:JAVA中Long與Integer比較容易犯的錯誤
今天使用findbugs掃描項目后發(fā)現(xiàn)很多高危漏洞,其中非常常見的一個是比較兩個Long或Integer時直接使用的==來比較。 其實這樣是錯誤的。
因為Long與Ineger都是包裝類型,是對象。 而不是普通類型long與int , 所以它們在比較時必須都應該用equals,或者先使用longValue()或intValue()方法來得到他們的基本類型的值然后使用==比較也是可以的。
但是有一種特殊情況, 其實Long與Integer都將 -128~127 這些對象緩存了。 可以看看Long類型源碼里面有一個LongCache類,代碼如下:
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
先看看這個例子:
public class Test05 {
public static void main(String[] args) {
Long a = 5L;
Long b = 5L;
System.out.println("a == b ? " + (a == b));
Long c = 129L;
Long d = 129L;
System.out.println("c == d ? " + (c == d));
}
}
打印的結(jié)果是:
a == b ? true
c == d ? false
原因
首先來看看 Long a = 5L ; 它是如何將一個基本類型long包裝成一個對象Long的 。
可以寫一個測試類,然后反編譯一下,看看java它是如何解析Long a = 5L這樣一條命令的 。
測試類如下:
public class Test06 {
Long l = 3L;
}
然后使用javap -verbose Test06 就能看到反編譯的結(jié)果了, 下面是輸出的部分:
{
java.lang.Long l;
public com.spring.test.Test06();
Code:
Stack=3, Locals=1, Args_size=1
0: aload_0
1: invokespecial #10; //Method java/lang/Object."<init>":()V
4: aload_0
5: ldc2_w #12; //long 3l
8: invokestatic #14; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
11: putfield #20; //Field l:Ljava/lang/Long;
14: return
LineNumberTable:
line 3: 0
line 5: 4
line 3: 14
LocalVariableTable:
Start Length Slot Name Signature
0 15 0 this Lcom/spring/test/Test06;
}
從Code中的8可以看出調(diào)用了Long的一個類方法Long.valueOf(Long) , 所以可以得到的結(jié)論是Long a = 5L實際上等于 Long a = Long.valueOf(5) ;
然后再看看Long.valueOf()方法是如何定義的:
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
一目了然,會先判斷基本類型的值如果在-128~127之間,就會直接從LongCache里面取出緩存的對象返回,否則就new一個新的Long對象返回 。
現(xiàn)在就不難理解Test05程序執(zhí)行得到的結(jié)果了,因為a與b等于5,在-127~128之內(nèi),所以都是直接從LongCache里面返回的一個Long對象,所以他們在使用==比較的時候,就是相等的(對于對象類型來說,==比較的是兩個對象的引用指向堆中的地址) ,而c與d等于129,不在-127~128之間,所以他們他們是分別new出來的兩個新的Long對象,使用==來比較自然是不相等的了。
Long重寫了equals方法:
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
它是先通過.longValue()方法獲取Long對象的基本類型long的值之后再做比較的。
所以對于Integer與Long的比較,最好是使用equals來比較才能確保得到我們想要的結(jié)果。
Integer與Long一樣,這里就不舉例了。
以上這篇java中l(wèi)ong(Long)與int(Integer)之間的轉(zhuǎn)換方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java使用任務(wù)架構(gòu)執(zhí)行任務(wù)調(diào)度示例
在Java 5.0之前啟動一個任務(wù)是通過調(diào)用Thread類的start()方法來實現(xiàn)的,5.0里提供了一個新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接池的線程池來執(zhí)行任務(wù),下面看一個示例2014-01-01
spring boot2結(jié)合mybatis增刪改查的實現(xiàn)
這篇文章主要給大家介紹了關(guān)于spring boot2結(jié)合mybatis增刪改查的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring boot2具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-09-09
Java網(wǎng)約車項目實戰(zhàn)之實現(xiàn)搶單功能詳解
本文詳細介紹了如何使用Java實現(xiàn)網(wǎng)約車項目的搶單功能,并提供了一個完整的代碼示例,以便讀者能夠直接運行和參考,感興趣的朋友一起看看吧2024-12-12
SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)
這篇文章主要介紹了SpringBoot2如何集成Elasticsearch6.x(TransportClient方式)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

