⑴ javaarraylist的方法有哪些
方法摘要
boolean add(E e)
將指定的元素添加到此列表的尾部。
void add(int index, E element)
將指定的元素插入此列表中的指定位置。
boolean addAll(Collection<? extends E> c)
按照指定 collection 的迭代器所返回的元素順序,將該 collection 中的所有元素添加到此列表的尾部。
boolean addAll(int index, Collection<? extends E> c)
從指定的位置開始,將指定 collection 中的所有元素插入到此列表中。
void clear()
移除此列表中的所有元素。
Object clone()
返回此 ArrayList 實例的淺表副本。
boolean contains(Object o)
如果此列表中包含指定的元素,則返回 true。
void ensureCapacity(int minCapacity)
如有必要,增加此 ArrayList 實例的容量,以確保它至少能夠容納最小容量參數所指定的元素數。
E get(int index)
返回此列表中指定位置上的元素。
int indexOf(Object o)
返回此列表中首次出現的指定元素的索引,或如果此列表不包含元素,則返回 -1。
boolean isEmpty()
如果此列表中沒有元素,則返回 true
int lastIndexOf(Object o)
返回此列表中最後一次出現的指定元素的索引,或如果此列表不包含索引,則返回 -1。
E remove(int index)
移除此列表中指定位置上的元素。
boolean remove(Object o)
移除此列表中首次出現的指定元素(如果存在)。
protected void removeRange(int fromIndex, int toIndex)
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之間的所有元素。
E set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
int size()
返回此列表中的元素數。
Object[] toArray()
按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的數組。
<T> T[] toArray(T[] a)
按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。
void trimToSize()
將此 ArrayList 實例的容量調整為列表的當前大小。
從類 java.util.AbstractList 繼承的方法
equals, hashCode, iterator, listIterator, listIterator, subList
從類 java.util.AbstractCollection 繼承的方法
containsAll, removeAll, retainAll, toString
從類 java.lang.Object 繼承的方法
finalize, getClass, notify, notifyAll, wait, wait, wait
從介面 java.util.List 繼承的方法
containsAll, equals, hashCode, iterator, listIterator, listIterator, removeAll, retainAll, subList
⑵ 請教,在List集合中怎麼得到元素的索引值
寫一個代碼可以解決,代碼如下:
⑶ java中對集合對象list的幾種循環訪問
的總結如下
1 經典的for循環View Code1publicstaticvoidmain(String[] args) {23List<String> list =newArrayList();4list.add("123");5list.add("java");6list.add("j2ee");7System.out.println("=========經典的for循環=======");8for(inti=0; i<list.size();i++){9System.out.println(list.get(i));10}11}
2 增強的for循環View Code1publicstaticvoidmain(String[] args) {23List<String> list =newArrayList();4list.add("123");5list.add("java");6list.add("j2ee");7System.out.println("=========Java1.6的for循環=======");8for(String s:list){9System.out.println(s);10}11}
3 Iterate的使用View Code1publicstaticvoidmain(String[] args) {23List<String> list =newArrayList();4list.add("123");5list.add("java");6list.add("j2ee");7System.out.println("=========Iterate循環=======");8Iterator<String> iter =list.iterator();9while(iter.hasNext()){10System.out.println(iter.next());11}1213}
⑷ 如何創建線程安全的list
一:使用synchronized關鍵字
二:使用Collections.synchronizedList()
⑸ list 介面的詳解
List 介面繼承了 Collection 介面以定義一個允許重復項的有序集合。該介面不但能夠對列表的一部分進行處理,還添加了面向位置的操作。
(1) 面向位置的操作包括插入某個元素或 Collection 的功能,還包括獲取、除去或更改元素的功能。在 List 中搜索元素可以從列表的頭部或尾部開始,如果找到元素,還將報告元素所在的位置 :
void add(int index, Object element): 在指定位置index上添加元素element
boolean addAll(int index, Collection c): 將集合c的所有元素添加到指定位置index
Object get(int index): 返回List中指定位置的元素
int indexOf(Object o): 返回第一個出現元素o的位置,否則返回-1
int lastIndexOf(Object o) :返回最後一個出現元素o的位置,否則返回-1
Object remove(int index):刪除指定位置上的元素
Object set(int index, Object element) :用元素element取代位置index上的元素,並且返回舊的元素
(2) List 介面不但以位置序列迭代的遍歷整個列表,還能處理集合的子集:
ListIterator listIterator() : 返回一個列表迭代器,用來訪問列表中的元素
ListIterator listIterator(int index) : 返回一個列表迭代器,用來從指定位置index開始訪問列表中的元素
List subList(int fromIndex, int toIndex) :返回從指定位置fromIndex(包含)到toIndex(不包含)范圍中各個元素的列表視圖
「對子列表的更改(如 add()、remove() 和 set() 調用)對底層 List 也有影響。」
2.1.ListIterator介面
ListIterator 介面繼承 Iterator 介面以支持添加或更改底層集合中的元素,還支持雙向訪問。ListIterator沒有當前位置,游標位於調用previous和next方法返回的值之間。一個長度為n的列表,有n+1個有效索引值:
(1) void add(Object o): 將對象o添加到當前位置的前面
void set(Object o): 用對象o替代next或previous方法訪問的上一個元素。如果上次調用後列表結構被修改了,那麼將拋出IllegalStateException異常。
(2) boolean hasPrevious(): 判斷向後迭代時是否有元素可訪問
Object previous():返回上一個對象
int nextIndex(): 返回下次調用next方法時將返回的元素的索引
int previousIndex():返回下次調用previous方法時將返回的元素的索引
「正常情況下,不用ListIterator改變某次遍歷集合元素的方向 — 向前或者向後。雖然在技術上可以實現,但previous() 後立刻調用next(),返回的是同一個元素。把調用 next()和previous()的順序顛倒一下,結果相同。」
「我們還需要稍微再解釋一下 add() 操作。添加一個元素會導致新元素立刻被添加到隱式游標的前面。因此,添加元素後調用 previous() 會返回新元素,而調用 next() 則不起作用,返回添加操作之前的下一個元素。」
2.2.AbstractList和AbstractSequentialList抽象類
有兩個抽象的 List 實現類:AbstractList 和 AbstractSequentialList。像 AbstractSet 類一樣,它們覆蓋了 equals() 和 hashCode() 方法以確保兩個相等的集合返回相同的哈希碼。若兩個列表大小相等且包含順序相同的相同元素,則這兩個列表相等。這里的 hashCode() 實現在 List 介面定義中指定,而在這里實現。
除了equals()和hashCode(),AbstractList和AbstractSequentialList實現了其餘 List 方法的一部分。因為數據的隨機訪問和順序訪問是分別實現的,使得具體列表實現的創建更為容易。需要定義的一套方法取決於您希望支持的行為。您永遠不必親自提供的是 iterator方法的實現。
2.3. LinkedList類和ArrayList類
在「集合框架」中有兩種常規的 List 實現:ArrayList 和 LinkedList。使用兩種 List 實現的哪一種取決於您特定的需要。如果要支持隨機訪問,而不必在除尾部的任何位置插入或除去元素,那麼,ArrayList 提供了可選的集合。但如果,您要頻繁的從列表的中間位置添加和除去元素,而只要順序的訪問列表元素,那麼,LinkedList 實現更好。
「ArrayList 和 LinkedList 都實現 Cloneable 介面,都提供了兩個構造函數,一個無參的,一個接受另一個Collection」
2.3.1. LinkedList類
LinkedList類添加了一些處理列表兩端元素的方法。
(1) void addFirst(Object o): 將對象o添加到列表的開頭
void addLast(Object o):將對象o添加到列表的結尾
(2) Object getFirst(): 返回列表開頭的元素
Object getLast(): 返回列表結尾的元素
(3) Object removeFirst(): 刪除並且返回列表開頭的元素
Object removeLast():刪除並且返回列表結尾的元素
(4) LinkedList(): 構建一個空的鏈接列表
LinkedList(Collection c): 構建一個鏈接列表,並且添加集合c的所有元素
「使用這些新方法,您就可以輕松的把 LinkedList 當作一個堆棧、隊列或其它面向端點的數據結構。」
2.3.2. ArrayList類
ArrayList類封裝了一個動態再分配的Object[]數組。每個ArrayList對象有一個capacity。這個capacity表示存儲列表中元素的數組的容量。當元素添加到ArrayList時,它的capacity在常量時間內自動增加。
在向一個ArrayList對象添加大量元素的程序中,可使用ensureCapacity方法增加capacity。這可以減少增加重分配的數量。
(1) void ensureCapacity(int minCapacity): 將ArrayList對象容量增加minCapacity
(2) void trimToSize(): 整理ArrayList對象容量為列表當前大小。程序可使用這個操作減少ArrayList對象存儲空間。
2.3.2.1. RandomAccess介面
一個特徵介面。該介面沒有任何方法,不過你可以使用該介面來測試某個集合是否支持有效的隨機訪問。ArrayList和Vector類用於實現該介面。
⑹ java中list,set和map 的區別
List按對象進入的順序保存對象,不做排序或編輯操作。Set對每個對象只接受一次,並使用自己內部的排序方法(通常,你只關心某個元素是否屬於Set,而不關心它的順序–否則應該使用List)。Map同樣對每個元素保存一份,但這是基於」鍵」的,Map也有內置的排序,因而不關心元素添加的順序。如果添加元素的順序對你很重要,應該使用 LinkedHashSet或者LinkedHashMap. List的功能方法
實際上有兩種List: 一種是基本的ArrayList,其優點在於隨機訪問元素,另一種是更強大的LinkedList,它並不是為快速隨機訪問設計的,而是具有一套更通用的方法。
List : 次序是List最重要的特點:它保證維護元素特定的順序。List為Collection添加了許多方法,使得能夠向List中間插入與移除元素(這只推薦LinkedList使用。)一個List可以生成ListIterator,使用它可以從兩個方向遍歷List,也可以從List中間插入和移除元素。
ArrayList : 由數組實現的List。允許對元素進行快速隨機訪問,但是向List中間插入與移除元素的速度很慢。ListIterator只應該用來由後向前遍歷ArrayList,而不是用來插入和移除元素。因為那比LinkedList開銷要大很多。
LinkedList : 對順序訪問進行了優化,向List中間插入與刪除的開銷並不大。隨機訪問則相對較慢。(使用ArrayList代替。)還具有下列方法:addFirst(), addLast(), getFirst(), getLast(), removeFirst() 和 removeLast(), 這些方法 (沒有在任何介面或基類中定義過)使得LinkedList可以當作堆棧、隊列和雙向隊列使用。
Set的功能方法
Set具有與Collection完全一樣的介面,因此沒有任何額外的功能,不像前面有兩個不同的List。實際上Set就是Collection,只是行為不同。(這是繼承與多態思想的典型應用:表現不同的行為。)Set不保存重復的元素(至於如何判斷元素相同則較為負責)
Set : 存入Set的每個元素都必須是唯一的,因為Set不保存重復元素。加入Set的元素必須定義equals()方法以確保對象的唯一性。Set與Collection有完全一樣的介面。Set介面不保證維護元素的次序。
HashSet : 為快速查找設計的Set。存入HashSet的對象必須定義hashCode()。
TreeSet : 保存次序的Set, 底層為樹結構。使用它可以從Set中提取有序的序列。
LinkedHashSet : 具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的次序)。於是在使用迭代器遍歷Set時,結果會按元素插入的次序顯示。
Map的功能方法
方法put(Object key, Object value)添加一個「值」(想要得東西)和與「值」相關聯的「鍵」(key)(使用它來查找)。方法get(Object key)返回與給定「鍵」相關聯的「值」。可以用containsKey()和containsValue()測試Map中是否包含某個「鍵」或「值」。標準的Java類庫中包含了幾種不同的Map:HashMap, TreeMap, LinkedHashMap, WeakHashMap, IdentityHashMap。它們都有同樣的基本介面Map,但是行為、效率、排序策略、保存對象的生命周期和判定「鍵」等價的策略等各不相同。
執行效率是Map的一個大問題。看看get()要做哪些事,就會明白為什麼在ArrayList中搜索「鍵」是相當慢的。而這正是HashMap提高速度的地方。HashMap使用了特殊的值,稱為「散列碼」(hash code),來取代對鍵的緩慢搜索。「散列碼」是「相對唯一」用以代表對象的int值,它是通過將該對象的某些信息進行轉換而生成的。所有Java對象都能產生散列碼,因為hashCode()是定義在基類Object中的方法。
HashMap就是使用對象的hashCode()進行快速查詢的。此方法能夠顯著提高性能。
Map : 維護「鍵值對」的關聯性,使你可以通過「鍵」查找「值」
HashMap : Map基於散列表的實現。插入和查詢「鍵值對」的開銷是固定的。可以通過構造器設置容量capacity和負載因子load factor,以調整容器的性能。
LinkedHashMap : 類似於HashMap,但是迭代遍歷它時,取得「鍵值對」的順序是其插入次序,或者是最近最少使用(LRU)的次序。只比HashMap慢一點。而在迭代訪問時發而更快,因為它使用鏈表維護內部次序。
TreeMap : 基於紅黑樹數據結構的實現。查看「鍵」或「鍵值對」時,它們會被排序(次序由Comparabel或Comparator決定)。TreeMap的特點在於,你得到的結果是經過排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個子樹。
WeakHashMao : 弱鍵(weak key)Map,Map中使用的對象也被允許釋放: 這是為解決特殊問題設計的。如果沒有map之外的引用指向某個「鍵」,則此「鍵」可以被垃圾收集器回收。
IdentifyHashMap : 使用==代替equals()對「鍵」作比較的hash map。專為解決特殊問題而設計。
⑺ java 基礎關於 list 集合問題
list2.add(list1); list1作為一個對象被傳入(這時list2中只有一個值),當list1所包含的被clear,list1還在list2中,只是為空而已(list2中有個空的list1,list1為空)
list2.addAll(list1); 把list1中的包含元素做為list2自己的元素add ,你加了兩個,自然傳入的是兩個值,這時clear list1,只是切斷list1和兩個元素之間的關系,並沒有改變list2(這時list2有兩個值,list1為空)
「就是想問下 add(Object o) 和 addAll(Collection c ); 的區別。」
這參數不同,還不是明顯的區別么?
⑻ C# :數組 、ArrayList、List、鏈表、棧、隊列,Hashset的不同Day0816
幾種常見數據結構的使用情景
Array 需要處理的元素數量確定並且需要使用下標時可以考慮,建議使用List<T>
ArrayList 不推薦使用,建議用List<T>
List<T> 需要處理的元素數量不確定時 通常建議使用
LinkedList 鏈表適合元素數量不固定,需要經常增減節點的情況,2端都可以增減 Queue 先進先出的情況
Stack 後進先出的情況
Dictionary 需要鍵值對,快速操作
1.數組
容量固定,類型固定
數組存儲在連續的內存上,順序存儲結構 數組可以直接通過下標訪問。
int[ ] myInt=new int[2,6,3];
創建一個新的數組時將在堆 中分配一塊 連續的內存空間,來盛放數量為size ,類型為所聲明類型的數組元素。如果類型為 值類型, 則將會有 size 個 未封箱 的 該類型的值被創建。如果類 型 為 引用類型 , 則將會有 size個相應類 型的 引用 被創建。
缺點 :由於是連續存儲 ,所以在兩個元素之間 插入新的元素就變得不方便 。聲明一個新的數組時, 必須 指定其長度 ,這就會存在一個潛在的問題, 長度過長時,顯然會浪費內存 ,長度過短的時候,則面 臨這溢出 的風險。 這樣不好!
2.ArrayList(這個不用,不安全)
容量不固定,類型不固定
ArrayList 中插入不同類型的數據是允許的。
ArrayList al = new ArrayList { 11, "string", 10.25 };
因為ArrayList會把所有插入其中的數據當作為 object類型 來處理,用ArrayList處理數據時,很可能會報類型不匹配的錯誤,也就是 ArrayList不是類型安全的 。在存儲或檢索值類型時通常發生 裝箱和取消裝箱操作,帶來很大的性能耗損。
3.List(用這個)
容量不固定,類型固定
在聲明List集合時,我們同時需要為其聲 明List集合內數據的對象類型 。
它的大部分用法都與ArrayList相似,因為List類也繼承了IList介面。最關鍵的區別在於, 確保了 類型安全 。
List<int> my List=new List<int >{11,22,33,66};
4. LinkedList鏈表
鏈表適合 元素數量不固定 ,需要 經常增減節點 的情況。
和數組最大的不同之處就是在於鏈表在內存存儲的排序上可能是不連續的 。
這是由於鏈表是通過 上一個元素指向下一個元素來排列的,不能通過下標來訪問 。
特點就是存儲在 內存的空間不一定連續 ,那麼鏈表相對於數組最大優勢和劣勢就顯而易見了。
1.向鏈表中插入或刪除節點無需調整結構的容量。因為本身不是連續存儲而是靠各對象的指針所決定,所以添加元素和刪除元素都要比數組要有優勢。
2.鏈表適合在需要有序的排序的情境下增加新的元素,這里還拿數組做對比,例如要在數組中間某個位置增加新的元素,則可能需要移動移動很多元素,而對於鏈表而言可能只是若干元素的指向發生變化而已。
3.缺點,由於其在內存空間中不一定是連續排列, 所以訪問時候無法利用下標,而是 必須 從頭結點開始,逐次遍歷下一個節點直到尋找到目標。所以當需要快速訪問對象時,數組無疑更有優勢。
5.Queue<T>
先進先出的線性表。 在Queue這種數據結構中,最先插入在元素將是最先被刪除; 反之最後插入的元素將最後被刪除,
通過使用Enqueue和Dequeue這兩個方法來實現對 Queue的存取。
6.Stack<T>
後進先出的的線性表
默認容量為10。
使用pop和push來操作。
7.Dictionary<K,T>
字典的實現方式就是哈希表的實現方式,只不過 字典是類型安全的 ,也就是說當創建字典時,必須聲明key和item的類。
缺點:以空間換時間,通過更多的內存開銷來滿足我們對速度的追求。在創建字典時,我們可以傳入一個容量值,但實際使用的容量並非該值。而是使用 「不小於該值的最小質數來作為它使用的實際容量,最小是3
因此,我們面臨的情況就是,即便我們新建了一個空的字典,那麼伴隨而來的是2個長度為3的數組。所以當處理的數據不多時,還是慎重使用字典為好,很多情況下使用數組也是可以接受的。
8.Hashset
這個集合類包含不重復項的無序列表
⑼ 集合介面 list、map、set 的存取速度問題
list 添加數據快, 支持順序遍歷, 但不能實現很快的隨機訪問;
set 沒用過;
map 是一個樹, 在訪問和添加數據上效率比較平衡!