Map接口

Map接口

Map集合的特点

  • Map存储了一系列键值的映射关系
  • Map集合需要保证键的唯一性
  • 可以通过键获得值,反之则不能
  • Map集合存储元素使用put(key,value)方法

HashMap实现类

  • 线程不安全,存取速度快,允许存放null键,null值。
  • 通过HashSet原理保证键唯一性

Hashtable实现类

  • 线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。

TreeMap实现类

  • 通过二叉树算法保证键唯一性
  • 对键进行排序,排序原理与TreeSet相同

Properties实现类

  • Hashtable的子类,所以也是线程安全的
  • 用于读写配置文件的,一般配置项等号两边都是String,所以该集合中的两列保存的都是String类型的数据,这个集合中只能存String,所以不需要定义泛型。

resource目录新建: db.properties文件

className=cn.zysheep.core.sysbase.bill.entity.User
classMethod=setUsername

测试类ReflectionTest

public class ReflectionTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException,
            InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        InputStream inputStream = ReflectionTest.class.getClassLoader().getResourceAsStream("db.properties");
        Properties properties = new Properties();
        properties.load(inputStream);
        String className = properties.getProperty("className");
        // 反射得到Class对象
        Class<?> clazz = Class.forName(className);
        // 创建实例
        Object o = clazz.newInstance();
        String classMethod = properties.getProperty("classMethod");
        
        Method method = clazz.getMethod(classMethod,String.class);
        method.invoke(o, "zysheep");
        System.out.println(o);

        ClassLoader classLoader = User.class.getClassLoader();
        Class<?> aClass = classLoader.loadClass(className);
        System.out.println(aClass);
    }
}

Map接口中方法

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。

添加

  • put(K key, V value)
  • putAll(Map<? extends K,? extends V> m)

删除

  • clear()
  • remove(Object key)

判断

  • containsValue(Object value)
  • containsKey(Object key)
  • isEmpty()

获取

  • get(Object key)
  • size()
  • values()
  • entrySet()
  • keySet()

总结

Map
	|--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
	|--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
	|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

Map和Set很像,其实Set底层就是使用了Map接口

map集合的两种取出方式:

  1. Set keySet():
  • 将map中所有的键存入到Set集合。因为set具备迭代器。
  • 所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
  • Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。
   //Map
        HashMap<Object,Object> map = new HashMap();
        map.put(1,"I");
        map.put(2,"love");
        map.put(3,"you");
        Set<Object> mapSet = map.keySet(); //根据key获取value
        for (Object obj:mapSet) {
            System.out.println(obj+"----"+map.get(obj));  //实际上就是遍历Set
        }
  1. Set<Map.Entry<k,v>> entrySet():
    将map集合中的映射关系存入到了set集合中,而这个关系的数据类型就是:Map.Entry,Entry其实就是Map中的一个static内部接口。

为什么要定义在内部呢?

因为只有有了Map集合,有了键值对,才会有键值的映射关系。关系属于Map集合中的一个内部事物。
而且该事物在直接访问Map集合中的元素。

Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。

// 方式1
Set<Map.Entry<Object, Object>> mapSet1= map.entrySet();
Iterator<Map.Entry<Object, Object>> iterator2 = mapSet1.iterator();
while(iterator2.hasNext()){
    Map.Entry<Object, Object> next = iterator2.next();
    System.out.println(next.getKey()+"======"+next.getValue());
}

// 方式2
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> entry : entries) {
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());
}
/* Map(interface)
*     实现类:(implements)
*            HashMap:低层实现采用了哈希表,这是一种非常重要是数据结构   数组+链表  核心(Node<K,V>[]  ) 位桶数组
*                     ※HashMap线程不安全,效率高,允许key或value为null
*                    jdk8以后链表的长度大于8,转换成红黑树
*                    put的底层原理:
*                        首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
*                         然后存放到相应的地址(hash  key  value  next),如果还有继续添加,形成链表结构
*                  get的底层原理:
*                         首先根据key对象的hashCode方法的到一个任意的哈希值,通过散列算法(一般是求余 %16)得到一个0-16的哈希值
*                          根据equals方法找到对应key的值的value 并返回
*                      java中规定,两个内容相同(equals()为true)的对象必须具有相等的hashCode
*           TreeMap  : 是红黑二叉树的典型实现,可以按照key递增的方式排序
*
*           HashTable:
*                 ※线程安全,效率低,不允许key或value为null
*
* */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李熠漾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值