欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入分析JAVA Vector和Stack的具體用法

 更新時(shí)間:2017年12月18日 11:59:48   作者:pony1223  
這篇文章主要介紹了深入分析JAVA Vector和Stack的具體用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前面我們已經(jīng)接觸過(guò)幾種數(shù)據(jù)結(jié)構(gòu)了,有數(shù)組、鏈表、Hash表、紅黑樹(shù)(二叉查詢樹(shù)),今天再來(lái)看另外一種數(shù)據(jù)結(jié)構(gòu):棧。

什么是棧呢,我們先看一個(gè)例子:棧就相當(dāng)于一個(gè)很窄的木桶,我們往木桶里放東西,往外拿東西時(shí)會(huì)發(fā)現(xiàn),我們最開(kāi)始放的東西在最底部,最先拿出來(lái)的是剛剛放進(jìn)去的。所以,棧就是這么一種先進(jìn)后出(FirstInLastOut,或者叫后進(jìn)先出)的容器,它只有一個(gè)口,在這個(gè)口放入元素,也在這個(gè)口取出元素。那么我們接下來(lái)學(xué)習(xí)JDK中的棧。

一、Vector&Stack的基本介紹和使用

我們先看下JDK種的定義:

public class Stack<E> extends Vector<E> {

從上面可以看到Stack 是繼承自于Vector的,因此我們要對(duì)Vector 也要有一定的認(rèn)識(shí)。

Vector:線程安全的動(dòng)態(tài)數(shù)組

Stack:繼承Vector,基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的一個(gè)線程安全的棧;

1.Vector 和 Stack的特點(diǎn):

Vector與ArrayList基本是一致的,不同的是Vector是線程安全的,會(huì)在可能出現(xiàn)線程安全的方法前面加上synchronized關(guān)鍵字;

Vector:隨機(jī)訪問(wèn)速度快,插入和移除性能較差(數(shù)組的特點(diǎn));支持null元素;有順序;元素可以重復(fù);線程安全;

Stack:后進(jìn)先出,實(shí)現(xiàn)了一些?;静僮鞯姆椒ǎㄆ鋵?shí)并不是只能后進(jìn)先出,因?yàn)槔^承自Vector,可以有很多操作,從某種意義上來(lái)講,不是一個(gè)棧);

2.Vector 和 Stack 結(jié)構(gòu):

Vector類

與ArrayList基本一致,剩下的主要不同點(diǎn)如下:

1、Vector是線程安全的

2、ArrayList增長(zhǎng)量和Vector的增長(zhǎng)量不一致

其它,如構(gòu)造方法不一致,Vector可以通過(guò)構(gòu)造方法初始化capacityIncrement,另外還有其它一些方法,如indexOf方法,Vector支持從指定位置開(kāi)始搜索查找;另外,Vector還有一些功能重復(fù)的冗余方法,如addElement,setElementAt方法,之所以這樣,是由于歷史原因,像addElement方法是以前遺留的,當(dāng)集合框架引進(jìn)的時(shí)候,Vector加入集合大家族,改成實(shí)現(xiàn)List接口,需要實(shí)現(xiàn)List接口中定義的一些方法,但是出于兼容考慮,又不能刪除老的方法,所以出現(xiàn)了一些功能冗余的舊方法;現(xiàn)在已經(jīng)被ArrayList取代,基本很少使用,了解即可。

Stack類

實(shí)現(xiàn)了棧的基本操作。方法如下:

public Stack();

創(chuàng)建空棧

public synchronized E peek();

返回棧頂?shù)闹担?/p>

public E push(E item);

入棧操作;

public synchronized E pop();

出棧操作;

public boolean empty();

判斷棧是否為空;

public synchronized int search(Object o);

返回對(duì)象在棧中的位置;

對(duì)于上述的棧而言,我們基本只會(huì)經(jīng)常用到上面的方法,雖然它繼承了Vector,有很多方法,但基本不會(huì)使用,而只是當(dāng)做一個(gè)棧來(lái)看待。

3.基本使用

Vector中的部分方法使用如下,另外Vector的遍歷方式跟ArrayList一致,可以用foreach,迭代器,for循環(huán)遍歷;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
public class Test {
  public static void main(String[] args) {
    Vector<Integer> vector = new Vector<Integer>();
    for(int i = 0; i < 10; i++){
      vector.add(i);
    }
     //直接打印
    System.out.println(vector.toString());    
    //size()
    System.out.println(vector.size());    
    //contains
    System.out.println(vector.contains(2));    
    //iterator
    Iterator<Integer> iterator = vector.iterator();
    while(iterator.hasNext()){
      System.out.print(iterator.next() + " ");
    }    
    //toArray
    Object[] objArr = vector.toArray();
    System.out.println("\nobjArr:" + Arrays.asList(objArr));
    Integer[] intArr = vector.toArray(new Integer[vector.size()]);
    System.out.println("intArr:" + Arrays.asList(intArr));    
    //add
    vector.add(5);    
    //remove
    vector.remove(5);    
    System.out.println(vector);    
    //containsAll
    System.out.println(vector.containsAll(Arrays.asList(5,6)));    
    //addAll
    vector.addAll(Arrays.asList(555,666));
    System.out.println(vector);
     //removeAll
    vector.removeAll(Arrays.asList(555,666));
    System.out.println(vector);    
    //addAll方法
    vector.addAll(5, Arrays.asList(666,666, 6));
    System.out.println(vector);    
    //get方法
    System.out.println(vector.get(5));    
    //set方法
    vector.set(5, 55);
    System.out.println(vector.get(5));    
    //add方法
    vector.add(0, 555);
    System.out.println(vector);    
    //remove方法
    vector.remove(0);
    System.out.println(vector);    
    //indexof方法
    System.out.println(vector.indexOf(6));    
    //lastIndexOf方法
    System.out.println(vector.lastIndexOf(6));    
    //listIterator方法
    ListIterator<Integer> listIterator = vector.listIterator();
    System.out.println(listIterator.hasPrevious());    
    //listIterator(index)方法
    ListIterator<Integer> iListIterator = vector.listIterator(5);
    System.out.println(iListIterator.previous());    
    //subList方法
    System.out.println(vector.subList(5, 7));    
    //clear
    vector.clear();
    System.out.println(vector);
    
  }
}

Stack中的部分方法使用如下,因?yàn)镾tack繼承Vector,所以Vector可以用的方法,Stack同樣可以使用,以下列出一些Stack獨(dú)有的方法的例子,很簡(jiǎn)單,就是棧的一些基本操作,另外stack除了Vector的幾種遍歷方式外,還有自己獨(dú)有的遍歷元素的方式(利用empty方法和pop方法實(shí)現(xiàn)棧頂?shù)綏5椎谋闅v):

import java.util.Stack;
public class Test {
  public static void main(String[] args) {
    Stack<Integer> stack = new Stack<Integer>();
    for(int i = 0; i < 10; i++){
      stack.add(i);
    }    
    System.out.println(stack);    
    System.out.println(stack.peek());    
    stack.push(555);    
    System.out.println(stack);    
    System.out.println(stack.pop());    
    System.out.println(stack);    
    System.out.println(stack.empty());    
    System.out.println(stack.search(6));    
    System.out.println("stack遍歷:");
    while(!stack.empty()){
      System.out.print(stack.pop() + " ");
    }
  }
}

小節(jié):

Vector是線程安全的,但是性能較差,一般情況下使用ArrayList,除非特殊需求;

如果打算用Stack作為棧來(lái)使用的話,就老老實(shí)實(shí)嚴(yán)格按照棧的幾種操作來(lái)使用,否則就是去了使用stack的意義,還不如用Vector;

二、Vector&Stacke的結(jié)構(gòu)和底層存儲(chǔ)

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Vector是List的一個(gè)實(shí)現(xiàn)類,其實(shí)Vector也是一個(gè)基于數(shù)組實(shí)現(xiàn)的List容器,其功能及實(shí)現(xiàn)代碼和ArrayList基本上是一樣的。那么不一樣的是什么地方的,一個(gè)是數(shù)組擴(kuò)容的時(shí)候,Vector是*2,ArrayList是*1.5+1;另一個(gè)就是Vector是線程安全的,而ArrayList不是,而Vector線程安全的做法是在每個(gè)方法上面加了一個(gè)synchronized關(guān)鍵字來(lái)保證的。但是這里說(shuō)一句,Vector已經(jīng)不官方的(大家公認(rèn)的)不被推薦使用了,正式因?yàn)槠鋵?shí)現(xiàn)線程安全方式是鎖定整個(gè)方法,導(dǎo)致的是效率不高,那么有沒(méi)有更好的提到方案呢,其實(shí)也不能說(shuō)有,但是還真就有那么一個(gè),Collections.synchronizedList()

由于Stack是繼承和基于Vector,那么簡(jiǎn)單看一下Vector的一些定義和方法源碼:

// 底層使用數(shù)組存儲(chǔ)數(shù)據(jù)
  protected Object[] elementData;
  // 元素個(gè)數(shù)
  protected int elementCount ;
  // 自定義容器擴(kuò)容遞增大小
  protected int capacityIncrement ;
 
  public Vector( int initialCapacity, int capacityIncrement) {
    super();
    // 越界檢查
    if (initialCapacity < 0)
      throw new IllegalArgumentException( "Illegal Capacity: " +
                        initialCapacity);
    // 初始化數(shù)組
    this.elementData = new Object[initialCapacity];
    this.capacityIncrement = capacityIncrement;
  }
 
  // 使用synchronized關(guān)鍵字鎖定方法,保證同一時(shí)間內(nèi)只有一個(gè)線程可以操縱該方法
  public synchronized boolean add(E e) {
    modCount++;
    // 擴(kuò)容檢查
    ensureCapacityHelper( elementCount + 1);
    elementData[elementCount ++] = e;
    return true;
  }
 
  private void ensureCapacityHelper(int minCapacity) {
    // 當(dāng)前元素?cái)?shù)量
    int oldCapacity = elementData .length;
    // 是否需要擴(kuò)容
    if (minCapacity > oldCapacity) {
      Object[] oldData = elementData;
      // 如果自定義了容器擴(kuò)容遞增大小,則按照capacityIncrement進(jìn)行擴(kuò)容,否則按兩倍進(jìn)行擴(kuò)容(*2)
      int newCapacity = (capacityIncrement > 0) ?
       (oldCapacity + capacityIncrement) : (oldCapacity * 2);
      if (newCapacity < minCapacity) {
       newCapacity = minCapacity;
      }
      // 數(shù)組copy
      elementData = Arrays.copyOf( elementData, newCapacity);
    }
  }

Vector就簡(jiǎn)單看到這里,其他方法Stack如果沒(méi)有調(diào)用的話就不進(jìn)行分析了,不明白的可以去看ArrayList源碼解析。

三、主要方法分析

1.peek()——獲取棧頂?shù)膶?duì)象

/**
   * 獲取棧頂?shù)膶?duì)象,但是不刪除
   */
  public synchronized E peek() {
    // 當(dāng)前容器元素個(gè)數(shù)
    int  len = size();
 
    // 如果沒(méi)有元素,則直接拋出異常
    if (len == 0)
      throw new EmptyStackException();
    // 調(diào)用elementAt方法取出數(shù)組最后一個(gè)元素(最后一個(gè)元素在棧頂)
    return elementAt(len - 1);
  }
 
  /**
   * 根據(jù)index索引取出該位置的元素,這個(gè)方法在Vector中
   */
  public synchronized E elementAt(int index) {
    // 越界檢查
    if (index >= elementCount ) {
      throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
    } 
    // 直接通過(guò)數(shù)組下標(biāo)獲取元素
    return (E)elementData [index];
  }

2.pop()——彈棧(出棧),獲取棧頂?shù)膶?duì)象,并將該對(duì)象從容器中刪除

/**
   * 彈棧,獲取并刪除棧頂?shù)膶?duì)象
   */
  public synchronized E pop() {
    // 記錄棧頂?shù)膶?duì)象
    E   obj;
    // 當(dāng)前容器元素個(gè)數(shù)
    int  len = size();
 
    // 通過(guò)peek()方法獲取棧頂對(duì)象
    obj = peek();
    // 調(diào)用removeElement方法刪除棧頂對(duì)象
    removeElementAt(len - 1);
 
    // 返回棧頂對(duì)象
    return obj;
  }
 
  /**
   * 根據(jù)index索引刪除元素
   */
  public synchronized void removeElementAt(int index) {
    modCount++;
    // 越界檢查
    if (index >= elementCount ) {
      throw new ArrayIndexOutOfBoundsException(index + " >= " +
                       elementCount);
    }
    else if (index < 0) {
      throw new ArrayIndexOutOfBoundsException(index);
    }
    // 計(jì)算數(shù)組元素要移動(dòng)的個(gè)數(shù)
    int j = elementCount - index - 1;
    if (j > 0) {
      // 進(jìn)行數(shù)組移動(dòng),中間刪除了一個(gè),所以將后面的元素往前移動(dòng)(這里直接移動(dòng)將index位置元素覆蓋掉,就相當(dāng)于刪除了)
      System. arraycopy(elementData, index + 1, elementData, index, j);
    }
    // 容器元素個(gè)數(shù)減1
    elementCount--;
    // 將容器最后一個(gè)元素置空(因?yàn)閯h除了一個(gè)元素,然后index后面的元素都向前移動(dòng)了,所以最后一個(gè)就沒(méi)用了 )
    elementData[elementCount ] = null; /* to let gc do its work */
  }

3.push(E item)——壓棧(入棧),將對(duì)象添加進(jìn)容器并返回

/**
   * 將對(duì)象添加進(jìn)容器并返回
   */
  public E push(E item) {
    // 調(diào)用addElement將元素添加進(jìn)容器
    addElement(item);
    // 返回該元素
    return item;
  }
 
  /**
   * 將元素添加進(jìn)容器,這個(gè)方法在Vector中
   */
  public synchronized void addElement(E obj) {
    modCount++;
    // 擴(kuò)容檢查
    ensureCapacityHelper( elementCount + 1);
    // 將對(duì)象放入到數(shù)組中,元素個(gè)數(shù)+1
    elementData[elementCount ++] = obj;
  }

4.search(Object o)——返回對(duì)象在容器中的位置,棧頂為1

/**
   * 返回對(duì)象在容器中的位置,棧頂為1
   */
  public synchronized int search(Object o) {
    // 從數(shù)組中查找元素,從最后一次出現(xiàn)
    int i = lastIndexOf(o);
 
    // 因?yàn)闂m斔?,所以要用size()-i計(jì)算
    if (i >= 0) {
      return size() - i;
    }
    return -1;
  }

5.empty()——容器是否為空

/**
   * 檢查容器是否為空
   */
  public boolean empty() {
    return size() == 0;
  }

小節(jié):

到這里Stack的方法就分析完成了,由于Stack最終還是基于數(shù)組的,理解起來(lái)還是很容易的(因?yàn)橛辛薃rrayList的基礎(chǔ)啦)。

雖然jdk中Stack的源碼分析完了,但是這里有必要討論下,不知道是否發(fā)現(xiàn)這里的Stack很奇怪的現(xiàn)象,

(1)Stack為什么是基于數(shù)組實(shí)現(xiàn)的呢?

我們都知道數(shù)組的特點(diǎn):方便根據(jù)下標(biāo)查詢(隨機(jī)訪問(wèn)),但是內(nèi)存固定,且擴(kuò)容效率較低。很容易想到Stack用鏈表實(shí)現(xiàn)最合適的。

(2)Stack為什么是繼承Vector的?

繼承也就意味著Stack繼承了Vector的方法,這使得Stack有點(diǎn)不倫不類的感覺(jué),既是List又是Stack。如果非要繼承Vector合理的做法應(yīng)該是什么:Stack不繼承Vector,而只是在自身有一個(gè)Vector的引用,聚合對(duì)不對(duì)?

唯一的解釋呢,就是Stack是jdk1.0出來(lái)的,那個(gè)時(shí)候jdk中的容器還沒(méi)有ArrayList、LinkedList等只有Vector,既然已經(jīng)有了Vector且能實(shí)現(xiàn)Stack的功能,那么就干吧。。。既然用鏈表實(shí)現(xiàn)Stack是比較理想的,那么我們就來(lái)嘗試一下吧:

import java.util.LinkedList; 
public class LinkedStack<E> { 
    private LinkedList<E> linked ;
     public LinkedStack() {
        this.linked = new LinkedList<E>();
    } 
    public E push(E item) {
        this.linked .addFirst(item);
        return item;
    } 
    public E pop() {
        if (this.linked.isEmpty()) {
           return null;
       }
        return this.linked.removeFirst();
    } 
    public E peek() {
        if (this.linked.isEmpty()) {
           return null;
       }
        return this.linked.getFirst();
    } 
    public int search(E item) {
        int i = this.linked.indexOf(item);
        return i + 1;
    }
     public boolean empty() {
        return this.linked.isEmpty();
    }
}

這里使用的LinkedList實(shí)現(xiàn)的Stack,記得在LinkedList中說(shuō)過(guò),LinkedList實(shí)現(xiàn)了Deque接口使得它既可以作為棧(先進(jìn)后出),又可以作為隊(duì)列(先進(jìn)先出)。

四、Vector&ArrayList的區(qū)別

List接口一共有三個(gè)實(shí)現(xiàn)類,分別是ArrayList、Vector和LinkedList。List用于存放多個(gè)元素,能夠維護(hù)元素的次序,并且允許元素的重復(fù)。

3個(gè)具體實(shí)現(xiàn)類的相關(guān)區(qū)別如下:

1.ArrayList是最常用的List實(shí)現(xiàn)類,內(nèi)部是通過(guò)數(shù)組實(shí)現(xiàn)的,它允許對(duì)元素進(jìn)行快速隨機(jī)訪問(wèn)。數(shù)組的缺點(diǎn)是每個(gè)元素之間不能有間隔,當(dāng)數(shù)組大小不滿足時(shí)需要增加存儲(chǔ)能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲(chǔ)空間中。當(dāng)從ArrayList的中間位置插入或者刪除元素時(shí),需要對(duì)數(shù)組進(jìn)行復(fù)制、移動(dòng)、代價(jià)比較高。因此,它適合隨機(jī)查找和遍歷,不適合插入和刪除。

2.Vector與ArrayList一樣,也是通過(guò)數(shù)組實(shí)現(xiàn)的,不同的是它支持線程的同步,即某一時(shí)刻只有一個(gè)線程能夠?qū)慥ector,避免多線程同時(shí)寫而引起的不一致性,但實(shí)現(xiàn)同步需要很高的花費(fèi),因此,訪問(wèn)它比訪問(wèn)ArrayList慢。

3.LinkedList是用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)的,很適合數(shù)據(jù)的動(dòng)態(tài)插入和刪除,隨機(jī)訪問(wèn)和遍歷速度比較慢。另外,他還提供了List接口中沒(méi)有定義的方法,專門用于操作表頭和表尾元素,可以當(dāng)作堆棧、隊(duì)列和雙向隊(duì)列使用。

五、隊(duì)列Queue、雙端隊(duì)列Deque簡(jiǎn)單了解

1、Queue

在java5中新增加了java.util.Queue接口,用以支持隊(duì)列的常見(jiàn)操作。該接口擴(kuò)展了java.util.Collection接口。

public interface Queue<E>  
extends Collection<E> 

除了基本的 Collection 操作外,隊(duì)列還提供其他的插入、提取和檢查操作。

每個(gè)方法都存在兩種形式:一種拋出異常(操作失敗時(shí)),另一種返回一個(gè)特殊值(null 或 false,具體取決于操作)。

隊(duì)列通常(但并非一定)以 FIFO(先進(jìn)先出)的方式排序各個(gè)元素。不過(guò)優(yōu)先級(jí)隊(duì)列和 LIFO 隊(duì)列(或堆棧)例外,前者根據(jù)提供的比較器或元素的自然順序?qū)υ剡M(jìn)行排序,后者按 LIFO(后進(jìn)先出)的方式對(duì)元素進(jìn)行排序。

在 FIFO 隊(duì)列中,所有的新元素都插入隊(duì)列的末尾,移除元素從隊(duì)列頭部移除。

Queue使用時(shí)要盡量避免Collection的add()和remove()方法,而是要使用offer()來(lái)加入元素,使用poll()來(lái)獲取并移出元素。它們的優(yōu)點(diǎn)是通過(guò)返回值可以判斷成功與否,add()和remove()方法在失敗的時(shí)候會(huì)拋出異常。如果要使用前端而不移出該元素,使用element()或者peek()方法。

offer 方法可插入一個(gè)元素,否則返回 false。這與 Collection.add 方法不同,該方法只能通過(guò)拋出未經(jīng)檢查的異常使添加元素失敗。

remove() 和 poll() 方法可移除和返回隊(duì)列的頭。到底從隊(duì)列中移除哪個(gè)元素是隊(duì)列排序策略的功能,而該策略在各種實(shí)現(xiàn)中是不同的。remove() 和 poll() 方法僅在隊(duì)列為空時(shí)其行為有所不同:remove() 方法拋出一個(gè)異常,而 poll() 方法則返回 null。

element() 和 peek() 返回,但不移除,隊(duì)列的頭。

Queue 實(shí)現(xiàn)通常不允許插入 null 元素,盡管某些實(shí)現(xiàn)(如 LinkedList)并不禁止插入 null。即使在允許 null 的實(shí)現(xiàn)中,也不應(yīng)該將 null 插入到 Queue 中,因?yàn)?null 也用作 poll 方法的一個(gè)特殊返回值,表明隊(duì)列不包含元素。

值得注意的是LinkedList類實(shí)現(xiàn)了Queue接口,因此我們可以把LinkedList當(dāng)成Queue來(lái)用。

import java.util.Queue;  
import java.util.LinkedList;  
public class TestQueue {  
  public static void main(String[] args) {  
    Queue<String> queue = new LinkedList<String>();  
    queue.offer("Hello");  
    queue.offer("World!");  
    queue.offer("你好!");  
    System.out.println(queue.size());  
    String str;  
    while((str=queue.poll())!=null){  
      System.out.print(str);  
    }  
    System.out.println();  
    System.out.println(queue.size());  
  }  
}

2、Deque

public interface Deque<E> 
extends Queue<E> 

一個(gè)線性 collection,支持在兩端插入和移除元素。

名稱 deque 是“double ended queue(雙端隊(duì)列)”的縮寫,通常讀為“deck”。

大多數(shù) Deque 實(shí)現(xiàn)對(duì)于它們能夠包含的元素?cái)?shù)沒(méi)有固定限制,但此接口既支持有容量限制的雙端隊(duì)列,也支持沒(méi)有固定大小限制的雙端隊(duì)列。

此接口定義在雙端隊(duì)列兩端訪問(wèn)元素的方法。提供插入、移除和檢查元素的方法。因?yàn)榇私涌诶^承了隊(duì)列接口Queue,所以其每種方法也存在兩種形式:一種形式在操作失敗時(shí)拋出異常,另一種形式返回一個(gè)特殊值(null 或 false,具體取決于操作)。

a、在將雙端隊(duì)列用作隊(duì)列時(shí),將得到 FIFO(先進(jìn)先出)行為。將元素添加到雙端隊(duì)列的末尾,從雙端隊(duì)列的開(kāi)頭移除元素。從 Queue 接口繼承的方法完全等效于 Deque 方法,如下表所示:

b、用作 LIFO(后進(jìn)先出)堆棧。應(yīng)優(yōu)先使用此接口而不是遺留 Stack 類。在將雙端隊(duì)列用作堆棧時(shí),元素被推入雙端隊(duì)列的開(kāi)頭并從雙端隊(duì)列開(kāi)頭彈出。堆棧方法完全等效于 Deque 方法,如下表所示:

相關(guān)文章

  • 關(guān)于SpringCloud整合RabbitMQ的實(shí)例

    關(guān)于SpringCloud整合RabbitMQ的實(shí)例

    這篇文章主要介紹了關(guān)于SpringCloud整合RabbitMQ的實(shí)例,消息隊(duì)列是指利用高效可靠的消息傳遞機(jī)制進(jìn)行與平臺(tái)無(wú)關(guān)的數(shù)據(jù)交流,并基于數(shù)據(jù)通信來(lái)進(jìn)行分布式系統(tǒng)的集成,是在消息的傳輸過(guò)程中保存消息的容器,需要的朋友可以參考下
    2023-07-07
  • Java容器類源碼詳解 Deque與ArrayDeque

    Java容器類源碼詳解 Deque與ArrayDeque

    這篇文章主要介紹了Java容器類源碼詳解 Deque與ArrayDeque,Deque 接口繼承自 Queue接口,但 Deque 支持同時(shí)從兩端添加或移除元素,因此又被成為雙端隊(duì)列。,需要的朋友可以參考下
    2019-06-06
  • @ControllerAdvice 用法解析

    @ControllerAdvice 用法解析

    @ControllerAdvice就是@Controller 的增強(qiáng)版,@ControllerAdvice主要用來(lái)處理全局?jǐn)?shù)據(jù),一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,這篇文章主要介紹了@ControllerAdvice 用法,需要的朋友可以參考下
    2022-11-11
  • Java JSON提取工具JsonExtractor的使用

    Java JSON提取工具JsonExtractor的使用

    本文主要介紹了Java JSON提取工具JsonExtractor的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • SpringBoot?Test的webEnvironment源碼解讀

    SpringBoot?Test的webEnvironment源碼解讀

    這篇文章主要為大家介紹了SpringBoot?Test的webEnvironment源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作

    Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的順序表如何操作

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示
    2022-03-03
  • Spring?Boot實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新功能

    Spring?Boot實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新功能

    這篇文章我們介紹了Spring?Boot如何實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-05-05
  • spring5新特性全面介紹

    spring5新特性全面介紹

    本文將全面介紹 Spring 5。我將介紹 Java SE 8 和 Java EE 7 API 的基準(zhǔn)升級(jí)、Spring 5 的新反應(yīng)式編程模型、HTTP/2 支持,以及 Spring 通過(guò) Kotlin 對(duì)函數(shù)式編程的全面支持。
    2020-10-10
  • Java開(kāi)發(fā)微信Navicat支付完整版

    Java開(kāi)發(fā)微信Navicat支付完整版

    這篇文章主要介紹了Java開(kāi)發(fā)微信Navicat支付完整版,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot Aop 詳解和多種使用場(chǎng)景解析

    SpringBoot Aop 詳解和多種使用場(chǎng)景解析

    aop面向切面編程,是編程中一個(gè)很重要的思想本篇文章主要介紹的是SpringBoot切面Aop的使用和案例,對(duì)SpringBoot Aop相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2021-08-08

最新評(píng)論