【Java實用技術】java中關於整數的幾個冷知識,總有一個你不知道
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 ,只是上下限不能通過配置修改。
不經意的錯誤
Integer是物件,因此可能為null,直接使用(integer == 1)
這種判斷方式,涉及拆箱比較,而導致空指標異常,對新手程式設計師來說,是一個很容易忽略的錯誤。
今天的分享就到這裡,希望對你有所幫助。
我是Pandas,專注Java程式設計實用技術分享,公眾號
Java實用技術手冊
和B站均有視訊解說,歡迎來玩。 如果你覺得這篇文章有用,別忘了點贊+關注,一起進步!
- spring注入靜態變數有幾種方法?春節假期虹貓藍兔三千問
- stream的實用方法和注意事項
- 【Java實用技術】字串的拆分用什麼方法好?有一半程式設計師都掉過split坑
- 【Java實用技術】字串的擷取用什麼方法好?
- 【Java實用技術】java中關於整數的幾個冷知識,總有一個你不知道
- 又是時間格式化問題,詭異的是隻有10月份BUG才出現
- 我決定寫一本Java實用技術,特點實用!實用!還是實用!
- 5 款新型 Linux 命令列工具,實用!
- 5 款新型 Linux 命令列工具,實用!
- Nginx 的 5 大應用場景,太實用了!
- 自定義雙向繫結框架-只需一個註解,簡單實用
- RabbitMQ 延遲佇列,太實用了!
- Spring 中的重試機制,簡單、實用!
- 推薦一款 ES 叢集視覺化工具:Cerebro,簡單、實用!