Java集合精选常见面试题( 十 )

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 中的方法 。
HashMapHashSet实现了 Map 接口实现 Set 接口存储键值对仅存储对象调用 put()向 map 中添加元素调用 add()方法向 Set 中添加元素HashMap 使用键(Key)计算 hashcodeHashSet 使用成员对象来计算 hashcode 值,对于两个对象来说 hashcode 可能相同,所以equals()方法用来判断对象的相等性3. HashMap 和 TreeMap 区别TreeMapHashMap 都继承自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》第二版:

经验总结扩展阅读