java学习之Map接口以及实现类HashMap,TreeMap的使用

Map
Map是一个接口,创建对象的时候,需要根据多态依靠它的实现类来创建
Map的特点是Map存储的对象是键值对,或者说Map是装键值对的容器
每一个键值对都是一个key对应一个Value;Key值是唯一,不能重复,但是value是可以重复的
基本上对Map对象的操作都是对key来操作的

这里写图片描述
如图所示:key和value就是一对键值对,但是要注意的是Map中的存储的键值对是无序的,没有顺序的.
下面我们来创建一个Map对象

//定义Map的时候,泛型中前面的K是指键值对中Key的数据类型,后面的V指的是键值对中value的数据类型
    Map<String, Integer> map = new HashMap<>();//Map的实现类有很多,我们主要用HashMap和TreeMap
    map.put("b", 15);//Map的添加元素的方法是put
    map.put("d", 16);
    map.put("c", 14);
    map.put("a", 17);
    map.put("a", 18);//这里的key值和上面的key重复了,因为map中key值是不能重复的,所以此时将原来key值对应的value给覆盖了,换成了新的
    System.out.println(map);

输出的结果是

{a=18, b=15, c=14, d=16}

从输出结果我们看出,重复的key值并没有添加进来,但是对应的key值却改变了,是被新的值给覆盖了
下面我们我们来看看Map中的一些常用API,就用刚才我们创建的map来试一下

map.clear();//清空map
boolean containsKey = map.containsKey("a");//判断map中是否包含key为"a"的键值对
boolean containsValue = map.containsValue(18);//判断map中是否包含value为18的键值对
boolean isEmpty = map.isEmpty();//判断map是否为空
int value = map.get("a");//根据key值来取value
int  size = map.size();//判断map中键值对的对数
Integer number = map.remove("a");//删除map中key值为a的键值对,返回值为删除的键值对中的value值

HashMap
HashMap是Map的实现类
HashMap其实和HashSet有很多相同处,这是因为HashSet的底层实现是依赖HashMap来实现的,所以hashSet和hashMap都会去除重复的,而且底层实现是一样的
下面我们来创建一个HashMap,里面的key值是一个非系统类,而是我们自己创建的一个Student类

public class Student 
{
 private String name;
 private int age;
public Student(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 "Student [name=" + name + ", age=" + age + "]";
}
//下面就是重写的hashCode和equals方法
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) 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;
}
}
//上面是我们 创建的student类
    HashMap<Student, String> map = new HashMap<>();
    map.put(new Student("zhangsan", 18),     "beijing");
    map.put(new Student("fanjunnan", 19), "henan");
    map.put(new Student("lisi", 20),"shanghai");
    map.put(new Student("fanjunnan", 19), "shanghai");

HashMap中去重是对Key操作的,因为Key是唯一的,不能重复
和HashSet类似,如果我们在添加键值对的时候,如果不重写hashCode和equals方法的话,因为Student类中的每一个对象在堆内存中的地址都不一样,所以系统会根据地址来判断没有重复的,所以我们要重写hashCode和equals方法.
因为Map也是一个容器,所以我们是可以对Map进行遍历的
对Map遍历的方法大致有这几种:
第一种:我们是根据KeySet()的对象方法,将Key值取出来放到一个集合中,然后对集合进行遍历,利用Key值得到所有的value值

HashMap<String, Integer> hashMap = new HashMap<>();
    hashMap.put("b", 15);
    hashMap.put("d", 16);
    hashMap.put("c", 14);
    hashMap.put("a", 17);
    hashMap.put("a", 18);
     Set<String> set = hashMap.keySet();//获得装着所有key的集合
    for (String string : set) //增强for循环
    {
         String Key = string;
         int value = hashMap.get(Key);//获得所有的value值
    }

第二种:我们根据对象方法 entry Set()将map中所有的键值对装到一个集合中,entry类型的对象就是一个键值对

HashMap<String, Integer> hashMap = new HashMap<>();
    hashMap.put("b", 15);
    hashMap.put("d", 16);
    hashMap.put("c", 14);
    hashMap.put("a", 17);
    hashMap.put("a", 18);
Set<Entry<String, Integer>> entrySet = hashMap.entrySet();//获得装着map所有键值对的集合set
   for (Entry<String, Integer> entry : entrySet) //遍历集合
    {
        String key = entry.getKey();
        int value = entry.getValue();
    }

TreeMap
TreeMap也是Map的实现类,TreeMap和TreeSet也有很多的相似之处
TreeSet的底层实现就是依赖TreeMap来实现的,
所以TreeMap也会根据key来进行排序
这里面我们同样要注意的是,在key为非系统类的对象的时候,我们要重写comparable中的比较方法来规定排序的规则,或者我们为TreeMap构建一个比较器,来排序
例如:在Map中添加三名学生,根据学生的年龄排序

   //我们向map中添加三个键值对,key为学生,同时给map构建一个比较器
    TreeMap<Student, String> treeMap = new TreeMap<new StudentImpl()>();
    treeMap.put(new Student("zhangsan",18),  "shanghai");
    treeMap.put(new Student("lisi",20),  "beijing");
    treeMap.put(new Student("zhangsan",16),  "hunan");
    //我们需要写一个类来实现comparator接口中的比较方法
    public class studentImpl implements Comparator<Student> 
{
   public int compare(Student o1, Student o2) {
    int number = o1.getAge() - o2.getAge();
    int nameNumber = o1.getName().compareTo(o2.getName());
    //这里当俩对象的年龄一样的时候,一定要返回一个非0的值,否则系统会 认为Key值重复,value就会覆盖掉以前的
    return number == 0 ? nameNumber==0 ? 1: nameNumber :number ;
}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值