java 基础知识点整理(二)
(1) 抽象类和接口
区别:
- 抽象类可以有的方法可以有普通方法,接口的方法全都是抽象方法
- 抽象类可以用普通成员变量,接口中只有常量也就是,static final的
- 抽象类是单继承,接口可以多继承
(2) 面向对象的三大特性
- 封装
将对象属性封装起来,只提供相关方法保障对象安全性,隐藏细节性。 - 继承
代码复用,增加扩展性 - 多态
允许对象的不通子类对一个方法作出多种实现。 多态的三个条件,继承,子类重写夫类的方法,父类的引用只想子类的实现
(3) 重写和重载
- 重写
子类重写夫类的方法,根据子类的类型调用具体的方法 - 重载
在同类下,方法名相同,参数数量不同
(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 | // ThreadLocalMap的key |
(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的区别
- Comparable 是接口 Coparator是类
- 需要排序的类都实现了Comparable 并且重写了 compare方法
this.==obj 结果0
this.> obj 结果正数
this.< obj 结果负数 - Comparator 可以传入到排序集合工具类的sort方法进行控制
(8) 继承
- 子类继承父类所有成员变量 (private 成员只有拥有权没有访问权)
- 子类可以直接使用父类的非private的成员隐式使用则在编译期间自动加上super关键字
(9) fianl 相关
- final 修饰类 ,类不能被继承 如String
- final 修饰方法,方法不能被重写,重载
- final 修饰属性,属性不可变 常量
(10) try{}cache{}finaly return
- 在 try {} 中return 会执行finaly的逻辑
- 在 try {} 中return 并且 finaly 也有retrun 返回的是try {} 中return 的值,retrun的时候是直接将retrun的值放到临时保存到局部变量中,等到finaly执行结束后会直接从该位置的值直接返回
- 无论执行return break continue 都会执行 finaly的内容,除非调System.exist()
(11) switch字符串的实现
switch的字符串的实现原理是int,在编译后switch的字符串会变为hashcode的值