Java集合:List集合

List集合

List集合類中元素有序、且可重復,集合中的每個元素都有其對應的順序索引。

List容器中的元素都對應一個整數型的序號記載其在容器中的位置,可以根據序號存取容器中的元素。

JDK API中List接口的實現類常用的有:ArrayList、LinkList和Vector。

List集合里添加了一些根據索引來操作集合元素的方法

一、ArrayList

ArrayList是List接口的典型實現類,本質上,ArrayList是對象引用的一個變長數組。

ArrayList是List接口的可變數組的實現。實現了所有可選列表操作,并允許包括null在內的所有元素。除了實現List接口外,此類還提供了一些方法來操作內部用來存儲列表的數組的大小。

每個ArrayList實例都有一個初始容量,該容量用來儲存列表元素的數組大小。默認初始容量為10。

ArrayList底層采用數組實現。數組都有一個重大的缺陷,這就是從數組的中間位置刪除一個元素要付出很大的代價,其原因是數組中處于被刪除元素之后的所有元素都要向數組的前端移動。在數組中間位置插入一個元素也是如此(數據的copy)。

注:Arrays.asList(…) 方法返回的 List 集合既不是 ArrayList 實例,也不是 Vector 實例。 Arrays.asList(…)返回值是一個固定長度的 List 集合。

1.ArrayList的存取實現

1.1存儲:

ArrayList提供了一下添加元素的方法

**add(E element)**方法,將指定的元素添加到列表的尾部

**add(int index, E element)**方法,將指定的元素插入此列表的指定位置,如果當前位置有元素,則向右移動當前位于該位置的元素以及所有后續元素(將其索引值加1)

**set(int index, E element)**方法,替換數組中已經存在的元素內容

**addAll(Collection<? extends E> c)**方法,按照指定Collection的迭代器所返回的元素順序,將該Collection中的所有元素添加到此列表的尾部。

**addAll(int index, Collection<? extends E> c)**方法,從指定的位置開始,將指定collection中的所有元素插入到此列表中

1.2讀取

**get(int index)**方法,獲取指定位置上的元素

2.總結

  • ArrayLlist內部是由數組來實現的。在存放數據的數組長度不夠時,會進行擴容,即增加數組長度。擴展為原來的1.5倍。
  • 由于是數組來實現,所以,優點是查找元素很快。可以通過下標查找元素,查找效率高。缺點是每次添加和刪除元素都會進行大量的數組元素移動。長度不夠會擴容。效率底下。
  • ArrayList每次的增、刪、改操作都伴隨著數組的復制和元素的移動。這意味著新的內存空間的開辟。

二、LinkedList

LinkedList其實也就是我們在數據結構中的鏈表,這種數據結構有這樣的特性:

  • 分配內存空間不是必須是連續的;
  • 插入、刪除操作很快,只要修改前后指針就OK了,時間復雜度為O(1);
  • 訪問比較慢,必須得從第一個元素開始遍歷,時間復雜度為O(n);

在Java中,LinkedList提供了豐富的方法,可以模擬鏈式隊列,鏈式堆棧等數據結構,為用戶帶來了極大的方便,下面看看這些方法的用法:

add:

boolean add(E e):在鏈表后添加一個元素,如果成功,返回true,否則返回falsevoid addFirst(E e):在鏈表頭部插入一個元素; 
addLast(E e):在鏈表尾部添加一個元素; 
void add(int index, E element):在指定位置插入一個元素。

remove:

E remove();移除鏈表中第一個元素; 
boolean remove(Object o):移除鏈表中指定的元素; 
E remove(int index):移除鏈表中指定位置的元素; 
E removeFirst():移除鏈表中第一個元素,與remove類似; 
E removeLast():移除鏈表中最后一個元素; 
boolean removeFirstOccurrence(Object o):移除鏈表中第一次出現所在位置的元素; 
boolean removeLastOccurrence(Object o):移除鏈表中最后一次出現所在位置的元素;

get:

E get(int index):按照下邊獲取元素; 
E getFirst():獲取第一個元素; 
E getLast():獲取最后一個元素;

push、pop、poll:

void push(E e):與addFirst一樣,實際上它就是addFirst; 
E pop():與removeFirst一樣,實際上它就是removeFirst; 
E poll():查詢并移除第一個元素;

push,pop的操作已經很接近stack的操作了。如果鏈表為空的時候,poll返回null,而pop則產生異常。

peek:

E peek():獲取第一個元素,但是不移除; 
E peekFirst():獲取第一個元素,但是不移除; 
E peekLast():獲取最后一個元素,但是不移除

offer:

boolean offer(E e):在鏈表尾部插入一個元素; 
boolean offerFirst(E e):與addFirst一樣,實際上它就是addFirst; 
boolean offerLast(E e):與addLast一樣,實際上它就是addLast;

其他:

boolean contains(Object o) 如果此列表包含指定的元素方法返回true。
E element() 此方法返回此列表的頭部
E set(int index,E element) 此方法替換在與指定元素在此列表中指定位置的元素。
subList(int index, int index) 方法是在給定的ArrayList集合中獲取給定下標的子集合。注意范圍是[)

三、Vector

Vector 可實現自動增長的對象數組。

java.util.vector提供了向量類(Vector)以實現類似動態數組的功能。
創建了一個向量類的對象后,可以往其中隨意插入不同類的對象,即不需顧及類型也不需預先選定向量的容量,并可以方便地進行查找。

對于預先不知或者不愿預先定義數組大小,并且需要頻繁地進行查找,插入,刪除工作的情況,可以考慮使用向量類。

向量類提供了三種構造方法:

public vector() 
public vector(int initialcapacity,int capacityIncrement) 
public vector(int initialcapacity)

使用第一種方法系統會自動對向量進行管理,若使用后兩種方法,則系統將根據參數,initialcapacity設定向量對象的容量(即向量對象可存儲數據的大小),當真正存放的數據個數超過容量時。系統會擴充向量對象存儲容量。

參數capacityincrement給定了每次擴充的擴充值。當capacityincrement為0的時候,則每次擴充一倍,利用這個功能可以優化存儲。

在Vector類中提供了各種方法方便用戶的使用:

1.插入功能

(1)public final synchronized void adddElement(Object obj)

將obj插入向量的尾部。obj可以是任何類型的對象。對同一個向量對象,亦可以在其中插入不同類的對象。但插入的應是對象而不是數值,所以插入數值時要注意將數組轉換成相應的對象。

(2)public final synchronized void setElementAt(Object obj,int index)

將index處的對象設置成obj,原來的對象將被覆蓋。

(3)public final synchronized void insertElementAt(Object obj,int index)

在index指定的位置插入obj,原來對象以及此后的對象依次往后順延。

2.刪除功能

(1)public final synchronized void removeElement(Object obj)

從向量中刪除obj,若有多個存在,則從向量頭開始試,刪除找到的第一個與obj相同的向量成員。

(2)public final synchronized void removeAllElements();

刪除向量所有的對象

(3)public fianl synchronized void removeElementAt(int index)

刪除index所指的地方的對象

3.查詢搜索功能

(1)public final int indexOf(Object obj)

從向量頭開始搜索obj,返回所遇到的第一個obj對應的下標,若不存在此obj,返回-1.

(2)public final synchronized int indexOf(Object obj,int index)

從index所表示的下標處開始搜索obj.

(3)public final int lastIndexOf(Object obj)

從向量尾部開始逆向搜索obj.

(4)public final synchornized int lastIndex(Object obj,int index)

從index所表示的下標處由尾至頭逆向搜索obj.

(5)public final synchornized firstElement()
  獲取向量對象中的首個obj

(6)public final synchornized Object lastElement()
  獲取向量對象的最后一個obj

4.其他功能

(1)public final int size();
此方法用于獲取向量元素的個數。它們返回值是向量中實際存在的元素個數,而非向量容量。可以調用方法capacity()來獲取容量值。

(2)public final synchronized void setSize(int newsize);
此方法用來定義向量的大小,若向量對象現有成員個數已經超過了newsize的值,則超過部分的多余元素會丟失。

程序中定義Enumeration類的一個對象Enumeration是java.util中的一個接口類,

(3)public final synchronized Enumeration elements();

此方法將向量對象對應到一個枚舉類型。java.util包中的其他類中也都有這類方法,以便于用戶獲取對應的枚舉類型。

在Enumeration中封裝了有關枚舉數據集合的方法。
  方法 hasMoreElement() 來判斷集合中是否還有其他元素。

? 方法 nextElement() 來獲取下一個元素

PS:同時也有一個結論 Vector是有序的,可以重復的。

四、ArrayList、LinkedList、Vector的底層實現和區別

List 有序, 可重復, 有索引。三者均為可伸縮數組

ArrayList:底層數據結構是數組結構。 線程不安全的。 所以ArrayList的出現替代了Vector, 但是查詢的速度很快。默認擴充為原來的1.5倍。

LinkedList:底層是鏈表數據結構。 線程不安全的, 同時對元素的增刪操作效率很高。但查詢慢

Vector:底層數據結構是數組結構。 jdk1.0版本。 線程安全的。 無論增刪還是查詢都非常慢。默認擴充為原來的2倍。

Vector 和 ArrayList都是基于存儲元素的Object[ ] array來實現的。

LinkedList是采用雙向列表來實現的。

1、 線程同步,Vector線程安全,ArrayList線程不安全。

2、 效率問題,Vector效率低,ArrayList效率高。

3、 增長數量,Vector以1.5倍增長,ArrayList以2倍增長。

List集合子類Vector這個類已經不常用了, 我就說里面的一個方法, Elements方法, 這個方法的返回值是枚舉接口, 里面有兩個方法, 判斷和獲取。此接口Enumeration的功能與 Iterator 接口的功能是重復的。Enumeration的名稱和方法的名稱過程, 書寫很麻煩。 所以被Iterator所取代。

ArrayList是實現了基于動態數組的數據結構,LinkedList基于雙線鏈表的數據結構。

ArrayList可以隨機定位對于新增和刪除操作add和remove,LinedList比較占優勢

具有Collection接口必備的iterator()方法外,List還提供一個listIterator()方法ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向后遍歷。

Vector與ArrayList唯一的區別是,Vector是線程安全的,即它的大部分方法都包含有關鍵字synchronized,因此,若對于單一線程的應用來說,最好使用ArrayList代替Vector,因為這樣效率會快很多(類似的情況有StringBuffer線程安全的與StringBuilder線程不安全的);而在多線程程序中,為了保證數據的同步和一致性,可以使用Vector代替ArrayList實現同樣的功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL為什么要set names

大家都知道SET NAMES x相當于SET character_set_client x;SET character_set_results x;SET character_set_connection x; 以下從MySQL5.0官方文檔上摘錄了相關內容&#xff0c;并翻譯&#xff0c;說明了相關系統變量的用處&#xff1a; What character set is the statem…

MySql日期處理系列-常用的日期推算處理

以下都是我平時用的一些日期推算處理方法&#xff0c;方法并不一定是最有效率的.全部均通過測試!轉載請注明來自[phpchina.com] #title: 常用的日期推算處理#auther: 小強(占卜師) #date: 2007-12-25 #取得當前日期set dtCURDATE();select dt; #當前日期這個月的第一天selec…

Java集合:Set集合

一、Set接口的特點 一個不包含重復元素的collection。更確切地講&#xff0c;Set不包含滿足e1.equals(e2)的元素對 e1和e2&#xff0c;并且最多包含一個null元素。 Set集合由Set接口和Set接口的實現類組成&#xff0c;Set接口繼承了Collection接口&#xff0c;因此包含了Coll…

談談我對MYSQL亂碼的解決辦法

經常更換虛擬主機,而各個服務商的MYSQL版本不同,當導入數據后,總會出現亂碼等無法正常顯示的問題,查了好多資料,總結出自己的一點技巧: WINDOWS 下導入應該這樣使用MYSQL的命令在DOS命令下進入mysql的bin目錄下,輸入mysql -uroot -p密碼 數據庫名稱<要恢復的數據庫, 例如我們…

Java集合:Map集合

一、簡述 public interface Map<K,V>將鍵映射到值的對象。一個映射不能包含重復的鍵&#xff1b;每個鍵最多只能映射到一個值。 注意&#xff1a;Map中的集合不能包含重復的鍵&#xff0c;值可以重復。每個鍵只能對應一個值。 Map集合是鍵值對形式存儲值的&#xff0c…

用離線編輯器Zoundry寫zblog日志

Zoundry是免費的離線網志發布工具&#xff0c;由于家里的網絡很差&#xff0c;寫了一半的日志經常因為掉線而丟失&#xff0c;這樣一款軟件的確是很必要的。今天下載試用了一下&#xff0c;感覺的確不錯。使用起來也很簡單&#xff1a; 1.下載并安裝zoundry軟件&#xff1a;現…

MySQL:基本命令

一、數據庫操作 1、查詢數據庫&#xff0c;命令如下: SHOW DATABASES;2、我們可以在登陸 MySQL 服務后&#xff0c;使用 create 命令創建數據庫&#xff0c;命令格式: CREATE DATABASE 數據庫名;3、使用 drop 命令刪除數據庫&#xff0c;命令格式&#xff1a; drop databas…

CentOS 5打造全功能Web服務器

轉&#xff1a;主要做為歷史記錄&#xff0c;以后用。另外很少見這么好的編譯的文章&#xff0c;其實我不推薦用編譯安裝。但這個文章不錯.V3.0 2007年11月11日 將搭建教程劃分階段以適應不同需要。加入程序優化&#xff0c;程序安全&#xff0c;加入memcache&#xff0c;squid…

MySQL:查詢條件

查詢條件 1、使用 WHERE 子句從數據表中讀取數據的通用語法&#xff1a; SELECT field1, field2,...fieldN FROM table_name1, table_name2... [WHERE condition1 [AND [OR]] condition2.....查詢語句中你可以使用一個或者多個表&#xff0c;表之間使用逗號**,** 分割&#x…

linux下的ImageMagick安裝

檢查系統有無安裝ImageMagick官方網址是&#xff1a; www.imagemagick.org 從官方不好下載&#xff0c;提供 sourceforge的下載地址&#xff1a; imagemagick.sourceforge.net shell> rpm -qa | grep ImageMagick 沒有就開始安裝ImageMagickshell> rpm -Uvh ImageMagi…

MySQL:進階應用

一、進階應用 1、可以在 SELECT, UPDATE 和 DELETE 語句中使用 Mysql 的 JOIN 來聯合多表查詢。 JOIN 按照功能大致分為如下三類&#xff1a; INNER JOIN&#xff08;內連接,或等值連接&#xff09;&#xff1a;獲取兩個表中字段匹配關系的記錄。**LEFT JOIN&#xff08;左連…

Hive-常用操作

一. 數據庫操作 1、創建數據庫 //用戶可以用 IF NOT EXISTS 選項來忽略這個異常。create database [ if not exists ] myhive ;2、創建數據庫并指定hdfs存儲位置 create database myhive2 location /myhive2;3、修改數據庫&#xff0c;可以使用alter database 命令來修改數據…

linux下nmap工具的使用

nmap NMap&#xff0c;也就是Network Mapper&#xff0c;是Linux下的網絡掃描和嗅探工 具包&#xff0c;其基本功能有三個&#xff0c;一是探測一組主機是否在線&#xff1b;其次是掃描主機端口&#xff0c;嗅探所提供的網絡服務&#xff1b;還可以推斷主機所用的操作系統 。N…

Hive-分區分桶概述

一、分區 簡介 為了對表進行合理的管理以及提高查詢效率&#xff0c;Hive可以將表組織成“分區”。 分區是表的部分列的集合&#xff0c;可以為頻繁使用的數據建立分區&#xff0c;這樣查找分區中的數據時就不需要掃描全表&#xff0c;這對于提高查找效率很有幫助。 分區是…

定時提醒你休息的腳本

本文來源于阿里西西WEB開發社區http://www.alixixi.com收集整理&#xff0c;歡迎訪問。 定時彈窗提醒功能腳本..把以下代碼存為.vbs運行即可. 以下是引用片段&#xff1a;set WshShell WScript.CreateObject("WScript.Shell") ’對話框標題 alerttitle "你的…

Hive-分區分桶操作

在大數據中&#xff0c;最常用的一種思想就是分治&#xff0c;我們可以把大的文件切割劃分成一個個的小的文件&#xff0c;這樣每次操作一個小的文件就會很容易了&#xff0c;同樣的道理&#xff0c;在hive當中也是支持這種思想的&#xff0c;就是我們可以把大的數據&#xff0…

ubuntu好文收集

ubuntu全程配置手冊 http://ljlau.blogdriver.com/ljlau/1220277.html ubuntu下向系統日志寫記錄 http://linux0818.bokee.com/viewdiary.14153197.html aptitude 使用快速參考 http://linuxtoy.org/archives/aptitude_quick_reference.html

Flume簡單介紹

在一個完整的離線大數據處理系統中&#xff0c;除了HDFSMapReduceHive組成分析系統的核心之外&#xff0c;還需要數據采集、結果數據導出、任務調度等不可或缺的輔助系統&#xff0c;而這些輔助工具在hadoop生態體系中都有便捷的開源框架&#xff0c;在此&#xff0c;我們首先來…

linux系統優化篇之---top

top命令是Linux下常用的性能分析工具&#xff0c;能夠實時顯示系統中各個進程的資源占用狀況&#xff0c;類似于Windows的任務管理器。下面詳細介紹它的使用方法。 top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.48Tasks: 29 total, 1 running, 28 sleeping, …

Flume安裝部署

1.安裝部署 1、解壓tar -zxvf apache-flume-1.9.0-bin.tar.gz 2、改名mv apache-flume-1.9.0-bin flume-1.9.0 3、配置環境變量 vi /etc/profile,source /etc/profile #flume export FLUME_HOME/usr/local/apps/flume-1.9.0 export PATH$PATH:$FLUME_HOME/bin4、將conf下的…