概念模型:
一般把搜索的数据称为关键字(key),和关键字对应的称为值(value),所以就会出现俩种模型
- 纯key模型,即是我们的Set要解决的事情,只需判断关键字在不在集合即可,没有关联的value。
- Key-Value模型,即我们的Map要解决的事情,需要指定Key找到关联的Value。
在介绍Map之前先先介绍–条目(Entry)
- Map.Entry<K,V>即Map中定义的K类型的Key,和V类型的value的映射关系的类。
- 常见方法: getKey()返回key 和getValue()返回value
for (Map.Entry<String, Student> m : map.entrySet()
) {
System.out.println(m.getKey() + ":" + m.getValue());
}
下面Map使用此自定义类型:
class Student {
public String name;
public int agg;
public String garde;
public String schlool;
static void h() {
System.out.println("hh");
}
public Student(String name, int agg, String garde, String schlool) {
this.name = name;
this.agg = agg;
this.garde = garde;
this.schlool = schlool;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", agg=" + agg +
", garde='" + garde + '\'' +
", schlool='" + schlool + '\'' +
'}';
}
}
Map的常用使用方法:
- Map的实例化
Map<String, Student> map = new HashMap<>();
- 设置key对应的value(要注意key是不可重复的,如果重复,后面来的value会覆盖前面的value)
Student student = new Student("Listen", 20, "001", "Happy");
Student student1 = new Student("Listen", 30, "002", "Day");
Student student2 = new Student("Byke", 40, "003", "Sun");
Student student3 = new Student("Frake", 50, "004", "Mane");
map.put(student.name, student);
//如果有相同的key,新的value会覆盖旧的value
map.put(student.name, student);
map.put(student1.name, student1);
map.put(student2.name, student2);
map.put(student3.name, student3);
- 返回key对于的value
String name = "Listen";
Student ret = map.get(name);
- 返回key对于的value,如果key不存在,返回默认值
map.getOrDefault("mm", new Student("mm", 50, "009", "shine"))
- 删除key对应的映射关系
map.remove(name);
- 返回所有key的不重复集合
Set<String> set = map.keySet();
- 返回所有value的可重复集合
Collection<Student> collections = map.values();
- 返回所有的key-value映射关系
Set<Map.Entry<String, Student>> set1 = map.entrySet();
- 判断是否有可以 或者判断是否有value
boolean containsKey(Object key);
boolean containsValue(Object value);
- Map的遍历方式
//遍历map
for (Map.Entry<String, Student> m : map.entrySet()
) {
System.out.println(m.getKey() + ":" + m.getValue());
}
//用迭代器遍历map
System.out.println("=============");
Iterator<Map.Entry<String, Student>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Student> entry = iterator.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}
//返回所有map的映射关系,并将它变成set里的key
Set<Map.Entry<String, Student>> set1 = map.entrySet();
//然后遍历set
Map最常用的地方-统计
Map<Integer, Integer> map = new TreeMap<>();
for(int i : nums) {
Integer tmp = map.get(i);
if(tmp == null) {
map.put(i,1);
}else {
map.put(i,tmp + 1);
}
}
//第二种方法
Map<Integer, Integer> map = new TreeMap<>();
for(int i : nums) {
map.put(i,map.getOrDefault(i,0) + 1);
}
}
Set的使用:
- 添加元素,但重复元素不会添加成功
Set<String> set = new TreeSet<>();
set.add("aaa");
set.add("bbb");
set.add("aaa");
set.add("ccc");
//有重复的set只保留一份
- 判断0是否在集合中
boolean contains(Object o)
- 删除集合中的0
boolean remove(Object o)
- 返回迭代器
Iterator<String> iterator = set.iterator();
- 清空集合
void clear();
Set的遍历方式:
//遍历方式 for each
for (String str : set
) {
System.out.print(str + " ");
}
System.out.println();
//用迭代器进行遍历
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String str = iterator.next();
System.out.print(str + " ");
}