Map集合

来源:互联网 发布:禁止在淘宝网上出售 编辑:程序博客网 时间:2024/05/20 11:24

一、Map映射容器:

Map(映射)是一个可以根据键值进行存储的,它的一个 Key 对应的是一个存储的位置,所以Key值是唯一的,根据Key值可以获取到对应的存储的Value。
这种存储的集合我们称为 “键-值” Map。
1)它不是集合Collection的子类;
2) 它的键值是唯一的,根据键值可以取出值;
3) 根据值无法直接取出Key。


二、Map的几种实现方式

同样的对于Map接口是有多种实现方式的:
(1)HashMap 按照散列存储,这样的存取较快,线程不安全的,允许存放null键,null值

(2)Hashtable 线程安全,速度慢,不允许存放null键,null值

(3)TreeMap 使用二叉树的算法来实现键值的自然排序功能。

Map的遍历:

package com.javatest;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Map.Entry;import java.util.Set;public class MapTest {public static void main(String[] args) {Map<String, String> map = new HashMap<>();map.put("语文", "95分");map.put("数学", "80分");Set<Entry<String, String>> set = map.entrySet();Iterator iterator = set.iterator();//map的遍历while (iterator.hasNext()) {Entry<String, String> entry = (Entry<String, String>) iterator.next();System.out.println(entry.getKey() + entry.getValue());}}}



三、对Map键值的要求:map的键值是唯一的,如果两次添加etity的键值相同,后面的会覆盖前面的。这就对键值的实现有一定的要求。

(Map也拥有很多实用的操作方法,如:containsKey(Object key)、equals(Object o)等,如果判断的对象是自定义的对象,需要正确重写equals和hashCode方法才能满足我们想要的结果。Map的键值可以用自定义对象,如Map<Employee,Integer> Employee需正确实现equals和HashCode。
Set中存储自定义对象时,为保证数据相同的不重复存储;List,Set使用操作contains等方法查询自定义对象时;都需要正确实现equals和HashCode。由此可见equals和hashCode方法的重要性。)

1、hashMap和Hashtable对键值的要求:正确重写equals和hashcode方法

例:

实体类Person(没有正确重写equals和hashCode方法):

package map;public class Person {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [name=" + name + "]";}}

这时编写测试类:

package map;import java.util.HashMap;import java.util.Map;public class MyhashMap {public static void main(String[] args) {Map<Person, Integer> map=new HashMap<>();Person person=new Person();person.setName("zs");map.put(person, 20);person=new Person();person.setName("zs");map.put(person, 20);//Person key=new Person();//key.setName("zs");System.out.println(map.size());}}

输出为2;而如果将Person类正确重写了equals和hashCode方法,再次编译输出1。hashTable也是这种情况。

2、TreeMap对键值的要求是,这个键值需要实现排序接口Comparable。

例:

package map;public class Person1 implements Comparable<Person1>{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Person [name=" + name + "]";}@Overridepublic int compareTo(Person1 o) {// TODO Auto-generated method stubreturn this.name.compareTo(o.name);}}
测试类:

package map;import java.util.Map;import java.util.TreeMap;public class MyTreeMap {public static void main(String[] args) {Map<Person1, Integer> map=new TreeMap<>();Person1 person=new Person1();person.setName("zs");map.put(person, 1);person=new Person1();person.setName("zs");map.put(person, 2);//Person1 key=new Person1();//key.setName("zs");System.out.println(map.size());}}
输出1,因为这两个name相等,认为这是一个对象。其实compareTo就是一种变向的去重复。



原创粉丝点击