1.Map接口
1.1Map接口
Map接口定义的集合称为查询表,用于存储键值对(hey-value)形式存储数据的数据结构,
可以把Map看成多行两列的表格,第一列存储Key,第二列存储Value
注意:key值不能重复,是指Map中不能包含任意两个equals为true的值
1.2put方法
是指将key-value的值存入Map中,若key 的值已经存在,则将对应value覆盖,返回值为替换的元素。若key不存在,返回值为null。
1.3get方法
是指返回集合中的元素,通过给定的key,返回对应的value
若Map中没有给定的key,返回值为null
1.4 containsKey
是指用于判断Map中是否包含指定的key
检查是否包含指定的key用equals方法进行笔记
以上几个方法的代码如下:
/*
* 统计各空气质量站点的PM2.5最高的值
*/
@Test
public void test1(){
String pm25="农展馆=423,东四=378,丰台花园=406,天坛=322,海淀区万柳=398,"
+ "官园=406,通州=366,昌平镇=248,怀柔镇=306,定陵=231,前门=422,"
+ "永乐店=368,古城=268,昌平镇=423,怀柔镇=267,定陵=377,前门=299,"
+ "永乐店=285,秀水街=277,农展馆=348,东四=356,丰台花园=179,天坛=277,"
+ "海淀区万柳=270,官园=268,通州=315";
String[]arr=pm25.split("[,=]");
System.out.println(Arrays.toString(arr));
System.out.println();
Map<String,Integer> map =new HashMap<String,Integer>();
for(int i=0;i<arr.length;i+=2){
if(!map.containsKey(arr[i])||Integer.parseInt(arr[i+1])>map.get(arr[i])){
map.put(arr[i],Integer.parseInt(arr[i+1]));
}
}
System.out.println(map);
}
2.HashMap
2.1Hash表原理
HashMap是Map一个常用子类的实现,是通过散列算法实现的。
HashMap中有一个散列数组,我们成为散列桶,当向Map添加一个键值对,HashMap首先获得key这个对象的HashCode方法,然后使用该值的散列算法,获得一个数值,这个数字就是这个键值对的散列数组下标位置,得知下标位置时,还要查看是否当前散列数组包含该元素。通过equals比较,若相等,则进行替换。若不相等,则进行存入。
2.2HashCode方法
HashMap的存取依赖于key的HashCode返回值。而HashCode方法是在Object中定义的。因此要重写该方法。
HashCode注意事项:
1.若一个类重写了equals方法,那么就应该重写HashCode方法。
2.若两个对象的equals比较值为true,那么他们应该有相同的HashCode值。
3.对一个对象而言,在内容没有改变的情况下,多次调用HashCode方法,其值不变
4.对于两个对象equals方法不同的对象,我们不要求其HashCode值必须不相同,但尽量保证不同,以提高散列性能
2.3装载因子以及HashMap优化,有以下几点
Capacity容量:hash表中同单位数量,既是散列数组大小
Initial Capacity:初始容量,默认为16,可以特定的指定容量。
Size:散列中存储数据的数量;
load factor:装载因子,默认值为0.75,如果Size/Capacity>=0.75,则会发生扩容,并重新散列(rehash)
3.有序Map
3.1LinkedHashMap实现有序Map
LinkedHashMap通过一个双向的循环链表,该循环链表定义了元素的迭代顺序,指存放元素的先后位置。
4.Map的遍历
4.1使用keyset方法:是通过key值进行遍历。代码如下
/*
* 使用迭代key的方式遍历map集合
*/
@Test
public void test2(){
String pm25="农展馆=423,东四=378,丰台花园=406,天坛=322,海淀区万柳=398,"
+ "官园=406,通州=366,昌平镇=248,怀柔镇=306,定陵=231,前门=422,"
+ "永乐店=368,古城=268,昌平镇=423,怀柔镇=267,定陵=377,前门=299,"
+ "永乐店=285,秀水街=277,农展馆=348,东四=356,丰台花园=179,天坛=277,"
+ "海淀区万柳=270,官园=268,通州=315";
String[]arr=pm25.split("[,=]");
System.out.println(Arrays.toString(arr));
System.out.println();
Map<String,Integer> map =new HashMap<String,Integer>();
for(int i=0;i<arr.length;i+=2){
if(!map.containsKey(arr[i])||Integer.parseInt(arr[i+1])>map.get(arr[i])){
map.put(arr[i],Integer.parseInt(arr[i+1]));
}
}
System.out.println(map);
Set<String>keys=map.keySet();
for(String str:keys){
System.out.print(str+":"+map.get(str)+" ");
}
}
4.2使用entryset方法进行遍历,只通过键值对(key-value)进行遍历Map,代码如下:
/*
* 使用迭代entry的方式遍历map集合
*/
public void test3(){
String pm25="农展馆=423,东四=378,丰台花园=406,天坛=322,海淀区万柳=398,"
+ "官园=406,通州=366,昌平镇=248,怀柔镇=306,定陵=231,前门=422,"
+ "永乐店=368,古城=268,昌平镇=423,怀柔镇=267,定陵=377,前门=299,"
+ "永乐店=285,秀水街=277,农展馆=348,东四=356,丰台花园=179,天坛=277,"
+ "海淀区万柳=270,官园=268,通州=315";
String[]arr=pm25.split("[,=]");
System.out.println(Arrays.toString(arr));
System.out.println();
Map<String,Integer> map =new HashMap<String,Integer>();
for(int i=0;i<arr.length;i+=2){
if(!map.containsKey(arr[i])||Integer.parseInt(arr[i+1])>map.get(arr[i])){
map.put(arr[i],Integer.parseInt(arr[i+1]));
}
}
System.out.println(map);
Set<Map.Entry<String,Integer>>set=map.entrySet();
for(Map.Entry<String,Integer>entry:set){
System.out.println(entry.getKey()+","+entry.getValue()+" ");
}
}