二、Java集合接口,學習目標:a.理解Java集合框架 b.熟練使用java.util包中的相關類於接口進行編程開發 c.改善程序性能,今後進行程序編寫時將大量使用集合類與相關接口
Set:HashSe和TreeSet
HashSet:
1)當使用HashSet時,hashCode()方法就會得到調用,判斷已經存儲在集合中的對象的hashCode值是否與增加對象的hashCode值一致;如果不一致,就直接放入HashSet中;如果一致,再進行equals方法比較,equals方法如果返回true,表示對象已經加進去了,就不會再增加新的對象,否則加進去。
2)如果我們重寫equals方法,那麼也要重寫hashCode方法,反之亦然。
這裏有一個問題需要注意:如果需要把一個對象放入HashSet中,如果重寫該對象對應類的equals方法,也應該重寫其hashCode方法,其規則是:
①如果這兩個對象通過equals方法比較返回true,兩個對象的hashCode方法返回值也應該相同;
②如果兩個對象通過equals方法比較返回ture,但這兩個對象的hashCode方法返回不同的值,這將導致HashSet將會把這兩個對象保存在HashSet中的不同位置;
③如果兩個對象hashCode方法返回值相同,但通過equals比較返回爲false時將更麻煩:因爲兩個對象的hashCode值相同,HashSet試圖將他們保存在同一位置,但實際上又不行(否則只剩下一個對象),所以處理起來比較複雜;而且HashSet訪問集合元素時也是根據元素的hashCode值來訪問的,如果HashSet中包含兩個元素有相同hashCode值,將會導致性能下降。
注意:如果需要某個類的對象保存到HashSet集合中,重寫這個類的equal()方法和hashCode()方法時,應儘量保證兩個對象equals比較返回爲true時,他們的hashCode返回值也相等。
3)例題:有一個Person類(有個name(String類型)屬性),如果Person的對象的名字相同,就不能加到HashCode當中
public class People
{
String name;
public People(String name)
{
this.name = name;
}
public boolean equals(Object obj)
{
if(this == obj)
{
return true;
}
if(obj instanceof People)
{
People people = (People)obj;
return this.name.equals(people.name);
}
return false;
}
public int hashCode()
{
return this.name.hashCode();
}
}
4)iterator迭代器用法
//iterator迭代器僅用於遍歷集合,當使用Iterator對集合元素進行迭代時,Iterator並不是把集合元素本身傳給了迭代變量,而是把集合元素的值傳給了迭代變量,所以修改迭代變量的值對集合元素本身沒有任何改變
HashSet set = new HashSet();
Iterator iter = set.iterator();
while(iter.hasNext())
{
String value = (String)iter.next();
System.out.println(value);
}
使用foreach方法遍歷集合 //foreach循環中的迭代變量也不是集合元素本身,系統只是依次把集合元素的值賦給迭代變量,因此在foreach中修改迭代變量的值沒有任何意義
TreeSet:
1)實現自己的Comparator:自定義排序規則
按學生的成績升序排列:
public class TreeSetTest implements Comparator
{
public int compare(Object o1, Object o2)
{
Student s1 = (Student)o1;
Student s2 = (Student)o2;
if(s1.score > s2.score)
{
return 1; //return -1 降序排列
}
else if(s1.score == s2.score)
{
return 0;
}
return -1; //return 1 降序排列
}
public static void main(String[] args)
{
TreeSetTest test = new TreeSetTest();
TreeSet tree = new TreeSet(test);
Student s1 = new Student(10);
Student s2 = new Student(20);
Student s3 = new Student(30);
Student s4 = new Student(40);
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
System.out.println(tree);
}
}
*Arrays類用來輔助數組用的,Collections類用來輔助集合的,用的時候再學
三、Map(映射)詳解
1)Map的keySet()方法會返回key的集合,因爲Map的鍵值是不能重複的,因此keySet()方法的返回類型是Set;而Mpa的值是可以重複的,因此values()方法的返回類型是Collection,可以容納重複的元素。
2)HashMap的兩種遍歷方式:
①HashMap map = new HashMap();
map.put("1","zhangsan");
map.put("2","lisi");
map.put("3","wangwu");
map.put("4","maliu");
Set set = map.keySet();
for(Iterator iter = set.iterator(); iter.hasNext();)
{
String key = (String)iter.next();
String value = (String)map.get(key);
System.out.println(key + " : " + value);
}
② HashMap map = new HashMap();
map.put("1","zhangsan");
map.put("2","lisi");
map.put("3","wangwu");
map.put("4","maliu");
Set set = map.entrySet();
for(Iterator iter = set.iterator(); iter.hasNext();)
{
Map.Entry entry = (Map.Entry)iter.next();
String value = (String)entry.getValue();
String key = (String)entry.getKey();
System.out.println(key + ":" + value);
}
3)用TreeMap實現下面例題:隨機生成50個數字(整數),每個數字的範圍是[10,50],統計每個數字出現的次數以及出現次數最多的數字與它的個數,最後將每個數字及其出現次數打印出來,如果某個數字出現次數爲0,則不需要打印它,打印時按照數字的降序排列。
package com.xy3;
import java.util.Comparator;
public class TestComparator implements Comparator
{
public int compare(Object o1, Object o2)
{
Integer t1 = (Integer)o1;
Integer t2 = (Integer)o2;
return -(t1.intValue() - t2.intValue());
}
}
package com.xy3;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Test
{
public static void main(String[] args)
{
Map map = new TreeMap(new TestComparator());
for(int i = 0; i < 50; i++)
{
int number = (int)(Math.random() * 41 + 10);
Integer in = new Integer(number);
if(map.get(in) == null)
{
map.put(in, new Integer(1));
}
else
{
Integer value = (Integer)map.get(in);
value = new Integer(value.intValue() + 1);
map.put(in, value);
}
}
Set set = map.entrySet();
for(Iterator iter = set.iterator(); iter.hasNext(); )
{
Map.Entry entry = (Map.Entry)iter.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println(key.toString() + "出現次數:" + value.toString());
}
Integer max = (Integer)Collections.max(map.values());
System.out.println("出現次數最多:" + max.intValue());
for(Iterator iter = set.iterator(); iter.hasNext(); )
{
Map.Entry entry = (Map.Entry)iter.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
if(value.intValue() == max.intValue())
{
System.out.println(key.toString());
}
}
}
}