map和list和set-ThreadLocal-finally-finalize

2022-07-28,,,,

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的遍历方式和效率

  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

本文地址:https://blog.csdn.net/qq_41773026/article/details/109564174

《map和list和set-ThreadLocal-finally-finalize.doc》

下载本文的Word格式文档,以方便收藏与打印。