Map接口

哈希表就是一种以键-值(key-indexed)存储数据的结构,只要输入待查找的值即key,即可查到其对应的值。

哈希的思路就是,如果所有的键hashCode都是整数,那么久可以使用一个简单数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。
简单的计算方法
hashcode%数组长度=【0,数组的长度-1】。
它提供了一组键值的映射。其中存储的每个数据对象都有一个响应的键key,键决定了值对象在Map中的存储位置。键应该是唯一的,不允许重复,每个key只能映射一个value。

Map接口的定义
public interface Mpa<K,V>

定义map对象时需要指定key和value对应的类型,必须是复杂类型,不能使用int。 map接口中有一个内部接口为Entry:interface Entry<K,V> 封装所存储的key-value对数据

interface Entry<K,V> {
        K getKey();   因为key决定数据的存放位置,一旦存储成功则key不允许修改
        V getValue();    针对value提供get/set方法
        V setValue(V value);
//存储的数据应该是可以进行等值判断的,key不允许重复
        boolean equals(Object o);
        int hashCode();
}

结论:每个Entry对象中封装了一个key和value
另外Entry接口中通过静态方法提供了一组比较器的默认实现。
用于规范其中存放数据的规则,map中所存放的数据将给封装为一个一个的Entry,一个key/value对 对应一个Entry对象

Map接口中常见方法
Object put(Object key,Object value):用来存放一个键-值对 Map中,如果出现key值冲突则后盖前。允许key值和value值为null,但是key值为null只能有一个,value值为null没有个数限制。
size():int 用于获取集合中的元素个数
Object remove(Object key): 根据key(键),移除键值对,并将值返回
boolean containsKey(Object key) :判断Map中是否存在某键key
clea(): 清空当前Map中的元素。
**boolean containsValue(Object value)**判断Map中是否存在某值value
另外Map提供了3种视图,分别是key所组成的set、value所组成的collection、key-value的Entry集合Set。
public Set keySet() :返回所有的键key,并使用Set容器存放,获取key值后就可以通过get方法获取key对应的值vlaue。
public Collection values(): 返回所有的值 Value ,并使用Collection存放。
public Set entrySet(): 返回一个实现Map.Entry 接口的元素 Set
1.通过key遍历整个map集合

Set<String> set = map.keySet();
for(String temp:set){
Integer val = map.get(temp);
System.out.println(temp+val);
}

2.获取所有的value,但是注意不能通过value直接获取key。

Collection<Integer> vals = map.values();
for(Integer temp:vals)
System.out.println(temp);
Set<Entry<String,Integer>>  set2 = map.entrySet();
for(Entry<String,Integer> temp:set2)
System.out.println(temp.getKey()+temp.getValue());

3.forEach 和Lambda 表达式实现输出

Map map =new HashMap() ;
map.forEach((key,value)->{
System.out.println(key+value);
});

HashMap
类定义

public  class HashMap<K,V> extends AbstractMap<K,V> 
     implements Map<K,V>, Cloneable,Serializable {

相关的常量值

static final int  DEFAULT_INITIAL_CAPACITY=-1<<4;      //aka 16 默认初始化容积
static final int MAXIMUM_CAPACITY =1<<30;   //最大容积值
static final float DEFAULT_LOAD_FACTOR=0.75f;    //默认的负载因子

具体的内部数据存储方式
static class Node<K,V> implements Map.Entry<K,V>{
final int hash;
final K key;
V value;
Node<K,V> next;
静态内部类用于实现Entry,HashMap中存放的key/value对就被封装为Node对象 。其中key就是存放的键值,用于决定具体的存放位置;value是具体存放的数据,hash就是当前Node对象的hash值,next用于指向下一个Node节点(单向链表)
具体存储数据的实现采用的是单向链

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值