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。