简单讲解Map集合下的HashMap

这篇博客详细介绍了HashMap的特性,包括其基于哈希表的数据结构、允许null键值、非同步以及在Java中的使用。通过示例展示了如何添加、检查、移除键值对,以及遍历HashMap的不同方式。同时,提到了在HashMap中对象作为键时需要重写hashCode和equals方法以确保键的唯一性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap:底层是哈希表数据结构,允许使用null键null值,该集合线程不同步, jdk1.2,效率高。

首先需要导入的包名:

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

 

然后再声明一个HashMap集合:

Map<String, String> map = new HashMap<String, String>();

// 添加元素,如果添加时出现相同的键,那么会面添加的值会覆盖前面的键对应的值,

//put方法会返回被覆盖的值。

      map.put("01", "zhangsan1");

      map.put("01", "wangwu");

      map.put("02", "zhangsan2");

      map.put("03", "zhangsan3");

System.out.println(map);

 上面代码有两个’01’的键,所以键值相同,前面的值将会被覆盖,

返回结果: {01=wangwu, 02=zhangsan2, 03=zhangsan3};

 

      System.out.println("containsKey:" + map.containsKey("01"));

// containsKey() 查找键是否存在,返回Boolean类型;

      System.out.println("remover:" + map.remove("02"));

// remover() 移除对应的键的数据;不存在返回null;

 

      map.put("04", null);

      System.out.println("get:" + map.get("04"));

//get()获取对应的键的数据,不存在返回null;

      // 可以通过get方法的返回值来判断一个键是否存在,可通过返回null来判断,但是注意可能只本就是null的情况。

 

      // 获取map集合中所有的值;

      Collection<String> coll = map.values();

      System.out.println(coll);

      //返回结果:[null, wangwu, zhangsan3]

 

          Map的两种取出方式:

      // 1Set<k> KeySet:在通过Set集合中的迭代器取出Set集合中的键。通过mapget(key)方法获取对应的键的值。

      // 2Set<Map.Entry<k,v>> EntrySet:将map集合中的映射关系存入到set集合中,而这个关系的数据类型就是:Map.Entry

重新声明集合,并添加数据:

      Map<String, String> maps = new HashMap<String, String>();

      maps.put("A", "A");

      maps.put("B", "B");

      maps.put("C", "C");

      maps.put("D", "D");

 

      // KeySet取出:

      Set<String> keyset = maps.keySet();//获取集合中所有的键

      Iterator<String> iter = keyset.iterator();//迭代器;

      while (iter.hasNext()) {

          String key = iter.next();//拿出单个键;

          String vaule = maps.get(key);//根据键在获取值;

          System.out.print("Key:" + key + ",    Values:" + vaule + "\t");

      }

      System.out.println();

 

      // EntrySet取出,Map集合中的映射关系取出,存入到Set集合中。

      Set<Map.Entry<String, String>> entry = maps.entrySet();

      Iterator<Map.Entry<String, String>> iten = entry.iterator();

      while (iten.hasNext()) {

          Map.Entry<String, String> me = iten.next();

          String key = me.getKey();//获取键;

          String value = me.getValue();//获取值;

          System.out.print("Key:" + key + ",    Values:" + value + "\t");

      }

这两种方法输出的结果:

Key:D,    Values:D  Key:A,    Values:A    Key:B,    Values:B    Key:C,    Values:C

 

我们来做一个练习:

要求:每一个学生都有对应的归属地。 学生Student,地址String,学生属性:姓名,年龄。

注意:姓名和年龄相同的视为同一个学生,保证学生的唯一性。

第一步:先建立一个学生对象

//注意:凡是带有Hash的集合都要复写hashCodeequals方法;

class Student{

  private String name;

  private int 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;

  }

  public Student(String name, int age) {

      super();

      this.name = name;

      this.age = age;

  }

  public int hashCode() {

      return this.name.hashCode() + this.age * 23;

      // 获取哈希值,也是判断哈希值是否有相等的数据,有就进行equals方法判断;

  }

  public boolean equals(Object obj) {

      if (!(obj instanceof Student))// 判断obj是否等于Student;

          throw new ClassCastException("类型不匹配"); // 抛出异常;

      Student stu = (Student) obj;

      return this.name.equals(stu.name) && this.age == stu.age;

  }

}

第二步:声明一个HashMap集合,并添加数据

Map<Student, String> stu = new HashMap<Student, String>();

      stu.put(new Student("A", 20), "广州");

      stu.put(new Student("B", 21), "上海");

      stu.put(new Student("A", 22), "北京");

      stu.put(new Student("C", 20), "江西");

      stu.put(new Student("A", 20), "西安");

第三步:取出数据:

Iterator<Student> setstu = stu.keySet().iterator();

      while (setstu.hasNext()) {

          Student sd = setstu.next();

          String name = sd.getName();

          int age = sd.getAge();

          String value = stu.get(sd);

          System.out.println("name: " + name + ",  age:" + age + ",  value:"

                  + value);

      }

打印结果:

第一条数据:stu.put(new Student("A", 20), "广州")被覆盖了,我们在Student这个类中做了比较,首先比较哈希值是否相同,若是相同在进行equals比较,还是相同的话就进行剔除。

注意:这里是将student作为键,地址作为值,键要唯一,键相同就覆盖前面的值;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值