1. 程式人生 > >java中vector,array,list,arraylist的區別

java中vector,array,list,arraylist的區別

陣列和其它容器的區別主要有三方面:效率,型別,和儲存基本型別的能力.在Java中,陣列是一種效率很高的儲存和隨機訪問物件引用序列的方式.陣列是一個簡單的線性序列,因此訪問速度很快,但也損失了其它一些特性.建立一個數組物件後,大小就固定了,如果空間不夠,通常是再建立一個數組,然後把舊陣列中的所有引用移到新陣列中.陣列可可以儲存基本型別,容器不行.
容器類不以具體的型別來處理物件,而是將所有的物件都以Object型別來處理,所以我們可以只建立一個容器,任意的Java物件都可以放進去.容器類可以使用包裝類(Integer,Double等),以便把基本型別放入其中. List Set Map 都可以自動調整容量,陣列不能.


Collection表示一組物件,這些物件也稱為collection的元素。一些 collection允許有重複的元素,而另一些則不允許。一些collection是有序的,而另一些則是無序的。JDK中不提供此介面的任何直接實現,它提供更具體的子介面(如 Set 和 List)實現.

Map 將鍵對映到值的物件。一個對映不能包含重複的鍵;每個鍵最多隻能對映一個值.Map 介面提供三種collection檢視,允許以鍵集、值集合或鍵值對映關係集的形式檢視某個對映的內容。某些對映實現可明確保證其順序,如 TreeMap(有序) 類;某些對映實現則不保證順序,如 HashMap(無序) 類。Map可以像陣列那樣擴充套件成多維陣列,只要把每個值也做成一個Map就行了.


Collection和Map是Java容器中的兩種基本型別. 區別在於容器中每個位置儲存的元素個數.Collection每個位置只能儲存一個元素,包括List和Set.其中List以進入的順序儲存一組元素; 而Set中的元素不能重複.ArrayList是一種List,HashSet是一種Set,將元素新增入任意Collection都可以使用add() 方法.Map儲存的是健值對.使用put()為Map新增元素,它需要一個健和一個值作引數.

ArrayList和LinkedList都實現了List介面,ArrayList底層由陣列支援LinkedList由雙向連結串列支援,因此,如果經常在表中插入或刪除元素LinkedList比較適合,如果經常查詢ArrayList比較適合.

Set的實現有TreeSet,HashSet,LinkedHashSet,HashSet查詢速度最快,LinkedHashSet保持元素插入次序,TreeSet基於TreeMap,生成一個總是處於排序狀態的Set.

                      Collection<--List<--Vector
                           Collection<--List<--ArrayList
                           Collection<--List<--LinkedList
                           Collection<--Set<--HashSet
                           Collection<--Set<--HashSet<--LinkedHashSet
                           Collection<--Set<--SortedSet<--TreeSet

Vector : 基於Array的List,其實就是封裝了Array所不具備的一些功能方便我們使用,它不可能走入Array的限制。效能也就不可能超越Array。所以,在可能的情況下,我們要多運用Array。另外很重要的一點就是Vector“sychronized”的,這個也是Vector和ArrayList的唯一的區別。

ArrayList:同Vector一樣是一個基於Array上的連結串列,但是不同的是ArrayList不是同步的。所以在效能上要比Vector優越一些,但是當執行到多執行緒環境中時,可需要自己在管理執行緒的同步問題。

LinkedList:LinkedList不同於前面兩種List,它不是基於Array的,所以不受Array效能的限制。它每一個節點(Node)都包含兩方面的內容:1.節點本身的資料(data);2.下一個節點的資訊(nextNode)。所以當對LinkedList做新增,刪除動作的時候就不用像基於Array的List一樣,必須進行大量的資料移動。只要更改nextNode的相關資訊就可以實現了。這就是LinkedList的優勢。

List總結:

1. 所有的List中只能容納單個不同型別的物件組成的表,而不是Key-Value鍵值對。例如:[ tom,1,c ];

2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];

3. 所有的List中可以有null元素,例如[ tom,null,1 ];

4. 基於Array的List(Vector,ArrayList)適合查詢,而LinkedList(連結串列)適合新增,刪除操作。
HashSet:雖然Set同List都實現了Collection介面,但是他們的實現方式卻大不一樣。List基本上都是以Array為基礎。但是Set則是在HashMap的基礎上來實現的,這個就是Set和List的根本區別。HashSet的儲存方式是把HashMap中的Key作為Set的對應儲存項。看看HashSet的add(Object   obj)方法的實現就可以一目瞭然了。
public boolean add(Object obj)
     {
         return map.put(obj, PRESENT) == null;
     }

這個也是為什麼在Set中不能像在List中一樣有重複的項的根本原因,因為HashMap的key是不能有重複的。
LinkedHashSet:HashSet的一個子類,一個連結串列。
TreeSet:SortedSet的子類,它不同於HashSet的根本就是TreeSet是有序的。它是通過SortedMap來實現的。


Set總結:
1. Set實現的基礎是Map(HashMap);

2.   Set中的元素是不能重複的,如果使用add(Object obj)方法新增已經存在的物件,則會覆蓋前面的物件;

相關推薦

javavector,array,list,arraylist區別

陣列和其它容器的區別主要有三方面:效率,型別,和儲存基本型別的能力.在Java中,陣列是一種效率很高的儲存和隨機訪問物件引用序列的方式.陣列是一個簡單的線性序列,因此訪問速度很快,但也損失了其它一些特性.建立一個數組物件後,大小就固定了,如果空間不夠,通常是再建立一個數組,

c++vectorlist區別

c++標準庫中,容器vector和list都可以用來存放一組型別相同的資料。而且二者不同於陣列的一點是,支援動態增長。但它們還是有有幾點不同 (1)  vector是順序表,表示的是一塊連續的記憶體,元素被順序儲存;list是雙向連線表,在記憶體中不一定連續。 (2)當數值

JavaVectorArrayList,LinkedList的區別

文章目錄 ArrayList 和 Vector 、LinkedLis t原理 ArrayList 和 Vector 部分原始碼解析 ArrayList 和 Vector 、LinkedList 的使用 ArrayList 和 Vector 、LinkedLi

Java VectorArrayListList 使用深入剖析

原文連結為http://www.cnblogs.com/xdxs/p/4896588.html 線性表,連結串列,雜湊表是常用的資料結構,在進行Java開發時,JDK已經為我們提供了一系列相應的類來實現基本的資料結構。這些類均在java.util包中。本文試圖通過簡單的

javaset/map/list/vector 的總結

List介面對Collection進行了簡單的擴充,它的具體實現類常用的有ArrayList和LinkedList。你可以將任何東西放到一個List容器中,並在需要時從中取出。ArrayList從其命名中可以看出它是一種類似陣列的形式進行儲存,因此它的隨機訪問速度極快,而LinkedList的內部實現是連結串

Java的集合之ArrayListVector和Stack

這三個集合型別,其底層都是陣列實現的。討論集合關注的問題: 底層資料結構 增刪改查方式 初始容量,擴容方式,擴容時機 執行緒安全與否 是否允許空,是否允許重複,是否有序 ArrayList ArrayList是

javaleetcode之用Arraylist List實現楊輝三角

要用java  ArrayLIsts實現下面的形式,題目是在leetcode上看到的,        1     1    1  1   2   1 1   3   3  1 具體看看用程式碼怎麼

淺析Java的集合包(ArrayList,LinkedList,Vector, Stack,HashSet,TreeSet,HashMap,TreeMap)

集合包是Java中最常用的包,它最常用的有Collection和Map兩個介面的實現類,Collection用於存放多個單物件,Map用於存放Key-Value形式的鍵值對。         Collection中常用的又分為兩種型別的介面:List和Set,兩者最明顯

STLvectorlist、deque和map的區別

map映照容器的元素資料是一個鍵值和一個映照資料組成的,鍵值與映照資料之間具有一一映照的關係。         map映照容器的資料結構是採用紅黑樹來實現的,插入鍵值的元素不允許重複,比較函式只對元素的鍵值進行比較,元素的各項資料可通過鍵值檢索出來。         使用map容器需要標頭檔案包含語句“#

STLdeque詳解及與vectorlist區別

在前面已經向大家介紹了vector,vector是單向開口的連續性空間,deque則是一種雙向開口的連續線性空間。所謂雙向開口,意思是可以在頭尾兩端分別作為元素的插入和刪除操作。 deque是在功能上合併了vector和list。    優點:(1) 隨機訪問方便,即支援

java堆和棧的區別

mem 線程 所有 生成 werror 空間 調用 訪問 指向 01,各司其職;         棧內存用來存儲局部變量和方法的調用,         而堆內存用來存儲java中的對象,無論是成員變量,局部變量,還是類變量         他們指向的對象都存儲在堆內存中。

楊恒說李的算法好-我問你聽誰說的-龍哥說的(java常見的List就2個)(list放入的是原子元素)

ron 2個 常用 span color 原子 ges pan col 1.List中常用的 方法集合: 函數原型 ******************************************* *****************************

javaComparator 和 Comparable的區別

true public arr ins ride err instance ural code 1、Comparable的代碼如下: public interface Comparable<T> { public int compareTo(T o);

Javavector用法整理

遍歷 檢索 集合 ash ets toa java code lan ArrayList會比Vector快,他是非同步的,如果設計涉及到多線程,還是用Vector比較好一些 import java.util.*; /** * 演示Vector的使用。包括Vector的創

java Vector的使用詳解

缺點 rem 下標 創建 相同 元素 num ger tin Vector 可實現自動增長的對象數組。 java.util.vector提供了向量類(vector)以實現類似動態數組的功能。在Java語言中沒有指針的概念,但如果正確靈活地使用指針又確實可以大大提高程序的質量

JavaRuntimeException和Exception的區別

字符 所有 數組越界 技術 ace stat ast == erro 在java的異常類體系中,Error和RuntimeException是非檢查型異常,其他的都是檢查型異常。 所有方法都可以在不聲明throws的情況下拋出RuntimeException及其子類 不可以

Java棧和堆的區別

分配內存 基本 變量 類型 名稱 垃圾回收器 函數 一個數 棧內存 在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。當在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內存空間,當超過變量的作用域後,Java會自動釋放掉為該變量

JAVAMAP轉LIST

new pub values pac exc except gpo x11 toarray @Test public void testMap2List() throws Exception{ Map<String, String> map = new

讓你徹底明白JAVA堆與棧的區別

java程序 運行 一點 動態 自動變 key 空間 類型 lin 原文地址:http://www.2cto.com/kf/201302/190704.html 簡單的說: Java把內存劃分成兩種:一種是棧內存,一種是堆內存。 在函數中定義的一些基本類型的變量和對象的引用

Javaequals和hashcode的區別

equals方法 div true 區別 hash pos post 兩個 不一定 Java中equals和hashcode方法是在Object對象中的,所以每個對象都有這兩個方法,大多數時候我們為了實現特定需求需要重寫這兩個方法 equals和hashcode方法常用在同