集合里的Map接口

Map接口:双列数据,保存具有映射关系的"key-value"的集合(用于一对一对的数据)
HashMap:是map的主要实现类,线程不安全,效率高
Hashtable:是一个古老的map实现类.jdk1.0就有了,线程安全的,效率低
这两者的实现原理和功能都相同
TreeMap:实现自然排序和定制排序
LinkedHashMap:实现按输入的顺序方式输出
在这里插入图片描述
map常用方法:

  • 1.添加

         Object put(Object key,Object value);向集合去添加"key-value"  key不允许重复
    
  • 2.添加多个元素

     	void putAll(Map map); 向当前集合中添加map集合中所有的元素
    
  • 3.删除

             Object remove(Object key) 删除指定的key对应key-value元素,并返回value
             Object remove(Object key,Object value)  删除指定的key-value元素,并返回boolean值判断是否删除成功
    
  • 4.修改

             可以通过put修改对应key的value值
    
  • 5.元素的查询

             Object get(Object key)获取指定key对应的value
    
package SE.day0304;

import java.util.HashMap;
import java.util.Map;

public class MapDemo01 {
    public static void main(String[] args) {
        /*
        map常用方法:
            1.添加
            Object put(Object key,Object value);
                向集合去添加"key-value"  key不允许重复
            2.添加多个元素
                void putAll(Map map);
                向当前集合中添加map集合中所有的元素
            3.删除
                Object remove(Object key) 删除指定的key对应key-value元素,并返回value
                Object remove(Object key,Object value)
                    删除指定的key-value元素,并返回boolean值判断是否删除成功

             4.修改
                可以通过put修改对应key的value值
             5.元素的查询
                Object get(Object key)获取指定key对应的value

         */
        Map map1=new HashMap();
        map1.put("皮卡丘",20);
        map1.put("皮卡丘",18);//key相同,此时的value覆盖掉原来的key的value
        map1.put("妙蛙种子",18);
        System.out.println(map1);
        Map map2=new HashMap();
        map2.put("杰尼龟",20);
        map2.putAll(map1);
        System.out.println(map1.get("皮卡丘"));


        /*
        //删除key值相同的元素,并返回value
        System.out.println(map2.remove("皮卡丘"));
        //删除key-value相同的元素,并返回boolean值
        System.out.println(map2.remove("杰尼龟", 20));
        */
    }
}

  • 6.获取map集合的key或者value

     获取key:  Set keySet();返回map集合中所有的key(key不可重复)
     获取value: Collection values();返回map集合中所有的value(value可重复可不重复)
     获取key-value: Set entrySet();返回集合所有的key-value的键值对
    
package SE.day0304;

import java.util.Collection;
import java.util.HashMap;
import java.util.Set;

public class MapDemo02 {
    public static void main(String[] args) {
        HashMap hm=new HashMap();
        hm.put("皮卡丘",10);
        hm.put("喷火龙",15);
        hm.put("杰尼龟",13);
        Set s=hm.keySet();
        for (Object o:s) {
            System.out.println(o);
        }
        Collection c=hm.values();
        for (Object o: c) {
            System.out.println(o);
        }
        Set s1=hm.entrySet();
        for(Object o:s1){
            System.out.println(o);
        }

    }
}

  • HashMap底层实现原理:

         底层结构:
             1.JDK7:hashMap底层采用的是数组+链表  底层创建数组
             2.JDK8:hashMap底层采用的是数组+链表+红黑树  底层添加元素的时候在创建数组
     
         hashMap:
             当hashMap中添加元素超过了数量大小的0.75倍,自动扩容为原来的2倍
         HashMap有个子类叫LinkedHashMap;底层维护一个链表,用来使集合看起来是按照插入顺序存储的
    
package SE.day0304;

import java.util.HashMap;

public class HashMapDemo {
    public static void main(String[] args) {
        HashMap hm=new HashMap();
        hm.put("皮卡丘",10);
        hm.put("喷火龙",15);
        /*
        先调用"皮卡丘"所在hashCode方法,计算出hash的值
        此时hash值金国某种特定的算法,计算出在数组中存放的位置
            如果指定位置没有元素,"皮卡丘",16添加成功
            如果指定位置有元素,那就去比较两个key所得类的hash值
                如果hash值相同,比较两个对象的equals方法
                    如果equals比较方法返回
                    false,添加成功
                    true,则使用当前对象的key的value去替换原来的value
                如果hash值不相同,则"皮卡丘"添加成功

         */
    }
}

  • Hashtable是一个古老的map实现类,JDK1.0就有了,不同于HashMap

         Hashtable是线程安全的,效率低
         Hashtable与HashMap实现原理与功能相同,底层都是使用哈希标结构,查询速度会快一些
         可以互相使用,但是Hashtable中不可以使null作为key和value,HashMap可以
         Properties作为Hashtable的子类,该类的对象用于处理属性文件
             由于属性文件里面的key和value都是String类型的,所以
    
             key     value
             name=root
             pwd=123456
             url=jdbc:mysql
    
package SE.day0304;


import java.io.FileInputStream;
import java.util.Properties;

/*
     Hashtable是一个古老的map实现类,JDK1.0就有了,不同于HashMap
        Hashtable是线程安全的,效率低
        Hashtable与HashMap实现原理与功能相同,底层都是使用哈希标结构,查询速度会快一些
        可以互相使用,但是Hashtable中不可以使null作为key和value,HashMap可以
        Properties作为Hashtable的子类,该类的对象用于处理属性文件
            由于属性文件里面的key和value都是String类型的,所以

            key     value
            name=root
            pwd=123456
            url=jdbc:mysql

 */
public class HashtableDemo01 {
    public static void main(String[] args) throws Exception {
           //事先在同一个项目里面创建一个jdbc.properties文件
        //使用输入流读取指定的配置文件中的内容
        FileInputStream fis=new FileInputStream("jdbc.properties");
        //创建Properties对象用来都读配置文件
        Properties p=new Properties();
        //使用Properties对象加载指定的配置文件
        p.load(fis);
        String username=p.getProperty("username");
        String password=p.getProperty("password");
        System.out.println(username+"="+ password);
    }
}

向指定文件写内容

package SE.day0304;

import java.io.FileOutputStream;
import java.util.Properties;

public class HashtableDemo02 {
    public static void main(String[] args) throws Exception {
        //给指定的文件创建输出流
        FileOutputStream f=new FileOutputStream("jdbc.properties");
        //创建Properties对象
        Properties p=new Properties();

        //先设置key和value
        p.setProperty("url","jdbc");
        p.setProperty("username","root");
        //将设置key和value写到文件中
        p.store(f,"hashtable");
    }
}

自然排序

package SE.day0304;


import java.util.TreeMap;

public class TreeMapDemo {
    public static void main(String[] args) {
        TreeMap treeMap=new TreeMap();
        treeMap.put("444",10);
        treeMap.put("555",10);
        treeMap.put("111",10);
        treeMap.put("666",10);
        System.out.println(treeMap);
        TreeMap tm2=new TreeMap();
        tm2.put(new User(20,"444",20),60);
        tm2.put(new User(2,"666",19),50);
        tm2.put(new User(6,"888",20),80);
        System.out.println(tm2);
    }
}
class User implements Comparable{
    int id;
    String name;
    int age;


    public User(int id, String name, int age) {
        this.name = name;
        this.age = age;
        this.id = id;
    }

    @Override
    public int compareTo(Object o) {
        if (o instanceof User){
            User u=(User)o;
            //return Integer.compare(this.id,u.id);id升序
            return this.name.compareTo(u.name);//名字升序
        }else{
            throw new RuntimeException("类型不匹配");
        }
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

效果图如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值