HashMap
回顾HashMap之前我们先回顾一下Map
补充:把Collection集合称为单列集合。Map被称为双列集合。
Map集合的特点
public interface Map<K,V>
特点:
1)Map集合可以一次性存储两个对象;
2)在Map集合中保存的key和value这样的具备一定对应关系的一组(一对)数据,Map集合中存储的是两个对象的对应关系(映射关系)。[ key-value映射关系 ];
3)Map集合中的key必须保证唯一(存储的key元素不能重复,value可以重复,但是一个key只能对应一个value);
4)Map集合中的key和value属于一一对应关系(一个key只能对应一个value)
Map和Collection的区别:
区别:
1)Map中键唯一,值没有要求。Collection中只有Set体系要求元素唯一;
2)Map的数据结构针对键而言,Collection的数据结构针对元素而言;
3)Map是双列集合顶级接口,Collection是单列集合顶级接口,他们两个分别是两种集合的顶级接口,之间没有必然的联系;
说明:
Collection集合中只能存储一个对象元素,称为单列集合。
Map集合中其实存储的是两个单列集合,称为双列集合。
Map接口中的常用方法
Map接口中定义了很多方法,常用的如下:
1)增加元素:
-
public V put(K key, V value)
: 把指定的键与指定的值添加到Map集合中。说明:
在使用put存储一对元素(key-value)对象时,会先拿key去判断Map集合中是否已经存在。
如果Map集合中没有相同的key存在:就把key-value存储到Map集合中,并返回null值。
如果Map集合中有相同的key存在:会把之前存储的value对象覆盖。并返回之前的value对象(旧value对象)。
这里可以理解为修改value,但是不能修改key。
注意:由于Map是接口,不能创建对象,只能使用Map下面的子类HashMap创建对象。
分析和步骤:
1)创建集合HashMap<String,String>集合对象map,返回值类型是Map<String,String>;
2)使用map对象调用put函数向集合中添加学生的学号作为key,姓名作为value;
3)输出对象map;
/*
* Map中的put函数的演示
* V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
*/
public class MapPutDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//给集合中添加数据
map.put("001","张三");
map.put("002","李四");
map.put("003","王二");
map.put("004","麻子");
map.put("005","王五");
map.put("006","麻子");
String name = map.put("006","老麻子");
//输出集合中的数据
System.out.println(map);
System.out.println(name);
}
}
删除元素:
-
public V remove(Object key)
: 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。说明:
remove是根据key删除当前key对应的value这一组数据:
如果Map集合中有与指定的key相同的元素存在:则删除一对key-value对象,而不是只删除value,并返回删除这组的value值;
如果Map集合中没有与指定的key相同的元素存在:没有删除操作,返回null;
问题:为什么不可以通过value来删除一组数据?
因为key是唯一的,而value可以有多个,所以不能通过value来删除一组数据,只能通过key值进行删除。
-
清空集合。void clear()
分析和步骤:
1)创建集合HashMap<String,String>集合对象map,返回值类型是Map<String,String>;
2)使用map对象调用put函数向集合中添加学生的学号作为key,姓名作为value;
3)使用map对象调用remove函数根据键key=004进行删除键值对,并使用String类型接收返回值value
4)输出对象map和删除的返回值value;
5)使用对象map调用clear()函数清除Map集合中的元素数据;
/*
* Map中的remove函数的演示
* V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
*/
public class MapRemoveDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//给集合中添加数据
map.put("001","张三");
map.put("002","李四");
map.put("003","王二");
map.put("004","麻子");
map.put("005","王五");
map.put("006","麻子");
//调用remove函数删除key为004的键值对组合
String value = map.remove("004");//返回删除key为004的value值麻子
//输出集合中的数据
System.out.println(map);
System.out.println(value);
//调用clear()函数清空map集合
//注意清空指的是将map集合中的所有元素清空,集合还在,还可以使用集合对象向集合中添加数据
map.clear();
System.out.println(map);
map.put("009", "黑旋风");
System.out.println(map);
}
}
3)获取集合中的元素:
-
public V get(Object key)
根据指定的键,在Map集合中获取对应的值。说明:
根据指定的key元素对象,去 Map集合获取相应的value对象。
如果Map集合中没有指定的key元素存在,则返回null。
注意:获取也只能根据key获取value,不能通过value获取key。
分析和步骤:
1)创建集合HashMap<String,String>集合对象map,返回值类型是Map<String,String>;
2)使用map对象调用put函数向集合中添加学生的学号作为key,姓名作为value;
3)使用map对象调用get函数根据键key=003获取value值,并使用String类型接收返回值value;
4)使用map对象调用get函数根据键key=007获取value值,并使用String类型接收返回值value1;
5)输出对象map和获得的value、value1;
/*
* Map中的get函数的演示
* V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
*/
public class MapGetDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//给集合中添加数据
map.put("001","张三");
map.put("002","李四");
map.put("003","王二");
map.put("004","麻子");
map.put("005","王五");
map.put("006","麻子");
//通过集合对象调用get函数根据key获取value值
String value = map.get("003");
String value1 = map.get("007");
//输出集合中的数据
System.out.println(map);
System.out.println(value);
//由于集合中没有key为007的数据,所以返回null
System.out.println(value1);
}
}
其他方法:
-
public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
-
int size()
获取Map集合中存储的key-value对应关系的个数。获取集合长度。
分析和步骤:
1)创建集合HashMap<String,String>集合对象map,返回值类型是Map<String,String>;
2)使用map对象调用put函数向集合中添加学生的学号作为key,姓名作为value;
3)使用map对象调用size()函数获取map集合中键值对个数,并输出结果;
4)使用map对象调用values()函数获取map集合中value值的个数,使用Collection集合进行接收并遍历输出结果;
5)使用map对象调用keySet()函数获取map集合中key值的个数,使用Set集合进行接收并遍历输出结果;
/*
* Map中的其他函数讲解
*/
public class MapOtherFunctionDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//给集合中添加数据
map.put("001","张三");
map.put("002","李四");
map.put("003","王二");
map.put("004","麻子");
map.put("005","王五");
map.put("006","麻子");
//返回map集合中的键值对的个数
int size = map.size();
System.out.println(size);
//获取map集合中的所有键集合
Set<String> keys = map.keySet();
//遍历set集合
for (String key : keys) {
System.out.println(key);
}
}
}
Map集合的遍历
针对Collection集合,它的遍历可以使用Iterator迭代器进行遍历。
但是Map集合不能直接使用Iterator迭代器来遍历,因为在Map集合根本就没有提供获得迭代器对象的函数。
既然不能通过Iterator迭代器直接来遍历,那是否可以间接使用Iterator迭代器来遍历Map集合呢?
之前讲Map集合时,Map集合是用来存储一对key-value两个对象,既然存储的是两个对象,那么能不能只获取其中一个所有的对象?
可以。Map集合属于双列集合,里面有两个单列集合。由于Map集合中的key是唯一的,所以我们我可以先获取Map集合中的key,然后根据key值来获取Map集合中的value值。
问题1:Map中的key对象,应该使用哪个集合存储?
key必须保证唯一性(不能重复),使用Set集合存储。
问题2:如何将Map中的key存储到Set集合呢?
可以使用Map中的keySet方法:获取Map集合中所有的key对象并存储到Set集合中。
public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
这样通过上述操作就可以将Map集合中的key存放到Collection集合下面的set中,然后使用Iterator遍历Map集合中的key所在的Set集合,进而可以使用 Map集合中的 public V get(Object key) 通过key间接的获取每个value。
注意:Map接口中提供了2个方法可以获取到Map中的key 或者key和value关系对象
keySet():Map中的key存储到Set集合中。
entrySet():Map中的key和value关系对象存储到Set集合中。
注:由于Map中key是唯一的,不能重复的,所以Map集合中键值对整体也是不能重复的,但是单独value值是可以重复的。
/*
* 使用keySet函数遍历Map集合
*/
public class MapKeySetDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//向集合中添加数据
map.put("李晨","范冰冰");
map.put("邓超","孙俪");
map.put("文章","马伊琍");
map.put("汪峰","章子怡");
/*
* 通过Map的对象调用keySet函数获得Map中的key值并保存到Set集合
* 所有的key键都保存到以下的set集合中了
*/
Set<String> keys = map.keySet();
//使用迭代器迭代Set集合
for (Iterator<String> it = keys.iterator(); it.hasNext();) {
//分别取出每个key值
String key = it.next();
//使用Map的对象调用get函数根据key获得value
String value = map.get(key);
//输出key和value
System.out.println(key+"===="+value);
}
}
}
使用entrySet遍历
分析和步骤:
1)创建Map集合对象map;
2)使用集合对象map调用put函数向集合中添加几个数据,丈夫作为key,妻子作为value;
3)使用集合对象map调用entrySet函数获取Map集合中所有的key和value对应关系的对象,把所有的对应关系的对象保存到Set集合中,并获取对象keyValues;
4)使用迭代器Iterator来对Set集合中的的对应关系的对象keyValues进行迭代,使用迭代器对象it调用next()函数来获取单个独立的key-value对应关系对象keyValue;
5)然后使用keyValue对象调用Map.Entry中的getKey()和getValue()函数来获得每个对应关系对象中的key和value,最后输出key和value值;
/*
* 使用Map集合中的entrySet函数遍历集合
*/
public class MapEntrySetDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String,String>();
//向集合中添加数据
map.put("李晨","范冰冰");
map.put("邓超","孙俪");
map.put("文章","马伊琍");
map.put("汪峰","章子怡");
/*
* 使用entrySet()函数获得键值对对应关系的对象
* KeyValues表示键值的对应关系的对象
*/
Set<Map.Entry<String, String>> keyValues = map.entrySet();
//迭代Set集合
/*
* Iterator<Map.Entry<String, String>> 表示每次迭代出来的是Map.Entry类型,
* 并且对应关系对象中的key和value都是String类型
*/
/*for (Iterator<Map.Entry<String, String>> it = keyValues.iterator(); it.hasNext();) {
Map.Entry<String, String> keyValue = it.next();
//keyValue表示每个独立的key-value对应关系的对象,现在分别取出对应关系中的key和value
String key = keyValue.getKey();
String value = keyValue.getValue();
//输出key和value
System.out.println(key+"---"+value);
}*/
//使用foreach循环遍历Set集合
for (Map.Entry<String, String> keyValue : keyValues) {
/*
* keyValue表示单个独立的映射关系对象,现在分别取出对应关系中的key和value
*/
String key = keyValue.getKey();
String value = keyValue.getValue();
//输出key和value
System.out.println(key+"。。。。"+value);
}
}
}