一、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);
}
}