三者異同
List,Set都是繼承自Collection接口;
List特點:元素有放入順序,元素可重復;?
Set特點:元素無放入順序,元素不可重復(注意:元素雖然無放入順序,但是元素在set中的位置是有該元素的HashCode決定的,其位置其實是固定的);?
Map特點:元素按鍵值對存儲,無放入順序 (應該知道什么是鍵值對吧!) ;
List接口有三個實現類:LinkedList,ArrayList,Vector;?
LinkedList:底層基于鏈表實現,鏈表內存是散亂的,每一個元素存儲本身內存地址的同時還存儲下一個元素的地址。鏈表增刪快,查找慢;?
ArrayList和Vector的區別:ArrayList是非線程安全的,效率高;Vector是基于線程安全的,效率低;?
Set接口有兩個實現類:HashSet(底層由HashMap實現),LinkedHashSet;?
SortedSet接口有一個實現類:TreeSet(底層由平衡二叉樹實現)?
Query接口有一個實現類:LinkList?
Map接口有三個實現類:HashMap,HashTable,LinkeHashMap?
HashMap非線程安全,高效,支持null;HashTable線程安全,低效,不支持null?
SortedMap有一個實現類:TreeMap?
其實最主要的是,list是用來處理序列的,而set是用來處理集的。Map是知道的,存儲的是鍵值對?
set 一般無序不重復.map kv 結構 list 有序
Map相當于和Collection一個級別的;Map
去重的問題
package yn;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
?* 類描述:set集合針對String類型和8大基礎數據類型過濾掉重復數據,如果存放的是其他類型對象,
?* 則需要重寫hashCode方法和equals方法,當equals比較相等時,
?* 則會去比較hashCode值 hashCode的值 如果一致的話,則不會存進set
?* @author yxx
?*/
public class ListSetMap {??
? ? public static void main(String[] args) {??
? ? ? ? Set<String> nameSet = new HashSet<String>();??
? ? ? ? nameSet.add("張三");??
? ? ? ? nameSet.add("李四");??
? ? ? ? nameSet.add("王五");??
? ? ? ? nameSet.add("張三");??
? ? ? ? // 輸出結果 張三? 李四? 王五??
? ? ? ? for(String name : nameSet){??
? ? ? ? ? ? System.out.print(name + "\t");??
? ? ? ? }??
? ? ? ? System.out.println();
? ? ? ? // List集合去除重復基礎數據??
? ? ? ? List<String> nameList = new ArrayList<String>();??
? ? ? ? nameList.add("張三");??
? ? ? ? nameList.add("李四");??
? ? ? ? nameList.add("王五");??
? ? ? ? nameList.add("趙六");??
? ? ? ? nameSet.addAll(nameList);??
? ? ? ? // 輸出結果 張三? 李四? 王五? 趙六??
? ? ? ? for(String name : nameSet){??
? ? ? ? ? ? System.out.print(name + "\n");??
? ? ? ? }??
? ? ? ? // 去除編號和用戶名一樣的 對象,需要重寫 equals 方法 和 hashCode方法??
? ? ? ? User admin = new User(1, "admin");??
? ? ? ? User user = new User(2, "user");??
? ? ? ? User user1 = new User(2, "user");??
? ? ? ? User admin1 = new User(3, "admin");??
? ? ? ? Set<User> userSet = new HashSet<User>();??
? ? ? ? userSet.add(admin);??
? ? ? ? userSet.add(user);??
? ? ? ? userSet.add(admin1);??
? ? ? ? userSet.add(user1);??
? ? ? ? // 輸入結果 admin1? admin3? user2??
? ? ? ? for(User u : userSet){??
? ? ? ? ? ? System.out.print(u.username + u.id + "\t");??
? ? ? ? }??
? ? ? ? System.out.println(user.equals(null));??
? ? }??
}??
class User{??
? ? protected Integer id;??
? ? protected String username;??
? ? public User(Integer id, String username){??
? ? ? ? this.id = id;??
? ? ? ? this.username = username;??
? ? }??
? ? /**?
? ? ?* 如果對象類型是User 的話 則返回true 去比較hashCode值?
? ? ?*/??
? ? @Override??
? ? public boolean equals(Object obj) {??
? ? ? ? if(obj == null) return false;??
? ? ? ? if(this == obj) return true;??
? ? ? ? if(obj instanceof User){? ?
? ? ? ? ? ? User user =(User)obj;??
//? ? ? ? ? if(user.id = this.id) return true; // 只比較id??
? ? ? ? ? ? // 比較id和username 一致時才返回true 之后再去比較 hashCode??
? ? ? ? ? ? if(user.id == this.id && user.username.equals(this.username)) return true;??
? ? ? ? ? ? }??
? ? ? ? return false;??
? ? }??
? ? /**?
? ? ?* 重寫hashcode 方法,返回的hashCode 不一樣才認定為不同的對象?
? ? ?*/??
? ? @Override??
? ? public int hashCode() {??
//? ? ? return id.hashCode(); // 只比較id,id一樣就不添加進集合??
? ? ? ? return id.hashCode() * username.hashCode();??
? ? }??
}??
運行截圖
這樣一來基本就明白了重寫equal是干什么的,也知道了set集合針對String類型和8大基礎數據類型過濾掉重復數據,如果存放的是其他類型對象,則需要重寫hashCode方法和equals方法,當equals比較相等時,則會去比較hashCode值 hashCode的值 如果一致的話,則不會存進set
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。