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修飾的方法,需要產生一個類的例項物件才可以呼叫該方法。”物件.方法“