javase学习第二十一天:集合Map(HashMap + TreeMap + Hashtable)+(HashMap继承类 LinkedHashMap + HashTable继承类Properit)

一.Map整体理解

1.Map框架结构

①HashMap–>LinkedHashMap

②TreeMap

③Hashtable–>Properities

2.三者特性

① HashMap

HashMap作为Map的主要实现类
线程不安全,效率高,可以存储null的key-value
LinkedHashMap作为HashMap的子类
可以按添加的顺序进行遍历,在原有的HashMap底层上,添加了一对指针。
适用于频繁的遍历操作。
HashMap jdk7.0以及之前:数组+链表
jdk8.0:数组+链表+红黑树

②TreeMap

TreeMap中对key-value进行排序,实现排序遍历

③Hashtable

Hashtable作为Map的古老实现类
线程安全,效率低,不能存储null的key-value
Hashtale的子类properites为处理配置文件,key-value都是String

④对key-value的理解

key:无序+不可重复 用Set存储
value:无序+可重复 用Colletion存
Entry对象(key-value):map中Entry对象无序不可重复 用Set存

注意:key所在的类要重写equals和hashcode
values需要写equals(不需要hashcode,因为已有key对应)

3.Hashmap的底层实现原理

①实例化

Hash map = new Hashmap()
jdk7:底层创建16的Entry[] table数组
jdk8:底层首先初始化并没有载入数组,在首次put后再创建数组

②put入元素时

首先计算key的hashcode的哈希值,通过某种算法获得数组的索引

如果位置为空,则添加成功
如果位置不为空,则比较key和已有数据的hash值

如果hash值与已有的都不相同,则添加成功
如果hash值和其中一个hash值相同,则调用equals

如果equals方法返回false,则添加成功
如果equals方法返回true,调用value的equals

如果equals为false,使用value替换相同key的旧value值
如果euals为true,则不添加

注意:在hash值不同,equals返回false,都是以链表添加到数组中国

③扩容问题

jdk7:在添加过程中,默认扩容方法为扩容为原来的两倍并赋值数据
jdk8:在扩容过程中,用到了红黑树,即若数组索引链表元素大于8且数组长度大于64,则将此时所有的链表都用红黑树存储

④红黑树概念

默认初始化容量 16
加载因子 0.75
临界值 12
最大链表长度 8 最大数组容量 64 满足此时转化红黑树

即为了保证数组利用率和链表尽可能少,设置加载因子,即若达到12,则此时扩容为原来的两倍

4.map的常用方法

①方法

	Map map = new HashMap();
    map.put("li",12);//放入key-value为age=12
    //map.putAll(map1) 将map1中的所有key-value放入map中
    map.remove("li");//删除key为li的key-value
    //map.clear() 清除map中的key-value
    map.get("li");//获得li的value
    map.containsKey("li");//map是否包含key为li的
    //map.containsValue(12) map是否包含value为12的
    map.size();//表示map的容量
    map.isEmpty();//判断此时map是否为空
    //map.equals(map1);判断map与map1是否相等

    //遍历map
    map.put("li",12);
    Set set = map.keySet();//获得key的set类型 可用迭代器
    Collection collection = map.values();//获取values的colletion类型 可用迭代器
    Set set1 = map.entrySet();//获得Entry的set
    Iterator iterator = set1.iterator();
    Object obj= iterator.next();//注意迭代器返回的是HashMap类的内部类Node的对象
    Map.Entry entry = (Map.Entry)obj;
    System.out.println(entry.getKey());
    System.out.println(entry.getValue());

②总结常用

增:put
删:remove
改:put
查:get
长度:size
遍历:KeySet/values/Entryset

5.TreeMap

①TreeMap的要求

TreeMap中添加数据,要求key必须是同一个类创建的对象(因为要排序)

TreeMap:
自定义类重写compareTo 自然排序
加入comparator 定制排序
(两者必须按照key来排序)

6.Properties

①用法

Proprieties是读取配置文件的,且数据都是String类型的

②例子

Properties pro = new Properties();
pro.load(file);
pro.getProperty(“name”);

二.Collections工具类的使用

1.例子

	List list = new ArrayList();
    list.add(1);
    list.add(2);

    Collections.reverse(list);//逆转列表
    Collections.shuffle(list);//对列表随机打乱

    Collections.sort(list);//自然排序
    Collections.sort(list, new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            return 0;
        }
    });//定制排序

    Collections.swap(list,0,1);//交换索引位置为0和1的元素
    Collections.frequency(list,1);//统计1出现的次数

    //List dest = new ArrayList();
    Collections.copy(dest,list);//会报错,因为底层判断dest.size是否大于list.size才会复制
    //进行操作 List dest = Arrays.aslist(new Obeject[list.size]
    List dest = Arrays.asList(new Object[list.size()]);
    //这样即可满足dest.size和list.size的关系

    Collections.synchronizedList(list);//这样可将线程不安全的Arraylist变成线程安全的Arraylist
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值