Java(2012/2/1)

一、Java Collection體系和Map體系:

 

 

二、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());
     }

 }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章