被alibaba从C++调剂到Java岗位,仍在面试中,然而对Java并不熟悉,基础很差,故整理而学习之。
同时询问,简书又没TOC功能的替代?没有目录很艰难
[TOC]
线程安全
当多个线程类并发操作某类的某个方法,在该方法的内部来修改这个类的某个成员变量的值,不会出错,我们就说,这个方法是线程安全的。
某类的某个方法是否线程安全的关键是:
线程不安全
当多个线程类并发操作某类的某个方法,在该方法内部来修改这个类的某个成员变量的值,很容易发生错误,故我们说,这个方法是线程不安全的。如果要把这个方法变成线程安全的,则用synchronized关键词来修饰这个方法即可。
TIPS:用synchronized关键字修饰方法,会导致加锁,虽然可能使该方法线程安全,但是会极大的降低该方法的执行效率,所以慎用该关键词。
Vector和ArrayList都是以类似数组的形式存储的,LinkedList则是以链表的形式进行存储的
Vector线程同步(安全),ArrayList和LinkedList线程不同步(不安全)
ArrayList扩容容器大小的50%,Vector为100%。ArrayList更省空间?
ArrayList 是线性表(数组)
get() 直接读取第几个下标,复杂度 O(1)
add(E) 添加元素,直接在后面添加,复杂度O(1)
add(index, E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)
remove() 删除元素,后面的元素需要逐个移动,复杂度O(n)
LinkedList 是链表的操作
get() 获取第几个元素,依次遍历,复杂度O(n)
add(E) 添加到末尾,复杂度O(1)
add(index, E) 添加第几个元素后,需要先查找到第几个元素,直接指针指向操作,复杂度O(n)
remove() 删除元素,直接指针指向操作,复杂度O(1)
Map是“键值对”映射的抽象接口
AbstractMap实现了Map中大部分函数接口,减少了“Map的实现类”的重复编码
SortedMap有序的”键值对“映射接口
NavigationMap继承自SortedMap,支持导航函数的接口
HashMap是基于拉链法实现的散列表,一般用于单线程程序中。
HashTable是基于拉链法实现的散列表,一般用于多线程。
TreeMap是有序(默认升序)的散列表,通过红黑树实现,一般用于单线程中存储有序的映射
WeakHashMap基于拉链法实现的散列表,一般用于单线程,相比HashMap,WeakHashMap中的键是”弱“键,当弱键被GC回收时,对应的键值也会从WeakHashMap中删除,而HashMap中的键是强键。
相同点
不同点
继承和实现方式不同
HashMap继承于AbstractMap,实现了Map、CloneMap、Serializable接口
HashTable继承于Dictionary,实现了Map、Cloneable、Serializable接口
两者定义代码
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {} public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable {}
线程安全性
对null值的处理
支持的遍历种类
通过Iterator迭代器便利时的遍历顺序
容量的初始值和增加方式
HashMap默认初始大小为16,默认加载因子是0.75。增加时,每次将容量变为原始容量*2(保证为2^n)
TIPS:为了提高效率,HashMap的容量是2的幂,即使指定初始容量不是2的幂,内部也会将其转换为2的幂。
int capacity = 1; while (capacity < initialCapacity) capacity <<= 1;//是不是非常interesting
HashTable默认初始大小为11,默认加载因子是0.75。增加时,每次扩容为原始容量*2+1(保证近似质数,分散效果好)
添加key-value时采用的hash函数不同
HashMap采用自定义的哈希算法
static int hash(int h) { h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }
Hash Table采用key的hashCode()方法,没有自定义的哈希函数
int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length;
部分API不同
//TODO:深夜更新