1.泛型中的extends 和 super
<? extends Fruit>:这个我知道
<? super Fruit>: super没用过,意义和extends相反,叫下界通配符,指必须是Fruit或者Fruit的基类
2.阻塞线程
3.WeakHashMap 和 ReferenceQueue
WeakReference创建时,可以传入一个ReferenceQueue,在对象被回收后,ReferenceQueue对应的变量就变为空,可以根据这个特性来判断对象是否被回收了,WeakHashMap就是利用该机制的,同时还有LeakCanary
4.堆栈
https://www.cnblogs.com/dolphin0520/p/3613043.html
5.ThreadLocal
首先,在每个线程Thread内部有一个ThreadLocal.ThreadLocalMap类型的成员变量threadLocals,这个threadLocals就是用来存储实际的变量副本的,键值为当前ThreadLocal变量,value为变量副本(即T类型的变量)。
初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。
然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找。
典型场景Looper.myLooper();
源码解析: Looper中有个static final ThreadLocal<Looper> sThreadLocal
Looper.prepar()中,sThreadLocal.set 一个Looper的实例。Looper.myLooper(), ThreadLocal 获取线程中的Looper实例副本
6.Class.forName 和 ClassLoader
java中class.forName()和classLoader都可用来对类进行加载。
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。