面面面(2)

1、介绍下Java泛型

泛型是jdk5以后推出的特性,主要目的是编译时的类型检查,避免运行时类型转换异常,实现代码复用及为了适配更多代码及之前版本。举例在不用泛型时候,用ArrayList存字符串,需要手动强转。如果存了其他类型,运行时才会报错。(这样好处是,比如对于arrayList里面插入不同类型时能尽早识别。)本质是类型参数化。

主要有三个用处:泛型类,比如一般封装好的Result类或者常见的容器类;泛型方法,在方法返回值前面用泛型;泛型通配符。

? extends T上界通配符,可以接收T及其子类,但是不能写,只能读。(因为编辑时,不清楚具体子类型)

? super T 下届通配符,可以接收T及其父类,但是只能写不能读。读只能是object类型。

泛型原理:类型擦除。是在编译时期,把泛型参数替换成边界类型或者是Object类型,同时插入类型转换代码。

2、spingboot启动流程

1、new springBootApplication 先判断是什么类型web还是应用,设置初始化器,监听器,主类。记得推断启动类型是判断类路径中是否有jarakta.servelet.Servelet相关的类就是web 应用,设置初始化器触发springboot自动配置动作,就是从spring.factories加载并初始化类。

2、启动.run方法。1、准备环境,加载配置环境,系统变量,命令行参数,最终封装成configureableEnvironment 2、创建ApplicationContext ,装配Bean,加载配置类,@ComponentScan就是这里发挥作用。3、刷新上下文,所有bean初始化完成,事务监听器配置完毕。web项目这时候会启动内置的tomcat。4、调用commandLineRunner ApplicationRunner 可以启动后输出内容 5、发布ApplicationReadyEvent,所有启动流程结束,应用进入运行状态,准备接收请求

3、@Resource和@Autowired 的区别

一个通过name一个通过类型

4、创建线程的几种方式

4种。1、直接继承Thread,但是java是单继承,不太方便。2、实现Runable接口 ,但是没有返回值 3、实现callable接口,但是得有futureTask 4、还有说用线程池。那就区别于前面new Thread,而是用executorService.execute(new xxThread())方法。

5、在工作中是怎么运用线程的呢?

是用线程池的方式使用线程。如何创建的呢?不能说用executor,因为它的工作队列是无界队列,容易OOM。

6、threadLocal

是每个线程的数据副本,底层是一个threadLocalMap,里面的key是弱引用,存得是该threadLocal对象,value是值,如果在不用完之后remove容易出现内存泄漏问题。

为什么是弱引用,因为这样,remove掉key value之间连接,gc时候就能吧该键值对给回收掉。

假设 Key 是强引用:如果 ThreadLocal 对象(比如局部变量)已经不用了,但 Thread 还在运行(比如线程池的核心线程),那么 ThreadLocalMap 的 Key 会一直强引用 ThreadLocal 对象,导致 ThreadLocal 无法被 GC 回收,进而引发内存泄漏;

用弱引用:当 ThreadLocal 对象没有其他强引用时,GC 会直接回收这个 Key(弱引用对象只要 GC 就会被回收),此时 Map 中会出现'Key 为 null'的无效键值对。⚠️ 注意:弱引用只能解决 Key 的回收问题,Value 依然是强引用 ------ 如果不手动 remove,Value 会一直被 Thread 的 Map 引用,直到 Thread 结束,这才是 ThreadLocal 内存泄漏的核心原因。

7、sychnorized锁升级过程

相关推荐
楼田莉子7 小时前
C++20新特性:Range库
开发语言·c++·后端·学习·c++20
布朗克1687 小时前
04 变量与数据类型
java·变量与数据类型
hdsoft_huge7 小时前
以2026世界杯晋级逻辑,生动拆解SpringBoot软件架构
java·spring boot·后端
念恒123067 小时前
Python 函数完全指南:定义与调用
开发语言·python
曹牧7 小时前
Java:Unix时间戳
java·开发语言
会编程的土豆7 小时前
Go 里的 error 接口 + 假 nil(超级重点)
开发语言·后端·golang
愿天垂怜7 小时前
【C++脚手架】ffmpeg 库的介绍与使用
linux·服务器·开发语言·c++·ide·git·ffmpeg
涛声依旧-底层原理研究所7 小时前
Node.js在高并发低延迟场景中的优势
java·人工智能·python·node.js
并不喜欢吃鱼7 小时前
从零开始 C++-----十一【C++ 数据结构】红黑树全解析:从定义到工程实现(一文搞定,十分详细)
开发语言·数据结构·c++
不会C语言的男孩7 小时前
C++ Primer Plus 第7章:函数——C++的编程模块
开发语言·c++