4.Map接口
Map接口专门处理键值映射数据的存储,可以根据键实现对值的操作。Map可以放置键值对,也就是每一个元素都包含键对象和值对象。(夫妻)
最常用的实现类:HashMap,HashMap对键对象的存取和HashSet一样,仍然采用的是哈希算法,所以使用自定类作为Map的键对象,必须复写equals和hashCode方法。
4.1Map接口常用方法
方法名 | 说明 |
---|---|
Object put(Object key, Object value) | 以“键-值对”的方式进行存储 |
Object get(Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove(Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
int hashCode() | 返回Map对象的哈希值 |
Set keySet() | 返回键的集合(含键的Set视图) |
Set entrySet() | 返回键的集合(含键的Set视图) |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
boolean containsValue(Object value) | 判断Map对象是否包含相应的值 |
boolean isEmpty() | 判断Map对象是否包含“键-值对”映射 |
boolean equals(Object o) | 判断指定对象o与Map对象的等价性 |
4.2HashMap
-
特点:
存储数据采用的哈希表结构,元素的存取顺序不能保证一致。 由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 HashMap的值是没有顺序的,他是按照key的HashCode来实现的(根据key的HashCode值来存储数据), 根据key可以直接获取它的Value,同时它具有很快的访问速度。 HashMap最多只允许一条记录的key值为null(多条会覆盖);允许多条记录的Value为null
4.2.1代码Code
package mygather;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest02 {
private long cardNo;
public static void main(String[] args) {
IdCard idCard01 = new IdCard();
idCard01.cardNo = 111L;
Person person01 = new Person();
person01.name = "张三";
IdCard idCard02 = new IdCard();
idCard02.cardNo = 112L;
Person person02 = new Person();
person02.name = "李四";
IdCard idCard03 = new IdCard();
idCard03.cardNo = 113L;
Person person03 = new Person();
person03.name = "王五";
Map<IdCard, Person> map = new HashMap<>();
map.put(idCard01, person01);
map.put(idCard02, person02);
map.put(idCard03, person03);
System.out.println(map.size());
System.out.println(map.hashCode());
//迭代器遍历
for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext(); ) {
Map.Entry entry = (Map.Entry) iterator.next();
IdCard idCard = (IdCard) entry.getKey();
Person person = (Person) entry.getValue();
System.out.println(idCard.cardNo + ", " + person.name);
}
}
//重写equals()和hashCode()方法
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof IdCard) {
IdCard idCard = (IdCard) obj;
if (this.cardNo == idCard.cardNo) {
return true;
}
}
return false;
}
public int hashCode() {
return new Long(cardNo).hashCode();
}
}
class IdCard {
long cardNo;
}
class Person {
int age;
String name;
}
4.2.2输出结果
4.3TreeMap
-
特点:
能够把它保存的记录根据key排序,默认是按升序排序,也可以指定排序的比较器 当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null。 TreeMap集合排序:实现Comparable接口或Comparator接口,重写CompareTo方法
4.3.1代码Code
package mygather;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
public class MyTreeMap {
public static void main(String[] args) {
Map<String, String> treemap = new TreeMap<String, String>();
treemap.put("1009", "赵六");
treemap.put("1005", "李四");
treemap.put("1006", "王五");
treemap.put("1003", "张三");
System.out.println(treemap);
//迭代器遍历
Iterator<Map.Entry<String, String>> iterator = treemap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
System.out.println(entry.getKey() + "," + entry.getValue());
}
}
}
4.3.2输出结果
4.4Map的遍历方式
1.在for-each循环中使用entry()
Map<String, String> map = new HashMap<String, String>();
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}
2.在for-each循环中仅仅遍历keys或values值
Map<String, String> map = new HashMap<String, String>();
//遍历map中的键
for (String key : map.keySet()) {
System.out.println("Key = " + key);
}
//遍历map中的值
for (String value : map.values()) {
System.out.println("Value = " + value);
}
3.使用Iterator遍历
Map<String, String> map = new HashMap<String, String>();
Iterator<Map.Entry<String, String>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, String> entry = entries.next();
System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}