# JAVA零基础小白学习免费教程day14-Set&HashMap（二）

JAVA零基础小白学习免费教程day14-Set&HashMap（一）https://developer.aliyun.com/article/1433777

### 比较器排序

Comparator 可以看成一个外部比较器，好处不用修改原代码直接实现

##### 代码实现
package cn.yanqi_02;
import cn.yanqi_01.Student;
import cn.yanqi_02.MyComparator;
import java.util.TreeSet;
/*
* 需求：请按照姓名的长度排序
*
* TreeSet集合保证元素排序和唯一性的原理
* 唯一性：是根据比较的返回是否是0来决定。
* 排序：
*    A:自然排序(元素具备比较性)
*      让元素所属的类实现自然排序接口 Comparable
*    B:比较器排序(集合具备比较性)
*      让集合的构造方法接收一个比较器接口的子类对象 Comparator
*/
public class Demo {
public static void main(String[] args) {
// 创建集合对象
// TreeSet<Student> ts = new TreeSet<Student>(); //自然排序
// public TreeSet(Comparator comparator) //比较器排序
TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
// 创建元素
Student s1 = new Student("linqingxia", 27);
Student s2 = new Student("zhangguorong", 29);
Student s3 = new Student("wanglihong", 23);
Student s4 = new Student("linqingxia", 27);
Student s5 = new Student("liushishi", 22);
Student s6 = new Student("wuqilong", 40);
Student s7 = new Student("fengqingy", 22);
Student s8 = new Student("linqingxia", 29);
// 添加元素
// 遍历
for (Student s : ts) {
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
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;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MyComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
// int num = this.name.length() - s.name.length();
// this -- s1
// s -- s2
// 姓名长度
int num = s1.getName().length() - s2.getName().length();
// 姓名内容
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
// 年龄
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num3;
}
}
Comparable<T> 内部比较器，需要修改原代码，不符合OCP原则
重写方法：  public int compareTo(T t)
Comparator 可以看成一个外部比较器，好处不用修改原代码直接实现
重写方法：  public int compare(Ojbect s1, Ojbect s2)

## Map集合

### Map与Collection集合区别

• Collection集合
单列集合，一次只能添加一个元素

• Map集合
Map集合是双列集合，由Key和Value组成
Key是不允许重复的，Value是允许重复
Key允许存null值的，但是只能存储唯一的一个

• HashMap

### Map接口中常用的方法

 方法名 说明 public V put(K key, V value) 把指定的键与指定的值添加到Map集合中。 public V remove(Object key) 把指定的键 所对应的键值对元素 在Map集合中删除，返回被删除元素的值。 public V get(Object key) 根据指定的键，在Map集合中获取对应的值。 boolean containsKey(Object key) 判断集合中是否包含指定的键。 public Set keySet() 获取Map集合中所有的键，存储到Set集合中。 public Set> entrySet() 获取到Map集合中所有的键值对对象的集合(Set集合)。

public class MapDemo {
public static void main(String[] args) {
//创建 map对象
HashMap<String, String>  map = new HashMap<String, String>();
//添加元素到集合
map.put("黄晓明", "杨颖");
map.put("文章", "马伊琍");
map.put("邓超", "孙俪");
System.out.println(map);
//String remove(String key)
System.out.println(map.remove("邓超"));
System.out.println(map);
// 想要查看 谁是谁的对象
System.out.println(map.get("黄晓明"));
System.out.println(map.get("邓超"));
System.out.println(map.get("yiyan"));//找不到返回null
}
}

### Map集合的遍历

#### keySet

• 分析步骤
1. 获取Map中所有的键，由于键是唯一的，所以返回一个Set集合存储所有的键。方法提示:keyset()
2. 遍历键的Set集合，得到每一个键。
3. 根据键，获取键所对应的值。方法提示:get(K key)
• 代码演示
public class MapDemo01 {
public static void main(String[] args) {
//创建Map集合对象
HashMap<String, String> map = new HashMap<String,String>();
//添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
//获取所有的键  获取键集
Set<String> keys = map.keySet();
// 遍历键集 得到 每一个键
for (String key : keys) {
//key  就是键
//获取对应值
String value = map.get(key);
System.out.println(key+"的CP是："+value);
}
}
}

#### EntrySet

• 什么是Entry

Map中存放的是两种对象，一种称为key(键)，一种称为value(值)，它们在在Map中是一一对应关系，这一对对象又称做Map中的一个Entry(项)Entry将键值对的对应关系封装成了对象。即键值对对象，这样我们在遍历Map集合时，就可以从每一个键值对（Entry）对象中获取对应的键与对应的值。

• 获取Entry

Map集合中通过entrySet() 方法获取Entry对象

public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
• Entry对象中的常用方法

 方法名 说明 public K getKey() 获取Entry对象中的键。 public V getValue() 获取Entry对象中的值。

• Entry图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1ammRlU-1672475567269)(assets/Map集合遍历方式二.bmp)]
• 代码实现
• 步骤分析
1.  获取Map集合中，所有的键值对(Entry)对象，以Set集合形式返回。方法提示:entrySet()
2.  遍历包含键值对(Entry)对象的Set集合，得到每一个键值对(Entry)对象。
3.  通过键值对(Entry)对象，获取Entry对象中的键与值。  方法提示:getkey() getValue()   
• 代码实现
public class MapDemo02 {
public static void main(String[] args) {
// 创建Map集合对象
HashMap<String, String> map = new HashMap<String,String>();
// 添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
// 获取 所有的 entry对象  entrySet
Set<Entry<String,String>> entrySet = map.entrySet();
// 遍历得到每一个entry对象
for (Entry<String, String> entry : entrySet) {
// 解析
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"的CP是:"+value);
}
}
}
• 补充另外两种遍历方式
System.out.println("---------通过iterator-------------");
Iterator<Map.Entry<Integer, String>> it = map.entrySet().iterator();
while (it.hasNext()){
//返回的 key value
Map.Entry<Integer, String> next = it.next();
Integer key = next.getKey();
String value = next.getValue();
System.out.println(key+": "+value);
}
System.out.println("----------jdk1.8新特性------------");
map.forEach((key, value) -> {
System.out.println(key+": "+value);
});

### Map存储自定义类型元素

• 需求
每位学生（姓名，年龄）都有自己的家庭住址。那么，既然有对应关系，则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。

• 编写学生类
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;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
• 编写测试类
public class HashMapTest {
public static void main(String[] args) {
//1,创建Hashmap集合对象。
Map<Student,String>map = new HashMap<Student,String>();
//2,添加元素。
map.put(newStudent("lisi",28), "上海");
map.put(newStudent("wangwu",22), "北京");
map.put(newStudent("zhaoliu",24), "成都");
map.put(newStudent("zhouqi",25), "广州");
map.put(newStudent("wangwu",22), "南京");
//3,取出元素。键找值方式
Set<Student>keySet = map.keySet();
for(Student key: keySet){
Stringvalue = map.get(key);
System.out.println(key.toString()+"....."+value);
}
}
}
• 总结
• 当给HashMap中存放自定义对象时，如果自定义对象作为key存在，这时要保证对象唯一，必须复写对象的hashCode和equals方法(如果忘记，请回顾HashSet存放自定义对象)。
• 如果要保证map中存放的key和取出的顺序一致，可以使用java.util.LinkedHashMap集合来存放。

• 有序的，而且key不允许重复
• 数据结构: 哈希表 + 链表
总结：有序，key唯一

### 代码演示

public class LinkedHashMapDemo {
public static void main(String[] args) {
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("刘德华", "朱丽倩");
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + "  " + entry.getValue());
}
}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmoNHF81-1672475567270)(assets/image-20201120101547482.png)]

JAVA零基础小白学习免费教程day14-Set&HashMap（三）https://developer.aliyun.com/article/1433782

|
3天前
|
IDE Oracle Java
java基础教程(1)-Java概述和相关名词解释
【4月更文挑战第1天】Java是1995年Sun Microsystems发布的高级编程语言，以其跨平台特性著名。它介于编译型和解释型语言之间，通过JVM实现“一次编写，到处运行”。Java有SE、EE和ME三个版本，分别针对标准、企业及嵌入式应用。JVM是Java虚拟机，确保代码在不同平台无需重编译。JRE是运行环境，而JDK包含开发工具。要安装Java开发环境，可从Oracle官网下载JDK，设置JAVA_HOME环境变量并添加到PATH。
26 0
|
4天前
|

java学习路径
【4月更文挑战第9天】java学习路径
14 1
|
4天前
|

Java是一种广泛使用的编程语言，其学习路径可以大致分为以下几个阶段
【4月更文挑战第9天】Java是一种广泛使用的编程语言，其学习路径可以大致分为以下几个阶段
10 1
|
5天前
|
XML 前端开发 Java
《手把手教你》系列技巧篇（十四）-java+ selenium自动化测试-元素定位大法之By xpath上卷（详细教程）
【4月更文挑战第6天】按宏哥计划，本文继续介绍WebDriver关于元素定位大法，这篇介绍定位倒数二个方法：By xpath。xpath 的定位方法， 非常强大。使用这种方法几乎可以定位到页面上的任意元素。xpath 是XML Path的简称， 由于HTML文档本身就是一个标准的XML页面，所以我们可以使用Xpath 的用法来定位页面元素。XPath 是XML 和Path的缩写，主要用于xml文档中选择文档中节点。基于XML树状文档结构，XPath语言可以用在整棵树中寻找指定的节点。
34 0
|
1天前
|
Java 存储

8 0
|
2天前
|

《手把手教你》系列技巧篇（十七）-java+ selenium自动化测试-元素定位大法之By css上卷（详细教程）
27 1
|
3天前
|
JavaScript Java 测试技术

8 0
|
19天前
|

map和set的简单介绍
map和set的简单介绍
18 1
|
1月前
|

java集合框架及其特点（List、Set、Queue、Map）
java集合框架及其特点（List、Set、Queue、Map）
36 3
|
3月前
|
JavaScript 前端开发 定位技术
JavaScript 中如何代理 Set（集合） 和 Map（映射）
JavaScript 中如何代理 Set（集合） 和 Map（映射）
48 0