map和list和set-ThreadLocal-finally-finalize
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区别
类型 | 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来调用的。
下一篇:
1-2 map和list和set-ThreadLocal-finally-finalize
本文地址:https://blog.csdn.net/qq_41773026/article/details/109564174
上一篇: cdr编组快捷键是什么?cdr怎么编组和取消群组?
下一篇: 匿名对象的值传递
推荐阅读
-
List和Dictionary泛型类查找效率浅析
-
Python中字典(dict)和列表(list)的排序方法实例
-
Python把csv数据写入list和字典类型的变量脚本方法
-
使用list和tuple
-
Python中的map()函数和reduce()函数的用法
-
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
-
php通过explode()和list()函数实现字符串的截取
-
php中foreach和list循环语句实例
-
python用reduce和map把字符串转为数字的方法
-
Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析