HashMap
特征:
- 数据结构:jdk1.8之前:数组 + 单链表,jdk1.8之后数组 + 单链表 + 红黑二叉树
- 初始容量是16,加载因子0.75
- 当存放的元素个数达到容量的0.75时,扩容为原来的2倍
- 容量上限 1 << 30
- 其他的常量:TREEIFY_THRESHOLD = 8:当map的容量达到8时,数据结构从单链表转为红黑二叉树;UNTREEIFY_THRESHOLD = 6:当map的容量小于6时,数据结构由红黑二叉树转为单链表。
- 无序的、key唯一、value不唯一、key和value都可以为null
- 线程不同步的、多线程使用不安全,如果要实现同步的map:Map map = Collections.synchronizedMap(new HashMap(…));
常用的方法:
put(key , value)(键,值)//将键值对存入map中
get(key)(键)通过键来获取值
remove(key)(键)移除元素通过键
size() 获取元素的个数
clear()清空所有元素
isEmpty() 判断map是否为空
containsKey(key) 判断map中是否包含指定的键
containsValue(value) 判断map中是否有包含的值
keySet() 返回map中key的set集合
values() 返回map中value的collection集合
entrySet() 一个entry里面只能有一个键值对,返回的是一个entry的set集合
创建以及赋值:
@Test
public void test1() {
HashMap<Integer, String> map = new HashMap<>();
map.put(3, "h1");
map.put(1, "h2");
map.put(2, "h3");
}
遍历HashMap:
- foreach(key)
HashMap<Integer, String> map = new HashMap<>();
//通过遍历map中的键数组来获取Key/Value
//map.keySet()是键所对应的数组
for (Integer key : map.keySet()) {
System.out.println(key + "::" + map.get(key));
}
- foreach(Entry<K, V>)
for (Entry<Integer, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "::" + entry.getValue());
}
- forEach方法
map.forEach((k, v) -> System.out.println(k + "::" + v));
LinkedHashMap
特征:
- 底层实现和HashMap类同,数据结构是链表
- 有序、key唯一、value不唯一、key和value都可以null
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put("wqs", "吴青山");
map.put("wzy", "王子玉");
map.put("hwz", "胡维柱");
System.out.println(map);
}
TreeMap
特征
- 数据结构是红黑二叉树
- 无序的,唯一,key和value都可以为null
- 可排序的,存入的元素需要经过排序(元素具有排序的能力、或者容器 具有排序的能力)
- 线程不同步的、多线程使用不安全
Hashtable
特征
- 底层数据结构 数组+单链表
- 默认的容量是11, 加载因子是0.75
- 当存储的元素个数达到容量的0.75时,扩容为原容量的2倍+1
- 无序的、key唯一的、value可重复、key和value都不能为null
- 线程同步的、多线程使用安全、单线程使用效率较低
Properties
特征
- 继承于Hashtable
- 可以作为配置信息的存储容器,同时加载配置文件的配置信息。
- 线程同步的、多线程使用安全
常用方法
setProperty(String key , String value) //设置键值对
get(String key)//通过键获取对应的值
getProperty(String key, String defaultValue)//通过key去取value的值,如果没有则给出一个默认的值
load(InputStream is)通过IO流读取properties配置文件
创建赋值取值
@Test
public void test1() {
Properties pro = new Properties();
pro.setProperty("name", "wzy");
pro.setProperty("sex", "gg");
System.out.println(pro);
System.out.println(pro.getProperty("name"));
System.out.println(pro.getProperty("age", "暂无数据"));
}
通过IO流读取配置文件
@Test
public void test2() throws IOException {
Properties pro = new Properties();
InputStream is = new FileInputStream("./config.properties");
pro.load(is);
System.out.println(pro);
}
这里注意一点:./表示从根目录开始寻找,…/表示上一级目录,这里也可以加上配置文件的全地址,但是不推荐,因为如果将文件复制给别人,别人和你的磁盘不一定一样。