【Java實用技術】java中關於整數的幾個冷知識,總有一個你不知道

語言: CN / TW / HK

theme: cyanosis highlight: a11y-dark


今天來講幾個java中數字比較有意思的用法。

數字的可讀性寫法

對於整數,大家都知道可以使用int,long等表示,但是如果數字很大,比如千萬或者億,你要怎麼寫才能快速清晰地讀出變數呢?

java  // 你能快速讀出下面是幾千萬?還是幾億?  int int1 = 21341763;  long long1 = 457813974947972L;

學過會計的同學知道很多數字,使用三位分節法可以提高數字可讀性,比如21,341,763

其實,從JDK7開始,java支援在數字字面變數中加下劃線,增加程式可讀性,java編譯器會自動去除這些下劃線。

java  // 比如我們使用四位分級法  int int2 = 2134_1763;  long long2 = 457_8139_7494_7972L;

除此之外,對於二進位制和浮點數/雙精度數,也支援這樣的寫法

java  // 浮點數寫法  float ff = 3_33.1F;  double dd = 3_3113.1345_63D;  // 二進位制寫法,有利於我們轉換成16進位制等  int bin = 0b1101_1001;

Integer/Long/Short的快取池問題

先看下面的例子:

java  // 下面的結果是什麼?  Integer int11 = 10;  Integer int12 = 10;  System.out.println("Integer 10 == 10? " + (int11 == int12));  ​  Integer int21 = new Integer(10);  Integer int22 = new Integer(10);  System.out.println("new Integer(10) ? " + (int21 == int22));  ​  Integer int31 = 128;  Integer int32 = 128;  System.out.println("Integer 128==128? " + (int31 == int32));  ​  ​  /** 結果:  Integer 10 == 10? true  new Integer(10) ? false  Integer 128==128? true  **/

如果有同學對於上面的第三個結果毫不驚訝,要麼你是不知道Integer快取池的小白,要麼你是沒有深入理解Integer快取池大白(●—●)

😏 機智的同學已經知道了,Integer中有一個IntegerCache,預設是快取 -128~127 的整數,出現上面的結果,是因為是我修改了java.lang.Integer.IntegerCache.high=<size>的值上限。

但是對於第二個驚訝的同學,可能需要自己看一下原始碼,整數快取池,只針對裝箱過程,因此第二個例子的new Integer並不涉及裝箱型別,自然產生的新物件,結果為false。

java  public static Integer valueOf(int i) {     if (i >= IntegerCache.low && i <= IntegerCache.high)         return IntegerCache.cache[i + (-IntegerCache.low)];     return new Integer(i);  }

對於Long和Short其實也有快取池,他們的快取池也是 -128~127 ,只是上下限不能通過配置修改。

不經意的錯誤

image-20211016233255847

Integer是物件,因此可能為null,直接使用(integer == 1) 這種判斷方式,涉及拆箱比較,而導致空指標異常,對新手程式設計師來說,是一個很容易忽略的錯誤。

今天的分享就到這裡,希望對你有所幫助。

我是Pandas,專注Java程式設計實用技術分享,公眾號Java實用技術手冊和B站均有視訊解說,歡迎來玩。 如果你覺得這篇文章有用,別忘了點贊+關注,一起進步!