Collection集合(二)——HashMap

一、Map接口

1、描述
Map是HashMap和TreeMap的父接口
2、特点:
通过key-value的形式存储元素,key只能存在一个,但是value可以存在多个相同的值
3、获取方法
通过接口变量指向实现类对象
Map list = new HashMap();
4、Map中常用的方法:
a、clear();//清除所有元素
b、containsKey(Object key);//是否包含此key
c、containsValue(Object value);//是否包含此value
d、get(Object key);//通过key获得值
e、keySet();//返回一个所有key的set集合
f、put();//添加一个元素
g、putAll(Map map);//添加一个集合
h、remove(Object key);//通过key删除指定元素,返回被删除的value
i、size();//返回集合的大小
j、map.values();//获取值的集合,结果返回一个Collection集合。
5、遍历元素的方法
a、增强for循环
b、通过entrySet();方法获取set集合的entry对象
通过entry对象的getKey()和getValue方法获取元素的key跟value

1.1、HashMap

1、HashMap概述
HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
1、 HashMap用法。
Map<String,String> mpa = new HashMap<>();
Mpa.add(”水果”,”苹果”);
Map存储的是键值对,k-v对应,Map中存储的k是唯一、无序的Set集合,V是无序可重复的Collection
常见方法:put(k,v) get(k) containsKey(k) keyset()//获取所有的键,返回一个Set集合
Remove(k) size() containsValue(v) values()//获取所有的值,返回一个集合
迭代方法:一、获取键 迭代键的过程通过get()方法获取键和值。
For(Object key:keySte()){
System.out.println(k+””+map.get(k));
}
二、获取 迭代键的过程中通过getkey和getValue方法获取键和值
//获取entry对象
Set<Entry<String,String>> kys = map.entrySet();//返回一个set集合 该集合中的每个元素都是entry对象// 实际是 HashSet中的Node对象 因为Node实现了Map中的Entry接口
For(Entry<String,String> entry:kys){
System.out.println(entry.getKey()+”
”+entry.getValue());
}
注意:hashMap和hashSet都可以存储对象元素,但是要注意的是,在存储对象时如果有相同对象存储,需要在对象的类中重写hashCode方法和equals方法。原本hashMap和hashSet的存储是无序不重复的在存储对象时,如果不重写hashCode和equals方法,就会把两个相同的对象认定为不同的元素存储在数据列表中。这里就需要了解到这两种的元素存储方式了。
hashMap和hashSet存储时都是基于hashCode来确定存储位置的,hashCode是利用hash值对9求余在散列存储机构中确定对象的储存地址的。两个对象的hashCode相同并不代表两个对象就相同,只说明这两个对象地址相同,这就需要用到equals方法来比较了,equals()作为方法,实现对象的比较。由于运算符不允许我们进行覆盖,也就是说它限制了我们的表达。因此我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过运算符是做不到的。通过重写这两方法判断两个对象是否相同,若是相同则后面的对象不再进行添加,若是不同则在同一个位置加一个链表来连接这个对象。
正因为hashMap和hashSet是用hashCode来确定元素存储位置,所以他们的查找效率很快。
总结:hashMap的实现原理:
2、 利用keydhashCode重新计算出当前对象的元素在数组中的下标
3、 存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,ze覆盖原始值;(2)如果key不同(出现冲突),则将当前的key-value放入链表中
4、 获取时,直接找到hash值对应的下标,进一步判断key是否相同,从而找到对应值、
5、 理解了以上过程就不难明白HashMap是如何解决hash冲突的问题,核心就是使用了数组的存储方式,然后将冲突的key的对象放入链表中,一旦发现冲突就在链表中做进一步的对比。

1.2、TreeMap

1、描述
TreeMap跟TreeSet相似。都是用树的结构来实现的。
2、特点:
自动排序
3、获取方法
TreeMap<T,T> tm = new TreeMap();
4、TreeMap中常用的方法:
a、clear();//清除所有元素
b、containsKey(Object key);//是否包含此key
c、containsValue(Object value);//是否包含此value
d、get(Object key);//通过key获得值
e、keySet();//返回一个所有key的set集合
f、put();//添加一个元素
g、putAll(Map map);//添加一个集合
h、remove(Object key);//通过key删除指定元素,返回被删除的value
i、size();//返回集合的大小
j、map.values();//获取值的集合,结果返回一个Collection集合。
特有的
firstKey();//返回第一个元素
lastKey();//返回最后一个元素
ceilingKey(key);//大于等于最小的value
higher(key);大于
floor(key);//小于等于的最大value
lower(key);//小于的最大value
5、遍历元素的方法
a、增强for循环
b、通过entrySet();方法获取set集合的entry对象
通过entry对象的getKey()和getValue方法获取元素的key跟value
6、如果要指定自定义类的排序的方法
1、内部比较器:
内部实现comparable接口,实现其compareTo();方法
2、外部比较器
外部定义一个比较器实现comparetor接口,实现其compare方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值