当前位置: 首页 > news >正文

【JavaSE】Java基础语法(三十):HashMap与TreeMap

文章目录

  • 1. HashMap
    • 1.1 HashMap集合概述和特点
    • 1.2 HashMap集合应用案例
  • 2. TreeMap
    • 2.1 TreeMap集合概述和特点
    • 2.2 TreeMap集合应用案例一
    • 2.3 TreeMap集合应用案例二
  • 3. 总结


在这里插入图片描述

1. HashMap

1.1 HashMap集合概述和特点

  • HashMap底层是哈希表结构的
  • 依赖hashCode方法和equals方法保证键的唯一
  • 如果键要存储的是自定义对象,需要重写hashCode和equals方法

1.2 HashMap集合应用案例

案例需求

  • 创建一个HashMap集合,键是学生对象(Student),值是居住地 (String)。存储多个元素,并
    遍历。
  • 要求保证键的唯一性:如果学生对象的成员变量值相同,我们就认为是同一个对象

代码实现

public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {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;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;if (age != student.age) return false;return name != null ? name.equals(student.name) : student.name ==null;}@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}
}
public class HashMapDemo {public static void main(String[] args) {//创建HashMap集合对象HashMap<Student, String> hm = new HashMap<Student, String>();//创建学生对象Student s1 = new Student("刘亦菲", 30);Student s2 = new Student("宋祖儿", 35);Student s3 = new Student("林黛玉", 33);Student s4 = new Student("林黛玉", 33);//把学生添加到集合hm.put(s1, "西安");hm.put(s2, "武汉");hm.put(s3, "郑州");hm.put(s4, "北京");//遍历集合Set<Student> keySet = hm.keySet();for (Student key : keySet) {String value = hm.get(key);System.out.println(key.getName() + "," + key.getAge() + "," + value);}}
}

2. TreeMap

2.1 TreeMap集合概述和特点

  • TreeMap底层是红黑树结构
  • 依赖自然排序或者比较器排序,对键进行排序
  • 如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象时候给出比较器
    排序规则

2.2 TreeMap集合应用案例一

案例需求

  • 创建一个TreeMap集合,键是学生对象(Student),值是籍贯(String),学生属性姓名和年龄,按照年
    龄进行排序并遍历
  • 要求按照学生的年龄进行排序,如果年龄相同则按照姓名进行排序

代码实现

public class Student implements Comparable<Student>{private String name;private int age;public Student() {}public Student(String name, int age) {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;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Student o) {//按照年龄进行排序int result = o.getAge() - this.getAge();//次要条件,按照姓名排序。result = result == 0 ? o.getName().compareTo(this.getName()) :result;return result;}
}
public class Test1 {public static void main(String[] args) {// 创建TreeMap集合对象TreeMap<Student,String> tm = new TreeMap<>();// 创建学生对象Student s1 = new Student("xiaohei",23);Student s2 = new Student("dapang",22);Student s3 = new Student("xiaomei",22);// 将学生对象添加到TreeMap集合中tm.put(s1,"江苏");tm.put(s2,"北京");tm.put(s3,"天津");// 遍历TreeMap集合,打印每个学生的信息tm.forEach((Student key, String value)->{System.out.println(key + "---" + value);});}
}

2.3 TreeMap集合应用案例二

案例需求

  • 给定一个字符串,要求统计字符串中每个字符出现的次数。
  • 举例: 给定字符串是“aababcabcdabcde”,在控制台输出: “a(5)b(4)c(3)d(2)e(1)”

代码实现

public class Test2 {public static void main(String[] args) {// 给定字符串String s = "aababcabcdabcde";// 创建TreeMap集合对象,键是Character,值是IntegerTreeMap<Character,Integer> tm = new TreeMap<>();//遍历字符串,得到每一个字符for (int i = 0; i < s.length(); i++) {//c依次表示字符串中的每一个字符char c = s.charAt(i);// 判断当前遍历到的字符是否在集合中出现过if(!tm.containsKey(c)){//表示当前字符是第一次出现。tm.put(c,1);}else{//存在,表示当前字符已经出现过了//先获取这个字符已经出现的次数Integer count = tm.get(c);//自增,表示这个字符又出现了依次count++;//将自增后的结果再次添加到集合中。tm.put(c,count);}}// a(5)b(4)c(3)d(2)e(1)//System.out.println(tm);tm.forEach((Character key,Integer value)->{System.out.print(key + "(" + value + ")");});}
}

3. 总结

HashMap和TreeMap都是常用的Java集合框架中的映射类型,实现了Java中Map接口,并且具有不同的特点和使用场景。

HashMap的特点:

  • 根据键的hashCode值存储数据,因此具有很快的访问速度;
  • 允许使用null作为键和值;
  • 不保证元素的顺序,在遍历元素时无法按照任何顺序输出。

TreeMap的特点:

  • 按照键排序存储数据,因此可以保证元素按照一定顺序输出,这种顺序可以通过key的自然顺序或者自定义排序器决定;
  • 不允许使用null作为键,但可以使用null作为值。

在具体使用时,需要根据数据的特点和需要进行选择。

如果需要快速的查找、插入、删除操作,并且对元素的顺序没有特别要求,那么就应该使用HashMap

如果需要按照键排序并且对元素的顺序有明确要求,那么可以使用TreeMap。同时,在需要在多线程环境下进行操作时,可以使用ConcurrentHashMap来代替HashMap,以保证线程安全。


在这里插入图片描述

http://www.lryc.cn/news/90532.html

相关文章:

  • Sangria:类似Nova folding scheme的relaxed PLONK for PLONK
  • 【蓝桥杯省赛真题22】python剩余空间问题 青少年组蓝桥杯比赛python编程省赛真题解析
  • 基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)
  • C++的类
  • 【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 划分子网、构造超网
  • 1-网络初识——网络发展史
  • 《Spring Guides系列学习》guide35 - guide40
  • 《算法导论》拓展之 一维二维最近点对问题
  • 【C++】动态存储分配
  • 小狗避障-第14届蓝桥杯省赛Scratch中级组真题第4题
  • GPT学习笔记-Embedding的降维与2D,3D可视化
  • Nautilus Chain上线主网,为DeFi和流支付的未来构建基础
  • java设计模式之命令设计模式的前世今生
  • 离散系统函数零积点分析
  • Karl Guttag:苹果VST MR头显也无法突破AR的物理局限
  • mysql倒库操作遇到的问题
  • ELK企业级日志分析系统
  • 华为OD机试真题 Java 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路
  • SSM 如何使用 TCC 机制实现分布式事务?
  • 如何在上架App之前设置证书并上传应用
  • 华清远见 day04
  • 如何处理Vue应用程序中的错误和异常情况?
  • javascript基础十六:Ajax 原理是什么?如何实现?
  • 大话手游原始服务端搭建教程Centos
  • C语言中的通用工具库stdlib.h
  • 优化带排序的分页查询
  • chatgpt赋能python:Python如何删除空白
  • [论文阅读] Explicit Visual Prompting for Low-Level Structure Segmentations
  • swagger在spring项目中的使用
  • 操作系统第五章——输入输出管理(中)