Map接口
简介
类型参数:
K-此映射所维护的键的类型 键
v-映射值的类型 值
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
collection中的集合,元素是孤立存在的(理解为单身) ,向集合中存储元素采用一个个元素的方式存储。
Map中的集合,元素是成对存在的理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
collection中的集合称为单列集合,Map中的集合称为双列集合。
需要注意的是, Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
特点
Map集合的特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)2.Map集合中的元素,key和value的数据类型可以相同,也可以不同3.Map集合中的元素,key是不允许重复的, value是可以重复的
4.Map集合中的元素,key和value是一一对应
注意
Map接口中的集合都有两个泛型变量KV>,在使用时,要为两个泛型变量赋予数据类型。
两个泛型变量<K,V>
的数据类型可以相同,也可以不同。
常用方法
public V put (K key, Vvalue) :把指定的键与指定的值添加到Map集合中。
public V remove(object key) :把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
public V get(object key)根据指定的键,在Map集合中获取对应的值。
boolean containskey (object key)判断集合中是否包含指定的键。
public Set<k>
keyset() :获取Map集合中所有的键,存储到Set集合中。
public Set
HashMap集合
特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度
hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
java.util. LinkedHashMap
HashMap-K,Vy :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。
由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
public V put(K key, v value)
private static void show01() {
//创建Map集合对象,多态
Map<String, String> map = new HashMap<>();
String v1 =map.put("李晨", "范冰冰1");
System.out.println("v1:"+v1);//vi:null存储键值对的时候,key不重复,返回值v是null
String v2 =map.put("李晨", "范冰冰2");
System.out.println("v2: "+v2);//v2:范冰冰1 存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
System.out.println(map);//{李晨=范冰冰2}
map.put ("冷锋","龙小云");
map. put ("杨过","小龙女");
map.put ("尹志平","小龙女");
System.out. println(map);
}
public static void main(String[] args) {
show01();
}
public V remove(object key)
/*
public V remove(object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值。
返回值:V
key存在,v返回被删除的值key不存在, v返回null
*/
private static void show02() {
//创建Map集合对象
Map<String, Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map. put ("杨颖", 165);
map. put ("林志玲",178);
System.out.println(map);//{林志玲=178,赵丽颖-168,杨颖=165}
Integer v1 =map.remove( "林志玲");
System.out.println("v1: "+v1);//v1:178
System.out.println(map);//{赵丽颖=168,杨颖=165}
//int v2=map. remove ("林志颖");//自动拆箱 NullPointerException
Integer v2 = map.remove( "林志颖");
System.out.println("v2:"+v2);//v2:nulL
System.out.println(map);//{赵丽颖=168,杨颖=165}
}
public static void main(String[] args) {
show02();
}
public V get (object key)
/*
public V get (object key)根据指定的键,在Map集合中获取对应的值。
返回值:
key存在,返回对应的value值key不存在,返回null
*/
private static void show03() {
//创建Map集合对象
Map<String, Integer> map = new HashMap<>();
map.put ("赵丽颖",168);
map.put ("杨颖", 165);
map.put ("林志玲",178);
Integer v1 =map. get ("杨颖");
System.out.println("v1: "+v1);//v1:165
Integer v2 =map.get("迪丽热巴");
System.out.println("v2:"+v2);//v2:null
}
public static void main(String[] args) {
show03();
}
boolean containskey(object key)
/*
boolean containsKey(object key)判断集合中是否包含指定的键。
包含返回true,不包含返回false
*/
private static void show04(){
//创建Map集合对象
Map<String, Integer> map =new HashMap <>();
map.put ("赵颖",168);
map. put ("杨颖",165);
map.put ("林志玲",178);
boolean b1 =map.containsKey("赵丽颖");
System.out.println("b1:"+b1);//b1:true
boolean b2=map.containsKey ("赵颖");
System.out.println("b2: "+b2);//b2:false
}
public static void main(String[] args) {
show04();
}
Map集合遍历键找值方式
键找值方式:即通过元素中的键,获取键所对应的值分析步骤:
1,获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示: keyset()
2,遍历键的Set集合,得到每一个键。
3根据键,获取键所对应的值。方法提示: get(K key)
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
实现步骤:
Set<K>
keySet()返回此映射中包含的键的Set视图。
1,使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
2.遍历set集合,获取Map集合中的每一个key
3.通过Map集合中的方法get(key),通过key找到value
public static void main(String[] args) {
//创建Map集合对象
Map<String, Integer> map = new HashMap<();
map.put ("赵丽颖", 168);
map.put("杨颖", 165);
map.put ("林志玲",178);
//1.使用Map集合中的方法keyset(),把Map集合所有的key取出来,存储到一个Set集合中
Set<string> set =map.keySet();
1/2.遍历set集合,获取Map集合中的每一个key//使用送代器遍历Set集合
Iterator<string> it = set.iterator();
while (it.hasNext()){
string key =it.next();
//3.通过Map集合中的方法get(key),通过key找到value
Integer value =map. get(key);
5ystem.out.printin(key+"="+value);
}
//使用增强for遍历Set集
for(String key : set){
//3.通过Map集合中的方法get(key),通过key找到value
Integer value =map.get(key);
System.out.println(key+"="+value);
}
//使用增强for遍历Set集合
for(String key : set)
//3.通过Map集合中的方法get(key),通过key找到value
Integer value =map.get (key);
System.out.println(key+"="+value);
}
}
}
Entry键值对对象
我们已经知道, Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是-对应关系,这一对对象又称做Map中的一个Entry(项). Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。
既然Entry表示了一对键和值,那么也同样提供了获取对应鏈和对应值得方法:
public K getkey() :获取Entry对象中的键。
public v getvalue() :获取Entry对象中的值。
在Map集合中也提供了获取所有Entry对象的方法:
public set
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
操作步骤与图解:
1,获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示: entryset()
2.遍历包含键值对(Entry对象的Set集合,得到每一个键值对(Entry)对象。
3,通过键值对(Entry)对象,获取Entry对象中的键与值。方法提示: getkey () getvalue()
Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法:
Set
实现步骤:
1,使用Map集合中的方法entryset(),把Map集合中多个Entry对象取出来,存储到一个set集合中2·遍历Set集合,获取每一个Entry对象
3,使用Entry对象中的方法getkey()和getvalue ()获取键与值
public static void main(String[] args) {
//创建Map集合对象
Map<String, Integer> map = new HashMap<>();
map.put("赵E颖", 168);
map.put("杨颖", 165);
map.put("林志玲", 178);
//1,使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
//2.遍历Set集合,获取每一个Entry对象//使用迭代器遍历Set集合
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while (it.hasNext()) {
Map.Entry<String, Integer> entry = it.next();
//3.使用Entry对象中的方法getkey()和getValue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + "=" + value);
}
System.out.println("----");
for (Map.Entry<String, Integer> entry : set) {
//3.使用Entry对象中的方法getKey()和getValue ()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + "=" + value);
}
}
HashMap存储自定义类型键值
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键,家庭住址作为值。
/*
HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
*/
public static void main(String[] args) {
show01();
show02();
}
/*
HashMap存储自定义类型键值
key: String类型
String类重写hashCode方法和equals方法,可以保证key唯一value:Person类型
value可以重复(同名同年龄的人视为同一个)
*/
private static void show01() {
//创建HashMap集合
HashMap<String, Person> map = new HashMap<>();
//往集合中添加元素
map.put("北京", new Person("张三", 18));
map.put("上海", new Person("李四", 19));
map.put("广州", new Person("王五", 20));
map.put("北京", new Person("赵六", 18));
//使用keySet加增强for遍历Map集合
Set<String> set = map.keySet();
for (String key : set) {
Person value = map.get(key);
System.out.println(key + "-->" + value);
}
}
/*
HashMap存储自定义类型键值
key: Person类型
Person类就必须重写hashCode方法和equals方法,以保证ke唯value:String类型
*/
private static void show02() {
//创建HashMap集合
HashMap<Person, String> map = new HashMap<>();
//往集合中添加元素
map.put(new Person("女王", 18), "英国");
map.put(new Person("秦始皇", 18), "秦国");
map.put(new Person("普京", 30), "俄罗斯");
map.put(new Person("女王", 18), "毛里求斯");
//使用entrySet和增强for遍历Map集合
Set<Map.Entry<Person, String>> set = map.entrySet();
for (Map.Entry<Person, String> entry : set) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println(key + "--" + value);
}
}
public class Person {
private String name;
private int age;
public Person() {
}
public Person(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;
Person person = (Person) o;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
LinkedHashMap
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
LinkedHashMap
需要重写键的hashCode()方法、equals0方法。
public class LinkedHashMapDemo {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("邓超", "孙丽");
map.put("李晨", "范冰冰");
map.put("刘德华", "朱丽倩");
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + " " + entry.getValue());
}
}
}