asp.net+Android+IOS開發 、Net培訓、期待與您交流!
(前言:本篇文章主要依據畢向東老師的課程視頻整理而成,如要詳細學習,請觀看畢老師視頻 百度網盤鏈接地址:http://pan.baidu.com/s/1o6mwDzO)
目錄:1、集合概述 2、Collection、Iterator接口 3、List接口與其ArrayList、LinkedList、Vector子類 4、Set接口及其HashSet、TreeSet子類
1、集合概述
下圖為JDK中集合的框架設計圖,我們主要使用的集合為黑色方框中的四種集合。
數組和集合的不同:集合中對象數量不定,而數組中對象數量必須是確定的。
ArrayList 底層數據存儲結構是數組結構 特點:查詢速度快,增刪稍慢,線程不同步
LinkedList 底層數據結構是鏈表結構 特點:查詢稍慢,增刪快
Vector 底層是數組數據結構 特點:都很慢,線程同步,出現最早,已經被ArrayList替代了現在很少用
Set 集合中的元素是無序的(存入和取出的順序不一定一致),元素不可以重復。
HashSet 底層數據結構是hash表
TreeSet 底層數據結構是二叉樹/紅黑樹
2、Collection、Iterator接口
迭代器 Iterator 是為了方便集合操作元素而定義。而且專門為List集合定義了特有的迭代器ListIterator(為Iterator接口的子接口)
注意:使用迭代器時,不可以再通過集合對象的方法操作集合中的對象,會發生ConcurrentModification異常。
兩個基本接口中的方法很重要
代碼演示了Collection方法的使用以及遍歷的操作方式(例子很普通,主要看下遍歷的操作方法)
1 public class CollectionTest { 2 public static void main(String[] args) { 3 List d=new ArrayList();//新建集合、向集合中添加對象 4 d.add("jake"); 5 d.add("alean"); 6 d.add("sam"); 7 iteratorTest(d); 8 } 9 //如何使用ListIterator進行遍歷操作對象10 public static void iteratorTest(List c){11 ListIterator it=c.listIterator();12 while(it.hasNext()){13 //ListIterator中添加14 if(it.next()!=null){ 15 it.add("nanjing");16 }17 // ListIterator中修改18 // if(it.next()=="jake"){19 // it.set("beokj");20 // } 21 }22 System.out.PRintln(c);23 }24 //collection接口方法使用25 public static void collectionMethods(){26 Collection c=new ArrayList();27 Collection d=new ArrayList();28 //增加29 d.add("jake"); d.add("alean");d.add("sam");30 c.addAll(d);31 //刪除32 //c.remove("jake");33 //c.removeAll(c);34 //c.clear();35 System.out.println(c.isEmpty());36 System.out.println(c+":size="+c.size());37 }38 }
3、List接口與其ArrayList、LinkedList、Vector子類
ArrayList中涉及到比較集合中對象是否相同中用到的底層方法是集合中對象的equals()方法
LinkedList中的方法 JDK1.6以后出現了替代getFirst()/getLast()/removeFirst()/removeLast()方法的
offerFirst/offerLast/peekFirst()/peekLast()新方法,新方法的優勢是集合中沒有元素了不會出現NoSuchElementException異常
Vector 有特有的枚舉方式取數據。其實枚舉和迭代是一樣的,枚舉的名稱和方法名稱過長,所以被迭代器取代了,僅做了解
ArrayList 演示代碼(除去集合中的重復對象)
1 public class ArrayListDemo { 2 3 public static void main(String[] args) { 4 //新建一個ArrayList類型集合,向其中添加Person對象 5 ArrayList al=new ArrayList(); 6 al.add(new Person("jack",12)); 7 al.add(new Person("jack",12)); 8 al.add(new Person("jack",11)); 9 al.add(new Person("jack2",12));10 al.add(new Person("jack",12));
//除去al集合中的相同對象,打印結果11 System.out.println(singleElement(al));12 }13 //刪除ArrayList集合中重復的元素14 public static ArrayList singleElement(ArrayList arrays){15 ArrayList al=new ArrayList(); 16 Iterator ite=arrays.iterator();17 //通過while循環,在其中用ArrayList的contains方法判斷是否重復18 while(ite.hasNext()){19 Object obj=ite.next();20 if(!al.contains(obj))21 al.add(obj);22 }23 return al;24 }25 26 }27 //Person類28 class Person{29 private String name;30 private int age;31 //共有全參構造方法32 public Person(String name, int age) {33 super();34 this.name = name;35 this.age = age;36 }37 public String getName() {38 return name;39 }40 public void setName(String name) {41 this.name = name;42 }43 public int getAge() {44 return age;45 }46 public void setAge(int age) {47 this.age = age;48 }49 //重寫equals方法,自定義比較的依據,這里我們定義對象的姓名、年齡都相同時,對象才相等50 public boolean equals(Object obj) {51 Person per=(Person)obj; 52 if(!(obj instanceof Person)) 53 return false;54 else 55 return per.name.equals(name) && per.age==age;56 }57 //重寫toString方法,便于查看程序的運行結果58 public String toString() {59 return name+"::"+age;60 }61 62 }
LinkedList示例代碼(用LinkedList模擬堆棧(先進后出)和隊列(先進先出)數據結構)
1 public class LinkedListDemo { 2 public static void main(String[] args) { 3 4 Queue queue=new Queue(); 5 queue.set("紅"); 6 queue.set("黃"); 7 queue.set("藍"); 8 queue.set("紫"); 9 10 while(!queue.isNull()){11 System.out.println(queue.get());12 }13 }14 }15 //模擬隊列,先進先出16 class Queue{17 private LinkedList ll;18 public Queue(){19 ll=new LinkedList();20 }21 public Object get(){22 return ll.removeFirst();23 }24 public void set(Object obj){25 ll.addLast(obj);26 }27 public boolean isNull(){28 return ll.isEmpty();29 }30 }31 //模擬堆棧-先進后出32 class Stack{33 private LinkedList ll;34 public Stack(){35 ll=new LinkedList();36 }37 public Object get(){38 return ll.removeLast();39 }40 public void set(Object obj){41 ll.addLast(obj);42 }43 public boolean isNull(){44 return ll.isEmpty();45 }46 }
4、Set接口及其HashSet、TreeSet子類
HashSet 中比較的底層原理 : 先調用hashcode方法判斷對象hash值是否相同,若相同,再調用對象那個的equels()方法,判斷對象是否相同
實際開發中,新建集合中的對象時,都要重寫對象的hashcode和equals方法
TreeSet : 可以對TreeSet集合中的元素進行自然排序。
第一種排序方式:比較原理是在集合元素中實現CompareTo接口
第二種排序方式:當元素自身不具備比較性時,可讓集合具有比較性。方法:定義比較器(即實現了Comparator接口的類),將比較器對象作為參數傳遞給TreeSet集合的構造函數。
總結:兩種方式中,第二種方式基于接口編程,拓展性好,比較常用。如果兩種排序方式同時存在,系統使用第二種方式
HashSet集合的代碼示例
1 public class HashSetDemo{ 2 3 public static void main(String[] args) { 4 5 HashSet hs=new HashSet(); 6 hs.add(new Persons("Tom1",24)); 7 hs.add(new Persons("Tom1",25)); 8 hs.add(new Persons("Tom1",24)); 9 //遍歷器來查詢集合中對象10 Iterator ite=hs.iterator();11 while(ite.hasNext())12 System.out.println(ite.next());13 }14 }15 //Person類16 class Persons{17 private String name;18 private int age;19 //共有全參構造方法20 public Persons(String name, int age) {21 super();22 this.name = name;23 this.age = age;24 }25 public String getName() {26 return name;27 }28 public void setName(String name) {29 this.name = name;30 }31 public int getAge() {32 return age;33 }34 public void setAge(int age) {35 this.age = age;36 }37 //重寫hashCode方法,自己定義判斷38 public int hashCode(){39 return name.hashCode()+age;40 }41 //重寫equals方法,自定義比較的依據,這里我們定義對象的姓名、年齡都相同時,對象才相等42 public boolean equals(Object obj) {43 Persons per=(Persons)obj; 44 if(!(obj instanceof Persons)) 45 return false;46 else 47 return per.name.equals(name) && per.age==age;48 }49 //重寫toString方法,便于查看程序的運行結果50 public String toString() {51 return name+"::"+age;52 } 53 }
TreeSet代碼示例
同時實現了兩種排序方式。驗證了兩種排序方式共存是,系統采用何種方式
1 public class TreeSetDemo { 2 //兩種比較方式共存,系統采用比較器的比較方式 3 public static void main(String[] args) { 4 5 TreeSet ts=new TreeSet(new comparator()); 6 ts.add(new Persont("bbama1",22)); 7 ts.add(new Persont("abama3",22)); 8 ts.add(new Persont("abama2",24)); 9 ts.add(new Persont("abama3",21));10 11 Iterator ite=ts.iterator();12 while(ite.hasNext()){13 System.out.println(ite.next());14 }15 }16 17 }18 //實現比較器,規定元素按照姓名排序,姓名相同的按年齡排序19 class comparator implements Comparator{20 @Override21 public int compare(Object o1, Object o2) {22 Persont p1=(Persont)o1;23 Persont p2=(Persont)o2;24 int i=p1.getName().compareTo(p2.getName());25 if(i==0)26 return p1.getAge()-p2.getAge();27 else return i;28 } 29 }30 //Person類,規定元素按照年齡排序,年齡相同的按姓名排序31 class Persont implements Comparable<Persont>{32 private String name;33 private int age;34 //共有全參構造方法35 public Persont(String name, int age) {36 super();37 this.name = name;38 this.age = age;39 }40 public String getName() {41 return name;42 }43 public void setName(String name) {44 this.name = name;45 }46 public int getAge() {47 return age;48 }49 public void setAge(int age) {50 this.age = age;51 }52 53 //重寫toString方法,便于查看程序的運行結果54 public String toString() {55 return name+"::"+age;56 }57 @Override58 public int compareTo(Persont per) {59 if(age>per.age)60 return 1;61 if(age==per.age){62 return name.compareTo(per.name);63 } 64 else65 return -1;66 } 67 }
初學者難免錯誤,歡迎評判指教,持續更正ing...........
ASP.Net+Android+IOS開發 、Net培訓、期待與您交流!
新聞熱點
疑難解答