亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java數(shù)據(jù)結(jié)構(gòu)常見(jiàn)幾大排序梳理

 更新時(shí)間:2022年03月03日 17:07:42   作者:波風(fēng)張三  
Java常見(jiàn)的排序算法有:直接插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序等。本文詳解介紹它們的實(shí)現(xiàn)以及圖解,需要的可以參考一下

一、排序的概念和分類(lèi)

1.排序的基本概念

排序是將一批無(wú)序的記錄(數(shù)據(jù))重新排列成按關(guān)鍵字有序的記錄序列的過(guò)程。

排序分為內(nèi)部排序和外部排序

  • 若整個(gè)排序過(guò)程不需要訪(fǎng)問(wèn)外存便能完成,則稱(chēng)此類(lèi)排序問(wèn)題為內(nèi)部排序。
  • 反之,若參加排序的記錄數(shù)量很大,整個(gè)序列的排序過(guò)程不可能在內(nèi)存中完成,則稱(chēng)此類(lèi)排序問(wèn)題為外部排序。

內(nèi)部排序的過(guò)程是一個(gè)逐步擴(kuò)大記錄的有序序列長(zhǎng)度的過(guò)程

2.排序的穩(wěn)定性

假定在待排序的記錄序列中,存在多個(gè)具有相同的關(guān)鍵字的記錄,若經(jīng)過(guò)排序,這些記錄的相對(duì)次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,則稱(chēng)這種排序算法是穩(wěn)定的;否則稱(chēng)為不穩(wěn)定的。

總結(jié)起來(lái)就是,如果一個(gè)數(shù)據(jù)在排序過(guò)程中發(fā)生了跳躍行為,則為不穩(wěn)定的排序;反之,則是穩(wěn)定的排序。

  • 時(shí)間復(fù)雜度:一個(gè)算法執(zhí)行所耗費(fèi)的時(shí)間
  • 空間復(fù)雜度:運(yùn)行完一個(gè)程序所需的內(nèi)存大小。

二、常見(jiàn)排序

1.直接插入排序

直接插入排序的基本操作是講一個(gè)記錄插入到已經(jīng)排好序的有序表中,從而得到一個(gè)新的、記錄數(shù)增1的有序表。

代碼:

    public static void insertSort(int[] array) {
        for (int i = 1; i < array.length; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= 0 ; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            //j回退到了小于0的地方
            array[j+1] = tmp;
        }
    }

流程圖解:

時(shí)間和復(fù)雜度分析: 我們?cè)趯?shí)現(xiàn)的這個(gè)排序算法的時(shí)候,只借助了一個(gè)輔助的記錄空間。

所以最好的情況就是我們?cè)瓉?lái)需要的排序的元素之間就是有序的,比如說(shuō){1,2,3,4,5,6},那么我們需要比較的次數(shù),其實(shí)就是臨近兩個(gè)元素的比較,因此沒(méi)有移動(dòng)的記錄,時(shí)間復(fù)雜度為O(n);

最壞的情況就是元素都是逆序的,如{6,5,4,3,2,1},所以都需要比較,移動(dòng)次數(shù)達(dá)到O(n^2).

穩(wěn)定性:穩(wěn)定

插入排序,初始數(shù)據(jù)越接近有序,時(shí)間效率越高

2.希爾排序

希爾排序法又稱(chēng)縮小增量法。希爾排序法的基本思想是:先選定一個(gè)整數(shù),把待排序文件中所有記錄分成個(gè)組,所有距離為的記錄分在同一組內(nèi),并對(duì)每一組內(nèi)的記錄進(jìn)行排序。然后,重復(fù)上述分組和排序的工作。當(dāng)?shù)竭_(dá)=1時(shí),所有記錄在統(tǒng)一組內(nèi)排好序。

希爾對(duì)記錄的分組,不是簡(jiǎn)單地“逐段分割”,而是將相隔某個(gè)“增量”的記錄分成一組。

在嚴(yán)薇敏的《數(shù)據(jù)結(jié)構(gòu)》里面是這樣說(shuō)的:

上面的話(huà)可能有點(diǎn)難理解,下面我們通過(guò)畫(huà)圖來(lái)了解一下希爾排序的本質(zhì)。

希爾排序跟直接插入排序有點(diǎn)相似,可以說(shuō)是直接插入排序的升級(jí)版。不同在于,希爾排序的比較方式變成了跳躍式的。比如說(shuō)下面這組數(shù)據(jù)的第一次排序。

最終排序完成了。

我們來(lái)看一下希爾排序的代碼:

    public static void shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++ ) {
            int tmp = array[i];
            int j = i-gap;
            for (; j >= 0 ; j -= gap) {
                if(array[j] > tmp) {
                    array[j+gap] = array[j];
                }else {
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }

//按照5、3、1分組
    public static void shellSort1(int[] array) {
        int[] drr = {5,3,1};
        for (int i = 0; i < drr.length; i++) {
            shell(array,drr[i]);
        }
    }

是不是跟直接插入排序很像?所以我們才說(shuō),希爾排序是直接插入排序的升級(jí)版。它不是隨便分組后各自排序,而是將相隔某個(gè)增量gap的記錄組成一個(gè)子序列,實(shí)現(xiàn)跳躍式移動(dòng),使得排序的效率提高了。

所以,選取“增量”是非常關(guān)鍵的一步,值得一提的是,選取什么樣的“增量”,目前為止尚沒(méi)有一個(gè)沒(méi)完美的增量序列。

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度[和增量有關(guān)系的]:O(n^1.3 - n^1.5)。
  • 空間復(fù)雜度:O(1)

穩(wěn)定性:不穩(wěn)定的。

3.簡(jiǎn)單選擇排序

簡(jiǎn)單選擇排序:通過(guò)n-i次關(guān)鍵字間的比較,從n-i+1個(gè)記錄中選出關(guān)鍵字最小的記錄,并和第 i(1 ≤ i ≤n) 個(gè)記錄交換

    public static void selectSort1(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i+1; j < array.length; j++) {
                //1 2 3 4 5 6
                if(array[j] < array[i]) {
                    swap(array,i,j);
                }
            }
        }
    }
    public static void swap(int[] array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;

有時(shí)候,我們可能不需要循環(huán)那么多次,循環(huán)一兩次就有序了,如果在有序的序列中繼續(xù)循環(huán),則會(huì)造成時(shí)間的浪費(fèi)。為避免這種情況,所以我們可以對(duì)代碼進(jìn)行稍稍改進(jìn):

    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            int minIndex = i;
            for (int j = i+1; j < array.length; j++) {
                //找到最小值下標(biāo)
                if(array[j] < array[minIndex]) {
                    minIndex = j;
                }
            }
            swap(array,i,minIndex);
        }
    }

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:O(n^2)
  • 空間復(fù)雜度:同接下介紹的冒泡排序一樣,只有在兩個(gè)記錄交換時(shí)需要一個(gè)輔助空間,所以空間復(fù)雜度為O(1).

穩(wěn)定性:穩(wěn)定

4.堆排序

堆排序的基本原理也是選擇排序,只是不在使用遍歷的方式查找無(wú)序區(qū)間的最大的數(shù),而是通過(guò)堆來(lái)選擇無(wú)序區(qū)間的最大的數(shù)。

我上一篇文章有詳細(xì)介紹,這里就不再說(shuō)了,大家感興趣可以去了解一下。 Java數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級(jí)隊(duì)列(堆)圖文詳解

這里也給一下代碼:

    public static void heapSort(int[] array) {
        //1、建堆  O(N)
        createHeap(array);
        int end = array.length-1;
        //2、交換然后調(diào)整 O(N * log N)
        while (end > 0) {
            swap(array,0,end);
            shiftDown(array,0,end);
            end--;
        }
    }

    public static void createHeap(int[] array) {
        for (int parent = (array.length-1-1)/2; parent >= 0 ; parent--) {
            shiftDown(array,parent,array.length);
        }
    }

    public static void shiftDown(int[] array,int parent,int len) {
        int child = 2*parent+1;//左孩子下標(biāo)
        while (child < len) {
            if(child+1 < len && array[child] < array[child+1]) {
                child++;
            }
            //child下標(biāo) 就是左右孩子最大值的下標(biāo)
            if(array[child] > array[parent]) {
                swap(array,child,parent);
                parent = child;
                child = 2*parent+1;
            }else {
                break;
            }
        }
    }

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:O(n * log2(n))——2指的是以2為底
  • 空間復(fù)雜度:O(1)

穩(wěn)定性:不穩(wěn)定

【注意】

  • 堆排序只能用于順序結(jié)構(gòu),不能用于鏈?zhǔn)浇Y(jié)構(gòu)
  • 由于建初堆的時(shí)候所需比較的次數(shù)較多,因此記錄次數(shù)較少時(shí)不宜采用。

5.冒泡排序

冒泡排序是一種交換排序,它的基本思想是:兩兩比較相鄰記錄的關(guān)鍵字,如果反序則交換,直到?jīng)]有反序的記錄為止。

代碼:

    public static  void bubbleSort(int[] array) {
        for (int i = 0; i < array.length-1; i++) {
            for (int j = 0; j < array.length-1; j++) {
                if(array[j] > array[j+1]) {
                    swap(array,j+1,j);
                }
            }
        }
    }
 public static void swap(int[] array,int i,int j) {
        int tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;

復(fù)雜度分析:

  • 時(shí)間復(fù)雜度:O(N^2)
  • 空間復(fù)雜度:O(1)

穩(wěn)定性:穩(wěn)定。

6.快速排序

6.1.遞歸快速排序

快速排序是冒泡排序的升級(jí)版,它們都屬于交換排序類(lèi),即它也是通過(guò)不斷比較和移動(dòng)交換來(lái)實(shí)現(xiàn)排序,不同的是,快排的實(shí)現(xiàn)增大的了記錄的比較和移動(dòng)的距離。

快排將關(guān)鍵字較大的數(shù)據(jù)從前面直接移到后面,關(guān)鍵字較小的記錄從后面直接移到前面,從而減少了總的比較次數(shù)和移動(dòng)交換次數(shù)。

快排的基本思想:

通過(guò)一趟排序?qū)⒋判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分比另一部小,然后再分別對(duì)這兩部分記錄并再次進(jìn)行排序,以達(dá)到整個(gè)序列有序。

我們翻譯翻譯一下上面的那段話(huà):

  • 首先,你得有一個(gè)中間數(shù),比它小的放一邊,比它大的放一邊。這個(gè)數(shù),我們稱(chēng)為基準(zhǔn)值。
  • 采用分治思想,對(duì)左右兩個(gè)小區(qū)間按照同樣的方式處理,直到小區(qū)間的長(zhǎng)度 == 1,代表已經(jīng)有序,或者小區(qū)間的長(zhǎng)度 == 0,代表沒(méi)有數(shù)據(jù)。

可能大家看到這里也還是有點(diǎn)迷惑,我們直接上代碼。

    public static void quickSort(int[] array) {
        quick(array,0,array.length-1);
    }

    public static void quick(int[] array,int left,int right) {
        if(left >= right) {
            return;
        }
        int pivot = partition(array,left,right);//基準(zhǔn)
        quick(array,left,pivot-1);
        quick(array,pivot+1,right);
    }

上面的代碼是不是有點(diǎn)像二叉樹(shù)的遍歷?

這二者確實(shí)有相似之處,我們后面再講。

上面還有一個(gè)partition函數(shù),這個(gè)函數(shù)是我們快速排序最關(guān)鍵的地方。

 /**
     * 找基準(zhǔn)
     * @param array 待排序數(shù)組對(duì)象
     * @param start左邊界
     * @param end右邊界
     * @return 基準(zhǔn)值下標(biāo)
     */
    private static int partition(int[] array,int start,int end) {
        int tmp = array[start];
        while (start < end) {
            while (start < end && array[end] >= tmp) {
                end--;
            }
            //end下標(biāo)就遇到了 < tmp的值
            array[start] = array[end];
            while (start < end && array[start] <= tmp) {
                start++;
            }
            //start下標(biāo)就遇到了 > tmp的值
            array[end] = array[start];
        }
        array[start] = tmp;
        return start;
    }

我們下面通過(guò)圖解模擬一下函數(shù)的運(yùn)行過(guò)程:

可以看到,當(dāng)?shù)谝惠喿咄曛?,?shù)據(jù)由基準(zhǔn)值分成了兩部分。

之后,我們?cè)俅螌?duì)左右兩部分完成同樣的操作,如下:

一直遞歸下來(lái),跟二叉樹(shù)的遍歷類(lèi)似。

復(fù)雜度分析:

時(shí)間復(fù)雜度:

  • 最好情況下:O(nlogn)
  • 最壞情況下:O(n^2).

空間復(fù)雜度:O(logn)

穩(wěn)定性:不穩(wěn)定

  • 快排優(yōu)化

不知大家看上面的圖解的時(shí)候有沒(méi)有一點(diǎn)困惑,就是我們這基準(zhǔn)選得不好,導(dǎo)致第一趟遞歸下來(lái)的效果不好,變成了如下圖:

如果我們有一種辦法,先找到相對(duì)居中的那個(gè)數(shù)字,那么整個(gè)排序的時(shí)間復(fù)雜度是不是大大減小了。

于是,有人提出了隨機(jī)選取一個(gè)值來(lái)作為基準(zhǔn),稱(chēng)為隨機(jī)選取法。

這種做法,得看運(yùn)氣,因?yàn)榧偃邕x的好,剛剛選取中間值,那么,性能大大提高;如果隨機(jī)得不好,比如隨機(jī)到最小值或者最大值,那么性能則變成最差了。

所以有人提出一個(gè)新的方法,三數(shù)取中:

取三個(gè)關(guān)鍵字先進(jìn)行排序,將中間數(shù)作為基準(zhǔn),一般取左端,右端和中間三個(gè)數(shù)。

如果運(yùn)用三數(shù)取中這種方法的話(huà),第一次比較的結(jié)果如下:

可以看到,11基本上與中間的數(shù)字相差不遠(yuǎn)了,性能大大提高。

所以,這里我們?cè)賹?xiě)一個(gè)找基準(zhǔn)的代碼:

/**
     * 找基準(zhǔn) 三數(shù)取中法
     * @param array 待排序數(shù)組對(duì)象
     * @param left 左邊界
     * @param right 右邊界
     * @return 基準(zhǔn)值下標(biāo)
     */
    private static int findMidValIndex(int[] array,int start,int end) {
        int mid = start + ((end-start) >>> 1);
        if(array[start] < array[end]) {
            if(array[mid] < array[start]) {
                return start;
            }else if(array[mid] > array[end]) {
                return end;
            }else {
                return mid;
            }
        }else {
            if(array[mid] > array[start]) {
                return start;
            }else if(array[mid] < array[end]) {
                return end;
            }else {
                return mid;
            }
        }
    }

前面quick函數(shù)改動(dòng)一下,如下:

    public static void quick(int[] array,int left,int right) {
        if(left >= right) {
            return;
        }

        //采用三數(shù)取中法找基準(zhǔn)值
        int midValIndex = findMidValIndex(array,left,right);
        swap(array,midValIndex,left);

        int pivot = partition(array,left,right);//基準(zhǔn)
        quick(array,left,pivot-1);
        quick(array,pivot+1,right);
    }

其實(shí),優(yōu)化到這里已經(jīng)很棒了 。但是,我們還能優(yōu)化。

這里先插播一個(gè)知識(shí)點(diǎn):

直接插入是簡(jiǎn)單排序中性能最好的。 所以如果要我們要排序的數(shù)組非常小,直接插入排序會(huì)更好。 原因在于,快速排序用到了遞歸操作,在大量的數(shù)據(jù)排序時(shí),這點(diǎn)性能影響相對(duì)它的整體算法優(yōu)勢(shì)而言是可以忽略的。但是如果數(shù)組只有不多的數(shù)據(jù)需要排序,就有點(diǎn)大材小用了。

因此,我們?cè)谶@里的優(yōu)化是:

增加一個(gè)判斷,當(dāng) right-left+1 不大于某個(gè)常數(shù)時(shí),就用直接插入排序,這個(gè)常數(shù)是具體情況而定。這樣我們就能保證最大化地利用兩種排序的優(yōu)勢(shì)來(lái)完成排序工作了。

/**
     * 優(yōu)化,加入插入排序
     * @param array 待排序數(shù)組對(duì)象
     * @param left 左邊界
     * @param right 右邊界
     * @return 基準(zhǔn)值下標(biāo)
     */
    public static void quick(int[] array,int left,int right) {
        if(left >= right) {
            return;
        }
        //加一個(gè)判斷,如果區(qū)間內(nèi)的數(shù)據(jù),在排序的過(guò)程當(dāng)中,小于某個(gè)范圍了,可以使用直接插入排序
        if(right-left+1 <= 1400) {
            //使用直接插入排序
            insertSort2(array,left,right);
            return;
        }

        //1、找基準(zhǔn)之前,我們找到中間大小的值-使用三數(shù)取中法
        int midValIndex = findMidValIndex(array,left,right);
        swap(array,midValIndex,left);

        int pivot = partition(array,left,right);//基準(zhǔn)
        quick(array,left,pivot-1);
        quick(array,pivot+1,right);
    }

//插入排序
    public static void insertSort(int[] array,int start,int end) {
        for (int i = 1; i <= end; i++) {
            int tmp = array[i];
            int j = i-1;
            for (; j >= start ; j--) {
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else {
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }

6.2.非遞歸方式實(shí)現(xiàn)

我們都知道,遞歸對(duì)性能是有一定影響的。所以我們也可以采用非遞歸的方式來(lái)實(shí)現(xiàn)快速排序

/**
     * 快速排序非遞歸實(shí)現(xiàn)
     * @param array 待排序數(shù)組
     */
    public static void quickSort(int[] array) {
        Stack<Integer> stack = new Stack<>();
        int left = 0;
        int right = array.length-1;
        int pivot = partition(array,left,right);
        if(pivot > left+1) {
            stack.push(left);
            stack.push(pivot-1);
        }
        if(pivot < right-1) {
            stack.push(pivot+1);
            stack.push(right);
        }

        while (!stack.isEmpty()) {
           right = stack.pop();
           left = stack.pop();
           pivot = partition(array,left,right);

            if(pivot > left+1) {
                //左邊有2個(gè)元素
                stack.push(left);
                stack.push(pivot-1);
            }
            if(pivot < right-1) {
                //右邊有2個(gè)元素
                stack.push(pivot+1);
                stack.push(right);
            }
        }
    }

非遞歸復(fù)雜度分析:

時(shí)間復(fù)雜度:

  • 最壞情況下: O(n^2)
  • 平均情況下:O(nlogn)

空間復(fù)雜度:

  • 最壞情況下:O(n)
  • 平均情況下:O(logn)

穩(wěn)定性:不穩(wěn)定

7.歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide an Conquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱(chēng)為二路歸并

7.1.遞歸歸并排序

直接上代碼:

//調(diào)用了mergeSortInternal函數(shù)
    public static void mergeSort1(int[] array) {
        mergeSortInternal(array,0,array.length-1);
    }

    private static void mergeSortInternal(int[] array,int low,int high) {
        if(low>=high) {
            return;
        }

        int mid = low + ((high-low) >>> 1);//>>>無(wú)符號(hào)右移1位。就是除以2,找中間值
        //左邊遞歸
        mergeSortInternal(array,low,mid);
        //右邊遞歸
        mergeSortInternal(array,mid+1,high);
        //合并兩邊數(shù)組
        merge(array,low,mid,high);
    }

mergeSortInternal函數(shù)的圖解:

其實(shí)就是對(duì)半分開(kāi)數(shù)組

這里這個(gè)merge函數(shù)是歸并排序里面的關(guān)鍵,無(wú)論是采用遞歸還是非遞歸都必須采用到這部分的函數(shù)。

而其本質(zhì),其實(shí)就是合并兩個(gè)數(shù)組,并使其有序起來(lái)。

merge函數(shù)的代碼:

    private static void merge(int[] array,int low,int mid,int high) {
        int[] tmp = new int[high-low+1];
        int k = 0;//

        int s1 = low;
        int e1 = mid;
        int s2 = mid+1;
        int e2 =  high;
        while (s1 <= e1 && s2 <= e2) {
            if(array[s1] <= array[s2]) {
                tmp[k++] = array[s1++];
            }else {
                tmp[k++] = array[s2++];
            }
        }
        while (s1 <= e1) {
            tmp[k++] = array[s1++];
        }
        while (s2 <= e2) {
            tmp[k++] = array[s2++];
        }
        //拷貝tmp數(shù)組的元素 放入原來(lái)的數(shù)組array當(dāng)中
        for (int i = 0; i < k; i++) {
            array[i+low] = tmp[i];
        }
    }

7.2.非遞歸歸并排序

歸并排序除了用遞歸的方式來(lái)實(shí)現(xiàn),也可以用非遞歸的方式來(lái)實(shí)現(xiàn)。

    public static void mergeSort(int[] array) {
        int nums = 1;//每組的數(shù)據(jù)個(gè)數(shù)
        while (nums < array.length) {
            //數(shù)組每次都要進(jìn)行遍歷,確定要?dú)w并的區(qū)間
            for (int i = 0; i < array.length; i += nums*2) {
                int left = i;
                int mid = left+nums-1;
                //防止越界
                if(mid >= array.length) {
                    mid = array.length-1;
                }
                int right = mid+nums;
                //防止越界
                if(right >= array.length) {
                    right = array.length-1;
                }
                //小標(biāo)確定之后,進(jìn)行合并
                merge(array,left,mid,right);
            }
            nums *= 2;數(shù)組合并后,以1-2-4-8-16-進(jìn)行循環(huán)
        }
    }

圖解如下:

總結(jié)

這次常見(jiàn)排序的文章,來(lái)來(lái)回回寫(xiě)了兩天左右,在寫(xiě)的過(guò)程,也是學(xué)習(xí)的過(guò)程,特別是里面畫(huà)圖的時(shí)候,得理清楚整個(gè)排序的思想,才能很好的作出整個(gè)圖解出來(lái)。各位看客老爺們,希望看到能給個(gè)三連,感謝!

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)常見(jiàn)幾大排序梳理的文章就介紹到這了,更多相關(guān)Java 排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot重寫(xiě)addResourceHandlers映射文件路徑方式

    SpringBoot重寫(xiě)addResourceHandlers映射文件路徑方式

    這篇文章主要介紹了SpringBoot重寫(xiě)addResourceHandlers映射文件路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringSecurity注銷(xiāo)設(shè)置的方法

    SpringSecurity注銷(xiāo)設(shè)置的方法

    這篇文章主要為大家詳細(xì)介紹了SpringSecurity注銷(xiāo)設(shè)置的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringCloud整合分布式服務(wù)跟蹤zipkin的實(shí)現(xiàn)

    SpringCloud整合分布式服務(wù)跟蹤zipkin的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud整合分布式服務(wù)跟蹤zipkin的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • mybatis plus表的創(chuàng)建時(shí)間和修改時(shí)間的操作方法

    mybatis plus表的創(chuàng)建時(shí)間和修改時(shí)間的操作方法

    這篇文章主要介紹了mybatis plus表的創(chuàng)建時(shí)間和修改時(shí)間的實(shí)現(xiàn)方法,本文給大家分享兩種方法,每種方法通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Java8 將一個(gè)List<T>轉(zhuǎn)為Map<String,T>的操作

    Java8 將一個(gè)List<T>轉(zhuǎn)為Map<String,T>的操作

    這篇文章主要介紹了Java8 將一個(gè)List<T>轉(zhuǎn)為Map<String, T>的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java修飾符 abstract,static,final 的區(qū)別詳解

    Java修飾符 abstract,static,final 的區(qū)別詳解

    以下是對(duì)Java修飾符abstract,static,final的區(qū)別進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • Java8新特性之Lambda表達(dá)式淺析

    Java8新特性之Lambda表達(dá)式淺析

    這篇文章主要介紹了Java8新特性之Lambda表達(dá)式,本文著重講解了Lambda表達(dá)式的語(yǔ)法部份,需要的朋友可以參考下
    2014-06-06
  • JAVA-NIO之Socket/ServerSocket Channel(詳解)

    JAVA-NIO之Socket/ServerSocket Channel(詳解)

    下面小編就為大家?guī)?lái)一篇JAVA-NIO之Socket/ServerSocket Channel(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Spring底層原理由淺入深探究

    Spring底層原理由淺入深探究

    Spring事務(wù)有可能會(huì)提交,回滾、掛起、恢復(fù),所以Spring事務(wù)提供了一種機(jī)制,可以讓程序員來(lái)監(jiān)聽(tīng)當(dāng)前Spring事務(wù)所處于的狀態(tài),這篇文章主要介紹了Spring底層事務(wù)原理,需要的朋友可以參考下
    2023-02-02
  • Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的示例詳解

    Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)MNIST手寫(xiě)數(shù)字識(shí)別的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01

最新評(píng)論