Day14
08 LinkedList
09 LinkedList練習
10 ArrayList練習
11 ArrayList練習2
12 HashSet
13 HashSet存儲自定義對象
14 HashSet判斷和刪除的依據
08 LinkedList
LinkedList特有的方法:
addFirst() addLast()
getFirst() getLast()
獲取元素,但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException。
removeFirst() removeLast()
獲取元素,並刪除元素。如果集合中沒有元素,會出現NoSuchElementException。
在JDK1.6中出現了替代方法。
offerFirst() offerLast()
peekFirst() peekLast()
獲取元素,但不刪除元素。如果集合中沒有元素,會返回null.
pollFirst() pollLast()
獲取元素,並刪除元素。如果集合中沒有元素,會返回null。
09 LinkedList練習
使用LinkedList模擬堆棧或者隊列的數據結構
堆棧:先進後出
隊列:先進先出
1 import java.util.*; 2 class myQueue 3 { 4 private LinkedList link; 5 public myQueue() 6 { 7 link=new LinkedList(); 8 } 9 10 public void myAdd(Object obj) 11 { 12 link.addFirst(obj); 13 } 14 public Object myGet() 15 { 16 return link.removeLast(); 17 } 18 public boolean isNull() 19 { 20 return link.isEmpty(); 21 } 22 } 23 class LinkedListTest 24 { 25 public static void main(String[] args) 26 { 27 myQueue q=new myQueue(); 28 q.myAdd("java01"); 29 q.myAdd("java02"); 30 q.myAdd("java03"); 31 q.myAdd("java04"); 32 33 while(!q.isNull()) 34 { 35 System.out.println(q.myGet()); 36 } 37 38 39 } 40 } View Code
10 ArrayList練習
去掉ArrayList中的重復元素
基本思想:拿一個新的容器,分別取出原ArrayList中的元素,每拿一個便檢查新容器中有沒有與之相同的元素。
如果有,就把此元素丟掉,如果沒有,就把此元素放到新容器中。遍歷完成後,新容器中就是原ArrayList去掉重復元素後的結果了。
1 //去掉ArrayList中的重復元素 2 import java.util.*; 3 class ArrayListTest 4 { 5 public static ArrayList singleElement(ArrayList al) 6 { 7 ArrayList newAl=new ArrayList(); 8 Iterator it=al.iterator(); 9 while(it.hasNext()) 10 { 11 Object obj=it.next(); 12 if(!newAl.contains(obj)) 13 { 14 newAl.add(obj); 15 16 } 17 } 18 /* 19 注意,循環中只能調用一次next,就用hasNext判斷一次, 20 否則,會出現錯誤。 21 while(it.hasNext()) 22 { 23 sop(it.next()+"......"+it.next()); 24 } 25 */ 26 return newAl; 27 28 } 29 public static void sop(Object obj) 30 { 31 System.out.println(obj); 32 } 33 public static void main(String[] args) 34 { 35 ArrayList al=new ArrayList(); 36 al.add("java01"); 37 al.add("java03"); 38 al.add("java01"); 39 al.add("java03"); 40 al.add("java01"); 41 al.add("java02"); 42 sop(al); 43 44 45 sop(singleElement(al)); 46 47 } 48 } View Code
11 ArrayList練習2
將自定義對象作為元素存到ArrayList集合中,並去除重復元素
比如,存入人對象,同姓名同年齡,視為同一個人,為重復元素
思路:
1.對人描述,將數據封裝進人對象。(姓名、年齡都相同的視為同一個人)
2.定義容器,將人存入
3.取出
List集合判斷元素是否相同,依據的是元素的equals方法。
1 import java.util.*; 2 class Person 3 { 4 private String name; 5 private int age; 6 public Person(String name,int age) 7 { 8 this.name=name; 9 this.age=age; 10 } 11 public String getName() 12 {return name;} 13 public int getAge() 14 {return age;} 15 //重寫父類的equals方法 16 public boolean equals(Object obj) 17 { 18 if(! (obj instanceof Person)) 19 return false; 20 Person p=(Person)obj; 21 System.out.println(this.name+"..."+p.name);//輸出語句,顯示equals的調用過程 22 //此語句中調用的是String 中的equals方法 23 return this.name.equals(p.name) && this.age==p.age; 24 25 26 } 27 } 28 29 30 class ArrayListTest2 31 { 32 public static void sop(Object obj) 33 { 34 System.out.println(obj); 35 } 36 public static ArrayList singleElement(ArrayList al) 37 { 38 ArrayList newAl=new ArrayList(); 39 Iterator it=al.iterator(); 40 while(it.hasNext()) 41 { 42 Object obj=it.next(); 43 //contains底層調用的是對象的equals方法 44 //但是原equals方法比較的是對象的地址 45 //並不知道,我們想要的比較方法 46 //所以,要在Person類中重寫父類的equals方法 47 if(!newAl.contains(obj)) 48 { 49 newAl.add(obj); 50 } 51 } 52 return newAl; 53 54 55 } 56 public static void main(String[] args) 57 { 58 ArrayList al=new ArrayList(); 59 al.add(new Person("java01",12));//al.add(Object obj) //Object obj=new Person("java01",12) 60 al.add(new Person("java02",22)); 61 al.add(new Person("java01",32)); 62 al.add(new Person("java03",22)); 63 al.add(new Person("java02",22)); 64 65 //如果注釋掉重寫的equals方法,remove的調用結果就是false,即找不到要移除的對象 66 //這說明remove底層調用的也是對象的equals方法。 67 sop("remove:"+al.remove(new Person("java03",22))); 68 69 al=singleElement(al); 70 71 Iterator it=al.iterator(); 72 while(it.hasNext()) 73 { 74 Person p=(Person)it.next(); 75 sop(p.getName()+"----"+p.getAge()); 76 77 } 78 79 80 } 81 } View Code
12 HashSet
|--Set:元素是無序的(存入和取出的順序不一定一致),元素不可以重復。
|--HashSet:底層的數據結構是哈希表
|--TreeSet:
Set集合的功能和Collection是一致的。
13 HashSet存儲自定義對象
HashSet是如何保證唯一性的呢?
是通過元素的兩個方法,hashCode和equals
如果元素的hashCode值相同,才會判斷equals是否為true
如果元素的hashCode不同,直接存入,不會調用equals。
在項目中,描述一個類,並且需要把它的對象裝入集合時,一般都需要復寫該類的hashCode方法和equals方法。
因為,原有的方法不能比較我們需要比較的內容。
1 /* 2 對象存入HashSet,先調用自己的hashCode方法計算哈希值,看哈希表中是否有和自己哈希值相同的元素 3 如果哈希值相同,再調用對象的equals方法來比較, 4 如果結果仍然相同,就不會存入Hashset; 5 如果不同就在哈希值相同的元素後,順延一個位置存入。 6 */ 7 import java.util.*; 8 class HashSetTest 9 { 10 public static void main(String[] args) 11 { 12 HashSet hs=new HashSet(); 13 hs.add(new Person("a1",11)); 14 hs.add(new Person("a2",12)); 15 hs.add(new Person("a2",12)); 16 hs.add(new Person("a1",13)); 17 hs.add(new Person("a3",11)); 18 19 Iterator it=hs.iterator(); 20 while(it.hasNext()) 21 { 22 Person p=(Person)it.next(); 23 sop(p.getName()+"::"+p.getAge()); 24 } 25 26 } 27 public static void sop(Object obj) 28 { 29 System.out.println(obj); 30 } 31 } 32 class Person 33 { 34 private String name; 35 private int age; 36 public int hashCode() 37 { 38 //return 60; 39 //為了避免再調用對象的equals方法進行比較,應該盡量使對象的hashCode值不同 40 return name.hashCode()+age*39; 41 42 } 43 public Person(String name,int age) 44 { 45 this.name=name; 46 this.age=age; 47 } 48 public String getName() 49 {return name;} 50 public int getAge() 51 {return age;} 52 //重寫父類的equals方法 53 public boolean equals(Object obj) 54 { 55 if(! (obj instanceof Person)) 56 return false; 57 Person p=(Person)obj; 58 System.out.println(this.name+"...equals..."+p.name);//輸出語句,顯示equals的調用過程 59 //此語句中調用的是String 中的equals方法 60 return this.name.equals(p.name) && this.age==p.age; 61 62 63 } 64 } View Code
14 HashSet判斷和刪除的依據
注意,對於hashSet判斷元素是否存在(contains()方法)或者刪除元素(remove()方法)依賴的方法是HashCode和equals方法。
如果,hashCode值不同,直接可知道該元素不存在;
如果相同,再用equals方法判斷。