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"}
從上述代碼中我們需要注意兩點:
- 如果被搜索的數(shù)組是無序的伊者,一定要先排序英遭,否則二分搜索很有可能搜索不到,我們 demo
里面也先對數(shù)組進行了排序亦渗; - 搜索方法返回的是數(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 方法猴抹,如果你自己對底層拷貝方法比較熟悉的話带族,也可以直接使用。