1.双列集合的特点
①在java中,双列集合·一次存储一对数据(键、值),这一对数据称为键值对或键值对对象、也可以称为Entry对象;
②键不可以重复,值可以重复;
③键和值是一一对应的,每个键都可以唯一的找到其所对应的值;
2.MAP
MAP是一个接口,故需使用其他类来实现此接口;常用类有HasMap,LinkedHasMap,TreeMap,Hashtable,Properties;
①MAP总常见的API
V put(k key,v value):常用来添加元素;
当我们添加的键值重复时,后面添加的会覆盖前面添加的值(返回值是被覆盖的值);
V remove(Object key):根据建删除键值对元素;
void clear():移除所有键值对元素;
boolean containsKey(Object key):判断集合中是否包含指定的键;
boolean containsValue(Object value):判断集合中是否包含指定的值;
boolean isEmpty():判断集合是否为空;
int size():求集合中键值对的个数;
import java.util.HashMap;
import java.util.Map;
public class TestMap {
public static void main(String[] args) {
Map map=new HashMap<>();//创建一个集合
map.put("1","杨过");//添加键值对
map.put("2","小龙女");
map.put("3","郭靖");
map.put("4","黄蓉");
map.put("5","魏无羡");
map.remove("5");//根据建删除对应的键值对
}
}
②遍历方式
键找值,键值对,Lambda表达式;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.BiConsumer;
public class TestMap {
public static void main(String[] args) {
Map map=new HashMap<>();
map.put("1","杨过");
map.put("2","小龙女");
map.put("3","郭靖");
map.put("4","黄蓉");
map.put("5","魏无羡");
Set keys = map.keySet();//将获取到的键存在SET集合中
for(String key:keys){
String values = map.get(key);//遍历集合,获取每个键对应的值
System.out.println(key+"="+values);//输出打印
}
System.out.println("*******************************通过键值对进行遍历");
Set> entries = map.entrySet();//获取集合中的每个键值对
for (Map.Entry entry : entries) {
String key=entry.getKey();//获取键
String value=entry.getValue();//获取值
System.out.println(key+"="+value);
}
System.out.println("*******************************foreach");
map.forEach(new BiConsumer() {
@Override
public void accept(String key, String value) {
System.out.println(key+"="+value);
}
});
System.out.println("*******************************Lambda表达式遍历");
map.forEach((key,values)-> System.out.println(key+"="+values));
}
}
3.案例分析
需求:某班级100名同学要出去团建,有“吃烧烤”,“轰趴馆”,“爬华山”,“大排档”,这几个选项,每人只能选一次,计算票数最多的;
分析:首先得有一个容器来存储这几个地方,其次还需要一个集合来存储学生的投票情况(可以使用随机数模拟学生投票情况),然后遍历集合获取地址看在HashMAP集合中是否存在,若存在需现获取对应的键值,给其++,再将其键值对储存到集合中;若不存在,则需将键值设为1,再将键值对存到集合中;
具体代码如下:
public class testHasMap {
public static void main(String[] args) {
String []addias={"吃烧烤","轰趴馆","爬华山","大排档"};
ArrayList list=new ArrayList<>();
Random random=new Random();
for (int i = 0; i < 100; i++) {
int index=random.nextInt(addias.length);
list.add(addias[index]);
}
Map map=new HashMap<>();
for (String name : list) {
if(map.containsKey(name)){
int count = map.get(name);
count++;
map.put(name,count);
}
else{
map.put(name,1);
}
}
System.out.println(map);
int max=0;
Set> entries = map.entrySet();
for (Map.Entry entry : entries) {
int value = entry.getValue();
if(value>max){max=value;}
}
System.out.println(max);
for (Map.Entry entry : entries) {
int value = entry.getValue();
if(value==max){
System.out.println(entry);
}
}
4.LinkedMap
①主要由键决定,有序,不重复,无索引;
②存储时的顺序和取出时的顺序一致;
③底层数据结构是哈希表,每个键值对元素含有一个双链表存储机制;
因为其实现了MAP接口故大多使用方法都和HashMap相差不大;
5.TreeMap
①TreeMap和TreeSet底层原理一样,都是红黑树结构;
②由键决定特性,不重复,无索引,可排序(对键进行排序,默认情况下升序);
也可通过实现Comparable接口来指定排序;
或创建集合时传递Comparator比较器对象来指定排序;
案例分析:
需求:键存学生对象;值存储籍贯;先按照年龄进行升序,年龄相同,在按照名字开头大写字母顺序进行排列,同名同龄视为同一人;
具体代码如下:
import java.util.Objects;
public class Student implements Comparable {//学生类
private String name;
private int age;
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 String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
@Override
public int compareTo(Student o) {
int i = this.getAge() - o.getAge();//先按照年龄进行升序
i = i == 0 ? this.getName().compareTo(o.getName()) : i;
return i;
}
}
测试代码:
import java.security.Key;
import java.util.*;
import java.util.function.BiConsumer;
public class testHasMap {
public static void main(String[] args) {
Student s1=new Student("张三",21);
Student s2=new Student("刘小三",23);
Student s3=new Student("张三",21);
Student s4=new Student("王五",21);
Student s5=new Student("李四",22);
TreeMap tm=new TreeMap<>();
tm.put(s1,"陕西");
tm.put(s2,"河北");
tm.put(s3,"石家庄");
tm.put(s4,"西安");
tm.put(s5,"重庆");
System.out.println(tm);
}
}