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

java 排序算法之希爾算法

 更新時(shí)間:2021年08月31日 09:41:06   作者:天然呆dull  
這篇文章主要介紹了java 排序算法之希爾排序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

注:學(xué)習(xí)本篇的前提是要會(huì)插入排序,數(shù)據(jù)結(jié)構(gòu)與算法——排序算法-插入排序

插入排序存在的問題

簡單的插入排序可能存在的問題。

如數(shù)組 arr = {2,3,4,5,6,1} 這時(shí)需要插入的數(shù) 1(最小),過程是:

展示的是要移動(dòng) 1 這個(gè)數(shù),的過程,由于在最后,需要前面的所有數(shù)都往后移動(dòng)一位
{2,3,4,5,6,6}
{2,3,4,5,5,6}
{2,3,4,4,5,6}
{2,3,3,4,5,6}
{2,2,3,4,5,6}
{1,2,3,4,5,6}

結(jié)論:當(dāng)需要插入的數(shù)是較小的數(shù)時(shí),后移的次數(shù)明顯增多,對(duì)效率有影響。

簡單介紹

希爾排序(Shell's Sort)是希爾(Donald Shell)于 1959 年提出的一種排序算法。

希爾排序也是一種 插入排序(Insertion sort),是將整個(gè)無序列分割成若干小的子序列分別進(jìn)行插入排序的方法,它是簡單插入排序經(jīng)過改進(jìn)后的一個(gè) 更高效的版本,也稱為 縮小增量排序。時(shí)間復(fù)雜度 O(n^(1.3—2)

關(guān)于插入排序請(qǐng)看 數(shù)據(jù)結(jié)構(gòu)與算法——排序算法-插入排序

基本思想

希爾排序把記錄按 下標(biāo)的一定增量分組,對(duì)每組使用 直接插入排序算法 排序,隨著 增量逐漸減少,每組包含的關(guān)鍵詞越來越多(要排序的數(shù)),當(dāng)增量減至 1 時(shí),整個(gè)文件被分成一組,算法便終止。

光看上面的描述,對(duì)于首次接觸的人來說,不知道是啥意思,舉個(gè)例子,認(rèn)真思考下面的說明:

  • 原始數(shù)組:以下數(shù)據(jù)元素顏色相同為一組

  • 初始增量為:gap = length/2 這里為 gap = 10 / 2 = 5(length 是數(shù)組的大小)

那么意味著整個(gè)數(shù)組被分為 5 組。分別為 [8,3][9,5][1,4][7,6][2,0]

先看明白這里的增量為 5 ,就會(huì)分成 5 組。[8,3] 這一組來說,對(duì)比看下圖,它的意思是:從 8 開始,下標(biāo)增加 5 既對(duì)應(yīng)的數(shù)是 3,所以他們分為一組

  • 對(duì)上面的這 5 組分別進(jìn)行 直接插入排序 ,也就是每一組分為有序列無序列,例如 [8,3] 這組,8 為有序列倒數(shù)第一個(gè)數(shù) 3為無序列第一個(gè)數(shù)。

結(jié)果如下圖:可以看到,像 3、5、6 這些小的元素被調(diào)整到了前面。

然后縮小增量 gap = 5 / 2 = 2,則數(shù)組被分為 2 組 [3,1,0,9,7][5,6,8,4,2]

  • 對(duì)以上 2 組再分別進(jìn)行 直接插入排序,即每一組分為有序列無序列,例如[3,1,0,9,7] 這組,3 為有序列的倒數(shù)第一個(gè)數(shù) 1 為無序列第一個(gè)數(shù)。

結(jié)果如下圖:可以看到,此時(shí)整個(gè)組數(shù)的有序程度更進(jìn)一步。

然后再縮小增量 gap = 2 / 2 = 1,則整個(gè)數(shù)組被當(dāng)成一組,再進(jìn)行一次直接插入排序,即每一組分為有序列無序列0 為有序列的倒數(shù)第一個(gè)數(shù) 2為無序列第一個(gè)數(shù)。由于基本上是有序的了,所以少了很多次的調(diào)整。

動(dòng)圖:

經(jīng)過上面的解析,應(yīng)該對(duì)希爾排序有了初步的認(rèn)識(shí),為了更深入理解它的實(shí)現(xiàn)過程以及原理,下面通過代碼進(jìn)行演示。

代碼實(shí)現(xiàn)

場景:有一群小牛,考試成績分布是 {8,9,1,7,2,3,5,4,6,0},請(qǐng)從小到大排序。

對(duì)于希爾排序時(shí),對(duì)有序序列在 插入 時(shí),有以下兩種方式:

  • 交換法:容易理解,速度相對(duì)較慢 (初學(xué)者用來理解的)
  • 移動(dòng)法:不太容易理解,速度相對(duì)較快 (這個(gè)才算是真正的希爾排序)

先實(shí)現(xiàn)交換法,然后再優(yōu)化成移動(dòng)法。比較容易。但是我個(gè)人感覺,如果你學(xué)好了插入排序,移動(dòng)法更容易理解。

特別注意

1.希爾排序,是一種插入排序,插入排序算法使用了的是移動(dòng)法,上面基本思想也算是是用的移動(dòng)法,但是基本思想是一個(gè)樣的,什么移動(dòng)法、交換法的只是一個(gè)數(shù)據(jù)移動(dòng)方式。(這里先講解交換法,便于理解)

2.希爾排序,對(duì)插入排序的改進(jìn),先分組,這里分組是通過增量步長和相關(guān)算法,來達(dá)到在循環(huán)中直接獲取到這一個(gè)組的元素

3.直接排序的基本思想一定要記得,最重要的兩個(gè)變量:無序列表中的第一個(gè)值,與有序列表中的最后一個(gè)值開始比較

    /**
     * 推到的方式來演示每一步怎么做,然后找規(guī)律
     */
    @Test
    public void processDemo() {
        int arr[] = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        System.out.println("原始數(shù)組:" + Arrays.toString(arr));
        processShellSort(arr);
    }

    public void processShellSort(int[] arr) {
        // 按照筆記中的基本思想,一共三輪
        // 第 1 輪:初始數(shù)組 [8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
        // 將 10 個(gè)數(shù)字分成了 5 組( length / 2),增量也是 5,需要對(duì) 5 組進(jìn)行排序
        // 外層循環(huán),并不是循環(huán) 5 次,只是這里巧合了。
        // 一定要記得,希爾排序:先分組,在對(duì)每組進(jìn)行插入排序
        for (int i = 5; i < arr.length; i++) {
            // 第 1 組:[8,3] , 分別對(duì)應(yīng)原始數(shù)組的下標(biāo) 0,5
            // 第 2 組:[9,5] , 分別對(duì)應(yīng)原始數(shù)組的下標(biāo) 1,6
            // ...
            // 內(nèi)層循環(huán)對(duì) 每一組 進(jìn)行直接排序操作
            // i = 5 ;j = 0, j-=5 = 0 - 5 = -5,跳出循環(huán),arr[j] = 8 ,這是對(duì)第 1 組進(jìn)行插入排序
            // i = 6 ;j = 1, j-=5 = 1 - 5 = -4,跳出循環(huán),arr[j] = 9 , 這是對(duì)第 2 組進(jìn)行插入排序
            // i = 7 ;j = 2, j-=5 = 2 - 5 = -3,跳出循環(huán),arr[j] = 1 ,這是對(duì)第 3 組進(jìn)行插入排序
            // i = 8 ;j = 3, j-=5 = 3 - 5 = -2,跳出循環(huán),arr[j] = 7 ,這是對(duì)第 4 組進(jìn)行插入排序
            // i = 9 ;j = 4, j-=5 = 4 - 5 = -1,跳出循環(huán),arr[j] = 2 ,這是對(duì)第 5 組進(jìn)行插入排序
            for (int j = i - 5; j >= 0; j -= 5) {
                // 如果當(dāng)前元素大于加上步長后的那個(gè)元素,就交換
                if (arr[j] > arr[j + 5]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 5];
                    arr[j + 5] = temp;
                }
            }
        }
        System.out.println("第 1 輪排序后:" + Arrays.toString(arr));

        // 第 2 輪:上一輪排序后的數(shù)組:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
        // 將 10 個(gè)數(shù)字分成了 2 組(上一次的增量 5 / 2),增量也為 2,需要對(duì) 2 組進(jìn)行排序
        for (int i = 2; i < arr.length; i++) {
            // 第 1 組:[3,1,0,9,7] , 分別對(duì)應(yīng)原始數(shù)組的下標(biāo) 0,2,4,6,8
            // 第 2 組:[5,6,8,4,2] , 分別對(duì)應(yīng)原始數(shù)組的下標(biāo) 1,3,5,7,9

            // 內(nèi)層循環(huán)對(duì) 每一組 進(jìn)行直接排序操作
            // i = 2 ;j = 0, j-=2 = 0 - 2 = -2,arr[j] = 3 ,跳出循環(huán),
            //      這是對(duì)第 1 組中的 3,1 進(jìn)行比較,1 為無序列表中的比較元素,3 為有序列表中的最后一個(gè)元素,3 > 1,進(jìn)行交換
            //      交換后的數(shù)組:[1, 5, 3, 6, 0, 8, 9, 4, 7, 2]
            //      第 1 組:[1,3,0,9,7]
            
            // i = 3 ;j = 1, j-=2 = 1 - 2 = -1,arr[j] = 5 ,跳出循環(huán)
            //      這是對(duì)第 2 組中的 5,6 進(jìn)行比較,6 為無序列表中的比較元素,5 為有序列表中的最后一個(gè)元素,5 < 6,不進(jìn)行交換
            //      交換后的數(shù)組:[1, 5, 3, 6, 0, 8, 9, 4, 7, 2] , 沒有交換
            //      第 2 組:[5,6,8,4,2]
            
            // i = 4 ;j = 2, j-=2 = 2 - 2 = 0,arr[j] = 3 ,
            //      這是對(duì)第 1 組中的 3,0 進(jìn)行比較,0 為無序列表中的比較元素,3 為有序列表中的最后一個(gè)元素,3 > 0,進(jìn)行交換
            //      交換后的數(shù)組:[1, 5, 0, 6, 3, 8, 9, 4, 7, 2],
            //           第 1 組:[1,0,3,9,7]
            //      由于 2 - 2 = 0,此時(shí) j = 0,滿足條件,繼續(xù)循環(huán) i = 4 :j = 0, j-=2 = 0 - 2 = -2,arr[j] = 1 ,跳出循環(huán)
            //      這是對(duì)第 1 組中的有序列表中的剩余數(shù)據(jù)進(jìn)行交換,1,0, 1>0 ,他們進(jìn)行交換(這里也就是完成有序列的一個(gè)排序)
            //           第 1 組:[0,1,3,9,7]
            //雖然有可能本次的排序完成了但是排序循環(huán)還是會(huì)循環(huán)下去,直到循環(huán)結(jié)束,后面的移動(dòng)法會(huì)解決該問題
            //以此類推
            for (int j = i - 2; j >= 0; j -= 2) {
                if (arr[j] > arr[j + 2]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 2];
                    arr[j + 2] = temp;
                }
            }
        }
        System.out.println("第 2 輪排序后:" + Arrays.toString(arr));

        // 第 3 輪:上一輪排序后的數(shù)組:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
        // 將 10 個(gè)數(shù)字分成了 1 組(上一次的增量 2 / 2),增量也為 1,需要對(duì) 1 組進(jìn)行排序
        for (int i = 1; i < arr.length; i++) {
            // 第 1 組:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
            // i = 1 :j = 0, j-=1 = 0 - 1 = -1,arr[j] = 0 ,跳出循環(huán)
            //      0 為有序列表中的最后一個(gè)元素,2 為無須列表中要比較的元素。 0 < 2,不交換
            //      [0, 2    有序 <-> 無序, 1, 4, 3, 5, 7, 6, 9, 8]
            // i = 2 :j = 1, j-=1 = 1 - 1 = o,arr[j] = 2 ,
            //      2 為有序列表中的最后一個(gè)元素,1 為無序列表中要比較的元素, 2 > 1,交換
            //      交換后:[0, 1, 2,     4, 3, 5, 7, 6, 9, 8]
            //      由于不退出循環(huán),還要比較有序列表中的數(shù)據(jù),0 與 1 ,0 < 1 ,不交換,退出循環(huán)
            //后面的以此類推,就是一個(gè)插入排序
            for (int j = i - 1; j >= 0; j -= 1) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println("第 3 輪排序后:" + Arrays.toString(arr));
    }

測試輸出信息

原始數(shù)組:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
第 1 輪排序后:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
第 2 輪排序后:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
第 3 輪排序后:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

這里的兩層循環(huán)一定明白是在做什么:

  • 外層循環(huán)不是控制組數(shù),是為了內(nèi)層循環(huán) 每一輪開始,都能 拿到某一組的無序列表第一個(gè)元素 arr[i]

難點(diǎn):結(jié)束條件是數(shù)組長度,是為了能拿到數(shù)組中的所有元素,每增長一次,由于步長的因素,可能這一的元素就不是上一次的同一組了。

  • 內(nèi)層循環(huán):拿到了這一組無序列表中第一個(gè)元素,只要減掉增量步長,就是有序列表中中的最后一個(gè)元素 arr[j] (這里說的是 循環(huán)中的 int j = i - gap)

細(xì)品這里的含義,這就是 插入排序博客中 講解的直接插入排序法的兩個(gè)變量,不過之前講解的算法是使用 移動(dòng)法,這里使用了 交換法,每一輪開始,都從有序列表最后一個(gè)開始交換,直到這個(gè)有序列表的第一個(gè)元素(在此之前,這個(gè)組可能已經(jīng)排序完成了),就退出循環(huán)。

從上述推導(dǎo)可以找到規(guī)律,只有每次的增量在變化,因此可以修改為如下方式

    @Test
    public void shellSortTest() {
        int arr[] = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        System.out.println("原始數(shù)組:" + Arrays.toString(arr));
        shellSort(arr);
    }

    /**
     * 根據(jù)前面的分析,得到規(guī)律,變化的只是增量步長,那么可以改寫為如下方式
     */
    public void shellSort(int[] arr) {
        int temp = 0;
        // 第 1 層循環(huán):得到每一次的增量步長
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            // 第 2 層和第 3 層循環(huán),是對(duì)每一個(gè)增量中的每一組進(jìn)行插入排序
            for (int i = gap; i < arr.length; i++) {
                for (int j = i - gap; j >= 0; j -= gap) {
                    if (arr[j] > arr[j + gap]) {
                        temp = arr[j];
                        arr[j] = arr[j + gap];
                        arr[j + gap] = temp;
                    }
                }
            }
            System.out.println("增量為 " + gap + " 的這一輪排序后:" + Arrays.toString(arr));
        }
    }

測試輸出

原始數(shù)組:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
增量為 5 的這一輪排序后:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
增量為 2 的這一輪排序后:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
增量為 1 的這一輪排序后:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

到這里其實(shí)希爾排序的思想就已經(jīng)講完了,只是目前的代碼欠于優(yōu)化,想必你們也覺得這個(gè)交換法有很多的不足,下面進(jìn)行測試就一目了然了

大數(shù)據(jù)量耗時(shí)測試

  /**
     * 大量數(shù)據(jù)排序時(shí)間測試
     */
    @Test
    public void bulkDataSort() {
        int max = 80_000;
//        int max = 8;
        int[] arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = (int) (Math.random() * 80_000);
        }

        Instant startTime = Instant.now();
        shellSort(arr);
//        System.out.println(Arrays.toString(arr));
        Instant endTime = Instant.now();
        System.out.println("共耗時(shí):" + Duration.between(startTime, endTime).toMillis() + " 毫秒");
    }

多次測試輸出

共耗時(shí):10816 毫秒
共耗時(shí):11673 毫秒
共耗時(shí):11546 毫秒

由于是交換法的插入排序,時(shí)間耗時(shí)較久

移動(dòng)法實(shí)現(xiàn)希爾排序

由于交換法上面測試速度也看到了,很慢。采用 數(shù)據(jù)結(jié)構(gòu)與算法——排序算法-插入排序 中的移動(dòng)法來對(duì)每組進(jìn)行排序

 /**
     * 移動(dòng)法希爾排序
     */
    @Test
    public void moveShellSortTest() {
        int arr[] = {8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
        System.out.println("原始數(shù)組:" + Arrays.toString(arr));
        moveShellSort(arr);
    }

    /**
     * 插入排序采用移動(dòng)法
     */
    public void moveShellSort(int[] arr) {
        // 第 1 層循環(huán):得到每一次的增量步長
        // 增量并逐步縮小增量
        for (int gap = arr.length / 2; gap > 0; gap /= 2) {
            /**
             這里的內(nèi)層循環(huán),除了是獲得每一組的值(按增量取),
             移動(dòng)法使用的是簡單插入排序的算法 {@link InsertionSortTest#processSelectSort2(int[])}
             唯一不同的是,這里的組前一個(gè)是按增量來計(jì)算的
             */
            // 每一輪,都是針對(duì)某一個(gè)組的插入排序中:待排序的起點(diǎn)
            for (int i = gap; i < arr.length; i++) {
                int currentInsertValue = arr[i]; // 無序列表中的第一個(gè)元素
                int insertIndex = i - gap; // 有序列表中的最后一個(gè)元素
                while (insertIndex >= 0
                        && currentInsertValue < arr[insertIndex]) {
                    // 比較的數(shù)比前一個(gè)數(shù)小,則前一個(gè)往后移動(dòng)
                    arr[insertIndex + gap] = arr[insertIndex];
                    insertIndex -= gap;
                }
                // 對(duì)找到的位置插入值
                arr[insertIndex + gap] = currentInsertValue;
            }
            System.out.println("增量為 " + gap + " 的這一輪排序后:" + Arrays.toString(arr));
        }
    }

測試輸出信息

原始數(shù)組:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
增量為 5 的這一輪排序后:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
增量為 2 的這一輪排序后:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
增量為 1 的這一輪排序后:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

移動(dòng)法-大數(shù)據(jù)量耗時(shí)測試

    /**
     * 移動(dòng)法,大數(shù)據(jù)量測試速度
     */
    @Test
    public void moveBulkDataSort() {
        int max = 80_000;
//        int max = 8;
        int[] arr = new int[max];
        for (int i = 0; i < max; i++) {
            arr[i] = (int) (Math.random() * 80_000);
        }

        Instant startTime = Instant.now();
        moveShellSort(arr);
//        System.out.println(Arrays.toString(arr));
        Instant endTime = Instant.now();
        System.out.println("共耗時(shí):" + Duration.between(startTime, endTime).toMillis() + " 毫秒");
    }

多次測試輸出信息

共耗時(shí):32 毫秒
共耗時(shí):23 毫秒
共耗時(shí):43 毫秒
共耗時(shí):25 毫秒

可以看到,只需要幾十毫秒了

算法分析

希爾排序是基于插入排序的一種算法, 在此算法基礎(chǔ)之上增加了一個(gè)新的特性,提高了效率。希爾排序的時(shí)間的時(shí)間復(fù)雜度為O(

),希爾排序時(shí)間復(fù)雜度的下界是n*log2n。希爾排序沒有快速排序算法快 O(n(logn)),因此中等大小規(guī)模表現(xiàn)良好,對(duì)規(guī)模非常大的數(shù)據(jù)排序不是最優(yōu)選擇。但是比O(

)復(fù)雜度的算法快得多。并且希爾排序非常容易實(shí)現(xiàn),算法代碼短而簡單。 此外,希爾算法在最壞的情況下和平均情況下執(zhí)行效率相差不是很多,與此同時(shí)快速排序在最壞的情況下執(zhí)行的效率會(huì)非常差。專家們提倡,幾乎任何排序工作在開始時(shí)都可以用希爾排序,若在實(shí)際使用中證明它不夠快,再改成快速排序這樣更高級(jí)的排序算法. 本質(zhì)上講,希爾排序算法是直接插入排序算法的一種改進(jìn),減少了其復(fù)制的次數(shù),速度要快很多。 原因是,當(dāng)n值很大時(shí)數(shù)據(jù)項(xiàng)每一趟排序需要移動(dòng)的個(gè)數(shù)很少,但數(shù)據(jù)項(xiàng)的距離很長。當(dāng)n值減小時(shí)每一趟需要移動(dòng)的數(shù)據(jù)增多,此時(shí)已經(jīng)接近于它們排序后的最終位置。 正是這兩種情況的結(jié)合才使希爾排序效率比插入排序高很多。Shell算法的性能與所選取的分組長度序列有很大關(guān)系。只對(duì)特定的待排序記錄序列,可以準(zhǔn)確地估算關(guān)鍵詞的比較次數(shù)和對(duì)象移動(dòng)次數(shù)。想要弄清關(guān)鍵詞比較次數(shù)和記錄移動(dòng)次數(shù)與增量選擇之間的關(guān)系,并給出完整的數(shù)學(xué)分析,今仍然是數(shù)學(xué)難題。

以上就是java 排序算法之希爾算法的詳細(xì)內(nèi)容,更多關(guān)于java 希爾算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)前綴樹詳解

    Java實(shí)現(xiàn)前綴樹詳解

    Java實(shí)現(xiàn)前綴樹(Trie樹)是一種樹形數(shù)據(jù)結(jié)構(gòu),用于字符串的存儲(chǔ)和查找,適用于大量字符串的快速匹配。通過將字符串拆分為字符序列,依次構(gòu)建樹形結(jié)構(gòu),將每個(gè)字符串的字符依次存儲(chǔ)在樹的節(jié)點(diǎn)上,實(shí)現(xiàn)高效的字符串匹配
    2023-04-04
  • java 實(shí)現(xiàn)圖片合成,并添加文字

    java 實(shí)現(xiàn)圖片合成,并添加文字

    這篇文章主要介紹了java 實(shí)現(xiàn)圖片合成,并添加文字的示例,幫助大家更好的利用Java處理圖片,感興趣的朋友可以了解下
    2020-12-12
  • Java連接MongoDB進(jìn)行增刪改查的操作

    Java連接MongoDB進(jìn)行增刪改查的操作

    這篇文章主要介紹了Java連接MongoDB進(jìn)行增刪改查的操作的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • maven項(xiàng)目中<scope>provided</scope>的作用及說明

    maven項(xiàng)目中<scope>provided</scope>的作用及說明

    這篇文章主要介紹了maven項(xiàng)目中<scope>provided</scope>的作用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java通過值查找對(duì)應(yīng)的枚舉的實(shí)現(xiàn)

    Java通過值查找對(duì)應(yīng)的枚舉的實(shí)現(xiàn)

    本文主要介紹了Java通過值查找對(duì)應(yīng)的枚舉的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總(親測有效)

    IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總(親測有效)

    在IDEA中的pom文件中添加了依賴,并且正確加載了相應(yīng)依賴,pom文件沒有報(bào)紅,看起來像是把所有依賴庫全部加載進(jìn)來了,但是代碼中使用依賴的類庫使報(bào)紅,本文給大家介紹了IDEA中Maven報(bào)錯(cuò)Cannot resolve xxx的解決方法匯總,需要的朋友可以參考下
    2024-06-06
  • Java如何實(shí)現(xiàn)長圖文生成的示例代碼

    Java如何實(shí)現(xiàn)長圖文生成的示例代碼

    這篇文章主要介紹了Java如何實(shí)現(xiàn)長圖文生成的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • SimpleDateFormat格式化日期問題

    SimpleDateFormat格式化日期問題

    這篇文章主要介紹了SimpleDateFormat格式化日期問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Spring?Cloud?Gateway遠(yuǎn)程命令執(zhí)行漏洞分析(CVE-2022-22947)

    Spring?Cloud?Gateway遠(yuǎn)程命令執(zhí)行漏洞分析(CVE-2022-22947)

    使用Spring Cloud Gateway的應(yīng)用程序在Actuator端點(diǎn)啟用、公開和不安全的情況下容易受到代碼注入的攻擊,攻擊者可以惡意創(chuàng)建允許在遠(yuǎn)程主機(jī)上執(zhí)行任意遠(yuǎn)程執(zhí)行的請(qǐng)求,這篇文章主要介紹了Spring?Cloud?Gateway遠(yuǎn)程命令執(zhí)行漏洞(CVE-2022-22947),需要的朋友可以參考下
    2023-03-03
  • Java中使用Hutool的DsFactory操作多數(shù)據(jù)源的實(shí)現(xiàn)

    Java中使用Hutool的DsFactory操作多數(shù)據(jù)源的實(shí)現(xiàn)

    在Java開發(fā)中,管理多個(gè)數(shù)據(jù)源是一項(xiàng)常見需求,Hutool作為一個(gè)全能的Java工具類庫,提供了DsFactory工具,幫助開發(fā)者便捷地操作多數(shù)據(jù)源,感興趣的可以了解一下
    2024-09-09

最新評(píng)論