最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java動態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的

 更新時間:2021年06月08日 09:42:36   作者:Duktig丶  
今天帶大家學(xué)習(xí)java隊(duì)列的相關(guān)知識,文章圍繞著如何實(shí)現(xiàn)Java動態(tài)循環(huán)隊(duì)列展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、隊(duì)列

1.1 定義

隊(duì)列 (Queue) 是一種限定性的有序線性表,它只允許在表的一端插入元素,而在另一端刪除元素,所以隊(duì)列具有先進(jìn)先出 (Fist In Fist Out,縮寫為FIFO)的特性。

  • 在隊(duì)列中,允許插入的一端叫做隊(duì)尾(rear);
  • 允許刪除的一端則稱為隊(duì)頭(front)。
  • 隊(duì)列是一個有序列表,可以用數(shù)組或是鏈表來實(shí)現(xiàn)。
  • 遵循先進(jìn)先出的原則。即:先存入隊(duì)列的數(shù)據(jù),要先取出。

1.2 抽象數(shù)據(jù)類型

數(shù)據(jù)元素:可以是任意類型的數(shù)據(jù),但必須屬于同一個數(shù)據(jù)對象。

關(guān)系:隊(duì)列中數(shù)據(jù)元素之間是線性關(guān)系。

基本操作:

1.初始化操作。使用構(gòu)造方法設(shè)置一個空隊(duì)列。

2.isEmpty():判空操作。若隊(duì)列為空,則返回TRUE,否則返回FALSE。

3.isFull():判滿操作。若隊(duì)列為滿,則返回TRUE,否則返回FALSE。

4.getSize():獲取隊(duì)列元素個數(shù)。

5.add(E e):進(jìn)隊(duì)操作。在隊(duì)列Q的隊(duì)尾插入e。如果隊(duì)滿,拋出異常。

6.poll():出隊(duì)操作。使隊(duì)列Q的隊(duì)頭元素出隊(duì),并用e返回其值。如果隊(duì)空,拋出異常。

7.getHead ():取隊(duì)頭元素操作。用e取得隊(duì)頭元素的值。如果隊(duì)列為空,則返回null。

8.clear():隊(duì)列置空操作。將隊(duì)列Q置為空隊(duì)列。

9.destroy():隊(duì)列銷毀操作。釋放隊(duì)列的空間。

1.3 順序存儲

隊(duì)列的一種順序存儲稱為順序隊(duì)列。與順序棧類似,在隊(duì)列的順序存儲結(jié)構(gòu)中,用一組地址連續(xù)的存儲單元依次存放從隊(duì)頭到隊(duì)尾的元素,如一維數(shù)組Queue[maxSize]。

二、數(shù)組隊(duì)列

由于隊(duì)列中隊(duì)頭和隊(duì)尾的位置都是動態(tài)變化的,因此需要附設(shè)兩個指針 front和 rear。

  • front:指示隊(duì)頭元素在數(shù)組中的位置;
  • rear:指示真實(shí)隊(duì)尾元素相鄰的下一個位置。

2.1 思路分析

  • 初始化隊(duì)列時,令front = rear = 0
  • 判斷隊(duì)空的條件:front == rear。
  • 判斷隊(duì)滿的條件:rear == maxSize。
  • 入隊(duì)時,若尾指針rear 小于隊(duì)列的最大下標(biāo) maxSize,則將數(shù)據(jù)存入rear所指的數(shù)組元素中,否則無法存入數(shù)據(jù);然后將尾指針往后移: rear + 1。
  • 出隊(duì)時,若隊(duì)列不為空,取出隊(duì)頭指針front所指的元素;然后將尾指針往后移: front + 1。

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

定義接口方法:

/**
 * description:自定義隊(duì)列接口
 *
 * @author RenShiWei
 * Date: 2021/5/29 20:45
 **/
public interface Queue<E> {

    /**
     * @return 是否隊(duì)空
     */
    boolean isEmpty();

    /**
     * @return 是否隊(duì)滿
     */
    boolean isFull();

    /**
     * @return 隊(duì)列的可承載元素個數(shù)
     */
    int getCapacity();

    /**
     * @return 隊(duì)列元素個數(shù)
     */
    int getSize();

    /**
     * 隊(duì)尾入隊(duì)
     *
     * @param e 入隊(duì)元素
     */
    void add(E e);

    /**
     * 隊(duì)首出隊(duì)
     *
     * @return 出隊(duì)元素
     */
    E poll();

    /**
     * 獲取隊(duì)首元素
     *
     * @return 隊(duì)首元素
     */
    E getHead();

}

2.3 數(shù)組隊(duì)列實(shí)現(xiàn)

/**
 * description:數(shù)組隊(duì)列
 *
 * @author RenShiWei
 * Date: 2021/5/29 20:41
 **/
public class ArrayQueue<E> implements Queue<E> {

    /** 表示可存儲元素的最大容量 */
    private int maxSize;
    /** 隊(duì)列頭 */
    private int front;
    /** 隊(duì)列尾 */
    private int rear;
    /** 該數(shù)據(jù)用于存放數(shù)據(jù),模擬隊(duì)列 */
    private E[] data;

    /**
     * 初始化隊(duì)列
     *
     * @param arrMaxSize 初始隊(duì)列最大容量
     */
    @SuppressWarnings("unchecked")
    public ArrayQueue(int arrMaxSize) {
        maxSize = arrMaxSize;
        data = (E[]) new Object[maxSize];
        front = 0;
        rear = 0;
    }

    /**
     * @return 是否隊(duì)空
     */
    @Override
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * @return 是否隊(duì)滿
     */
    @Override
    public boolean isFull() {
        return rear == maxSize;
    }

    /**
     * @return 隊(duì)列元素個數(shù)
     */
    @Override
    public int getSize() {
        return rear - front;
    }

    /**
     * 隊(duì)尾入隊(duì)
     *
     * @param e 入隊(duì)元素
     */
    @Override
    public void add(E e) {
        if (isFull()) {
            throw new IllegalArgumentException("隊(duì)列已滿,不能入隊(duì)!");
        }
        data[rear++] = e;
    }

    /**
     * 隊(duì)首出隊(duì)
     *
     * @return 出隊(duì)元素
     */
    @Override
    public E poll() {
        if (isEmpty()) {
            throw new IllegalArgumentException("隊(duì)列為空,不能出隊(duì)!");
        }
        //出隊(duì)位置置null
        E temp = data[front];
        data[front++] = null;
        return temp;
    }

    /**
     * 獲取隊(duì)首元素
     * 如果隊(duì)空,返回null
     *
     * @return 隊(duì)首元素
     */
    @Override
    public E getHead() {
        return data[front];
    }

    /**
     * @return 隊(duì)列的可承載元素個數(shù)
     */
    @Override
    public int getCapacity() {
        return data.length - 1;
    }

    /**
     * @return 隊(duì)列的有效容量(未使用的空間數(shù)量)
     */
    public int getEmptyCount() {
        return maxSize - rear;
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Queue: ");
        res.append("front [");
        for (int i = front; i < rear; i++) {
            res.append(data[i]);
            if (i != rear - 1) {
                res.append(", ");
            }
        }
        res.append("] rear");
        return res.toString();
    }

    /**
     * 隊(duì)列測試
     */
    public static void main(String[] args) {
        ArrayQueue<Integer> queue = new ArrayQueue<>(5);
        Scanner sc = new Scanner(System.in);
        char c;
        boolean loop = true;
        while (loop) {
            System.out.println("s(toString):輸出隊(duì)列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加數(shù)據(jù)到隊(duì)列");
            System.out.println("p(poll):從隊(duì)列取出數(shù)據(jù)");
            System.out.println("h(getHead):查看隊(duì)列頭的數(shù)據(jù)");
            System.out.println("n(isEmpty):是否隊(duì)空");
            System.out.println("f(isFull):是否隊(duì)滿");
            c = sc.next().charAt(0);
            switch (c) {
                case 's':
                    System.out.println("當(dāng)前隊(duì)列:" + queue.toString() + "\t元素個數(shù):" + queue.getSize() + "\t有效容量:" + queue.getEmptyCount());
                    break;
                case 'e':
                    sc.close();
                    loop = false;
                    break;
                case 'a':
                    System.out.println("請輸入一個整數(shù)");
                    queue.add(sc.nextInt());
                    break;
                case 'p':
                    System.out.printf("出隊(duì)元素:%d\n", queue.poll());
                    break;
                case 'h':
                    System.out.printf("隊(duì)首元素:%d\n", queue.getHead());
                    break;
                case 'n':
                    System.out.println("隊(duì)空:" + queue.isEmpty());
                    break;
                case 'f':
                    System.out.println("隊(duì)滿:" + queue.isFull());
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }

}

2.4 分析

假溢出現(xiàn)象

在非空順序隊(duì)列中,隊(duì)頭指針始終指向當(dāng)前的隊(duì)頭元素,而隊(duì)尾指針始終指向真正隊(duì)尾元素。當(dāng)rear == maxSize - 1 時,認(rèn)為隊(duì)滿。但此時不一定是真的隊(duì)滿,因?yàn)殡S著部分元素的出隊(duì),數(shù)組前面會出現(xiàn)一些空單元,如下圖所示。由于只能在隊(duì)尾入隊(duì),使得上述空單元無法使用。把這種現(xiàn)象稱為假溢出。

image-20210529183259424

問題:目前這個數(shù)組使用一次就不能用(出隊(duì)的空間),沒有達(dá)到復(fù)用的效果。可使用算法將其改造成環(huán)形隊(duì)列(取模:%)。

三、環(huán)形隊(duì)列

為了解決假溢出現(xiàn)象并使得隊(duì)列空間得到充分利用,一個較巧妙的辦法是將順序隊(duì)列的數(shù)組看成一個環(huán)狀的空間,即規(guī)定最后一個單元的后繼為第一個單元,我們形象地稱之為循環(huán)隊(duì)列。

3.1 思路分析

  • 初始化隊(duì)列時,令front = rear = 0。front指向隊(duì)列的第一個元素,rear指向隊(duì)列最后一個元素的后一個位置(希望損失一個位置作為約定,用來區(qū)分隊(duì)空和隊(duì)滿)。
  • 判斷隊(duì)空的條件:front == rear。
  • 判斷隊(duì)滿的條件:(rear + 1) % maxSize == front
  • 隊(duì)列中的元素個數(shù):(rear + maxSize - front) % maxSize。
  • 入隊(duì)時,將數(shù)據(jù)存入rear所指的數(shù)組元素中,指針變化:rear = ( rear+1) % maxSize。
  • 出隊(duì)時,將數(shù)據(jù)存入front所指的數(shù)組元素中,指針變化:front = ( front+1 ) % maxSize。

下圖給出了循環(huán)隊(duì)列的幾種情況:

image-20210530163134963 

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

/**
 * description:循環(huán)隊(duì)列
 *
 * @author RenShiWei
 * Date: 2021/5/30 16:38
 **/
public class LoopQueue<E> implements Queue<E> {

    /** 存儲元素 數(shù)組的長度(有效長度需要-1) */
    private int maxSize;
    /** 隊(duì)列頭 */
    private int front;
    /** 隊(duì)列尾 */
    private int rear;
    /** 該數(shù)據(jù)用于存放數(shù)據(jù),模擬隊(duì)列 */
    private E[] data;

    /**
     * 初始化環(huán)形隊(duì)列
     *
     * @param arrMaxSize 初始隊(duì)列容量
     */
    @SuppressWarnings("unchecked")
    public LoopQueue(int arrMaxSize) {
        //循環(huán)隊(duì)列需要有意識浪費(fèi)一個空間
        maxSize = arrMaxSize + 1;
        data = (E[]) new Object[maxSize];
    }

    /**
     * @return 是否隊(duì)空
     */
    @Override
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * @return 是否隊(duì)滿
     */
    @Override
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    /**
     * @return 隊(duì)列的可承載元素個數(shù)
     */
    @Override
    public int getCapacity() {
        return data.length - 1;
    }

    /**
     * @return 隊(duì)列元素個數(shù)
     */
    @Override
    public int getSize() {
        return (rear + maxSize - front) % maxSize;
    }

    /**
     * 隊(duì)尾入隊(duì)
     *
     * @param e 入隊(duì)元素
     */
    @Override
    public void add(E e) {
        if (isFull()) {
            throw new IllegalArgumentException("隊(duì)列已滿,不能入隊(duì)!");
        }
        data[rear] = e;
        //rear指針后移一位
        rear = (rear + 1) % maxSize;
    }

    /**
     * 隊(duì)首出隊(duì)
     *
     * @return 出隊(duì)元素
     */
    @Override
    public E poll() {
        if (isEmpty()) {
            throw new IllegalArgumentException("隊(duì)列為空,不能出隊(duì)!");
        }
        E temp = data[front];
        //出隊(duì)位置置null
        data[front] = null;
        //front指針后移一位
        front = (front + 1) % maxSize;
        return temp;
    }

    /**
     * 獲取隊(duì)首元素
     * 如果隊(duì)空,返回null
     *
     * @return 隊(duì)首元素
     */
    @Override
    public E getHead() {
        return data[front];
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Queue: size = %d , capacity = %d\n", getSize(), getCapacity()));
        res.append("front [");
        for (int i = front; i != rear; i = (i + 1) % data.length) {
            res.append(data[i]);
            if ((i + 1) % data.length != rear) {
                res.append(", ");
            }
        }
        res.append("] tail");
        return res.toString();
    }

    /**
     * 隊(duì)列測試
     */
    public static void main(String[] args) {
        LoopQueue<Integer> queue = new LoopQueue<>(5);
        Scanner sc = new Scanner(System.in);
        char c;
        boolean loop = true;
        while (loop) {
            System.out.println("s(toString):輸出隊(duì)列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加數(shù)據(jù)到隊(duì)列");
            System.out.println("p(poll):從隊(duì)列取出數(shù)據(jù)");
            System.out.println("h(getHead):查看隊(duì)列頭的數(shù)據(jù)");
            System.out.println("n(isEmpty):是否隊(duì)空");
            System.out.println("f(isFull):是否隊(duì)滿");
            c = sc.next().charAt(0);
            switch (c) {
                case 's':
                    System.out.println("當(dāng)前隊(duì)列:" + queue.toString());
                    break;
                case 'e':
                    sc.close();
                    loop = false;
                    break;
                case 'a':
                    System.out.println("請輸入一個整數(shù)");
                    queue.add(sc.nextInt());
                    break;
                case 'p':
                    System.out.printf("出隊(duì)元素:%d\n", queue.poll());
                    break;
                case 'h':
                    System.out.printf("隊(duì)首元素:%d\n", queue.getHead());
                    break;
                case 'n':
                    System.out.println("隊(duì)空:" + queue.isEmpty());
                    break;
                case 'f':
                    System.out.println("隊(duì)滿:" + queue.isFull());
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }


}

3.3 分析

相比數(shù)組隊(duì)列來說,循環(huán)隊(duì)列解決了數(shù)組空間不能再次利用的問題。但依然存在一些問題:

  • 當(dāng)隊(duì)列真的滿的時候就不能再進(jìn)行入隊(duì)操作了。但是從我們常用的ArrayList來分析,在存儲空間允許的條件下是可以一直添加元素的。
  • 當(dāng)數(shù)組元素頻繁進(jìn)行入隊(duì)或者出隊(duì)操作時,可能造成空間的浪費(fèi)。循環(huán)隊(duì)列其實(shí)只利用了有限的存儲空間,但是在最初實(shí)例化循環(huán)隊(duì)列的時候,如果空間聲明的很大,那么會造成一定程度上的空間浪費(fèi)。
  • 假設(shè),聲明一個容量為20的循環(huán)隊(duì)列,但每次入隊(duì)2個元素后,又出隊(duì)2個元素,那么實(shí)際只利用了很有限的空間,造成了空間浪費(fèi),但又不能聲明的空間太小,并不能保證未來每次只入隊(duì)或者出隊(duì)2個元素。

因此,是否可以實(shí)現(xiàn)動態(tài)的將循環(huán)隊(duì)列進(jìn)行擴(kuò)容或者縮容,上述兩個問題,可以利用下面的動態(tài)循環(huán)隊(duì)列來實(shí)現(xiàn)。

當(dāng)然,上述的數(shù)組隊(duì)列,也可以改造成動態(tài)的,但是出隊(duì)元素的空間依然會浪費(fèi),所以沒必要進(jìn)行實(shí)現(xiàn)。

四、動態(tài)循環(huán)隊(duì)列

為了解決循環(huán)隊(duì)列,隊(duì)滿不能入隊(duì),以及頻繁入隊(duì)出隊(duì)引起的空間浪費(fèi),而引出動態(tài)循環(huán)隊(duì)列的概念。即在隊(duì)滿時進(jìn)行擴(kuò)容,在隊(duì)列元素個數(shù)下降到一定情況下進(jìn)行縮容。

4.1 思路分析

  • 除了入隊(duì)和出隊(duì)操作,其他操作均與循環(huán)隊(duì)列相同。
  • 循環(huán)隊(duì)列存儲元素的數(shù)組容量變更思路:使用擴(kuò)容一倍/縮容一倍的新數(shù)組接收原來循環(huán)隊(duì)列存儲的元素。接收后,將front指針置為0;將rear指針值到最后一個元素的位置(即存儲有效元素的數(shù)量)。
  • 什么時候擴(kuò)容:隊(duì)滿
  • 什么時候縮容:隊(duì)列元素只有1/4,并且縮容后容量不為0。
  • 數(shù)組容量為0時,縮容會出現(xiàn)異常
  • 為什么不在隊(duì)列元素只有1/2時縮容?當(dāng)數(shù)組元素為一半的時候一次添加,一次刪除,造成的一直擴(kuò)容和減小的操作。

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

/**
 * description:動態(tài)循環(huán)
 *
 * @author RenShiWei
 * Date: 2021/5/30 17:06
 **/
public class DynamicLoopQueue<E> implements Queue<E> {

    /** 存儲元素 數(shù)組的長度(有效長度需要-1) */
    private int maxSize;
    /** 隊(duì)列頭 */
    private int front;
    /** 隊(duì)列尾 */
    private int rear;
    /** 該數(shù)據(jù)用于存放數(shù)據(jù),模擬隊(duì)列 */
    private E[] data;

    /**
     * 初始化環(huán)形隊(duì)列
     *
     * @param arrMaxSize 初始隊(duì)列容量
     */
    @SuppressWarnings("unchecked")
    public DynamicLoopQueue(int arrMaxSize) {
        //循環(huán)隊(duì)列需要有意識浪費(fèi)一個空間
        maxSize = arrMaxSize + 1;
        data = (E[]) new Object[maxSize];
    }

    /**
     * @return 是否隊(duì)空
     */
    @Override
    public boolean isEmpty() {
        return front == rear;
    }

    /**
     * @return 是否隊(duì)滿
     */
    @Override
    public boolean isFull() {
        return (rear + 1) % maxSize == front;
    }

    /**
     * @return 隊(duì)列的可承載元素個數(shù)
     */
    @Override
    public int getCapacity() {
        return data.length - 1;
    }

    /**
     * @return 隊(duì)列元素個數(shù)
     */
    @Override
    public int getSize() {
        return (rear + maxSize - front) % maxSize;
    }

    /**
     * 隊(duì)尾入隊(duì)
     *
     * @param e 入隊(duì)元素
     */
    @Override
    public void add(E e) {
        if (isFull()) {
            //隊(duì)滿不再進(jìn)行報錯,而是進(jìn)行動態(tài)擴(kuò)容
            resize(getCapacity() * 2);
        }
        data[rear] = e;
        //rear指針后移一位
        rear = (rear + 1) % maxSize;
    }

    /**
     * 隊(duì)首出隊(duì)
     *
     * @return 出隊(duì)元素
     */
    @Override
    public E poll() {
        if (isEmpty()) {
            throw new IllegalArgumentException("隊(duì)列為空,不能出隊(duì)!");
        }
        E temp = data[front];
        //出隊(duì)位置置null
        data[front] = null;
        //front指針后移一位
        front = (front + 1) % maxSize;

        //當(dāng)數(shù)組實(shí)際元素減小到空間的一半的時候,對其進(jìn)行縮小
        //if(size == data.length / 2)
        /*
            解決當(dāng)一半的時候一次添加,一次刪除,造成的一直擴(kuò)容和減小的操作,
            增加必須要擴(kuò)容,所以可以讓縮容變得更懶時在進(jìn)行,即1/4時
            data.length / 2 != 0防止數(shù)組大小最后變成0,造成異常
        */
        if (getSize() == getCapacity() / 4 && getCapacity() / 2 != 0) {
            resize(getCapacity() / 2);
        }
        return temp;
    }

    /**
     * 獲取隊(duì)首元素
     * 如果隊(duì)空,返回null
     *
     * @return 隊(duì)首元素
     */
    @Override
    public E getHead() {
        return data[front];
    }

    /**
     * 擴(kuò)容方法
     *
     * @param newCapacity 擴(kuò)容后的隊(duì)列大小
     */
    @SuppressWarnings("unchecked")
    private void resize(int newCapacity) {
        E[] newData = (E[]) new Object[newCapacity + 1];
        //有多個元素循環(huán)多少次
        for (int i = 0; i < getSize(); i++) {
            //循環(huán)隊(duì)列會發(fā)生偏移,重新賦值給新數(shù)組
            newData[i] = data[(i + front) % data.length];
        }
        data = newData;
        maxSize = data.length;
        //重置指針
        front = 0;
        rear = getSize();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Queue: size = %d , capacity = %d\n", getSize(), getCapacity()));
        res.append("front [");
        for (int i = front; i != rear; i = (i + 1) % data.length) {
            res.append(data[i]);
            if ((i + 1) % data.length != rear) {
                res.append(", ");
            }
        }
        res.append("] tail");
        return res.toString();
    }

    /**
     * 隊(duì)列測試
     */
    public static void main(String[] args) {
        DynamicLoopQueue<Integer> queue = new DynamicLoopQueue<>(3);
        Scanner sc = new Scanner(System.in);
        char c;
        boolean loop = true;
        while (loop) {
            System.out.println("s(toString):輸出隊(duì)列");
            System.out.println("e(exit):退出程序");
            System.out.println("a(add):添加數(shù)據(jù)到隊(duì)列");
            System.out.println("p(poll):從隊(duì)列取出數(shù)據(jù)");
            System.out.println("h(getHead):查看隊(duì)列頭的數(shù)據(jù)");
            System.out.println("n(isEmpty):是否隊(duì)空");
            System.out.println("f(isFull):是否隊(duì)滿");
            c = sc.next().charAt(0);
            switch (c) {
                case 's':
                    System.out.println("當(dāng)前隊(duì)列:" + queue.toString());
                    break;
                case 'e':
                    sc.close();
                    loop = false;
                    break;
                case 'a':
                    System.out.println("請輸入一個整數(shù)");
                    queue.add(sc.nextInt());
                    break;
                case 'p':
                    System.out.printf("出隊(duì)元素:%d\n", queue.poll());
                    break;
                case 'h':
                    System.out.printf("隊(duì)首元素:%d\n", queue.getHead());
                    break;
                case 'n':
                    System.out.println("隊(duì)空:" + queue.isEmpty());
                    break;
                case 'f':
                    System.out.println("隊(duì)滿:" + queue.isFull());
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }

}

到此這篇關(guān)于Java動態(tài)循環(huán)隊(duì)列是如何實(shí)現(xiàn)的的文章就介紹到這了,更多相關(guān)Java動態(tài)循環(huán)隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(2)

    java書店系統(tǒng)畢業(yè)設(shè)計(jì) 用戶模塊(2)

    這篇文章主要介紹了java書店系統(tǒng)畢業(yè)設(shè)計(jì),第二步系統(tǒng)總體設(shè)計(jì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java發(fā)起http請求的完整步驟記錄

    Java發(fā)起http請求的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于Java發(fā)起http請求的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類

    詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類

    這篇文章主要介紹了JAVA中的Collection接口和其主要實(shí)現(xiàn)的類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java?導(dǎo)出?CSV?文件操作詳情

    Java?導(dǎo)出?CSV?文件操作詳情

    這篇文章主要介紹了Java導(dǎo)出CSV文件操作詳情,文章通過導(dǎo)入坐標(biāo)展開詳細(xì)內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java Calendar類使用案例詳解

    Java Calendar類使用案例詳解

    這篇文章主要介紹了Java Calendar類使用案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • spring?webClient配置及使用簡單代碼示例

    spring?webClient配置及使用簡單代碼示例

    WebClient是Spring框架5.0引入的基于響應(yīng)式編程模型的HTTP客戶端,它提供一種簡便的方式來處理HTTP請求和響應(yīng),支持異步和非阻塞式的請求和響應(yīng)處理,下面這篇文章主要給大家介紹了關(guān)于spring?webClient配置及使用的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • springboot實(shí)現(xiàn)SSE(Server?Sent?Event)的示例代碼

    springboot實(shí)現(xiàn)SSE(Server?Sent?Event)的示例代碼

    SSE?全稱Server?Sent?Event,直譯一下就是服務(wù)器發(fā)送事件,本文主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)SSE的相關(guān)知識,需要的可以參考一下
    2024-04-04
  • Java數(shù)組實(shí)例練習(xí)題整理

    Java數(shù)組實(shí)例練習(xí)題整理

    在本篇文章中小編給各位分享的是關(guān)于Java數(shù)組實(shí)例練習(xí)題以及相關(guān)代碼整理,有需要的朋友們跟著學(xué)習(xí)下。
    2019-07-07
  • 詳解SpringBoot結(jié)合策略模式實(shí)戰(zhàn)套路

    詳解SpringBoot結(jié)合策略模式實(shí)戰(zhàn)套路

    這篇文章主要介紹了詳解SpringBoot結(jié)合策略模式實(shí)戰(zhàn)套路,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 一文詳解SpringBoot如何優(yōu)雅地實(shí)現(xiàn)異步調(diào)用

    一文詳解SpringBoot如何優(yōu)雅地實(shí)現(xiàn)異步調(diào)用

    SpringBoot想必大家都用過,但是大家平時使用發(fā)布的接口大都是同步的,那么你知道如何優(yōu)雅的實(shí)現(xiàn)異步呢?這篇文章就來和大家詳細(xì)聊聊
    2023-03-03

最新評論

塘沽区| 左贡县| 方城县| 呼伦贝尔市| 南汇区| 安平县| 榕江县| 福州市| 荣昌县| 吉木萨尔县| 阿拉善盟| 新营市| 广昌县| 庆元县| 红原县| 伊吾县| 武胜县| 普定县| 德庆县| 横峰县| 芮城县| 固原市| 合江县| 南川市| 图们市| 额尔古纳市| 涞水县| 沙湾县| 遂川县| 孙吴县| 潼南县| 承德市| 台前县| 泽库县| 天长市| 白朗县| 平湖市| 巴中市| 任丘市| 奉贤区| 眉山市|