Map
map映射关系
a集合当中每一个元素,都可以在b集合当中找到一个唯一的一个值与之对应
a集合当中的元素不能够重复(set)
a集合当中的元素称他是一个key(键)
Map当做是一个字典(dict)
内部维护了set和list集合
map不同的名称,是根据 左边set的结构,比如HAshMap左边就是HashSet,LinkedHashMAp就是LinkedHashset,TreeMap就是TreeSet
hashMap
package com.company;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
//map当中的元素并不是有序的
Map<String, Object> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
map.put("key5","value5");
System.out.println(map);
//获取a集合
Set<String> set =map.keySet();
System.out.println(set);
//获取b集合
Collection<Object> values=map.values();
System.out.println(values);
}
}
常用方法
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
//map当中的元素并不是有序的
Map<String, Object> map = new HashMap<>();
map.put("李四",20);
map.put("张三",20);
map.put("张三",123);
System.out.println(map.get("张三"));//根据键取值 值为123
System.out.println(map);//{李四=20, 张三=123}
map.remove("李四");//删除
System.out.println(map);//{张三=123}
System.out.println(map.size());//打印长度,为1
map.clear();//清空元素
System.out.println(map);//{}
}
}
遍历
根据迭代器取出set来获取HashMap的值
package com.company;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("李四",20);
map.put("张三",20);
map.put("王五",123);
Set<String> allKeys=map.keySet();
Iterator<String> it=allKeys.iterator();
while (it.hasNext()){
String key= it.next();
System.out.println(map.get(key));
}
}
}
使用entry遍历
package com.company;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("李四",20);
map.put("张三",20);
map.put("王五",123);
//获取所有的key-value对象entry对象
//entry是定义在map内部当中的一个接口
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();//就是一个实体的entry对象
System.out.println(next);
}
}
}
foreach遍历
package com.company;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("李四",20);
map.put("张三",20);
map.put("王五",123);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
}
}
HashMap特性
以上是Map接口的公有的特性,接下来讲述Hashmap自己的特性
通过覆盖Equals与HashCode去重
package com.company;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
class Student{
String name;
Integer age;
Student (String name,Integer age){
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return name.equals(student.name) &&
age.equals(student.age);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Main {
public static void main(String[] args) {
Map<Student, String> hm = new HashMap<>();
hm.put(new Student("张三",20),"北京");
hm.put(new Student("张三",20),"深圳");
hm.put(new Student("李四",20),"深圳");
System.out.println(hm);
}
}
LinkedHashMap
HashMap的子类
添加的元素都是有序的
package com.company;
import java.util.LinkedHashMap;
public class Main {
public static void main(String[] args) {
//添加的元素师有顺序的,按照添加顺序来排序
LinkedHashMap<String, Integer> hm = new LinkedHashMap<>();
hm.put("张三",20);
hm.put("李四",20);
hm.put("王五",20);
System.out.println(hm);
}
}
TreeMap
和TreeSet同理
想要自己定义对象排序就要覆盖Comparable<>
对set不了解的,可以查看文章
https://www.nasuiyile.cn/143.html#TreeSet
hashmap与hashTable区别
hashmap与hashTable区别于共同点底层都是Hash算法,都是双列集合
1.区别HashMap是线程不安全,效率比较高,1.2版本才有
2.HashTable是线程安全的效率不高1.0之前就有
HashMap可以存nullHashTable不可以