Map接口
1. 概述
Map接口是一个双列集合(每个元素都包含两个值 分别为key 和value),其中这个key要求必须是唯一的,value可以重复,将来可以根据某个key来从容器中快速获取对应的哪个唯一元素
key和value本身就是一个对,之间存在映射关系,在某些语言中将这种集合形象的称为“字典集合”
2. HashMap实现类
常用的一些方法
- put(key,value) 向Map集合中添加新元素
- size() 返回当前集合中的元素个数
- get(key)根据某个key获取对应的value
- containsKey(key) 判断某个key是否存在
- isEmpty()判断集合是否为空
- remove(key)根据key删除对应的元素
- clear()清空Map集合
//创建一个HashMap
Map<String, String> map=new HashMap<>();
//往Map集合中添加元素
map.put("1001","zhangsan");
map.put("1002","lisi");
map.put("1003","wangwu");
map.put("1004","zhaoliu");
//获取集合中元素的个数
System.out.println(map.size());
//根据key获取对应的value
System.out.println(map.get("1003"));
//判断是否存在某个key
System.out.println(map.containsKey("1002"));
常见的几种遍历方式
- foreach循环(增强for循环):获取键值,然后通过键值遍历整个集合
- 迭代器循环(万能迭代器)
package com.qianfeng.day14;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import com.qianfeng.weekendDay03.Student;
public class HashMapTest {
public static void main(String[] args) {
HashMap<String,Student> hashMap = new HashMap<String,Student>() ;
Student[] student = new Student[5];
student[0] = new Student("1001","张三",18,"12345@qq.com","15675636271");
student[1] = new Student("1002","李四",19,"54321@qq.com","18366543271");
student[2] = new Student("1003","王五",28,"98765@qq.com","12365736271");
student[3] = new Student("1004","赵六",20,"13534@qq.com","19887532271");
student[4] = new Student("1005","田七",22,"56789@qq.com","16765736271");
for(int i = 0; i < 5; i++) {
hashMap.put(student[i].getNumber(), student[i]);
}
Set<String> set = hashMap.keySet();
//增强for循环(foreach)
for(String str : set) {
System.out.println(hashMap.get(str));
}
System.out.println("=============================================");
//迭代器循环
Iterator<String> iterator = hashMap.keySet().iterator();
while(iterator.hasNext()) {
String s = iterator.next();
System.out.println(hashMap.get(s));
}
//调用map接口的entrySet()方法也是返回一个Set 但是里面存储的是Map.
//Entry类型的对象,该类型是一个Map中的内部类,
//该类型的对象上提供两个方法getKey和getValue
Set<Entry<String, String>> entrySet = hashMap.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey() + "--->" + entry.getValue());
}
}
}
结果截图:

HashMap原理解析
- jdk1.7中HashMap底层采用的数据结构是:数组+链表 ,在jdk1.8中底层采用的数据结构是:数组+链表+红黑树(二叉平衡树)
- putVal()添加元素过程如下
- 对添加元素的key调用它的hashCode()方法得到一个hash值
- 根据这个哈希值结合一定的算法(i = (n - 1) & hash)映射为一个数组的下标
- 如果这个下标对应的位置为null,则直接将新元素添加到下标对应的位置,如果这个下标对应的位置已经存在元素了(发生了冲突),将添加的元素的key依次和当前位置的每个元素的key进行相等比较(equals),如果发现有相等则用新的value覆盖老的value,如果没有发现某个元素的key和添加的元素key相等则将新元素添加到链表的末尾
- 当某个桶位上链表的元素过多(8个)时会将映射的数组扩容,直到这个数组容量等于树化容量阈值的时候,将这个链表转成红黑树,目的是提高查找的效率
TreeMap实现类
TreeMap属于有序的Map集合类型,它可以按照key进行排序,所以在使用这个子类的手一定要配合Comparable接口共同使用。
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
Hashtable实现类
Hashtable是一个线程安全版的HashMap
面试题:HashMap和Hashtable的区别:
- HashMap是线程不安全的 Hashtable是线程安全类
- HashMap元素key可以为null Hashtable不允许
Properties
它是Hashtable的一个子类,和Hashtable不同,Properties主要用来加载应用程序的配置信息,加载过程在整个程序执行期间只会发生一次
属性资源文件一般以.properties作为后缀,本质上就是一个文本文件,内容的格式必须是key=value
//1.创建一个Properties集合对象
Properties prop=new Properties();
//2.需要有一个读取外部磁盘文件的输入流
InputStream in = TestProperties.class.getResourceAsStream("/info.properties");
System.out.println(in);
//3.调用properties集合对象的load方法
prop.load(in);
//4.调用prop集合对象的getProperty(String propertyName)
String username=prop.getProperty("username");
String password=prop.getProperty("password");
System.out.println("username:" + username);
System.out.println("password:" + password);
总结:双列集合相比于单列来说更耗费内存空间,但是根据某个关键字查询的效率比较高
key的选择问题:
1.key具有唯一性
2.信息更简单,占的空间更少
3.选择经常作为查询条件的字段
本文详细介绍了Java中的Map接口及其常用的实现类HashMap、TreeMap和Hashtable。HashMap是基于哈希表的数据结构,提供了高效的插入、删除和查找操作。TreeMap则是有序的Map,它按照key进行排序。Hashtable是一个线程安全的HashMap版本。此外,文章还提到了Properties类,用于加载和存储应用程序配置信息。并探讨了选择key的原则,强调key的唯一性和适合查询的特性。
474

被折叠的 条评论
为什么被折叠?



