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);
}
}