(1) 抽象类和接口

区别:

  1. 抽象类可以有的方法可以有普通方法,接口的方法全都是抽象方法
  2. 抽象类可以用普通成员变量,接口中只有常量也就是,static final的
  3. 抽象类是单继承,接口可以多继承

    (2) 面向对象的三大特性

  4. 封装
    将对象属性封装起来,只提供相关方法保障对象安全性,隐藏细节性。
  5. 继承
    代码复用,增加扩展性
  6. 多态
    允许对象的不通子类对一个方法作出多种实现。
    多态的三个条件,继承,子类重写夫类的方法,父类的引用只想子类的实现
    

(3) 重写和重载

  1. 重写
    子类重写夫类的方法,根据子类的类型调用具体的方法
  2. 重载
    在同类下,方法名相同,参数数量不同

(4) ThreadLocal(线程局部变量)

线程之间共享变量是有风险的,如果想每一个线程使用自己的变量可以使用ThreadLocal来实现
ThreadLocal 实际上是使用 ThreadLocalMap 来实现的 key 存储的是ThreadLocal,value为当前线程存储的变量
因为线程都有一个ThreadLocalMap 的属性。
1. set方法
(1) 获取当前线程
(2) 从当前线程获取ThreadLocalMap对象
(3) 把ThreadLoacl对象作为key value为要存储的值
(4) 如果获取当前线程ThreadLocalMap 为空 则创建ThreadLocalMap

1
2
3
4
5
6
7
8
 public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}

2. get方法
(1) 获取当前线程
(2) 从当前线程获取ThreadLocalMap,将当前的ThreadLocal作为key 获取对应的value值

 public T get() {
    Thread t = Thread.currentThread();
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    return setInitialValue();
}

(5) ThreadLocalMap的key为什么是弱引用?

如果不是弱引用则ThreadLocalMap无法释放内存
1. 如果是普通的Map用来存储,theadlocal一直与线程保持强引用的关系
2. 会导致gc时如果线程不结束,则无法进行垃圾回收(gc 垃圾回收是可达性判断,强引用的关系是无法进行gc)的
3. ThreadLocalMap 的key 为弱引用 继承了Weakreference来实现的
4. ThreadLocalMap 为垃圾回收实现了便利

1
2
3
4
5
6
7
8
9
//   ThreadLocalMap的key
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}

(6) ThreadLocal 内存泄漏

只有调用ThreadLocal的get set remove方法才会采取措施来进行处理 ThreadLocal对应的value,
如果在局部定义ThreadLocal但是没有显示的调用remove方法怎会产生内存泄漏。
因为在 set或get方法的时候会将key为null的对象去除这样,对应的value没有gc root了,则会被gc回收
jdk建议将ThreadLocal定义为 static final的 这样 它的声明周期更长,由于一直都存在强引用,这样就能保证在任何时候都能获取到对应 Entry的value值,然后remove它,防止内存泄露。

(7) Comparable 和 Comparator的区别

  1. Comparable 是接口 Coparator是类
  2. 需要排序的类都实现了Comparable 并且重写了 compare方法
    this.==obj 结果0
    this.> obj 结果正数
    this.< obj 结果负数
  3. Comparator 可以传入到排序集合工具类的sort方法进行控制

    (8) 继承

  4. 子类继承父类所有成员变量 (private 成员只有拥有权没有访问权)
  5. 子类可以直接使用父类的非private的成员隐式使用则在编译期间自动加上super关键字

(9) fianl 相关

  1. final 修饰类 ,类不能被继承 如String
  2. final 修饰方法,方法不能被重写,重载
  3. final 修饰属性,属性不可变 常量

(10) try{}cache{}finaly return

  1. 在 try {} 中return 会执行finaly的逻辑
  2. 在 try {} 中return 并且 finaly 也有retrun 返回的是try {} 中return 的值,retrun的时候是直接将retrun的值放到临时保存到局部变量中,等到finaly执行结束后会直接从该位置的值直接返回
  3. 无论执行return break continue 都会执行 finaly的内容,除非调System.exist()

(11) switch字符串的实现

switch的字符串的实现原理是int,在编译后switch的字符串会变为hashcode的值