淺析Java中Vector類的capacity方法

2020-12-08 軟體開發領路人

在各種Java面試題中,想必大家是有見到過Vector這個類吧。一般都是說Vector是同步的這個點。

不過今天我要說的不是這個,而是Vector類中的capacity方法。

先看看下面這段關於Vector類中的capacity方法的代碼。

這段代碼中使用了Vector類的三個方法,add方法、size方法和capacity方法。add方法、size方法大家經常用就不多說了,那capacity方法是幹什麼的呢。

capacity單詞的意思是容量、容積。這個方法的意思就是獲取Vector類對象的容量。

拿上面代碼的執行結果來解釋一下吧。

我這裡實例化是使用的默認的構造方法,大家可以看一下源碼,默認的構造方法中,給這個對象設置的初始容量是10。那就是說這個Vector類對象(一個動態數組)初始化後可以放10個元素。

然後執行的結果就會輸出size是0(因為一個元素都沒有存入),而容量就是上面說的10。

這時候執行add方法存入一個元素,於是輸出的size就是1了,容量不會改變,還是10。

那如果存入的元素操作10個呢,就需要自動擴容了。就是上面的第三組自行結果了,當存入的元素操作之前的容量時,容量擴容到了20。

那這個擴容的規則是什麼呢。看一看源碼便知了。

add方法中調用了ensureCapacityHelper
ensureCapacityHelper調用了grow
grow方法是擴容的實現

其中capacityIncrement是擴容增量,public Vector(int initialCapacity, int capacityIncrement)這個構造方法可以指定,默認擴容增量為0.

從grow方法中我們可以看到,如果增量不為0,則每次容量不足時按照增量去增加容量。如果增量為0,則每次容量不足時會將當前容量翻倍。

今天的關於Vector類中的capacity方法的內容就到這裡了。

相關焦點

  • 如何減少 vector 的內存佔用
    內存分配策略淺析》,其中定義了用於測試的類A,本文中也有用到,大家可以點擊連結跳轉至上一篇,了解下類A的定義。2、erase()函數和clear()會減少vector的內存佔用嗎?上篇文章中,我們說過vector佔用空間的大小,可以通過capacity()函數來查看。通過一個示例,來驗證一下erase()、clear()會減少vector內存佔用嗎?
  • C++打怪 之 vector
    簡介❝Vector類 是在 java 中可以實現自動增長的對象數組,vector在C++標準模板庫中的部分內容,它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。---百度百科❞2. 場景實例在C語言編程中,涉及到聲明一個全局數組的時候,經常會遇到一種情況,數組的大小設定多少合適。
  • C++ vector詳解
    可以簡單的認為,vector是一個能夠存放任意類型的動態數組。接下來,請跟隨小編一起來複習一下吧。以下是正文前言本文mark了vector的一些接口,介紹了vector中的對內存和對象的管理詳解請見cppreference-vector。
  • C++ vector用法詳解
    vector概述  vector是種容器,類似數組一樣,但它的size可以動態改變。  vector的元素在內存中連續排列,這一點跟數組一樣。這意味著我們元素的索引將非常快,而且也可以通過指針的偏移來獲取vector中的元素。
  • 面試題目--vector的內存管理
    關於vector的內存空間,有幾個函數需要注意:   size() :指當前擁有的元素個數;  capacity() :指當前(容器必須分配新存儲空間之前)可以存儲的元素個數。      vector另外一個特性在於它的內存空間會自增長,每當vector容器不得不分配新的存儲空間時,會以加倍當前容量的分配策略實現重新分配。例如,當前capacity為50,當添加第51個元素時,預留空間不夠用了,vector容器會重新分配大小為100的內存空間,作為新連續存儲的位置。
  • C vector詳解
    可以簡單的認為,vector是一個能夠存放任意類型的動態數組。接下來,請跟隨小編一起來複習一下吧。以下是正文前言本文mark了vector的一些接口,介紹了vector中的對內存和對象的管理詳解請見cppreference-vector。
  • C++逆向學習(二) vector
    現在的逆向C++題越來越多,經常上來就是一堆容器、標準模板庫,這個系列主要記錄這些方面的逆向學習心得本文主要介紹std::vector,因為逆向題中的C++代碼可能會故意寫的很繞,比如輸入一個數組,直接給vector賦值即可,但是也可以用稍微費解的方法連續push_back(),也算是一種混淆的手段,文章中的示例會逆向一些故意寫的繁瑣的程序vector內存布局
  • 【譯】Rust中的array、vector和slice
    Rust 中的 array、vector 和 slice。在其內部,vector 把所有的元素放在一個分配在堆(heap)上的 array 上。當一個新元素被 push 進來時,vector 檢查 array 是否有足夠的剩餘空間。如果空間不足,vector 就分配一個更大的 array,將所有的元素都拷貝到這個新的 array 中,然後釋放舊的 array。
  • ​跟我學C++中級篇——STL的容器vector
    一、順序容器vectorC++程式設計師中,如果用到過STL,那麼一定肯定用過vector,這個是最常見,最初步的一個數據類型。上一篇提到的array遠遠比不上它。畢竟那玩意兒相對vector是很久遠後才提出來的。在這之前,std::vector承擔了多少小菜鳥處理數組各種問題的最優選方法。不用處理內存,可以刪除,任意增加不考慮越界。那簡直是一種最單純質樸的快樂。
  • 淺析java內存管理機制
    不同的程式語言有不同的內存管理機制,本文在對比C++和Java語言內存管理機制的不同的基礎上,淺析java中的內存分配和內存回收機制,包括java對象初始化及其內存分配,內存回收方法及其注意事項等……Java 堆中生成一個代表這個類的 java.lang.Class 對象,作為對方法區中這些數據的訪問入口。
  • 乾貨 |名企高頻考點之-C++ STL vector底層實現
    底層是連續空間,並且vector重載了[]下標運算符,用戶可以向使用數組的方式訪問vector中的每一個元素,即支持隨機訪問,但vector不適宜做任意位置的插入和刪除操作,因為要進行大量元素的搬移,比如插入:
  • Java基礎知識中的類
    Java類的內容一、類的定義和聲明Java程式語言是面向對象的,處理的最小的完整單元為對象。而現實生活中具有共同特性的對象的抽象就稱之為類。類由類聲明和類體構成,類體又由變量和方法構成。下面給出一個例子來看一下類的構成。
  • java 基礎 之 集合ArrayList和Vector
    今天我們繼續學習集合中的其他數據類型。今天我們主要看下線性表。在java中的線性表是如何實現的呢。
  • Java之File類的構造方法
    各位小夥伴們大家好,在之前的文章中,小編介紹了Java之File類的簡單介紹,File類的靜態成員變量,這次小編要介紹的是File類的構造方法(f1);//重寫了Object類的toString方法,列印的是一個路徑:c:\Users\java\code\a.textFile f2=new File("c:\\Users\\java\\code");System.out.println(f2);
  • C++提高第三篇2 STL常用容器 vector
    = v.end(); it++) { cout << *it << " "; } cout << endl;}函數printVector後文多次使用,列印示例中vector容器的數據。
  • 乾貨 | 名企高頻考點之-談談你所理解的vector數據插入(一)
    ,vector的插入經常會被考到,可能會被面試官問到,也有可能在OJ筆試中遇到,操作不當可能就會導致程序效率低下而不能完全通過測試用例,或者不能給出程序簡潔的書寫方式。vector的插入從插入位置上可以分為兩類:2.1 內置類型元素插入內置類型的元素尾插非常簡單,定義好了vector之後,便可以直接插入,而且該容器在插入時可以動態增長,用戶只管插入數據,一般不用擔心數據放不下的問題,降低了用戶的使用成本。
  • Java多線程並發編程中並發容器第二篇之List的並發類講解
    Java多線程並發編程中並發容器第二篇之List的並發類講解概述本文我們將詳細講解list對應的並發容器以及用代碼來測試ArrayList、vector以及CopyOnWriteArrayList在100個線程向list中添加1000個數據後的比較
  • 乾貨 | 名企高頻考點之-C++ 如何避免vector的動態擴容,為何是2倍(上)
    ,如果有錢任性請隨意在面試時vector的擴容問題會經常被問到,比如:        3.為什麼選擇以1.5倍或者2倍方式進行擴容?本節我們再來深究vector擴容背後所包含的細節問題,讓你的面試不再尷尬。1.1 擴容機制回顧當向vector中插入元素時,如果元素有效個數size與空間容量capacity相等時,vector內部會觸發擴容機制:注意:每次擴容新空間不能太大,也不能太小,太大容易造成空間浪費,太小則會導致頻繁擴容而影響程序效率。
  • Java性能優化的50個細節,我必須分享給你!
    儘量使用final修飾符帶有final修飾符的類是不可派生的。在JAVA核心API中,有許多應用final的例子,例如java、lang、String,為String類指定final防止了使用者覆蓋length()方法。另外,如果一個類是final的,則該類所有方法都是final的。
  • 【java概念】String的常用方法
    接收字符的數組由target指定,target中開始複製子串的下標值是targetStart。  例:String s="this is a demo of the getChars method.";    char buf[]=new char[20];    s.getChars(10,14,buf,0);4、getBytes()  替代getChars()的一種方法是將字符存儲在字節數組中,該方法即getBytes()。