集合:HashMap与TreeMap

一、HashMap特点:

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

例题:

需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。存储三个键值对元素,并遍历
要求:同姓名,同年龄认为是同一个学生

首先要先定义Student类:

package MapDemo1;

import java.util.Objects;

public class Student1 {
    private String name;
    private int age;
    public Student1(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;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student1 student1 = (Student1) o;
        return age == student1.age && Objects.equals(name, student1.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }

因为键是学生对象(Student),键存储的是自定义对象,所以需要重写hashCode和equals方法

测试类:

package MapDemo1;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class test5 {
    public static void main(String[] args) {
        /*需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。存储三个键值对元素,并遍历
          要求:同姓名,同年龄认为是同一个学生
          核心点:
          HashMap的键位置如果存储的是自定义对象,需要重写hasLSode和equals方法。
       */
        Student1 t1=new Student1("张三",23);
        Student1 t2=new Student1("lisi",20);
        Student1 t3=new Student1("wangwu",22);
       // Student t4=new Student("张三",23);
        Map<Student1,String> map=new HashMap<Student1,String>();
        map.put(t1,"江苏");
        map.put(t2,"山东");
        map.put(t3,"浙江");
        //map.put(t4,"北京");
        //遍历集合;第一种
        map.forEach((student1, s)->System.out.println(student1 +":"+s));
        System.out.println("===========================");

        //2
        Set<Student1> keys=map.keySet();
        for(Student1 key:keys){
            String value=map.get(key);
            System.out.println(key+":"+value);
        }
        System.out.println("===========================");

        //3
        Set<Map.Entry<Student1,String>> entries=map.entrySet();
        for(Map.Entry<Student1,String> entry:entries){
            Student1 key=entry.getKey();
            String value=entry.getValue();
            System.out.println(key+":"+value);
        }






    }
}

遍历有三种方法,任选一种即可。 

 

二、 TreeMap集合

1.特点:
           不重复、无索引、可排序
           底层基于红黑树实现排序,增删改查性能较好
2. TreeMap集合排序的两种方式
实现Comparable接口,指定比较规则
创建集合时传递Comparator比较器对象,指定比较规则

3例题:

字符串“aababcadeddaaccee"
请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:
a(6)b(2)c(3)d(3)e(3)

代码:

package MapDemo1;
import java.util.TreeMap;
public class test8 {
    public static void main(String[] args) {
        /*符串“aababcadeddaaccee"
        请统计字符串中每一个字符出现的次数,并按照以下格式输出输出结果:
        a(6)b(2)c(3)d(3)e(3)
        */
        String s="aababcadeddaaccee";
        TreeMap<Character,Integer> tm=new TreeMap<>();
        //遍历字符串的每个字符
        for(int i=0;i<s.length();i++){
            char c=s.charAt(i);
            if(tm.containsKey(c)){
                int count=tm.get(c);
                count++;
                tm.put(c,count);
            }else{
                //不存在
                tm.put(c,1);
            }
        }
        //遍历集合,并按照指定的格式进行排序
        
        StringBuilder sb=new StringBuilder();
        tm.forEach((key,value)->sb.append(key).append("(").append(value).append(")"));
        System.out.println(sb);
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值