基于双向链表实现,查找慢:o(n),增删快:o(1)
封装了队列和栈的调用
[](()HashMap 、HashTable
HashMap
-
基于数组和链表实现,数组是 HashMap 的主体;链表是为解决哈希冲突而存在的
-
当发生哈希冲突且链表 size 大于阈值时会扩容,JAVA 8 会将链表转为红黑树提高性能
允许 key/value 为 null
HashTable
-
数据结构和 HashMap 一样
-
不允许 value 为 null
-
线程安全
[](()ArrayMap、SparseArray
ArrayMap
1.基于两个数组实现,一个存放 hash;一个存放键值对。扩容的时候只需要数组拷贝,不需要重建哈希表
2.内存利用率高
3.不适合存大量数据,因为会对 key 进行二分法查找(1000以下)
SparseArray
1.基于两个数组实现,int 做 key
2.内存利用率高
3.不适合存大量数据,因为会对 key 进行二分法查找(1000以下)
[](()volatile 关键字
-
只能用来修饰变量,适用修饰可能被多线程同时访问的变量
-
相当于轻量级的 synchronized,volatitle 能保证有序性(禁用指令重排序)、可见性;后者还能保证原子性
-
变量位于主内存中,每个线程还有自己的工作内存,变量在自己线程的工作内存中有份拷贝,线程直接操作的是这个拷贝
-
被 volatile 修饰的变量改变后会立即同步到主内存,保持变量的可见性。
双重检查单例,为什么要加 volatile?
1.volatile想要解决的问题是,在另一个线程中想要使用instance,发现instance!=null,但是实际上instance还未初始化完毕这个问题
2.将instance =newInstance();拆分为3句话是。1.分配内存2.初始化3.将instance指向分配的内存空
3.volatile可以禁止指令重排序,确保先执行2,后执行3
[](()wait 和 sleep
-
sleep 是 Thread 的静态方法,可以在任何地方调用
-
wait 是 Object 的成员方法,只能在 synchronized 代码块中调用,否则会报 IllegalMonitorStateException 非法监控状态异常
-
sleep 不会释放共享资源锁,wait 会释放共享资源锁
[](()lock 和 synchronized
-
synchronized 是 Java 关键字,内置特性;Lock 是一个接口
-
synchronized 会自动释放锁;lock 需要手动释放,所以需要写到 try catch 块中并在 finally 中释放锁
-
synchron