寫在前面:
我也是一名java語言的愛好者,僅以此文作爲學習的記錄,對於文中出現的代碼規範,代碼格式,算法效率等問題,希望各路大神不吝賜教,在下感激不盡。同是學習的同學也同樣希望互相交流,取長補短。
以下內容是學習《java編程思想》(《Thinking in Java》)的筆記,包括對習題的實現。
java容器類庫中的兩種主要類型:他們的區別在於容器中的每個“槽”保存的元素個數
1.Collection在每個槽中只能保存一個元素,此類容器包括
<1.1>list,它以特定的順序保存一組元素
<1.2>set, 元素不能重複
<1.3>Queue,只允許在容器的一端插入對象,並從另一端移除對象
2.Map在每個槽內保存了兩個對象,即鍵和與之關聯的值
在一個Collection中添加一組元素的方法。Arrays.asList()接受一個數組或是一個用逗號分隔的元素列表,並將其轉換爲一個List對象,
例如使用Collection構造器來初始化容器
Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
Collections.addAll()方法接受一個Collection對象,以及一個數組或是一個用逗號分隔的列表,將元素添加到Collection中
例如:
Collections.addAll(collection,11,12,13,14,15)
一.List
List承諾可以將元素維護在特定的序列中,List接口在Collection的基礎上添加了大量的方法,使得可以在List的中間插入和移除元素。
有兩種類型的List。(1)基本的ArrayList,它用於隨機訪問元素,但是在List的中間插入和移除元素較慢
(我嘗試了一下兩種對ArrayList的初始化方式,貌似結果沒有什麼區別:
public class test {
public static void main(String[] args){
List<Integer> list = new ArrayList<Integer>(Arrays.asList(1,2,3));
List<Integer> list2 = Arrays.asList(1,2,3);
System.out.println(list.getClass());
System.out.println(list2.getClass());
}
}
查詢api chm文檔,找到ArrayList的構造函數:
(2)LinkedList,它通過代價較低的在List中間進行插入和刪除操作,提供了優化的順序訪問,LinkedList在隨機訪問方面相對比較慢,但是它的特性集較ArrayList更大(這個特性集我沒搞懂是什麼意思?)
書上的例子是以導入的Pet類爲例子,而225頁的練習五,要求修改例子,使用Integer而不是Pet
代碼實現:
package ListContainer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class ListFeatures {
public static void main(String[] args){
Random random = new Random(5);
List<Integer> intLists = new ArrayList<Integer>(Arrays.asList(40,20,3,4,5,6,7,8));//構造一個集合
System.out.println("1: "+intLists);
Integer i = new Integer(10);
intLists.add(i);
System.out.println("2: "+intLists);
System.out.println("3: "+intLists.contains(i));
intLists.remove(i);//去掉元素i
Integer i2 = intLists.get(2);
System.out.println("4: "+i2+" "+intLists.indexOf(i2));
Integer i3 = new Integer(5);
System.out.println("5: "+intLists.indexOf(i3));
System.out.println("6: "+intLists.remove(i3));
System.out.println("7: "+intLists.remove(i2));
System.out.println("8: "+intLists);
intLists.add(3,new Integer(19));
System.out.println("9: "+intLists);
List<Integer> sub = intLists.subList(1, 4);
System.out.println("subList: "+sub);
System.out.println("10: "+intLists.containsAll(sub));
Collections.sort(sub);
System.out.println("sorted subList: "+sub);
System.out.println("11: "+intLists.containsAll(sub));
Collections.shuffle(sub,random);
System.out.println("shuffle subList: "+sub);
System.out.println("12: "+intLists.containsAll(sub));
List<Integer> copy = new ArrayList<Integer>(intLists);
sub = Arrays.asList(intLists.get(1),intLists.get(4));
System.out.println("sub: "+sub);
copy.retainAll(sub);//交集操作,保留所有copy與sub相同的元素,這樣子看來應該還是sub
System.out.println("13: "+copy);
copy = new ArrayList<Integer>(intLists);
copy.remove(2);
System.out.println("14: "+copy);
copy.removeAll(sub);//移除sub的元素
System.out.println("15: "+copy);
copy.set(1, 99);//和之前的add方法不同的是,add是在這個位置增加一個元素,而set方法是在指定位置Replace an element
System.out.println("16: "+copy);
copy.addAll(sub);//再把sub添加回來
System.out.println("17: "+copy);
System.out.println("18: "+intLists.isEmpty());//判斷是否爲空
intLists.clear();//清空容器
System.out.println("19: "+intLists);
System.out.println("20: "+intLists.isEmpty());
intLists.addAll(Arrays.asList(6,5,4,3,2,1));
System.out.println("21: "+intLists);
Object[] o = intLists.toArray();
System.out.println("22: "+o[3]);
Integer[] array = intLists.toArray(new Integer[0]);//toArray方法,作用是把任意的Collection轉換成一個數組,無參的時候返回一個Object類型的數組,有參數的時轉爲與參數同類型的數組,(假如這個參數(數組)能通過參數類型檢查)
System.out.println("23: "+array[3]);
}
}
實現結果:
關於java.util.Random這個類,構造函數中Random()包括無參和有參Random(seed),有參構造方法的種子有何作用 在另一篇文章中有說明
List的兩種實現方式ArrayList和LinkedList,顧名思義一個底層爲數組,另一個底層爲鏈表。
具體的區別,點擊這篇文章http://blog.csdn.net/qq_37935670/article/details/79594159