1-2 map和list和set-ThreadLocal-finally-finalize
- 1-map和list和set
-
- 1-1 各自分集合
- 1-2 区别
- 1-3 ArrayList和LinkedList区别
- 1-4 List的遍历方式和效率
- 2-ThreadLocal
-
- 2-1介绍
- 2-2 原理
- 2-3 源码
- 2-4 ThreadLocal导致的内存泄漏问题
- 3-finally-finalize
这里是easy的java基础面试
下面是总的阅览:
java基础
java集合
JVM
多线程
mysql_数据库
计算机网络
nosql_redis
设计模式
操作系统
消息中间件activeMq
SSM框架面试题
服务中间件Dubbo
1-map和list和set
1-1 各自分集合
list:
ArrayList Vector : Object数组 LinkedList双向链表,1.7取消了循环
set:
HastSet|(无序,唯一): 基于hashmap实现,底层采用hashmap来保存元素
LinkedHashSet :继承与HashSet, 并且其内部是通过LinkedHashMap 来实现的
TreeSet(有序, 唯一): 红黑树,(自带平衡的排序二叉树)
map:
HashMap: JDK1.8 之前 hashmap由数组+链表组成。数组是hashmap主体,链表主要是为了解决哈希冲突而存在的(“拉链法”解决冲突。)
TreeMap: 红黑树(自平衡的排序二叉树)
1-2 区别
List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象 ) 有序的对象,通过下标访问元素。
Set(独一无二的性质) : 不允许重复的集合,不会有多个元素引用相同的对象。
Map(利用key来进行搜索): 使用键值对存储。Map会维护与key有关联的值。key不可以引用相同的对象,但key不重复,key是string / 任何对象。
1-3 ArrayList和LinkedList区别
类型 | ArrayList | LinkedList |
---|---|---|
是否保证线程安全 | 都是不同步的,所以线程不安全 | |
底层数据结构 | Object数组 | jdk1.6 双向循环链表 1.7取消了循环 |
插入和删除是否受元素位置的影响 | 受影响,因为需要移动元素 | 不受影响 O(1) |
是否支持快速随机访问 | 支持因为实现了randomAccess接口 | 不支持,需要遍历链表 |
内存空间占用 | 主要体现在List列表尾部会预留一部分空间 | 体现在每一个元素都有直接后继和直接前驱数据 |
1-4 List的遍历方式和效率
- 实现了RandomAccess接口的list: 优先使用for, 其次foreach
- 未实现上述接口: 优先使用iterator foreach, 注意大 size的数据,千万不要用普通for。
2-ThreadLocal
2-1介绍
记住,ThreadLocal不是解决对象的共享访问问题,ThreadLoacl.set()到线程中的对象是线程自己使用的对象。其他线程是不能访问的。因为这就是线程自己专属的数据。
2-2 原理
各个线程独立的对象不是通过,ThreadLocal.set()创建的,而是在每个线程中自己new 的对象,ThreadLocal.set() 将新建的对象的引用保存在线程独有的map中,也就是(ThreadLocal, 值) 。
2-3 源码
Thread:
public class Thread implements Runnable {
ThreadLocal.ThreadLocalMap threadLoacls = null;
ThreadLocal.ThreadLocalMap inheritableThreadLocals = null;
...
}
ThreadLocal 只是ThreadLocalMap的封装,传递了变量值, 每一个thread中都具备一个threadLocalMap—>存储以threadLocal为key的 键值对。
当使用ThreadLocal 维护变量时,ThreadLocal为每个使用该变量的线程都提供独立的变量副本,所以每一个线程都可以独立的改变自己的副本,而不会影响其他线程所对应副本。
ThreadLocal
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value); // this 就是当前 ThreadLocal副本
} else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLoacls;
}
2-4 ThreadLocal导致的内存泄漏问题
threadLocalMap 中key是 ThreadLocal的弱引用,而value是强引用。 如果ThreadLocal无被外部强引用的情况下,在垃圾回收的时候, key会被清理掉,而value不会被清理掉。这样nulll–>value的entry。如果我们不做什么,那么value永远都不会被GC回收与,就会造成内存泄漏。
然而, ThreadLocalMap已经考虑到这一点,所以在调用set get remove时,都会清理掉key为null的记录。使用完ThreadLocal最好手动调用remove方法。
3-finally-finalize
- finalize 用途
垃圾回收器决定回收对象时,就会运行对象的finalize方法。
主要是: 回收从特殊渠道申请的内存。JNI调用non-Java程序(c++)
- finally
在return之前会执行fianlly中的代码,如果fianlly中有return,则直接return,值为fianlly中修改的值。
如果finally中无 return,则执行try中return,数值仍然是 try中的。
如果fianlly中无return,但是finally中作了值的修改,那try中return返回的值依旧是try中的值。
- 区别
无论是否抛出异常,finally都会执行,他主要是用来释放应用占用的内存,比如流,文件关闭。
finalize方式是Object类的一个protected方法,他是在对象被垃圾回收器回收之前,用JVM来调用的。