MAP集合
Map接口时双列结合恶的顶层接口:
- 存储的数据必须包含key和value
- key和value在Map中是一一对应的关系
- key在Map集合中是不会重复的
1. HashMap
特点:
- 底层数据结构式哈希表
- 存储数据的顺序和遍历顺序可能不一致
- key值不会重复
1.创建对象
//创建对象 HashMap<key数据类型, value数据类型> hashMap = new HashMap<>();
HashMap<String, Integer> hashMap = new HashMap<>();
2.常用方法
public static void main(String[] args) {
//创建对象 HashMap<key数据类型, value数据类型> hashMap = new HashMap<>();
HashMap<String, Integer> hashMap = new HashMap<>();
//常用方法
//添加元素,如果key不存在就添加,如果key已经存在就修改对应的value值,并返回修改前的value
hashMap.put("age1",10); // 1. put(k key,v value)
hashMap.put("age2",12);
hashMap.put("age3",13);
//根据key获取对应的value值,如果key值不存在,返回null
System.out.println(hashMap.get("age1")); // 2. get(object key)
//根据key值删除map中对应的键值对,删除的value作为返回值
System.out.println(hashMap.remove("age3"));// 3. remove(object key)
//判断key值是否存在
System.out.println(hashMap.containsKey("age1"));// 4. containsKey(object key)
//集合中键值对的对数
hashMap.size(); // 5. size()
//清空集合中的所有键值对
hashMap.clear(); //6. clear()
}
3.遍历
/*
1.使用entrySet遍历
map集合的entrySet方法可以获得一个Set集合,集合中存放的是Entry对象
一个Entry对象相当于一个键值对,通过set集合拿到Entry对象
*/
Set<Map.Entry<String, Integer>> entries = hashMap.entrySet();
//使用迭代器遍历entrySet
Iterator<Map.Entry<String, Integer>> iterator = entries.iterator();
while(iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next.getKey()+" "+next.getValue());
}
//使用forearch遍历entrySet
for (Map.Entry<String, Integer> entry : entries) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
/*
2. 使用keySet遍历
map集合的keySet方法可以获取一个集合的set集合,集合中存放的是所有的key
我们可以遍历set集合拿到可以对象,然后获取value
*/
Set<String> keySet = hashMap.keySet();
//foreach遍历
for (String s : keySet) { //s表示的是key
System.out.println(s+" "+hashMap.get(s));
}
2. HashMap的key去重原理
HashMap在添加元素的时候会判断集合中是否有key和本次存入的key相同。判断主要通过hashCode方法和equals方法进行判断,当两者同时相同的时,被判定相同。但用的是“==”号,默认比较的是地址,因此进行自定义,进行方法重写
//alt+insert 快捷键重写
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Demo02 demo02 = (Demo02) o;
return Objects.equals(age, demo02.age) && Objects.equals(name, demo02.name);
}
@Override
public int hashCode() {
return Objects.hash(age, name);
}