Map接口需要注意:
Map提供了一种映射关系,其中的元素是以键值对的形式存储的,能够实现根据key快速查找value;
键值是唯一的,值是可以重复,一个值可以和很多键形成对应关系,每个建最多只能映射到一个值。
(打个比方就比如身份证,身份证号是唯一的,但是身份证上面的名字却不是,我可以叫马克波罗,你也可以!)
Map集合的从数据结构是针对键有效,跟值无关。 Collection集合的数据结构是针对元素有效。
Map的功能:
添加功能:
V put(K key, V value):添加元素
删除功能:
-
void clear():移除所有的键值对元素
-
V remove(Object key):根据键删除键值元素,并把值进行返回
判断功能:
-
boolean containsKey(Object key):判断集合是否包含指定的键
-
boolean containsValue(Object value):判断集合是否包含指定的值
-
boolean isEmpty():判断集合是否为空
- 获取功能:
-
V get(Object key):根据键来获取值
-
Set<K> keySet():获取集合中所有的键
-
Collection<V> values():获取集合中所有值的集合
-
Set<Map.Entry<K,V>> entrySet():返回的是键值对 对象 的集合
- 长度功能:
-
int size():返回集合中的键值对的对数
例子:
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("马可波罗", "小乔");
map.put("百里守约", "大乔");
map.put("狼狗", "明世隐");
System.out.println(map.put("公孙离", "貂蝉"));
System.out.println(map);
System.out.println(map.put("公孙离", "女娲")); //键是唯一的,所以此时键的值已经被替换,由"杨幂"变成了"王鸥";
System.out.println(map);
String remove = map.remove("狼狗"); //删除了"狼狗"键
System.out.println(remove); //返回的是键所对应的值
//map.clear(); //这是一个清空集合的方法
System.out.println(map);
boolean containsKey = map.containsKey("马可波罗"); //判断集合中是否包含该键
System.out.println(containsKey);
boolean containsValue = map.containsValue("小娃娃");//判断集合中是否包含该值
System.out.println(containsValue);
//map.clear();
boolean empty = map.isEmpty(); //判断集合是否为空
System.out.println(empty);
System.out.println("----------------------");
String string = map.get("马可波罗");//通过键来获取值
System.out.println(string);
Set<String> keySet = map.keySet();//获取集合中所有的键,因为键是唯一的 所以用Set(唯一性)来接收
for (String string2 : keySet) { //遍历
System.out.println(string2+"--------"+map.get(string2));
}
System.out.println(keySet);
Collection<String> values = map.values(); //获取所有的值
System.out.println(values);
System.out.println(map.size());//返回集合中的键值对的对数
//Set<Map.Entry<K,V>> entrySet():返回的是键值对 对象 的集合
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+"-------"+entry.getValue());
}
}
HashMap类
HashMap是Map的一个重要实现类,也是最常用的,基于哈希表实现(保证唯一性)
练习·:要求如果两个对象的成员变量的值相同,则为同一个对象
假设我们定义一个工人类,想要比较成员变量是否相同或者集合是否存在这个对象
我们需要实现equlas方法的重写
例子:
package com.hwua.Map;
public class Worker {
private String name;
private int age;
public Worker() {
super();
}
public Worker(String name, int age) {
super();
this.name = name;
this.age = 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 "Worker [name=" + name + ", 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;
Worker other = (Worker) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
public static void main(String[] args) {
HashMap<Worker, Integer> map = new HashMap<>();
map.put(new Worker("张三", 16), 8800);
map.put(new Worker("李四", 26), 1800);
map.put(new Worker("王五", 36), 4800);
map.put(new Worker("张三", 46), 2800);
map.put(new Worker("张三", 16), 1800);
System.out.println(map);
Set<Worker> keySet = map.keySet();
for (Worker worker : keySet) {
System.out.println(worker+"--"+map.get(worker));
}
}
除了HashMap还有TreeMap
要使用TreeMap进行排序,就要实现接口,可以在实体类(上例的工人类)中实现comprable接口的方法
也可以使用匿名内部类去实现ComparaTo接口的方法
直接上例子:(上例工人类适用于此例子)
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeMap<Worker, Integer> map = new TreeMap<>(new Comparator() {
@Override
public int compare(Worker o1, Worker o2) {
// TODO Auto-generated method stub
int num = o1.getAge()-o2.getAge();
int num2 = num==0?o1.getName().compareTo(o2.getName()):num;
return num2;
}
});
map.put(new Worker("张三", 16), 8800);
map.put(new Worker("李四", 26), 1800);
map.put(new Worker("王五", 36), 4800);
map.put(new Worker("张三", 46), 2800);
map.put(new Worker("张三", 16), 1800);
System.out.println(map);
}
扩展:
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
HashMap<String, String> sanguo = new HashMap<>();
sanguo.put(“周瑜”, “小乔”);
sanguo.put(“吕布”, “貂蝉”);
arrayList.add(sanguo);
HashMap<String, String> xiyouji = new HashMap<>();
xiyouji.put("牛魔王", "铁扇公主");
xiyouji.put("至尊宝", "紫霞仙子");
arrayList.add(xiyouji);
HashMap<String, String> wuxia = new HashMap<>();
wuxia.put("郭靖", "黄蓉");
wuxia.put("杨过", "大雕");
arrayList.add(wuxia);
System.out.println(arrayList);
for (HashMap<String, String> hashMap : arrayList) {
Set<Entry<String, String>> entrySet = hashMap.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+"--"+entry.getValue());
}
}
}
集合里面可以有很多元素,一个键值对就是一个元素。