A. java集合框架的知識總結
說明:先從整體介紹了Java集合框架包含的介面和類,然後昌平鎮IT培訓總結了集合框架中的一些基本知識和關鍵點,並結合實例進行簡單分析。
1、綜述
所有集合類都位於java.util包下。集合中只能保存對象(保存對象的引用變數)。(數組既可以保存基本類型的數據也可以保存對象)。
當我們把一個對象放入集合中後,系統會把所有集合元素都當成Object類的實例進行處理。敬碰前從JDK1.5以後,這種狀態得到了改進:可以使用泛型來限制集合里元素的類型,並讓集合記住所有集合元素的類型(參見具體泛型的內容)。
Java的集合類主要由兩個介面派生而出:Collection和Map,Collection和Map是Java集合框架的根介面,這兩個介面又包含了一些介面或實現類。
Set、List和Map可以看做集合的三大類。
List集合是有序集合,集合中的元素可以重復,訪問集合中的元素可以根據元素的索引來訪問。
Set集合是無序集合,集合中的元素不可以重復,訪問集合中的元素只能根據元素本身來訪問(也是不能集合里元素不允許重復的原因)。
Map集合中保存Key-value對形式的元素,訪問時只能根據每項元素的key來訪問其value。
對於Set、List和Map三種集合,最常用的實現類分別是HashSet、ArrayList和HashMap三個實現類。(並發控制的集合類,以後有空研究下)。
2、Collection介面
Collection介面是List、Set和Queue介面的父介面,同時可以操作這三個介面。亮清
Collection介面定義操作集合元素的具體方法大家可以參考API文檔,這里通過一個例子來說明Collection的添加元素、刪除元素、返回集合中元素的個數以及清空集合元素的方法。
3、兩種遍歷集合的方法Iterator介面和foreach循環1、Iterator介面
Iterator也是Java集合框架的成吵鎮員,主要用於遍歷(即迭代訪問)Collection集合中的元素,也稱為迭代器。
B. Java List遍歷方法及其效率對比
Java代碼
package zbalpha test;
差州吵 import java util ArrayList;
import java util Iterator;
import java util List;
public class ListTest {
public static void main(String args[]){
跡世 List<Long> lists = new ArrayList<Long>();
for(Long i= l;i< l;i++){
lists add(i);
}
Long oneOk = oneMethod(lists);
Long oOk = oMethod(lists);
Long threeOk = threeMethod(lists);
Long fourOk = fourMethod(lists);
System out println( One: + oneOk);
System out println( Two: + oOk);
System out println( Three: + threeOk);
System out println( four: + fourOk);
}
public static Long oneMethod(List<Long> lists){
Long timeStart = System currentTimeMillis();
for(int i= ;i<lists size();i++) {
System out println(lists get(i));
}
Long timeStop = System currentTimeMillis();
return timeStop timeStart ;
}
public static Long oMethod(List<Long> lists){
Long timeStart = System currentTimeMillis();
for(Long string : lists) {
System out println(string);
}
Long timeStop = System currentTimeMillis();
return timeStop timeStart ;
}
public static Long threeMethod(List<Long> lists){
Long timeStart = System currentTimeMillis();
Iterator<Long> it = erator();
while (it hasNext())
{
虛侍 System out println(it next());
}
Long timeStop = System currentTimeMillis();
return timeStop timeStart ;
}
public static Long fourMethod(List<Long> lists){
Long timeStart = System currentTimeMillis();
for(Iterator<Long> i = erator(); i hasNext();) {
System out println(i next());
}
Long timeStop = System currentTimeMillis();
return timeStop timeStart ;
}
}
容器類可以大大提高編程效率和編程能力 在Java 中 所有的容器都由SUN公司的Joshua Bloch進行了重新設計 豐富了容器類庫的功能
Java 容器類類庫的用途是 保存對象 它分為兩類
Collection 一組獨立的元素 通常這些元素都服從某種規則 List必須保持元素特定的順序 而Set不能有重復元素
Map 一組成對的 鍵值對 對象 即其元素是成對的對象 最典型的應用就是數據字典 並且還有其它廣泛的應用 另外 Map可以返回其所有鍵組成的Set和其所有值組成的Collection 或其鍵值對組成的Set 並且還可以像數組一樣擴展多維Map 只要讓Map中鍵值對的每個 值 是一個Map即可
迭代器
迭代器是一種設計模式 它是一個對象 它可以遍歷並選擇序列中的對象 而開發人員不需要了解該序列的底層結構 迭代器通常被稱為 輕量級 對象 因為創建它的代價小
Java中的Iterator功能比較簡單 並且只能單向移動
( ) 使用方法iterator()要求容器返回一個Iterator 第一次調用Iterator的next()方法時 它返回序列的第一個元素
( ) 使用next()獲得序列中的下一個元素
( ) 使用hasNext()檢查序列中是否還有元素
( ) 使用remove()將迭代器新返回的元素刪除
Iterator是Java迭代器最簡單的實現 為List設計的ListIterator具有更多的功能 它可以從兩個方向遍歷List 也可以從List中插入和刪除元素
List的功能方法
List(interface): 次序是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(interface): 存入Set的每個元素必須是唯一的 因為Set不保存重復元素 加入Set的Object必須定義equals()方法以確保對象的唯一性 Set與Collection有完全一樣的介面 Set介面不保證維護元素的次序
HashSet: 為快速查找而設計的Set 存入HashSet的對象必須定義hashCode()
TreeSet: 保持次序的Set 底層為樹結構 使用它可以從Set中提取有序的序列
LinkedHashSet: 具有HashSet的查詢速度 且內部使用鏈表維護元素的順序(插入的次序) 於是在使用迭代器遍歷Set時 結果會按元素插入的次序顯示
lishixin/Article/program/Java/hx/201311/26494
C. java里set list 為什麼能遍歷集合
list和set集合是java中最常見的兩種數據結構,都是Collection的子集,今天就簡單的說說他們兩者的遍歷以及相互轉化吧。
一、list的遍歷
有三種遍歷方法:
/**
* list的三種遍歷
* @author Owner
*
*/
public class ListTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("c");//可添加重復數據
//遍歷方法一 迭代器
for(Iterator<String> iterator = list.iterator();iterator.hasNext();){
String value = iterator.next();
System.out.println(value);
}
//遍歷方法二 超級for循環
for(String value : list){
System.out.println(value);
}
//遍歷方法三
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
分析一下這三種遍歷吧,第一種迭代器的遍歷,執行過程中會進行數據鎖定,性能上是安全的,效率較低;
第二種,是java新語法,增強型for循環,其中內部也是調用了迭代器;
第三種,直接使用取數組的方式,效率最快,但會有多線程安全問題。
原理如下:
ArrayList底層是採用數組來保存數據的,對於訪問數組里的數據來說,直接採用數組索引當然是最快的了,相當於直接從內存讀取數據,其他的兩種迭代方式,實際上都是一種,即iterator,foreach包裝了一下;iterator遍歷最終還是要通過索引來訪問數據,源碼中對應的get方法了。
Set的遍歷和List類似,由於set沒有get方法,所有第三種是不可以的;
總結:綜合考慮使用第二種,增強型for循環就可以
二、List和Set相互轉化:
這個需求一般也不多,直接上代碼吧:
/**
* List和Set的轉化(Set轉化成List)
*/
public static <T> List<T> SetToList(Set<T> set) {
List<T> list = new ArrayList<>();
list.addAll(set);
return list;
}
使用泛型實現。不過值得注意的是,list轉化成set會丟失數據,重復數據會丟失。