1. 程式人生 > >Set、List、Map(lesson8)

Set、List、Map(lesson8)

/*2、設計一個User類,保護三個基本私有屬性 : String id; String name;String gender; 以及三個屬性的setter與getter方法,重寫類的toStrng方法,toString方法輸出物件的所有屬性。User類的例項根據以 id 作為唯標識。 編寫一個TestUser類,使用for迴圈建立 50個User物件,建立使用者物件時,使用 "emp"+r.nextInt(50) 產生使用者的id, gender為String[] genders {"男","女"}中的任意一個和name 值為"emp"+i 隨意(i為迴圈化量), 分別把使用者存入到 ArrayList ,HashSet,以及HashMap中,分別使用 在for迴圈,增強for迴圈, 迭代器 輸出Arraylist,HashSet,HashMap中的值,輸出集合中使用者的屬性資訊, 檢查你的程式是否正確(輸出的使用者中是否存在id相同的使用者)。*/

User

lesson8;

public class User{     private String id;     private String name;     private String gender;     public User() {}     public User(String id,String name,String gender) {         this.id=id;         this.name=name;         this.gender=gender;     }          public String getId() {         return id;     }     public void setId(String id) {         this.id = id;     }     public String getName() {         return name;     }     public void setName(String name) {         this.name = name;     }     public String getGender() {         return gender;     }     public void setGender(String gender) {         this.gender = gender;     }

//因為id作為唯一標識,所以用了hashcode和equals     @Override     public int hashCode() {         final int prime = 31;         int result = 1;         result = prime * result + ((id == null) ? 0 : id.hashCode());         return result;     }     @Override     public boolean equals(Object obj) {         if (this == obj)             return true;         if (obj == null)             return false;         if (getClass() != obj.getClass())             return false;         User other = (User) obj;         if (id == null) {             if (other.id != null)                 return false;         } else if (!id.equals(other.id))             return false;         return true;     }     @Override     public String toString() {         return "User [id=" + id + ", name=" + name + ", gender=" + gender + "]";     }     //為什麼要用say呢???

    public void say(){

//為什麼要say呢 不可以直接tostring嗎,因為面向物件,更加友好         System.out.println(this.toString());     } }

TestUser

package lesson8; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set;

public class TestUser{     private static String[] genders= {"男性","女性"};    //建立一個數組genders     //static 靜態陣列 可以直接類訪問?     public static void main(String[] args) {         List<User>  userList = new ArrayList();         Set<User>  userSet = new  HashSet();         Map<String,User> userMap = new HashMap();         Random r= new Random();         for(int i=0;i<50;i++){             User u=new User("emp"+r.nextInt(50),"emp"+i,genders[i%2]);             //建立50個User類的物件             userList.add(u);             userSet.add(u);             userMap.put(u.getId(), u);             //將每次建立的物件分別新增到以上三個集合中             //其中Map型別新增指定關係的方法為put(key,value)             //key為唯一標示id             }                               System.out.println("使用for迴圈遍歷集合,集合個數為"+userList.size());             //繼承collection藉口 所以用到size()方法             for(int i=0;i<userList.size();i++)             { //                System.out.println(userList.get(i).toString());                 userList.get(i).say();//等價於上面的             //List介面中重要的方法get(int)獲得指定索引位置的元素             //而此處獲得的元素為User 型別的物件u,userList.get(i)==u,所以再呼叫tostring方法                                  }                                       System.out.println("使用增強for迴圈遍歷集合,集合元素個數為"+userSet.size());             for(User u:userSet){                 //u.say();等價於下面的                 System.out.println(u.toString());             }//Set集合好像沒有像上面List集合一樣有getid方法             //User類中多定義say方法就是為了更加簡單,面向物件的思想                                       Set<String> keySet =userMap.keySet();             //keySet()是map的一個方法,為的是返回該集合中所有key物件形成的set集合 //            只有實現的collection集合才有iterator方法,比如List和se介面; //            而Map介面不能使用iterator方法,需要現獲取set檢視,即Set set = map.keySet(); //            set就可以使用了。             System.out.println("使用迭代器遍歷集合,集合元素個數為"+keySet.size());             Iterator<String> it =keySet.iterator();             while(it.hasNext()){                 userMap.get(it.next()).say();                 //Map的get(object key)方法如果存在key物件,可以返回指定的key物件對應的值,否則返回null             //此處返回的是User型別的物件 u。userMap.get(it.next()).say()==u.say() //            //而iterator裡儲存的是userMap裡的key值                 }                                   }     }

  • Map集合:

1)Map<String,User> userMap = new HashMap();代表的即為Map<key,value>提供的是key到value的對映。這裡指通過每一個String型別的key找到對應的每個為user型別的value 2)Q2:java中map為什麼不能直接使用iterator遍歷?  直接使用map的時候方法中不會顯示iterator方法,而是要寫Set set = map.keySet();才可以使用iterator方法,為什麼map和set同為集合,map就不可以直接使用iterator方法? 內部邏輯是什麼? 只有實現的collection集合才有iterator方法,比如List和se介面;而Map介面不能使用iterator方法,需要現獲取set檢視,即Set set = map.keySet();set就可以使用了。

  • equals和==

== : 它的作用是判斷兩個物件的地址是不是相等。即,判斷兩個物件是不試同一個物件。 equals() : 它的作用也是判斷兩個物件是否相等。但它一般有兩種使用情況(前面第1部分已詳細介紹過):                  情況1,類沒有覆蓋equals()方法。則通過equals()比較該類的兩個物件時,等價於通過“==”比較這兩個物件。                  情況2,類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來兩個物件的內容相等;若它們的內容相等,則返回true(即,認為這兩個物件相等)。Q1:用hashcode和equals是為了判斷和保證id沒有重複,可以當唯一標識?

  • static的作用

用static修飾的方法,無須產生類的例項物件就可以呼叫該方法。 "類.方法" 沒有static修飾的方法,需要產生一個類的例項物件才可以呼叫該方法。”物件.方法“