JAVA中有关于Map的知识整理

Map

Map表示集合,是Map集合的顶层接口
Map集合与Collection集合的区别:
Collection集合:存放的元素都是单个的独立的值。
Map集合:存放的每一个元素都是两个值,第一个值表示键(Key),第二个值表示值(value),每一个元素的Key与value都建立映射关系。
映射关系:一定能通过指定的Key找到唯一的value。
特点:Key不能重复,value可以重复。
常用方法:
V put(K key, V value):向Map中添加一对键值对
如果添加key已经存在,则将该key对应的value进行替换,返回被替换的value
V remove(Object key):删除Map中指定key对应的键值对
V get(Object key):获取Map中指定的key对应的value
void clear():清空map中的所有键值对
boolean containsKey(Object key):判断map中是否包含指定的key值
boolean containsValue(Object value):判断map中是否包含指定的value值
boolean isEmpty():判断当前map是否为空
int size():获取当前map中的键值对的数量
遍历相关的方法 :
Set entrySet():获取map中所有的Entry对象组成的Set集合
Set keySet():获取map中所有的key组成的Set集合 Collectionvalues():获取map中所有的value组成的List集合

HashMap

new HashMap():创建一个空的HashMap集合,默认的数组容量为16,默认的负载因子为0.75
new HashMap(Map map):将其他的map集合转换为HashMap

HashMap的所有方法都是实现了Map接口的方法

例子:创建一个字符串,记录字符串中每一个字符出现的次数

package com.qianfeng.hashmapDemo;
import java.util.HashMap;
/*
创建一个字符串,记录字符串中每一个字符出现的次数
思路:选择使用HashMap存放每一个字符出现的次数
key:字符 value:次数
遍历字符串的每一个字符,将该字符以及对应的次数存入map中
如果:
map中不存在该字符,表示第一次添加该字符,次数设置为1
map中存在该字符,表示不是第一次添加该字符串,次数为以及存在的次数+1
*/
public class Practise1 {
public static void main(String[] args) {
String str = "AAAAAABBBBBCCCCCDDDDD";
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
//判断map中是否存在该字符
if(!map.containsKey(c)){
//如果不存在,表示第一次添加
map.put(c, 1);
}else{
//如果存在,则一定不是第一次添加,次数应该为当前次数+1
//取出字符c在map中对应的次数
Integer oldValue = map.get(c);
Integer newValue = oldValue + 1;
map.put(c, newValue);
}
}
System.out.println(map);
}
}

HashTable

简单理解为线程安全版的HashMap

package com.qianfeng.hashmapDemo;
import java.util.Hashtable;
public class Demo3 {
public static void main(String[] args) {
Hashtable hashtable = new Hashtable();
//hashtable.put(null, "haha");//会报错 因为不允许key为null
//hashtable.put("haha", null);//会报错 因为不允许value 为null
}
}

Properties

HashTable的子类
自己扩展了一些方法
void load(InputStream is):读取指定文件的内容
文件的内容的格式必须为指定格式:
一行表示一对键值对
Key的内容=value的内容
文件的类型,建议是.properties String getProperty(String key):获取指定的Key对应的value值
因为properties的内容基本上都是通过读取文件来的,所以它的key和value都一定是String类型
那么此方法默认将Key与Value处理成String类型,避免了需要程序员主动的对key与value进行强转
创建对象:new Properties()

package com.qianfeng.propertiesDemo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
public class Demo1 {
public static void main(String[] args) throws IOException {
//1.创建Properties对象
Properties properties = new Properties();
/*
2.通过读取文件向此map集合中添加键值对
调用load(InputStream is)
想法1:直接创建InputStream对象作为参数
不可取:通过查询API文档,发现该类是抽象类
想法2:创建该类的子类对象
根据类的名称我们选择FileInputStream这个子类
发现该类没有无参构造方法,选择new FileInputStream(String name)
*/
FileInputStream inputStream = new FileInputStream("users.properties");
//调用了load方法之后 我们认为指定的文件中的内容已经都解析成键值对存放到properties中
properties.load(inputStream);
//取出properties中的值
System.out.println(properties.getProperty("hpc"));
System.out.println(properties.getProperty("kl"));
System.out.println(properties.getProperty("jay"));
System.out.println(properties.getProperty("haha"));
}
}

总结

这几个map集合的底层都是用数组+链表+红黑树实现的
当我们向集合中添加一个元素时,根据该元素的hashcode值计算出一个索引,然后向该数组的指定索引处添加该元素
如果该索引处已经有元素:
如果只有一个元素,则将新元素与旧元素形成链表
如果有多个元素,则将新元素添加到链表的尾部
如果当前集合的元素数量达到64,并且该链表的长度达到8时,则将链表升级成红黑树。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值