1-2 map和list和set-ThreadLocal-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区别

类型ArrayListLinkedList
是否保证线程安全都是不同步的,所以线程不安全
底层数据结构Object数组jdk1.6 双向循环链表 1.7取消了循环
插入和删除是否受元素位置的影响受影响,因为需要移动元素不受影响 O(1)
是否支持快速随机访问支持因为实现了randomAccess接口不支持,需要遍历链表
内存空间占用主要体现在List列表尾部会预留一部分空间体现在每一个元素都有直接后继和直接前驱数据

1-4 List的遍历方式和效率

  1. 实现了RandomAccess接口的list: 优先使用for, 其次foreach
  2. 未实现上述接口: 优先使用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

  1. finalize 用途
    垃圾回收器决定回收对象时,就会运行对象的finalize方法。
    主要是: 回收从特殊渠道申请的内存。JNI调用non-Java程序(c++)
  1. finally
    在return之前会执行fianlly中的代码,如果fianlly中有return,则直接return,值为fianlly中修改的值。
    如果finally中无 return,则执行try中return,数值仍然是 try中的。
    如果fianlly中无return,但是finally中作了值的修改,那try中return返回的值依旧是try中的值。
  1. 区别
    无论是否抛出异常,finally都会执行,他主要是用来释放应用占用的内存,比如流,文件关闭。
    finalize方式是Object类的一个protected方法,他是在对象被垃圾回收器回收之前,用JVM来调用的。

下一篇:
1-2 map和list和set-ThreadLocal-finally-finalize

匿名

发表评论

匿名网友