HashMap

集合简介

概述
什么是集合呢?集合规范而言是一类引用数据类型。当我们有多个数据需要存储的时候我们一般使用数组来存储。但数组有一个很不讨喜的特点就是数组在初始化的时候其长度就被定死了,不可改变。其存储的数量不变,因此在使用的时候一般用于存储数量不变的场景中。当遇到存储数量需要改变的时候数组就显得不太合适。因此我们引入了集合!
作用
集合,可以保存数量不确定的数据,更重要的是,集合能保存具有映射关系的数据。集合中只能保存对象(对象的引用变量),而数组元素可以是基本数据类型的值,也可以是对象(对象的引用变量)。
集合类
集合类,主要由两个接口派生而来:Collection 和 Map

Map接口

其子类关系图如下:
Map 实现类,用于保存具有映射关系的数据,也就是 key-value对,但 key 不会重复,一般需要通过 key 来找到对应的 value 值。
在这里插入图片描述

Map集合

概述
Map 集合,也常被称为字典,因为它主要用于保存具有映射关系的数据,有 key,有 value,==
具体关系:key - value==。所以 Map 中保存两组值,分别是 key 和 value,都可以保存任何引用类
型的数据

Map 中的 key 不能重复,要根据唯一的 key 找到对应的 value,集合中任何两个 key 使用
equals() 方法进行比较都会返回 false。
Map 与 Set 的关系
如果把 Map 中所有的 key 放在一起来看,就是一个 Set 集合,因为元素不允许重复、没有顺序,Map
中的 key 刚好满足这个条件。
Map 中的 keySet() 方法可以返回一个 Set 集合,元素就是 Map 集合中所有的 key,此方法比较常
用。
Map 的 key 集和 Set 集合中元素的存储形式非常相似,甚至名字都相似。
Set 集合中是单个元素,Map 集合中是 key-value 对,如果把 key-value 揉成一个整体来看的话,我们
完全可以将 Map 集合当做 Set 集合来看,它们的关系是如此的微妙。
Map 提供了一个 Entry 内部类来封装 key-value 对,而计算 Entry 存储时只考虑 Entry 封装的
key。
Map 与 List 的关系
如果把 Map 中所有的 value 放在一起,就是一个 List 集合,因为元素之间可以重复、有顺序、可以根
据索引来查找。不过 Map 中不是通过整数值来当作索引的,而是另外一个对象作为索引。获取值,主
要通过该元素的 key 索引。

HashMap和Hashtable

概述
它们其实跟之前介绍的 ArrayList 和 Vector 是一样的概念,其实 Hashtable 是一个比较老的 Map 实现
类,不建议使用了。
Hashtable 是一个线程安全的 Map 实现,但 HashMap 是线程不安全的实现,所以 HashMap 比
Hashtable 的性能会更好些;
如果有多个线程访问同一个 Map 对象时,使用 Hashtable 会更好。
Hashtable 不能用 null 作为 key 和 value,会引发控制异常,但 HashMap 可以。
如果需要线程安全的 Map 实现类,不建议使用 Hashtable 了,可以用 Collections 工具类来处理即

为了在它们中存储、获取对象,用作 key 的对象必须实现 hashCode() 方法和 equals() 方法。
判断两个 key 是否相等:两个 key 通过 equals() 方法比较返回 true,两个 key 的 hashCode 值也相
等。
Hashtable 判断两个 value 是否相等:只要两个对象通过 equals() 方法比较返回 true 即可。

HashMap基础使用

无非增、删、改、查
可以根据键来删除 修改值 得到值
直接上代码

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class HashDemoMap {
		
	public static void main(String[] args) {
		
		HashMap<Integer,String> user  = new HashMap<Integer,String>();
		
		//map 集合键不允许重复 值允许重复
		user.put(1,"李四");
		user.put(1,"张三");//键不允许重复此时会自动修改键中所对应的数据
		user.put(2,"张三");//值允许重复
		user.put(3,"王五");
		user.put(4,"宋柳");
		user.put(5,"刘其");
		user.put(6,"周八");
		
		System.out.println(user);
		
		//删除 根据键删除数据
		user.remove(1);
		
		//替换
		user.replace(2, "李四");
		
		System.out.println(user);
		//清空集合
		//user.clear();
		
		//根据键得到值
		System.out.println(user.get(2));		
		
	}
}

在这里插入图片描述

HashMap两种遍历方式

第一种将键转换为set集合的方法一般用它

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;



public class HashDemoMap {
	
	
	public static void main(String[] args) {
		
		HashMap<Integer,String> user  = new HashMap<Integer,String>();
		
		//map 集合键不允许重复 值允许重复
		user.put(1,"李四");
		user.put(1,"张三");//键不允许重复此时会自动修改键中所对应的数据
		user.put(2,"张三");//值允许重复
		user.put(3,"王五");
		user.put(4,"宋柳");
		user.put(5,"刘其");
		user.put(6,"周八");
		
		System.out.println(user);
		
		//删除 根据键删除数据
		user.remove(1);
		
		//替换
		user.replace(2, "李四");
		
		System.out.println(user);
		//清空集合
		//user.clear();
		
		//根据键得到值
		System.out.println(user.get(2));
		
		//遍历集合 1
		//Map中没有迭代器 但是却提供的将键转换为set集合的方法 
		Set<Integer> s1 = user.keySet(); //将map中的值转换为set集合
		System.out.println(s1);
		System.out.println("============迭代器==========");
		//迭代器
		Iterator<Integer> iterator = s1.iterator();
		while(iterator.hasNext()) {
				int uId=iterator.next();
				System.out.println("键:"+uId+" 值:"+user.get(uId));
		}
		
		System.out.println("================foreach===========");
		//forecah
		for(Integer uId : s1) {
			System.out.println("键:"+uId+" 值:"+user.get(uId));
			
		}
				
	}

}

在这里插入图片描述
第二种 entrySet返回键值对 Map.Entry<Integer, String> 理解成一种类型即可 不常用
除此之外我们还能将map中的值转换成collection集合


import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;



public class HashDemoMap {
	
	
	public static void main(String[] args) {
		
		HashMap<Integer,String> user  = new HashMap<Integer,String>();
		
		//map 集合键不允许重复 值允许重复
		user.put(1,"李四");
		user.put(1,"张三");//键不允许重复此时会自动修改键中所对应的数据
		user.put(2,"张三");//值允许重复
		user.put(3,"王五");
		user.put(4,"宋柳");
		user.put(5,"刘其");
		user.put(6,"周八");
		
		System.out.println(user);
		
		//删除 根据键删除数据
		user.remove(1);
		
		//替换
		user.replace(2, "李四");
		
		System.out.println(user);
		//清空集合
		//user.clear();
		
		//遍历集合2
		//entrySet返回键值对 Map.Entry<Integer, String> 理解成一种类型即可
		Set<Map.Entry<Integer, String>> s2= user.entrySet();
		System.out.println(s2);
		System.out.println("====迭代器=====");
		Iterator<Map.Entry<Integer, String>> iterator2 = s2.iterator();
		while(iterator2.hasNext()) {
			Map.Entry<Integer, String> userName = iterator2.next();
			System.out.println("entry迭代器键:"+userName.getKey()+" ||entry迭代器值:"+userName.getValue());
		}
		
		System.out.println("===========foreach=============");
		
		for(Map.Entry<Integer,String> userName : s2) {
			System.out.println("键:"+userName.getKey()+" 值:"+userName.getValue());
		}
		
		
		//除此之外我们还能将map中的值转换成collection集合
		Collection<String> values = user.values();
		System.out.println(values);
		
	}

}

在这里插入图片描述
HashMap因为篇幅有限不展开面试讲解了 只说基础用法 HashMap的复杂用法和源码将会伴随你的每一次跳槽 。。。。

LinkedHashMap

LinkedHashMap 也是用双向链表来维护 key-value 对的顺序,也就是 key 的顺序,该链表负责维护Map 的迭代顺序,迭代顺序与 key-value 对的插入顺序保持一致。

LinkedList 因为需要维护元素的插入顺序,因此性能会比 HashMap 的稍低,但又因为它是链表结构来维护内部顺序,在迭代访问 Map 中全部元素时,性能较好。

使用 Properties 读写属性数据&文件

Properties 在处理属性文件时特别好用,项目开发中常用。
Properties 能把 Map 对象的 key-value 写入属性文件中,格式:属性名=属性值
示例

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class ProUtilsDemo {
	
	
	public static void main(String[] args) {
		Properties properties = new Properties();
		properties.setProperty("1", "张三");
		properties.setProperty("2", "李四");
		properties.setProperty("3", "王五");
		
		System.out.println(properties);
		
		//写入文件
		try {
			properties.store(new FileOutputStream("src/user.properties"),"pp");
		}catch (FileNotFoundException e) {
			// TODO: handle exception
		}catch (IOException e) {
			// TODO: handle exception
		}catch (Exception e) {
			// TODO: handle exception
		}
		
		
		//读取文件		
		Properties properties2 = new Properties();		
		try {
			properties2.load(new FileInputStream("src/user.properties"));
		}catch (FileNotFoundException e) {
			// TODO: handle exception
		}catch (IOException e) {
			// TODO: handle exception
		}catch (Exception e) {
			// TODO: handle exception
		}
		System.out.println(properties2);
		
	}	

}

在这里插入图片描述
在这里插入图片描述

其他(了解)

SortedMap 接口和 TreeMap 实现类

TreeMap 就是一个红黑树数据结构,每个 key-value 对就作为红黑树的一个节点。
TreeMap 存储 key-value 对(节点)时,需要根据 key 对节点进行排序,它能保证所有的 key-value 对
处于有序状态。
TreeMap 有两种排序方式:自然排序和自定义排序。
自然排序:TreeMap 的所有 key 都应该实现 Comparable 接口
自定义排序:
TreeMap 中判断两个 key 是否相等:两个 key 通过 compareTo() 方法返回 0,它就认为这两个 key 就
是相等的。
class

WeakHashMap 实现类

它与 HashMap 用法几乎一样。
区别:HashMap 的 key 保留了对实际对象的强引用;WeakHashMap 的 key 只保留了对实际对象的弱
引用。
垃圾回收时数据会消失

IdentityHashMap 实现类

实现机制与 HashMap 基本一致,它在处理两个 key 相等时比较特殊,在 IdentityHashMap 中,
有当两个 key 相等时(key1 == key2)
,才会认为两个 key 相等。

EnumMap 实现类

是一个与枚举类一起使用的 Map 实现,它所有的 key 都必须是单个枚举类的枚举值。创建 EnumMap
时,需要显示或隐式指定它对应的枚举类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值