Map接口
程序员文章站
2022-12-12 17:10:47
1.Map集合1)Map集合的特点1.Map 双列集合(key,value) key和value的数据类型可同2.key不许重复,value可以重复且一一对应2)Map集合常用方法/*1.public V put(K key, V value): 返回值:v key不重复,返回null key重复,返回被替换的value */ Map...
1.Map接口
1)Map接口的特点
1.双列集合
2.key不可重复 value可重复
2)Map接口常用方法
1.public V put(K key, V value):
return:V key不重复,返回null
key重复,返回被替换的value
2.public V remove(Object key):
return:V key不存在,返回null
key存在,返回被删除的value
3.public V get(Object key)
return:
key不存在,返回null
key存在,返回对应的value值
4.boolean containsKey(Object key)
Map<String,String> map = new HashMap<>();
map.put("李晨", "范冰冰1");//v1:null
map.put("李晨", "范冰冰2");//v2:范冰冰1
//此时集合中{李晨=范冰冰2}
map.put("冷锋","龙小云");
map.put("杨过","小龙女");
map.put("尹志平","小龙女");
//此时集合中{杨过=小龙女, 尹志平=小龙女, 李晨=范冰冰2, 冷锋=龙小云}
String v1 = map.remove("李晨");//v1:范冰冰2
String v2 = map.remove("林俊杰");//v2:null
String v3 = map.get("杨过");//v3:小龙女
String v4 = map.get("迪丽热巴");//v4:null
boolean b1 = map.containsKey("杨过");//b1:true
boolean b2 = map.containsKey("赵颖");//b2:false
注意
:
int V = map.remove("1");
自动拆箱,返回的Value赋值给V
v是数字的时候可以,vnull则报NullPointerException
3)Map接口的遍历方法①键找值
①键找值:—需要借助2个Map接口中的方法
public Set< K > keySet() //返回map中所有的key到一个set集合中
public V get(Object key) //返回对应的value
//创建Map集合对象,准备使用map中的方法
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
//1.使用keySet(),提取所有的key,一下子存到set集合中
Set<String> set = map.keySet();
//2.遍历set集合,一步步得到其中所有key
for(String key : set){ //set也可以直接写成 map.keySet()
//3.使用get(key),找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
//2.遍历set集合,一步步得到其中所有key
Iterator<String> it = set.iterator();
while (it.hasNext()){
String key = it.next();
//3.使用get(key),找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
林志玲=178
赵丽颖=168
杨颖=165
4)Map接口的遍历方法②Entry
②Entry:—需要借助2个Map接口中的方法
Map.Entry是Map声明的一个内部接口,定义为Entry<K,V>
public Set<Map.Entry<K,V>> entrySet() 返回map中所有的键值对对象到一个set集合中
public interface Map<K, V>{
interface Entry<K, V> { //Entry将键值对的对应关系封装成了对象
K getKey();//获取Entry对象中的键。
V getValue();//获取Entry对象中的值。
}
}
//创建Map集合对象,准备使用map中的方法
Map<String,Integer> map = new HashMap<>();
map.put("赵丽颖",168);
map.put("杨颖",165);
map.put("林志玲",178);
// 1.使用entrySet(),提取所有的Entry对象,一下子存到set集合中
Set<Map.Entry<String, Integer>> set = map.entrySet();
// 2.遍历set集合,一步步得到其中所有Entry对象
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);
}
for(Map.Entry<String,Integer> entry:set){
//3.使用Entry对象中的方法getKey()和getValue()获取键与值
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key+"="+value);
}
林志玲=178
赵丽颖=168
杨颖=165
2.HashMap
1)HashMap集合特点
public class HashMap<K,V> implements Map<K,V>
- HashMap底层由哈希表实现:数组+单向链表或红黑树(链表的长度超过8): (哈希表结构查询都非常快)
- hashMap无序集合 多线程
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
2)HashMap存储自定义键值类型
作为键key必须保证唯一性
<String,Person>分析:
- key:String类型,系统重写String类hashCode方法和equals方法,保证了key唯一性
- value:Person类型 value可以重复
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));
//字符串重写了hashCode和equals方法,所以张三key北京重复被替换了
Set<String> set = map.keySet();
for (String key : set) {
Person value = map.get(key);
System.out.println(key+"-->"+value);
}
上海-->Person{name='李四', age=19}
广州-->Person{name='王五', age=20}
北京-->Person{name='赵六', age=18}
<Person,String>分析:
- key:Person类型,Person类必须重写hashCode方法和equals方法,来保证key唯一性
- value:String类型 value可以重复
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),"毛里求斯");
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 {
@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 &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
Person{name='女王', age=18}-->毛里求斯
Person{name='秦始皇', age=18}-->秦国
Person{name='普京', age=30}-->俄罗斯
3)LinkedHashMap集合特点
public class LinkedHashMap<K,V> extends HashMap<K,V>
哈希表+链表 有序
HashMap<String,String> map = new HashMap<>();
map.put("a","a");
map.put("c","c");
map.put("b","b");
map.put("a","d");
System.out.println(map);// key不允许重复,无序 {a=d, b=b, c=c}
LinkedHashMap<String,String> linked = new LinkedHashMap<>();
linked.put("a","a");
linked.put("c","c");
linked.put("b","b");
linked.put("a","d");
System.out.println(linked);// key不允许重复,有序 {a=d, c=c, b=b}
4)Hashtable与HashMap
public class Hashtable<K,V> implements Map<K,V>
HashMap<String,String> map = new HashMap<>();
map.put(null,"a");
map.put("b",null);
map.put(null,null);
System.out.println(map);//{null=null, b=null}
//Hashtable不能和null扯上关系
Hashtable<String,String> table = new Hashtable<>();
table.put(null,"a");//NullPointerException
table.put("b",null);//NullPointerException
table.put(null,null);//NullPointerException
- Hashtable的子类Properties依然活跃( IO流))
3.of方法一次性添加
三者都是实现了of
- static < E > List< E > of( ){E… elements}
- static < E > Set< E > of(){E… elements}
- static <K, V> Map<K, V> of( ){E… elements}
List<String> list = List.of("a", "b", "a", "c", "d");
System.out.println(list);//[a, b, a, c, d]
1.'of返回一个不能变的集合,集合不能再使用add,put方法添加元素,会抛出异常'
list.add("w");//UnsupportedOperationException:不支持操作异常
2.'Set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常'
Set<String> set = Set.of("a", "b", "a", "c", "d");//IllegalArgumentException:非法参数异常,有重复的元素
Set<String> set = Set.of("a", "b", "c", "d");
System.out.println(set);
3.'of仅适用于List Set Map 本身,不适用于接口的实现类'
ArrayList<String> list1 = ArrayList.of("a", "b", "a", "c", "d");
本文地址:https://blog.csdn.net/weixin_40285319/article/details/110440510