HashMap集合

HashMap集合

1.HashMap集合底层是哈希表/散列表的数据结构
2.哈希表是一个怎样的数据结构呢?
    哈希表是一个数组和单向链表的结合体
    数组:在查询方面效率很高,随机增删方面效率低。
    单向链表:在随机增删方面效率高,在查询方面效率低。
    哈希表将以上的2种数据结构融合在一起,充分的发挥它们各自的优点。
3.HashMap集合默认的初始化容量是16,默认加载因子是0.75,扩容是:扩容之后的容量是原容量的2倍。
这个默认加载的因子是当HashMap集合底层数组的容量达到75%时,数组开始扩容。
重点:记住,HashMap集合初始化 容量必须是2的倍数。这也是官方推荐的。
这是因为达到散列均匀。为了提高HashMap集合的存取效率,所必须的。

终极结论:放在HashMap集合key部分及放在HashSet()集合中的元素,需要equals()和 hashcode() 同时重写

HashMap集合中的key特点:无序,不可重复。
为什么无序?
因为不一定挂到哪个单向链表上。
不可重读是怎么保证的?equals方法来保证HashMap集合中的key不可重复。如果key重复了,value会覆盖。

放在HashMap集合key部分元素,其实就是放到了HashSet集合中
所以HashSet集合中的元素也需要同时重写hashcode()+equals()方法;

哈希表HashMap使用不当时无法发挥性能。
假设将所有的hashcode()方法 返回值固定为某个值,那么会导致哈希表变成纯单向链表。这种情况我们成为:散列分布不均匀
什么是散列分布均匀?
假设有100个元素,10个单向链表,那么每个单向链表上有10个节点,这是最好的,是散列分布均匀的。

假设将所有的hashcode()方法返回值都设定为不一样的值,可以吗,有什么问题?
不行,因为这样话,导致底层哈希表就成为一个数组了,没有链表的概念了,也是散列分布不均匀。
散列分布不均匀需要重写hashcode()方法时,有一定的技巧。

map.put(k,v);map.get(k)原理

在这里插入图片描述
HashMap和Hashtable规则

package com;

import java.util.*;

/**
 * Hashtable:方法带有synchronized:线程安全的。对线程线程效率低。少用。
 * 和HashMap一样底层使用哈希表数据结构。初始化容量是11,默认加载因子是0.75f
 * Hashtable扩容是:原容量*2+1;
 */

/**
 * Map集合中的key可以为null,value也可以为null
 * 如果有多个key为null会被覆盖。长度为1
 */
public class test {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(null, null);
        //下面2个会覆盖为1个
        map.put(1, "zs");
        map.put(1, "sss");
        System.out.println(map.size());
        String s = map.get(null);
        System.out.println(s);

        /**
         * hashtable的key和value都不能为null
         */
        Map map1=new Hashtable();
        map1.put(null,122);
        map1.put(100,null);
        System.out.println(map1.size());//null
    }
}

Properties

1.Properties是一个Map集合,继承Hashtable,properties的key和value都是String类型
2.Properties被称为属性类对象
3.Properties是线程安全的

package com;

import java.util.*;

public class test {
    public static void main(String[] args) {
        //创建一个Properties对象
       Properties properties=new Properties();
       //存
       properties.setProperty("url","jdbc:mysql://localhsot:3306/ssm");
       properties.setProperty("driver","com.mysql.jdbc.Driver");
       properties.setProperty("username","root");
       properties.setProperty("password","123");
       //通过key获取value
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        System.out.println(url);
        System.out.println(driver);
        System.out.println(username);
        System.out.println(password);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值