Map集合的特点
1、Map集合中保存的都是键值对,键和值是一一对应的
2、一个映射不能包含重复的值
3、每个键最多只能映射到一个值上
Map接口和Collection接口的不同
Map是双列集合的根接口,Collection是单列集合的根接口
1、Map是双列的(是双列集合的根接口),Collection是单列的(是单列集合的根接口)
2、Map的键是唯一的,Collection的子接口Set是唯一的
3、Map集合的数据结构值针对键有效,跟值无关;如:TreeMap:键是用二叉树算法,HashMap:键是hash算法, Collection集合的数据结构是针对元素有效
Map集合的遍历方式
package com.jd.text; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class Demo06 { public static void main(String[] args) { // 创建map集合 Map map = new HashMap<>(); // 添加 将指定的值与此映射中的指定键关联 map.put("张三", 12); map.put("李四", 13); map.put("蔡文姬", 14); map.put("王五", 15); // 删除 如果存在一个键的映射关系,则将其从此映射中移除 map.remove("王五"); // map.clear();//删除全部 从此映射中移除所有映射关系 // 根据指定的key获取对应的value Object obj1 = map.get("张三"); System.out.println(obj1); // 是否包含指定的key,包含返回true,不包含返回false。 boolean b = map.containsKey("张三"); System.out.println(b); // 是否包含指定的value,包含返回true,不包含返回false。 boolean c = map.containsValue(13); System.out.println(c); System.out.println("******************************"); // map集合的遍历,通过keyset()方法(迭代器) Set keySet = map.keySet(); Iterator iter = keySet.iterator(); while (iter.hasNext()) { Object key = iter.next(); Object value = map.get(key); System.out.println(key + ":" + value); } System.out.println("******************************"); // map集合的遍历,通过keyset()方法(foreach) Set keySet2 = map.keySet(); for (Object key : keySet2) { Object value = map.get(key); System.out.println(key + ":" + value); } System.out.println("******************************"); // map集合的遍历,通过entrySet()方法(foreach) Set entrySet = map.entrySet(); for (Object obj3 : entrySet) { Entry e = (Entry) obj3; Object key = e.getKey(); Object value = e.getValue(); System.out.println(key + ":" + value); } System.out.println("******************************"); // map集合的values方法,获取到的map集合的value的值组成的collection集合 Collection coll = map.values(); for (Object obj : coll) { System.out.println(obj); } } }
运行结果:
12 true true ****************************** 李四:13 张三:12 蔡文姬:14 ****************************** 李四:13 张三:12 蔡文姬:14 ****************************** 李四:13 张三:12 蔡文姬:14 ****************************** 13 12 14
TreeMap集合保存自定义对象
package com.jd.text;
import java.util.Set;
import java.util.TreeMap;
/*
* TreeMap保存自定义对象,比较的Comparable和Comparator两种方式
* 1.通过实现Comparable接口,重写compareTo()方法。
*/
public class Demo07 {
public static void main(String[] args) {
TreeMap map=new TreeMap<>();
map.put(new User("张三01", 12),11);
map.put(new User("张三01", 10),11);
map.put(new User("张三02", 13),11);
map.put(new User("张三01", 12),11);
//通过重写hashCode()和equals(Object obj)方法防止重复的值存入
Set set = map.keySet();
for (Object key : set) {
Object value = map.get(key);
System.out.println(key + ":" + value);
}
}
}
package com.jd.text; /* * 通过实现Comparable接口,重写compareTo()方法。 */ public class User implements Comparable{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + "]"; } public User(String name, int age) { super(); this.name = name; this.age = age; } public User() { super(); } @Override public int hashCode() { final int prime=31; int result=1; result=prime*result+age; result=prime*result+((name==null)?0:name.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 user=(User) obj; if(age!=user.age) return false; if(name==null){ if(user.name!=null) return false; }else if(!name.equals(user.name)) return false; return true; } @Override public int compareTo(Object o) { if(o instanceof User){ User user=(User) o; int sum=name.compareTo(user.name); if(sum==0) return age-user.age; return sum; } throw new ClassCastException("不是User类型"); } }
运行结果:
User [name=张三01, age=10]:11 User [name=张三01, age=12]:11 User [name=张三02, age=13]:11
package com.jd.text; /* * TreeMap保存自定义对象,比较的Comparable和Comparator两种方式 * 2.自己构造比较器实现Comparator接口,重写compare(Object o1, Object o2)方法 */ import java.util.Comparator; import java.util.Set; import java.util.TreeMap; public class Demo08 { public static void main(String[] args) { TreeMap map=new TreeMap(new MyCompare()); map.put(new User2("张三01", 12),11); map.put(new User2("张三01", 10),11); map.put(new User2("张三02", 13),11); map.put(new User2("张三01", 12),11); //通过重写hashCode()和equals(Object obj)方法防止重复的值存入 Set set = map.keySet(); for (Object key : set) { Object value = map.get(key); System.out.println(key + ":" + value); } } } class User2{ String name; int age; public User2(String name,int age){ this.name=name; this.age=age; } @Override public int hashCode(){ final int prime=31; int result=1; result=prime*result+age; result=prime*result+((name==null)?0:name.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; User2 u=(User2) obj; if(age!=u.age) return false; if(name==null){ if(u.name!=null) return false; }else if(!name.equals(u.name)) return false; return true; } @Override public String toString() { return "User2 [name=" + name + ", age=" + age + "]"; } } //比较器 class MyCompare implements Comparator{ @Override public int compare(Object o1, Object o2) { if(o1 instanceof User2 && o2 instanceof User2){ User2 u1=(User2) o1; User2 u2=(User2) o2; int sum=u1.age-u2.age; if(sum==0){ return u1.name.compareTo(u2.name); } return sum; } throw new ClassCastException("不是User2 类型"); } }
运行结果:
User2 [name=张三01, age=10]:11 User2 [name=张三01, age=12]:11 User2 [name=张三02, age=13]:11