Arrays常用方法源碼解析

1:工具類通用的特征

1)構(gòu)造器必須是私有的挺勿。這樣的話雇毫,工具類就無法被 new 出來玄捕,因為工具類在使用的時候,無
需初始化棚放,直接使用即可枚粘,所以不會開放出構(gòu)造器出來。
2)工具類的工具方法必須被 static席吴、final 關(guān)鍵字修飾赌结。這樣的話就可以保證方法不可變,并且
可以直接使用孝冒,非常方便柬姚。

2:Arrays工具類

Arrays 主要對數(shù)組提供了一些高效的操作,比如說排序庄涡、查找量承、填充、拷貝穴店、相等判斷等等撕捍。我們選擇其中兩三看下,對其余操作感興趣的同學(xué)可以到 GitHub 上查看源碼解析泣洞。

1)2.1 排序

Arrays.sort 方法主要用于排序忧风,下面我們寫個 demo 來演示一下自定義類數(shù)組的排序:

@Data
// 自定義類 
class SortDTO { 
  private String sortTarget; 
  public SortDTO(String sortTarget) { 
     this.sortTarget = sortTarget; 
  } 
}
@Test 
public void testSort(){ 
  List<SortDTO> list = ImmutableList.of( new SortDTO("300"), new SortDTO("50"), new SortDTO("200"), new SortDTO("220") );
// 我們先把數(shù)組的大小初始化成 list 的大小,保證能夠正確執(zhí)行 toArray 
SortDTO[] array = new SortDTO[list.size()];
list.toArray(array);
log.info("排序之前:{}", JSON.toJSONString(array)); 
Arrays.sort(array, Comparator.comparing(SortDTO::getSortTarget));
log.info("排序之后:{}", JSON.toJSONString(array)); }
輸出結(jié)果為: 排序之前:[{"sortTarget":"300"},{"sortTarget":"50"},{"sortTarget":"200"},{"sortTarget":"220"}]
排序之后:[{"sortTarget":"200"},{"sortTarget":"220"},{"sortTarget":"300"},{"sortTarget":"50"}]

sort 使用了雙軸快速排序算法

2)2.2 二分查找法

Arrays.binarySearch 方法主要用于快速從數(shù)組中查找出對應(yīng)的值球凰。其支持的入?yún)㈩愋头浅6啵?如 byte狮腿、int、long 各種類型的數(shù)組呕诉。返回參數(shù)是查找到的對應(yīng)數(shù)組下標(biāo)的值缘厢,如果查詢不
到,則返回負(fù)數(shù)甩挫。

List<SortDTO> list = ImmutableList.of( new SortDTO("300"), new SortDTO("50"), new SortDTO("200"), new SortDTO("220") );
SortDTO[] array = new SortDTO[list.size()];
list.toArray(array);
log.info("搜索之前:{}", JSON.toJSONString(array)); 
Arrays.sort(array, Comparator.comparing(SortDTO::getSortTarget));
log.info("先排序贴硫,結(jié)果為:{}", JSON.toJSONString(array));
int index = Arrays.binarySearch(array, new SortDTO("200"),
Comparator.comparing(SortDTO::getSortTarget));
if(index<0){ 
  throw new RuntimeException("沒有找到 200"); 
}
log.info("搜索結(jié)果:{}", JSON.toJSONString(array[index])); 
輸出的結(jié)果為: 搜索之前:[{"sortTarget":"300"},{"sortTarget":"50"},{"sortTarget":"200"},{"sortTarget":"220"}] 
先排序,結(jié)果為:[{"sortTarget":"200"},{"sortTarget":"220"},{"sortTarget":"300"},{"sortTarget":"5 搜索結(jié)果:{"sortTarget":"200"}

從上述代碼中我們需要注意兩點:

  1. 如果被搜索的數(shù)組是無序的伊者,一定要先排序英遭,否則二分搜索很有可能搜索不到,我們 demo
    里面也先對數(shù)組進行了排序亦渗;
  2. 搜索方法返回的是數(shù)組的下標(biāo)值挖诸。如果搜索不到,返回的下標(biāo)值就會是負(fù)數(shù)央碟,這時我們需要
    判斷一下正負(fù)。如果是負(fù)數(shù),還從數(shù)組中獲取數(shù)據(jù)的話亿虽,會報數(shù)組越界的錯誤菱涤。
3)2.3 拷貝

數(shù)組拷貝我們經(jīng)常遇到,有時需要拷貝整個數(shù)組洛勉,有時需要拷貝部分粘秆,比如 ArrayList 在add(擴容) 或 remove(刪除元素不是最后一個) 操作時,會進行一些拷貝收毫」プ撸拷貝整個數(shù)組 我們可以使用 copyOf 方法,拷貝部分我們可以使用 copyOfRange 方法此再,以 copyOfRange為例昔搂,看下底層源碼的實現(xiàn):

// original 原始數(shù)組數(shù)據(jù)
// from 拷貝起點  to 拷貝終點 
public static char[] copyOfRange(char[] original, int from, int to) {
// 需要拷貝的長度
int newLength = to - from;
if (newLength < 0) 
     throw new IllegalArgumentException(from + " > " + to);
// 初始化新數(shù)組 
char[] copy = new char[newLength];
// 調(diào)用 native 方法進行拷貝
System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); 
// 被拷貝的數(shù)組、從數(shù)組那里開始输拇、目標(biāo)數(shù)組摘符、從目的數(shù)組那里開始拷貝、拷貝的長度 return copy; }
}

從源碼中策吠,我們發(fā)現(xiàn)逛裤,Arrays 的拷貝方法,實際上底層調(diào)用的是 System.arraycopy 這個
native 方法猴抹,如果你自己對底層拷貝方法比較熟悉的話带族,也可以直接使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟀给,一起剝皮案震驚了整個濱河市蝙砌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坤溃,老刑警劉巖拍霜,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異薪介,居然都是意外死亡祠饺,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門汁政,熙熙樓的掌柜王于貴愁眉苦臉地迎上來道偷,“玉大人,你說我怎么就攤上這事记劈∩籽唬” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵目木,是天一觀的道長换途。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么军拟? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任剃执,我火速辦了婚禮,結(jié)果婚禮上懈息,老公的妹妹穿的比我還像新娘肾档。我一直安慰自己,他們只是感情好辫继,可當(dāng)我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布怒见。 她就那樣靜靜地躺著,像睡著了一般姑宽。 火紅的嫁衣襯著肌膚如雪遣耍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天低千,我揣著相機與錄音配阵,去河邊找鬼。 笑死示血,一個胖子當(dāng)著我的面吹牛棋傍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播难审,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼瘫拣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了告喊?” 一聲冷哼從身側(cè)響起麸拄,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎黔姜,沒想到半個月后拢切,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡秆吵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年淮椰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纳寂。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡主穗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毙芜,到底是詐尸還是另有隱情忽媒,我是刑警寧澤,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布腋粥,位于F島的核電站晦雨,受9級特大地震影響架曹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闹瞧,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一音瓷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夹抗,春花似錦、人聲如沸纵竖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽靡砌。三九已至已脓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間通殃,已是汗流浹背度液。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留画舌,地道東北人堕担。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像曲聂,于是被迫代替她去往敵國和親霹购。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,587評論 2 350