一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四

聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當(dāng)前位置: > 關(guān)注 > > 正文

構(gòu)造器必須是私有的 工具類(lèi)的特征是什么?

來(lái)源:CSDN 時(shí)間:2023-02-03 15:10:09

工具類(lèi)特征:

構(gòu)造器必須是私有的,工具類(lèi)一般不需要初始化,可以直接使用;工具類(lèi)的方法必須是被static final方法修飾,保證方法不可變;不要在工具類(lèi)方法中對(duì)共享變量有修改的操作,如果一定要有,必須加鎖保證線程安全;工具類(lèi)的所有方法都沒(méi)有線程安全問(wèn)題;


(資料圖片僅供參考)

一、Arrays

Arrays主要提供了對(duì)數(shù)組的高效操作,包括排序、查找、填充、拷貝、相等判斷等操作;

1、sort(int[] a)

1.1、JDK1.6

1.1.1、源碼

// int類(lèi)型數(shù)組排序public static void sort(int[] a) {sort1(a, 0, a.length);}private static void sort1(int x[], int off, int len) {// Insertion sort on smallest arrays    if (len < 7) {for (int i = off; i < len + off; i++)            for (int j = i; j > off && x[j - 1] > x[j]; j--)                swap(x, j, j - 1);        return;    }    // Choose a partition element, v    int m = off + (len >> 1);       // Small arrays, middle element    if (len > 7) {int l = off;        int n = off + len - 1;        if (len > 40) {// Big arrays, pseudomedian of 9            int s = len / 8;            l = med3(x, l, l + s, l + 2 * s);            m = med3(x, m - s, m, m + s);            n = med3(x, n - 2 * s, n - s, n);        }        m = med3(x, l, m, n); // Mid-size, med of 3    }    int v = x[m];    // Establish Invariant: v* (v)* v*    int a = off, b = a, c = off + len - 1, d = c;    while (true) {while (b <= c && x[b] <= if="" while="" c="">= b && x[c] >= v) {if (x[c] == v)                swap(x, c, d--);            c--;        }        if (b > c)            break;        swap(x, b++, c--);    }    // Swap partition elements back to middle    int s, n = off + len;    s = Math.min(a - off, b - a);    vecswap(x, off, b - s, s);    s = Math.min(d - c, n - d - 1);    vecswap(x, b, n - s, s);    // Recursively sort non-partition-elements    if ((s = b - a) > 1)        sort1(x, off, s);    if ((s = d - c) > 1)        sort1(x, n - s, s);}/** * Swaps x[a] with x[b]. */private static void swap(int x[], int a, int b) {int t = x[a];    x[a] = x[b];    x[b] = t;}/** * Swaps x[a .. (a+n-1)] with x[b .. (b+n-1)]. */private static void vecswap(int x[], int a, int b, int n) {for (int i = 0; i < n; i++, a++, b++)        swap(x, a, b);}/** * Returns the index of the median of the three indexed integers. */private static int med3(int x[], int a, int b, int c) {return (x[a] < x[b] ?            (x[b] < x[c] ? b : x[a] < x[c] ? c : a) :            (x[b] > x[c] ? b : x[a] > x[c] ? c : a));}

1.1.2、分析

(1)數(shù)組長(zhǎng)度小于7,那么排序時(shí)基于基本的插入排序算法(2)數(shù)組長(zhǎng)度大于7,那么在使用的優(yōu)化后的快速排序,對(duì)應(yīng)數(shù)組長(zhǎng)度在7和40之間的數(shù)組,取的切分元素相對(duì)來(lái)說(shuō)簡(jiǎn)單點(diǎn)

1.2、JDK1.7

1.2.1、源碼:

public static void sort(int[] a) {DualPivotQuicksort.sort(a);}// 下面方法來(lái)自:java.util.DualPivotQuicksort#sort(int[])public static void sort(int[] a) {sort(a, 0, a.length - 1);}/** * If the length of an array to be sorted is less than this * constant, Quicksort is used in preference to merge sort. */private static final int QUICKSORT_THRESHOLD = 286;/** * The maximum number of runs in merge sort. */private static final int MAX_RUN_COUNT = 67;/** * The maximum length of run in merge sort. */private static final int MAX_RUN_LENGTH = 33;public static void sort(int[] a, int left, int right) {// Use Quicksort on small arrays    if (right - left < QUICKSORT_THRESHOLD) {sort(a, left, right, true);        return;    }    /*     * Index run[i] is the start of i-th run     * (ascending or descending sequence).     */    int[] run = new int[MAX_RUN_COUNT + 1];    int count = 0; run[0] = left;    // Check if the array is nearly sorted    for (int k = left; k < right; run[count] = k) {if (a[k] < a[k + 1]) {// ascending            while (++k <= right && a[k - 1] <= else="" if=""> a[k + 1]) {// descending            while (++k < = right="" k="" -="">= a[k]);            for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) {int t = a[lo]; a[lo] = a[hi]; a[hi] = t;            }        } else {// equal            for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) {if (--m == 0) {sort(a, left, right, true);                    return;                }            }        }        /*         * The array is not highly structured,         * use Quicksort instead of merge sort.         */        if (++count == MAX_RUN_COUNT) {sort(a, left, right, true);            return;        }    }    // Check special cases    if (run[count] == right++) {// The last run contains one element        run[++count] = right;    } else if (count == 1) {// The array is already sorted        return;    }    /*     * Create temporary array, which is used for merging.     * Implementation note: variable "right" is increased by 1.     */    int[] b; byte odd = 0;    for (int n = 1; (n <<= 1) < count; odd ^= 1);    if (odd == 0) {b = a; a = new int[b.length];        for (int i = left - 1; ++i < right; a[i] = b[i]);    } else {b = new int[a.length];    }    // Merging    for (int last; count > 1; count = last) {for (int k = (last = 0) + 2; k <= count; k += 2) {int hi = run[k], mi = run[k - 1];            for (int i = run[k - 2], p = i, q = mi; i < hi; ++i) {if (q >= hi || p < mi && a[p] <= else="" if="" count="" for="" int="" i="right," lo="run[count" -="" --i="">= lo;                 b[i] = a[i]                    );            run[++last] = right;        }        int[] t = a; a = b; b = t;    }}/** * Sorts the specified range of the array by Dual-Pivot Quicksort. * * @param a the array to be sorted * @param left the index of the first element, inclusive, to be sorted * @param right the index of the last element, inclusive, to be sorted * @param leftmost indicates if this part is the leftmost in the range */private static void sort(int[] a, int left, int right, boolean leftmost){}

在JDK7中,排序使用的雙軸快速排序,其要比傳統(tǒng)的單軸排序要快

雙軸快速排序:如果數(shù)組的長(zhǎng)度小于QUICKSORT_THRESHOLD的話就會(huì)使用這個(gè)雙軸快速排序,而這個(gè)值是286

if (right - left < QUICKSORT_THRESHOLD) {sort(a, left, right, true);    return;}

1.3、JDK1.8

1.3.1、源碼

public static void sort(int[] a) {DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);}

DualPivotQuicksort.sort方法

private static final int QUICKSORT_THRESHOLD = 286;static void sort(int[] a, int left, int right,                 int[] work, int workBase, int workLen) {// Use Quicksort on small arrays,QUICKSORT_THRESHOLD為286,當(dāng)要排序區(qū)間小于286時(shí),發(fā)現(xiàn)調(diào)用了本類(lèi)的重載sort方法    if (right - left < QUICKSORT_THRESHOLD) {sort(a, left, right, true);        return;    }    /**    * run[i] 意味著第i個(gè)有序數(shù)列開(kāi)始的位置,(升序或者降序)    **/    int[] run =new int[MAX_RUN_COUNT + 1];    int count=0; run[0] = left;    // 檢查數(shù)組是不是已經(jīng)接近有序狀態(tài)    for(int k = left; k < right; run[count] = k) {if(a[k] < a[k + 1]){// 升序            while(++k <= right && a[k - 1] <= else=""> a[k + 1]) {// 降序            while(++k <=right k="" -="">= a[k]);            //如果是降序的,找出k之后,把數(shù)列倒置            for (int lo = run[count],hi = k;++lo < --hi) {int t = a[lo]; a[lo] = a[hi]; a[hi] = t;            }        } else {// 相等            for(int m = MAX_RUN_LENGTH; ++k <=right && a[k - 1] == a[k];) {// 數(shù)列中有至少M(fèi)AX_RUN_LENGTH的數(shù)據(jù)相等的時(shí)候,直接使用快排。                // 這里為什么這么處理呢?                if(--m == 0){sort(a, left, right, true);                    return;                }            }        }        /**        * 數(shù)組并非高度有序,使用快速排序,因?yàn)閿?shù)組中有序數(shù)列的個(gè)數(shù)超過(guò)了MAX_RUN_COUNT        */        if(++count == MAX_RUN_COUNT) {sort(a, left, right, true);            return;        }    }    //檢查特殊情況    if(run[count] == right++){// 最后一個(gè)有序數(shù)列只有最后一個(gè)元素        run[++count] =right; // 那給最后一個(gè)元素的后面加一個(gè)哨兵    } else if(count == 1) {// 整個(gè)數(shù)組中只有一個(gè)有序數(shù)列,說(shuō)明數(shù)組已經(jīng)有序啦,不需要排序了        return;    }    /**    * 創(chuàng)建合并用的臨時(shí)數(shù)組。    * 注意: 這里變量right被加了1,它在數(shù)列最后一個(gè)元素位置+1的位置    * 這里沒(méi)看懂,沒(méi)發(fā)現(xiàn)后面的奇數(shù)處理和偶數(shù)處理有什么不同    */    int[] b; byte odd=0;    for(int n=1; (n <<= 1) < count; odd ^=1);    if(odd == 0) {b=a;a= new int[b.length];        for(int i=left -1; ++i < right; a[i] = b[i]);    } else {b=new int[a.length];    }    // 合并    // 最外層循環(huán),直到count為1,也就是棧中待合并的序列只有一個(gè)的時(shí)候,標(biāo)志合并成功    // a 做原始數(shù)組,b 做目標(biāo)數(shù)組    for(int last; count > 1; count = last) {// 遍歷數(shù)組,合并相鄰的兩個(gè)升序序列        for(int k = (last = 0) + 2; k <= count; k += 2) {// 合并run[k-2] 與 run[k-1]兩個(gè)序列            int hi = run[k], mi = run[k - 1];            for(int i = run[k - 2], p = i,q = mi; i < hi; ++i){// 這里我給源碼加了一個(gè)括號(hào),這樣好理解一點(diǎn)。 之前總覺(jué)得它會(huì)出現(xiàn)數(shù)組越界問(wèn)題,                // 后來(lái)加了這個(gè)括號(hào)之后發(fā)現(xiàn)是沒(méi)有問(wèn)題的                if(q >= hi  ||  (p < mi && a[p] < = else="" count="" int="" i="right," lo="run[count" --i="">= lo; b[i] = a[i]);            run[++last] = right;        }        //臨時(shí)數(shù)組,與原始數(shù)組對(duì)調(diào),保持a做原始數(shù)組,b 做目標(biāo)數(shù)組        int[] t = a; a = b; b = t;    }}int length = right - left + 1;// INSERTION_SORT_THRESHOLD為47,發(fā)現(xiàn)當(dāng)要排序的個(gè)數(shù)小于47個(gè)時(shí),采用插入排序,采用了哨兵方法,對(duì)于新元素從他前一個(gè)一個(gè)一個(gè)比較// Use insertion sort on tiny arraysif (length < INSERTION_SORT_THRESHOLD) {if (leftmost) {/*        * Traditional (without sentinel) insertion sort,        * optimized for server VM, is used in case of        * the leftmost part.        */        for (int i = left, j = i; i < right; j = ++i) {int ai = a[i + 1];            while (ai < a[j]) {a[j + 1] = a[j];                if (j-- == left) {break;                }            }            a[j + 1] = ai;        }    } else {/**        * 首先跨過(guò)開(kāi)頭的升序的部分        */        do {if(left > right) {return;            }        }while(a[++left] >= a[left - 1]);        /**        * 這里用到了成對(duì)插入排序方法,它比簡(jiǎn)單的插入排序算法效率要高一些        * 因?yàn)檫@個(gè)分支執(zhí)行的條件是左邊是有元素的        * 所以可以直接從left開(kāi)始往前查找。        */        for(int k = left; ++left <= k="++left)" int="" a1="" a2="a[left];">=a2            if(a1 < a2) {a2 = a1; a1 = a[left];            }            //先把兩個(gè)數(shù)字中較大的那個(gè)移動(dòng)到合適的位置            while(a1 < a[--k]) {a[k + 2] = a[k]; //這里每次需要向左移動(dòng)兩個(gè)元素            }            a[++k + 1] = a1;            //再把兩個(gè)數(shù)字中較小的那個(gè)移動(dòng)到合適的位置            while(a2 < a[--k]) {a[k + 1] = a[k]; //這里每次需要向左移動(dòng)一個(gè)元素            }            a[k + 1] = a2;        }        int last = a[right];        while(last < a[--right]) {a[right + 1] = last;        }        a[right + 1] = last;    }    return;}

至于大過(guò)INSERTION_SORT_THRESHOLD(47)的,用一種快速排序(雙軸快排)的方法:

從數(shù)列中挑出五個(gè)元素,稱(chēng)為 “基準(zhǔn)”(pivot);重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱(chēng)為分區(qū)(partition)操作;遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

總結(jié):插入排序,快速排序,歸并排序三種排序的組合

1.4、parallelSort

并行排序,JDK1.8增加的新方法

// 并行排序的最小數(shù)組長(zhǎng)度private static final int MIN_ARRAY_SORT_GRAN = 1 << 13;public static void parallelSort(int[] a) {int n = a.length, p, g;    // 如果數(shù)據(jù)的長(zhǎng)度小于 MIN_ARRAY_SORT_GRAN(1 << 13)    if (n <= MIN_ARRAY_SORT_GRAN ||        // 或者當(dāng)前并行度級(jí)別是 1的話,仍然使用常規(guī)的雙軸快速排序        (p = ForkJoinPool.getCommonPoolParallelism()) == 1)        DualPivotQuicksort.sort(a, 0, n - 1, null, 0, 0);    else        // 否則使用并行排序        new ArraysParallelSortHelpers.FJInt.Sorter            (null, a, new int[n], 0, n, 0,                ((g = n / (p << 2)) <= MIN_ARRAY_SORT_GRAN) ?                MIN_ARRAY_SORT_GRAN : g).invoke();}

2、搜索:binarySearch

主要用于快速?gòu)臄?shù)組中查找對(duì)應(yīng)的值,如果查找到了,返回的是對(duì)應(yīng)數(shù)組的下標(biāo)的值;如果查詢不到則返回負(fù)數(shù);

二分查找確保數(shù)組一定是有序的,否則可能找不到對(duì)應(yīng)的數(shù)據(jù)

但是該方法有有一個(gè)問(wèn)題:如果一個(gè)數(shù)組當(dāng)中有多個(gè)元素,其無(wú)法保證匹配的到底是哪一個(gè)

// a:我們要搜索的數(shù)組,fromIndex:從那里開(kāi)始搜索,默認(rèn)是0; toIndex:搜索到何時(shí)停止,默認(rèn)是數(shù)組大小// key:我們需要搜索的值 // c:外部比較器private staticint binarySearch0(T[] a, int fromIndex, int toIndex,                                     T key, Comparator c) {// 如果比較器 c 是空的,直接使用 key 的 Comparable.compareTo 方法進(jìn)行排序    // 假設(shè) key 類(lèi)型是 String 類(lèi)型,String 默認(rèn)實(shí)現(xiàn)了 Comparable 接口,就可以直接使用 compareTo 方法進(jìn)行排序    if (c == null) {// 這是另外一個(gè)方法,使用內(nèi)部排序器進(jìn)行比較的方法        return binarySearch0(a, fromIndex, toIndex, key);    }    int low = fromIndex;    int high = toIndex - 1;    // 開(kāi)始位置小于結(jié)束位置,就會(huì)一直循環(huán)搜索    while (low <= low="0,high" mid="(low" int="">>> 1;        T midVal = a[mid];        // 比較數(shù)組中間值和給定的值的大小關(guān)系        int cmp = c.compare(midVal, key);        // 如果數(shù)組中間值小于給定的值,說(shuō)明我們要找的值在中間值的右邊        if (cmp < 0)            low = mid + 1;        // 我們要找的值在中間值的左邊        else if (cmp > 0)            high = mid - 1;        else        // 找到了            return mid; // key found    }    // 返回的值是負(fù)數(shù),表示沒(méi)有找到    return -(low + 1);  // key not found.}

3、數(shù)據(jù)拷貝:copyOf和copyRange

拷貝整個(gè)數(shù)組:copyOf

public static int[] copyOf(int[] original, int newLength) {    int[] copy = new int[newLength];    System.arraycopy(original, 0, copy, 0,                        Math.min(original.length, newLength));    return copy;}

拷貝部分?jǐn)?shù)組:copyOfRange

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

基本上調(diào)用的是System.arrayCopy方法。

另外在在ArrayList的toArray方法中,其調(diào)用的也是Arrays里的copyOf方法,因?yàn)锳rrayList的底層實(shí)現(xiàn)是數(shù)組;

4、數(shù)組填充:fill

5、數(shù)組轉(zhuǎn)換為結(jié)婚:asList

public staticListasList(T... a) {    return new ArrayList<>(a);}

該方法有以下需要注意的:

其返回的集合不是java.util.ArrayList的實(shí)例,而是Array的內(nèi)部類(lèi):java.util.Arrays.ArrayList;java.util.Arrays.ArrayList不能對(duì)集合進(jìn)行增、刪操作,其沒(méi)有實(shí)現(xiàn)AbstractList類(lèi)中的add、remove方法;常見(jiàn)使用方法是:Listlist = new ArrayList<>(Arrays.asList(T...a));,可以將其作為參數(shù)傳到對(duì)應(yīng)集合的構(gòu)造方法里面;

二、Collections

為方便集合操作而產(chǎn)生的工具類(lèi)。

Collections也提供sort和binarySearch方法,其sort方法底層調(diào)用就是Arrays.sort方法,而binarySearch底層重寫(xiě)了二分查找算法,實(shí)現(xiàn)邏輯和Arrays的二分查找算法一致

1、sort()方法實(shí)現(xiàn)

public staticvoid sort(Listlist)

1.1、JDK1.6

1.1.1、源碼

// 基本方法public staticvoid sort(Listlist) {Object[] a = list.toArray();    Arrays.sort(a);    ListIteratori = list.listIterator();    for (int j=0; j<A.LENGTH; j++)="" {i.next();        i.set((T)a[j]);    }}/**********************下面方法未自Arrays***********************/// 調(diào)用 Arrays.sort(Object[] a) 排序方法,This algorithm offers guaranteed n*log(n) performance.public static void sort(Object[] a) {Object[] aux = (Object[])a.clone();    mergeSort(aux, a, 0, a.length, 0);}/** * Tuning parameter: list size at or below which insertion sort will be * used in preference to mergesort or quicksort. */private static final int INSERTIONSORT_THRESHOLD = 7;/** * Src is the source array that starts at index 0 * Dest is the (possibly larger) array destination with a possible offset * low is the index in dest to start sorting * high is the end index in dest to end sorting * off is the offset to generate corresponding low, high in src */private static void mergeSort(Object[] src,                              Object[] dest,                              int low,                              int high,                              int off) {int length = high - low;    // Insertion sort on smallest arrays    if (length < INSERTIONSORT_THRESHOLD) {for (int i = low; i < high; i++)            for (int j = i; j > low &&                    ((Comparable) dest[j - 1]).compareTo(dest[j]) > 0; j--)                swap(dest, j, j - 1);        return;    }    // Recursively sort halves of dest into src    int destLow = low;    int destHigh = high;    low += off;    high += off;    int mid = (low + high) >>> 1;    mergeSort(dest, src, low, mid, -off);    mergeSort(dest, src, mid, high, -off);    // If list is already sorted, just copy from src to dest.  This is an    // optimization that results in faster sorts for nearly ordered lists.    if (((Comparable) src[mid - 1]).compareTo(src[mid]) <= 0) {System.arraycopy(src, low, dest, destLow, length);        return;    }    // Merge sorted halves (now in src) into dest    for (int i = destLow, p = low, q = mid; i < destHigh; i++) {if (q >= high || p < mid && ((Comparable) src[p]).compareTo(src[q]) <= 0)            dest[i] = src[p++];        else            dest[i] = src[q++];    }}private static void swap(Object[] x, int a, int b) {Object t = x[a];    x[a] = x[b];    x[b] = t;}

1.2、JDK1.7

1.2.1、源碼

public staticvoid sort(Listlist) {Object[] a = list.toArray();    Arrays.sort(a);    ListIteratori = list.listIterator();    for (int j=0; j<A.LENGTH; j++)="" {i.next();        i.set((T)a[j]);    }}//Arrays.sort方法public static void sort(Object[] a) {if (LegacyMergeSort.userRequested)        legacyMergeSort(a);    else        ComparableTimSort.sort(a);}static final class LegacyMergeSort {private static final boolean userRequested =        java.security.AccessController.doPrivileged(            new sun.security.action.GetBooleanAction(                "java.util.Arrays.useLegacyMergeSort")).booleanValue();}/** To be removed in a future release. */private static void legacyMergeSort(Object[] a) {Object[] aux = a.clone();    mergeSort(aux, a, 0, a.length, 0);}private static void mergeSort(Object[] src,                              Object[] dest,                              int low,                              int high,                              int off) {int length = high - low;    // Insertion sort on smallest arrays    if (length < INSERTIONSORT_THRESHOLD) {for (int i=low; ilow &&                     ((Comparable) dest[j-1]).compareTo(dest[j])>0; j--)                swap(dest, j, j-1);        return;    }    // Recursively sort halves of dest into src    int destLow  = low;    int destHigh = high;    low  += off;    high += off;    int mid = (low + high) >>> 1;    mergeSort(dest, src, low, mid, -off);    mergeSort(dest, src, mid, high, -off);    // If list is already sorted, just copy from src to dest.  This is an    // optimization that results in faster sorts for nearly ordered lists.    if (((Comparable)src[mid-1]).compareTo(src[mid]) <= 0) {System.arraycopy(src, low, dest, destLow, length);        return;    }    // Merge sorted halves (now in src) into dest    for(int i = destLow, p = low, q = mid; i < destHigh; i++) {if (q >= high || p < mid && ((Comparable)src[p]).compareTo(src[q])<=0)            dest[i] = src[p++];        else            dest[i] = src[q++];    }}/** * Swaps x[a] with x[b]. */private static void swap(Object[] x, int a, int b) {Object t = x[a];    x[a] = x[b];    x[b] = t;}// ComparableTimSort

1.3、JDK1.8

2、集合的最大、最小值

max方法提供了兩種實(shí)現(xiàn)

// 沒(méi)有比較器的,那么默認(rèn)非泛型必須實(shí)現(xiàn)了Comparable接口,否則編譯的時(shí)候會(huì)報(bào)錯(cuò),因?yàn)槠涞讓邮钦{(diào)用Comparable的compareTo方法來(lái)進(jìn)行比較的;// 泛型必須繼承Objec且實(shí)現(xiàn)Comparable接口;public staticT max(Collection coll) {Iterator i = coll.iterator();    T candidate = i.next();    while (i.hasNext()) {T next = i.next();        if (next.compareTo(candidate) > 0)            candidate = next;    }    return candidate;}// 帶比較器,跟不帶比較器的類(lèi)似;public staticT max(Collection coll, Comparator comp) {if (comp==null)        return (T)max((Collection) coll);    Iterator i = coll.iterator();    T candidate = i.next();    while (i.hasNext()) {T next = i.next();        if (comp.compare(next, candidate) > 0)            candidate = next;    }    return candidate;}

3、多張類(lèi)型的集合

Collections對(duì)原始集合進(jìn)行了封裝,提供了:線程安全的集合、不可變的集合;

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-R1ReBn5L-1580104538820)(集合/image/Collections-InnerClass.png)]

3.1、線程安全的集合

線程安全的集合都是以Synchronized開(kāi)頭

SynchronizedListSynchronizedMapSynchronizedSetSynchronizedSortedMapSynchronizedSortedSet

上述線程安全的集合都是通過(guò)synchronized代碼塊來(lái)實(shí)現(xiàn)的,雖然都是線程安全的,但是在實(shí)際應(yīng)用中避免使用這些類(lèi);

3.2、不可變集合

不可變集合都是Unmodifiable開(kāi)頭,這類(lèi)方法的操作是會(huì)從原集合中得到一個(gè)不可變的新集合,新集合只能訪問(wèn),不能修改;否則拋出異常;

UnmodifiableCollection:為只讀集合

static class UnmodifiableListextends UnmodifiableCollectionimplements List{public E set(int index, E element) {// 拋出異常        throw new UnsupportedOperationException();    }    public void add(int index, E element) {// 拋出異常        throw new UnsupportedOperationException();    }    public E remove(int index) {// 拋出異常        throw new UnsupportedOperationException();    }    public int indexOf(Object o)            {return list.indexOf(o);}    public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}    public boolean addAll(int index, Collection c) {// 拋出異常        throw new UnsupportedOperationException();    }    @Override    public void replaceAll(UnaryOperatoroperator) {// 拋出異常        throw new UnsupportedOperationException();    }    @Override    public void sort(Comparator c) {// 拋出異常        throw new UnsupportedOperationException();    }}

三、Objects

1、相等

主要有兩個(gè)方法:deepEquals、equals,其中deepEquals主要是判斷數(shù)組的,后面equals主要判斷基本類(lèi)型和自定義類(lèi)型的

public static boolean deepEquals(Object a, Object b) {if (a == b)        return true;    else if (a == null || b == null)        return false;    else        return Arrays.deepEquals0(a, b);}public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}

2、判空

Objects.isNull(Object obj)Objects.nonNull(Object obj)Objects.requireNonNull(T obj)Objects.requireNonNull(T obj, String message)Objects.requireNonNull(T obj, SuppliermessageSupplier)

責(zé)任編輯:

標(biāo)簽:

相關(guān)推薦:

精彩放送:

新聞聚焦
Top 一区二区三区电影_国产伦精品一区二区三区视频免费_亚洲欧美国产精品va在线观看_国产精品一二三四
影音先锋一区| 欧美日韩成人在线观看| 久久午夜精品一区二区| 国产一区二区三区精品欧美日韩一区二区三区 | 在线视频你懂得一区二区三区| 欧美在线一二三| 狠狠狠色丁香婷婷综合激情| 久久这里有精品15一区二区三区 | 亚洲综合视频一区| 国产主播精品在线| 欧美激情1区2区| 性做久久久久久| 亚洲精品1区2区| 国产精品三级久久久久久电影| 久久久久国色av免费看影院| 一本久久综合亚洲鲁鲁| 国内精品久久久久久影视8 | 国产精品白丝jk黑袜喷水| 午夜精品久久| 亚洲国产另类精品专区| 国产精品日韩欧美| 欧美成人蜜桃| 久久se精品一区精品二区| 日韩视频一区二区在线观看| 国产乱码精品1区2区3区| 欧美成人免费在线视频| 亚洲欧美日韩成人| 亚洲精品一级| 狠狠v欧美v日韩v亚洲ⅴ| 欧美午夜片在线免费观看| 噜噜噜躁狠狠躁狠狠精品视频| 亚洲一区二区三区视频播放| 亚洲激情第一页| 国产综合精品| 国产欧美一区二区精品秋霞影院| 欧美日韩国产区一| 欧美韩国一区| 久久综合成人精品亚洲另类欧美 | 久久精品免费看| 亚洲一区二区三区四区视频| 亚洲精品美女在线| 激情综合色丁香一区二区| 国产精品免费一区豆花| 欧美日韩视频免费播放| 欧美a级大片| 免费观看一区| 久久一区二区精品| 久久免费视频在线| 久久九九热免费视频| 亚洲欧美经典视频| 亚洲一级黄色av| 亚洲视频电影在线| 一区二区三区久久网| 日韩系列欧美系列| 亚洲精品日韩精品| 日韩一区二区免费高清| 亚洲日本无吗高清不卡| 亚洲激情午夜| 亚洲精品欧美极品| 亚洲精品午夜| 日韩午夜视频在线观看| 亚洲精品欧美| 一区二区三区四区国产精品| 9久草视频在线视频精品| 99国内精品久久久久久久软件| 亚洲精品一区二区三| 亚洲精品视频在线| 一区二区欧美激情| 亚洲欧美综合精品久久成人| 亚洲欧美在线播放| 久久精品国产第一区二区三区| 久久久久久亚洲综合影院红桃 | 性色一区二区三区| 久久大香伊蕉在人线观看热2| 久久久国产视频91| 欧美黑人在线播放| 国产精品久久久久久久午夜| 国产亚洲综合精品| 亚洲激情午夜| 亚洲一区精彩视频| 久久亚洲综合网| 欧美视频中文一区二区三区在线观看 | 国产午夜一区二区三区| 欧美性猛交xxxx乱大交退制版| 国产精品美女999| 国产主播一区| 91久久精品网| 亚洲一区二区三区免费观看 | 国产精品视频专区| 国产在线视频欧美| 亚洲精一区二区三区| 亚洲欧美日本另类| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美日韩一区二区三区高清| 国产日韩在线看片| 亚洲毛片在线| 久久精品亚洲一区二区三区浴池| 欧美国产亚洲视频| 国产自产女人91一区在线观看| 亚洲精品小视频| 久久黄色级2电影| 欧美经典一区二区三区| 国产欧美在线视频| 日韩午夜剧场| 六月天综合网| 国产精品亚发布| 亚洲精品社区| 老色批av在线精品| 国产日本亚洲高清| 一区二区三区日韩在线观看| 久久欧美中文字幕| 国产精品免费久久久久久| 亚洲高清自拍| 久久国产一二区| 国产精品女人毛片| 亚洲美女av黄| 欧美777四色影视在线| 激情欧美一区二区| 欧美影院在线播放| 国产精品久久久久久久一区探花 | 久久久一本精品99久久精品66| 欧美日韩一级大片网址| 亚洲盗摄视频| 久久夜色精品国产噜噜av| 国产三区精品| 午夜精品免费在线| 国产精品视区| 午夜精品一区二区三区在线播放| 欧美日韩国产精品 | 久久精品亚洲| 国产午夜精品美女毛片视频| 亚洲在线免费| 国产精品免费看片| 午夜伦理片一区| 国产网站欧美日韩免费精品在线观看| 亚洲欧美99| 国产午夜精品全部视频在线播放| 亚洲欧美色婷婷| 国产热re99久久6国产精品| 午夜精品久久久久久久99水蜜桃 | 国内成人自拍视频| 久久国产精品久久久久久| 国产午夜精品美女视频明星a级| 欧美一区二区三区在线看| 国产丝袜一区二区三区| 久久精品亚洲一区二区| 亚洲第一久久影院| 欧美日韩国产123区| 亚洲一区二区三区在线| 国产欧美日韩91| 久久乐国产精品| 亚洲国产一区二区视频| 欧美理论在线播放| 亚洲伊人伊色伊影伊综合网| 国产精品一区在线观看| 久久久精品一区| 亚洲另类自拍| 国产区精品在线观看| 久久高清国产| 91久久久亚洲精品| 欧美性色综合| 久久综合电影一区| 中文在线资源观看网站视频免费不卡 | 日韩视频不卡中文| 欧美少妇一区| 久久久精品国产一区二区三区| 狠狠久久亚洲欧美| 欧美激情综合五月色丁香小说| 亚洲一区不卡| 在线观看视频亚洲| 国产精品久线观看视频| 玖玖国产精品视频| 亚洲在线1234| 91久久久久久国产精品| 国产日韩一区二区三区在线| 欧美国产大片| 久久精品国产一区二区电影| 日韩一级欧洲| 伊人伊人伊人久久| 国产精品自在线| 欧美日韩岛国| 欧美h视频在线| 羞羞答答国产精品www一本| 亚洲精品免费一二三区| 国内精品久久久久伊人av| 国产精品高潮视频| 欧美激情欧美狂野欧美精品| 久久久久成人精品免费播放动漫| 亚洲视频在线免费观看| 亚洲国产日韩欧美在线动漫| 国产一区在线看| 国产日本欧美一区二区三区在线| 欧美日韩免费观看一区| 嫩模写真一区二区三区三州| 久久久777| 久久精品国产欧美激情| 欧美一级视频精品观看| 亚洲一区综合| 亚洲综合第一| 在线视频亚洲欧美|