map的基本用法以及自我实现

map的综述

java.util 中的集合类包含 Java 中某些最常用的类。最常用的集合类是 List 和 Map。Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。键是不能够相同,值可以一样,键相同的话,新键所对应的值会覆盖前面的值。同一个Map对象的任何两个key通过equals方法比较总是返回false。

  • map接口定义了如下方法:

 - V put(K key,V value)-->添加一个key-value对,如果当前map中已有一个与当前key相等的key-value对,则新的key-value会覆盖原来的key-value对。
 - V remove(Object key)-->删除指定的key所对应的key-value对,返回被删除key所关联的value,如果key不存在返回null
 - void clear()---------->删除该集合里的所有key-value对
 - boolean containsKey(Object key)----------->查询该集合里是否包含指定的key,如果包含返回true
 - boolean containsValue(Object value)------->查询该集合是否包含一个或多个value,如果包含返回true
 - boolean isEmpty()----->查询该集合是否为空
 - int size()------------>查询该集合里的key-value对的个数
 - Set entrySet()-------->返回该集合中包含的key-value对所组成的set集合,每个集合元素都是map.entry(entry是map的内部类)对象
 9.Set keyset() --------->返回该map中所有key组成的set集合
 10.Collection values()-->返回该集合中所有值对象形成的Collection集合

 MAP中包含一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法:
  Object getKey():返回该Entry里包含的key值。
  Object getValue():返回该Entry里包含的value值。
  Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值
  • HashMap、TreeMap和Hashtable:

这二者的键是哈希表结构,都可以保证键的唯一性。HashMap和Hashtable都是map接口的实现类,他们之间的关系完全类似于ArrayList和Vector的关系。treeMap的键是红黑树结构,可以保证键的排序和唯一性.

HashMap和Hashtable区别:
  1.Hashtable是一个线程安全的map实现,但HashMap是线程不安全的实现,故HashMap的性能较高
  2.Hashtable不允许使用null作为key和value,如果试图将null放入Hashtable,会报NullPointException异常;但HashMap可放入null作为key或value。

Hashtable的一个子类Properties:
  Properties类似Windows操作平台上的ini文件就是一种属性文件。Properties可以把Map对象和属性文件管理起来,从而可以把map对象中的key-value对写入属性文件。也可以把属性文件里的内容加载到map对象中,由于属性文件里的属性名、属性值只能是字符串类型,故Properties里的key、value都是字符串类型。

它有如下方法:

String getProperty(String key) :获取Properties中指定属性名对应的属性值。

Object setProperty(String key, String value) :设置属性值,类似于Hashtable的put方法。

void load(Reader reader):从属性文件中加载key-value对,把加载的key-value对追加到Properties里。

void store(OutputStream out, String comments):将Properties的key-value对输出到属性文件里。

自定义实现HashMap

下面自定义的HashMap实现的是数组+链表的结构。
这里写图片描述

import java.util.LinkedList;

public class TestMyMap {
    LinkedList[] arr = new LinkedList[200]; //申明要放入的数组
    int size;
    //map放入键值对方法
    public void put(Object k,Object v){
        jzd a = new jzd(k,v);   //表示要放入的内容也就是键值对
        int hash = k.hashCode();
        hash = hash<0?-hash:hash; //防止hash码为负的
        int b = hash%arr.length;
        //下面就是找到Hash码对应的数组,里面存放链表,链表里面存放键值对
        if(arr[b]==null){
            LinkedList c = new LinkedList();
            c.add(a);
            arr[b] = c;
        }else{
            if(arr[b]!=null){
                for(int i=0;i<arr[b].size();i++){
                    jzd d = (jzd)arr[b].get(i);
                    if(d.K.equals(k)){
                        d.V = v;
                        return ;
                    }
                }
            }
            arr[b].add(a);
        }
        size++;
    }
    /**删除键值对*/
    public void remove(Object k){
        int m = k.hashCode()%arr.length;
        if(arr[m]!=null){
            for(int i=0;i<arr[m].size();i++){
                MyMap b = (MyMap)arr[m].get(i);
                if(b.k.equals(k)){
                    System.arraycopy(arr, i+1, arr, i, size-i-1);
                }   
            }
        }
        arr[--size] = null;
    }
    //HashMap取出元素的方法
    public Object get(Object key){
        int hash = key.hashCode();
        hash = hash<0?-hash:hash;
        int b = hash%arr.length;

        if(arr[b]!=null){
            for(int i=0;i<arr[b].size();i++){
                jzd a = (jzd)arr[b].get(i);
                if(a.K.equals(key)){
                    return a.V;
                }
            }
        }
        return null;
    }

    public int size(){
        return size;
    }

    public static void main(String[] args) {
        TestMyMap s = new TestMyMap();
        s.put("1", "aa");
        s.put("2", "bb");
        s.put("1", "cc");
        s.remove("1");
        System.out.println(s.size);
        System.out.println(s.get("1"));
    }

}

class jzd{
    Object K,V;

    public jzd(Object k, Object v) {
        super();
        K = k;
        V = v;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值