Map集合

Map集合

1. Map介绍

1.1 通过键-值(key-value)对的形式来存储数据

1.2 Map的实现:HashMap(使用频率最高的),TreeMap,HashTable

1.3 Map中,key可以为任意类型,但这里建议使用String,value也可以是任意类型

1.4 Map里面多个value可以是不同类型

1.5 Map里面key是可以重复的,当key重复时,后存入的数据会覆盖前面的数据

1.6 Map里面,value可以重复.

1.7 Map里面的key可以为null,但是只能有一个,多个的时候,后面的会覆盖前面的

1.8 Map中value可以是null,多个value可以同时为null。

1.9 Map中的key在底层可以理解为是一个Set

2. Map的常用方法

int size():Map集合中key-value的长度

boolean containsKey(Object key):判断是否包含指定的key

boolean containsValue(Object value):判断是否包含指定的value

V put(K key, V value):把指定的key-value存入Map集合(增加,修改)

V remove(Object key):根据key在Map中删除指定的key-value组合(删除)

V get(Object key):根据指定的key来获取对应的value(查找)

boolean isEmpty():判断集合是否为空

Set keySet():Map中所有key的集合

void putAll(Map m):把一个Map集合存入指定的Map中

Collection values():返回Map中所有的value的集合,不包括key

3. HashMap

3.1 HashMap的原理

Map集合中,存储数据,实际上是一个Entry类型的数组,中间的每个元素又是一个链表

存储原理:

​ 1.判断key是否为空,如果为空,把指定的value存到首位

​ 2.如果key 不为空,先根据key的hashCode来计算得到hash值

​ 3.再根据hash值来获取数组的下标,如果该下标对应的位置已经有数据了,替代该数据

读取原理:

​ 类似于存储

​ 根据key的hashCode值,调用hash(),得到一个hash值;

​ 再根据hash值获取数组下标(通过indexFor()方法),再根据数组下标从数组中获取元素

3.2 HashMap的迭代

目的:迭代出map集合中所有数据

方法一:1.通过keySet()方法,找到所有key的集合,返回类型是一个Set;

​ 2.通过Iterator迭代器,迭代出Set中的每一个key;

​ 3.通过get(key)方法,根据上一步得到的key,来获取对应的value

方法二:1.通过values()方法,获取map集合中所有的value的集合.返回值类型为Collection(该接口是List和Set的父接口,该类型下有Iiterator迭代器,可以用来迭代)

​ 2.通过Iterator迭代器,迭代出所有的value

方法三:1.通过entrySet()方法,得到一个Entry对象的集合,这里用Set来装载.

​ 2.通过Set中的迭代器,迭代出每一个Entry对象.

​ 3.针对每一个Entry对象,通过getKey()和getValue()方法,来分别获取到对应的key和value

4. 泛型的使用

​ 泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法

a.使用Map的泛型

 
  1. Map<String,Object> map = new HashMap<String,Object>();

b.泛型接口的定义:

 
  1. public interface IObjectDAO<T,K> {
  2. public void addObj(T vo);
  3. public void updateObj(T vo);
  4. public boolean check(K id);
  5. }

c.泛型类:

 
  1. public class Person<T> {
  2. public List<T> all = new ArrayList<T>();
  3. public boolean doCreate(T vo){
  4. all.add(vo);
  5. return true;
  6. }
  7. }

d.泛型方法(当静态方法需要使用泛型时,只能在方法中定义泛型):

 
  1. public class Person {
  2. public static <T> boolean doCreate(T vo){
  3. System.out.println("vo:"+vo);
  4. return true;
  5. }

e.受限制的泛型(了解):

​ class MyGenerics:将来使用时只能给List或其子类型

​ T类型或其父类类型

5. TreeMap

​ TreeMap 中包含了红黑树,把key存下来,红黑树要求它自己以及左右子树都是平衡二叉树(左右两个子树的高度差在1以内).

​ 在使用TreeMap存储数据时,先把数据存入map,然后利用红黑树的左悬,右悬,着色等操作,调整二叉树的结构.

6. HashTable

HashTable与HashMap的区别:

​ hashtable 是jdk1.0提出来的,是同步的,线程安全的,key和value都不能为空,继承自Dictionary,有contains()方法直接判断键-值对

​ hashMap是jdk1.2提出来的,不是同步的,线程不安全,key和value都可以为空,继承自AbstractMap,通过containsKey()和containsValue()分别判断

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值