面面面(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锁升级过程

相关推荐
SimonKing3 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户298698530144 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波19 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端