java面试题收集(16)---==与equals区别、HashSet、HashMap、HashMap和HashTable区别

87 阅读3分钟

1、==与equals区别

(1)==可以比较基本类型和引用类型 基本类型:比较内存地址是否相同。 引用类型:比较值是否相同。 (2)equals主要分默认和重写两种情况 默认:object类,默认是==方式比较。 重写:要根据具体情况具体分析。

2、HashSet

底层是由HashMap实现的。

HashSet重载方法:

private transient HashMap<E,Object> map;
//默认构造器
public HashSet() {
    map = new HashMap<>();
}
//将传入的集合添加到HashSet的构造器
public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}
//明确初始容量和装载因子的构造器
public HashSet(int initialCapacity, float loadFactor) {
    map = new HashMap<>(initialCapacity, loadFactor);
}
//仅明确初始容量的构造器(装载因子默认0.75)
public HashSet(int initialCapacity) {
    map = new HashMap<>(initialCapacity);
}
HashSet如何在内部工作并利用HashMap的 put方法:
private static final Object PRESENT =new Object();
public  boolean  add(E e){
return  map. put(e, PRESENT)==nul1;
}

3、HashMap

HashMap的底层结构在jdk1.7中由数组+链表实现,在jdk1.8中由数组+链表+红黑树实现,以数组+链表的结构为例。 在这里插入图片描述 在这里插入图片描述

  JDK1.8之前Put方法: 在这里插入图片描述

JDK1.8之后Put方法: 在这里插入图片描述

数组初始值长度为16,默认达到0.75饱和扩容,Node类型数组的k,v键值对 链表长度达到8后会分成树。

4 、HashMap和HashTable区别

(1)线程安全性不同 HashMap是线程不安全的,HashTable是线程安全的,其中的方法是Synchronize的,在多线程并发的情况下,可以直接使用HashTabl,但是使用HashMap时必须自己增加同步处理。

(2)是否提供contains方法 HashMap只有containsValue和containsKey方法;HashTable有contains、containsKey和containsValue三个方法,其中contains和containsValue方法功能相同。

(3)key和value是否允许null值 Hashtable中,key和value都不允许出现null值。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。

(4)数组初始化和扩容机制 HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。 Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

5、B树与B+树

B树:Balance Tree 多路平衡查找树。 B+树:增强版的多路平衡查找树。 加入树结构是为了排序与查找。 InnoDB不支持哈希索引,一页默认是16 KB,使用B+树实现索引结构。 B树比平衡二叉树减少了一次IO操作。

B+树与B树的区别: (1) B+树非叶子节点只存储键信息。 (2) B+树所有叶子节点之间都有一个链指针。 (3) B+树数据记录都存在叶子节点。

6、intern问题

String str = new StringBuilder("10").append("30").toString();

System.out.println(str==str.intern()); //true

String str2 = new StringBuilder("ja").append("va").toString();


System.out.println(str2==str2.intern()); //false

//intern方法是查找堆中是否以及存在该对象。
//JDK初始化自己定义了JAVA,所以报false。

GC只有15次是因为四位二进制最大为15:1111转十进制为15。