哇,這一章真的是好混亂啊。 首先,要弄明白這些類的層次關(guān)系,層次關(guān)系錯綜復(fù)雜,只要知道主要的就好,去看jdk文檔趴。 這一章的目的主要熟悉各種接口,為后面的內(nèi)容做鋪墊。 一、Collection接口Collection接口是List、Queue、Set接口的基類。他們分別有不同的抽象類實現(xiàn),AbstracCollection類是AbstractList類、AbstractQueue類、AbstractSet類的基類。 一、List? ?共同特點:按照被插入的順序保存元素 1.ArrayList特點:①由數(shù)組實現(xiàn)擅長于隨機(jī)訪問,但是插入刪除元素較慢 ? (1)列表初始化方法: 每個Collection類型的類都有默認(rèn)構(gòu)造函數(shù)和參數(shù)為Collection的構(gòu)造函數(shù)兩種 ? ![]() import java.util.*; //初始化列表的三種方式 public class AddingGroups { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Integer> l = new ArrayList<Integer>(); Integer[] moreInts = {6,7,8,9,10}; //第一種使用Collections類提供的靜態(tài)方法是首選的方式 Collections.addAll(l, 1,2,3,4,5); Collections.addAll(l, moreInts); System.out.println("第一種方式Collections.addAll():" l); //第二種使用Arrays類的asList()方法,此方法由數(shù)組實現(xiàn)返回一個固定大小列表,不可增改 //因此常包裝在容器中使用 ArrayList<Integer> l1 = new ArrayList<Integer>(Arrays.<Integer>asList(11,12,13,14,15)); System.out.println("第二方式Arrays.asList():" l1); //第三種方式容器自身的方法 l.addAll(l); System.out.println("第三種方式:" l); } }View Code ? 輸出: 第一種方式Collections.addAll():[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ? (2)ArrayList方法舉例 Pet類對象都被定義為唯一的,任何兩個Pet對象equals()的結(jié)果都是false,在equals()方法中可以定義判斷兩個對象相等的標(biāo)準(zhǔn)。 判斷一個元素是否屬于List,返回元素索引,刪除元素等操作都會用到equals()方法,所以這些隨著equals()方法實現(xiàn)的不同,便會有不同的效果。 ? ![]() import java.util.*; import typeinfo.pets.*; //ArrayList方法應(yīng)用舉例 public class ArrayListMethod2 { public static void main(String[] args) { // TODO Auto-generated method stub ArrayList<Pet> l = Pets.arrayList(10); Rat r = new Rat(); System.out.println("[1]: " l); //在數(shù)組列表末尾增加一個對象 l.add(r); System.out.println("[2]: " l); //在2位置插入一個對象 l.add(2, new Pug()); System.out.println("[3]: " l); //刪除對象r l.remove(r); System.out.println("[4]: " l); //刪除位置2處的元素 l.remove(2); System.out.println("[5]: " l); //清空列表 l.clear(); System.out.println("[6]: " l); //將列表l1中元素加入到l中 ArrayList<Pet> l1 = Pets.arrayList(7); l.addAll(l1); System.out.println("[7]: " l); //在l列表3位置插入l l.addAll(3, l); System.out.println("[8]: " l); //打印列表大小 System.out.println("[9]: size " l.size()); //修改列表元素 l.clear(); l.addAll(l1); l.set(0, new Manx()); System.out.println("[10]: " l); //查看列表是否為空 System.out.println("[11]: isEmpty " l.isEmpty()); //根據(jù)索引返回元素 Pet p = l.get(2); System.out.println("[12]: " p); //獲得元素索引 System.out.println("[13]: indexOf " l.indexOf(p)); //判斷是否包含 System.out.println("[14]: " l.contains(p)); //返回一個含有列表所有元素的數(shù)組 Object[] o = l.toArray(); System.out.println("[15]: " o[3]); } }View Code ? 2.LinkedList特點:①由鏈表實現(xiàn)善于增刪數(shù)據(jù) ?、趯崿F(xiàn)了棧、隊列、雙端隊列的方法,可直接作為棧、隊列、雙端隊列使用 ? 實例一:Stack的基本用法 ? import typeinfo.pets.*; import java.util.*; public class StackLinkedList { public static void main(String[] args) { // TODO Auto-generated method stub LinkedList<Pet> stack = new LinkedList<Pet>(Pets.arrayList(6)); System.out.println("[1]: " stack); Rat r = new Rat(); stack.push(r); System.out.println("[2]: " stack); stack.pop(); stack.pop(); System.out.println("[3]: " stack); } } ? 結(jié)果: ? 實例二:Queue的基本用法 ? ![]() public class QueueLinkedList { public static void printQ(Queue q) { while(q.peek() != null) { System.out.print(q.remove() " "); } System.out.println(); } public static void main(String[] args) { // TODO Auto-generated method stub Random rand = new Random(); Queue<Integer> queue = new LinkedList<Integer>(); for(int i = 0; i < 8; i ) { queue.offer(rand.nextInt(i 10)); } printQ(queue); Queue<Character> qc = new LinkedList<Character>(); for(Character c : "haohao".toCharArray()) { qc.offer(c); } printQ(qc); } }View Code ?輸出: ?2 9 6 6 11 13 12 11 ? 實例三:PriorityQueue的基本用法 ?按照Integer、Character、String的內(nèi)建自然順序排序 ![]() import java.util.*; public class PriorityQueueList { public static void main(String[] args) { // TODO Auto-generated method stub PriorityQueue<Integer> pq = new PriorityQueue<Integer>(); Random rand = new Random(); for(int i = 0; i < 10; i ) { pq.offer(rand.nextInt(i 10)); } QueueLinkedList.printQ(pq); List<Integer> l = Arrays.asList(2,4,3,1,5,10); pq = new PriorityQueue<Integer>(l); QueueLinkedList.printQ(pq); PriorityQueue<Integer> pq1 = new PriorityQueue<Integer>(10, Collections.reverseOrder()); pq1.addAll(l); QueueLinkedList.printQ(pq1); } }View Code ? 二、Set?共同特點:①不保存重復(fù)元素 ②善于查找,基于對象值 1.HashSet?特點:①基于Hash表散列函數(shù)實現(xiàn),存儲元素?zé)o序 ②專門對快速查找進(jìn)行了優(yōu)化 ? 2.LinkedHashSet?特點:①基于Hash表散列函數(shù)實現(xiàn),看起來卻像使用鏈表維護(hù) ?、谑荋ashSet的子類 3.TreeSet?特點:①基于紅黑樹實現(xiàn),會對存儲元素進(jìn)行排序 ? ![]() import java.util.*; public class SetMethod { public static void main(String[] args) { // TODO Auto-generated method stub Set<Integer> s = new HashSet<Integer>(Arrays.asList(3,1,2,5,6,7,4)); System.out.println("[1]: " s); s.add(8); System.out.println("[2]: " s); Set<Integer> s1 = new HashSet<Integer>(Arrays.asList(5,4,3,2,1)); System.out.println("[3]: " s1); System.out.println("[4]: " s.containsAll(s1)); System.out.println("[5]: " Arrays.asList(3,1,2,5,6,7,4)); } }View Code ? ?結(jié)果: ? ?這個結(jié)果咋是有序的嘞,正所謂“懸之又懸,妙不可言”,有點復(fù)雜 哈哈 以后再說。 三、Map?Map和Set情況差不多,不過Map四基于鍵值對的 實例: ? ![]() import java.util.*; import typeinfo.pets.*; public class MapBase { public static void main(String[] args) { // TODO Auto-generated method stub Map<String, Pet> m = new HashMap<String, Pet>(); m.put("My Rat", new Rat("honghong")); m.put("My ManX", new Manx()); m.put("My Pug", new Pug()); System.out.println(m); Pet p = m.get("My Rat"); System.out.println(p); System.out.println(m.containsKey("My Pug")); System.out.println(m.containsValue(p)); } }View Code ? 結(jié)果: |
|