Java開發之路 (19)Long快取問題

2021-09-20 04:47:58 字數 1931 閱讀 4383

long中有個小小的陷阱,就是在-128至127範圍內,long.valueof(long l)返回的long的例項是相同的,而在此範圍之外每次使用valueof(long l)時,返回的例項都是不同的。

舉例:

system

.out

.println

(long

.valueof

(-129)==

long

.valueof

(-129

));// false

system

.out

.println

(long

.valueof

(-128)==

long

.valueof

(-128

));// true

system

.out

.println

(long

.valueof

(127)==

long

.valueof

(127

));// true

system

.out

.println

(long

.valueof

(128)==

long

.valueof

(128

));// false

下面我們通過long原始碼進行分析一下:

public

static

long

valueof

(longl)

return

newlong(l

);

}

從上面**中我們可以看出先判斷傳遞過來的數值是否在[-128,127]之間,如果是則直接從快取中返回對應的引用,否則新建立乙個long的例項。所以說如果不在這個區間範圍內,返回乙個新建立的long型別引用,用==判斷就會理所當然的返回false,位址不一樣。但是如果我們使用equals方法,則會返回true,數值是一樣的。

long

.valueof

(128

).equals

(long

.valueof

(128

))// true

我們看看對於在區間範圍之內,是如何返回對應的引用?最重要的是long類中有乙個靜態的內部類longcache,專門用於快取-128至127之間的值。

private

static

class

longcache

static

final

long

cache

=new

long

[-(-

128)

+127+1

];

static

}

在longcache類中定義了乙個cache陣列,來儲存快取資料。我們可以看到

cache陣列的長度:-(-128) + 127 + 1,很明了的知道快取資料從-128到127,後面的1代表數字0,一共256個元素。

valueof這個方法設計比較好的一點是offset,它的初始值設為128,目的就是為了陣列下標128處存放0,這樣就將正數和負數分隔開。

Android開發之路 1

1.android 9之後 網路請求需要載入適配檔案 network security config.xml android networksecurityconfig xml network security config 載入配置檔案即可 2.解決handler記憶體溢位問題建立靜態並且繼承ha...

Java 學習之路 執行緒1

自己練習了一下執行緒同步的例項 package com.lcq.threadtest 類名 threadtext4 功能 用於測試多執行緒的同步問題以及解決方法 第乙個執行緒執行後就被加上鎖,只有執行完成之後其他執行緒才能執行 用synchronized關鍵字實現同步 version 1.0 aut...

go語言開發之路(1)安裝

tar xzvf go1.14.2.linux amd64.tar.gz 得到目錄 go mv go usr local 修改 etc profile 最後面加上 export gopath mnt win go export goroot usr local go export path path...