HashMap
中带有初始容量的构造函数:
public HashMap(int initialCapacity,float loadFactor) {if (initialCapacity < 0)throw new IllegalArgumentException("Illegal initial capacity: " +initialCapacity);if (initialCapacity > MAXIMUM_CAPACITY)initialCapacity = MAXIMUM_CAPACITY;if (loadFactor <= 0 || Float.isNaN(loadFactor))throw new IllegalArgumentException("Illegal load factor: " +loadFactor);this.loadFactor = loadFactor;this.threshold = tableSizeFor(initialCapacity);}public HashMap(int initialCapacity) {this(initialCapacity,DEFAULT_LOAD_FACTOR);}
下面这个方法保证了 HashMap
总是使用 2 的幂作为哈希表的大小 。
/*** Returns a power of two size for the given target capacity.*/static final int tableSizeFor(int cap) {int n = cap - 1;n |= n >>> 1;n |= n >>> 2;n |= n >>> 4;n |= n >>> 8;n |= n >>> 16;return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;}
2. HashMap 和 HashSet 区别如果你看过 HashSet
源码的话就应该知道:HashSet
底层就是基于 HashMap
实现的 。(HashSet
的源码非常非常少,因为除了 clone()
、writeObject()
、readObject()
是 HashSet
自己不得不实现之外,其他方法都是直接调用 HashMap
中的方法 。
HashMap
HashSet
实现了 Map
接口实现 Set
接口存储键值对仅存储对象调用 put()
向 map 中添加元素调用 add()
方法向 Set
中添加元素HashMap
使用键(Key)计算 hashcode
HashSet
使用成员对象来计算 hashcode
值,对于两个对象来说 hashcode
可能相同,所以equals()
方法用来判断对象的相等性3. HashMap 和 TreeMap 区别TreeMap
和HashMap
都继承自AbstractMap
,但是需要注意的是TreeMap
它还实现了NavigableMap
接口和SortedMap
接口 。
实现 NavigableMap
接口让 TreeMap
有了对集合内元素的搜索的能力 。
实现SortedMap
接口让 TreeMap
有了对集合中的元素根据键排序的能力 。默认是按 key 的升序排序,不过我们也可以指定排序的比较器 。示例代码如下:
/** * @author shuang.kou * @createTime 2020年06月15日 17:02:00 */public class Person {private Integer age;public Person(Integer age) {this.age = age;}public Integer getAge() {return age;}public static void main(String[] args) {TreeMap<Person,String> treeMap = new TreeMap<>(new Comparator<Person>() {@Overridepublic int compare(Person person1,Person person2) {int num = person1.getAge() - person2.getAge();return Integer.compare(num,0);}});treeMap.put(new Person(3),"person1");treeMap.put(new Person(18),"person2");treeMap.put(new Person(35),"person3");treeMap.put(new Person(16),"person4");treeMap.entrySet().stream().forEach(personStringEntry -> {System.out.println(personStringEntry.getValue());});}}
输出:
person1person4person2person3
可以看出,TreeMap
中的元素已经是按照 Person
的 age 字段的升序来排列了 。
上面,我们是通过传入匿名内部类的方式实现的,你可以将代码替换成 Lambda 表达式实现的方式:
TreeMap<Person,String> treeMap = new TreeMap<>((person1,person2) -> {int num = person1.getAge() - person2.getAge();return Integer.compare(num,0);});
综上,相比于HashMap
来说 TreeMap
主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力 。
HashSet 如何检查重复以下内容摘自《Head first java》第二版:
经验总结扩展阅读
- Java单例模式,看这一篇就够了
- 感恩节祝福寄语精选
- 微信支付v3接口的 官方 Java SDK
- Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化
- 精选600个 冯姓女孩名字2023年属兔
- 精选600个 韩姓女孩名字2023年属兔
- 精选600个 唐姓女孩名字2023年属兔
- 精选600个 罗姓女孩名字2023年属兔
- 精选600个 马姓女孩名字2023年属兔
- 精选600个 谢姓女孩名字2023年属兔