本文首发于 cartoon 的博客
转载请注明出处:https://cartoonyu.github.io/c…
java 基础
-
Iterator 与 ListIterator 的区别
- Iterator 与 ListIterator 都是 Collection 的迭代器实现,ListIterator 继承于 Iterator
-
遍历集合分类
- Iterator 可以遍历 Set,List,Queue 的实现类
- ListIterator 只能遍历 List 接口下的实现类
-
修改被迭代集合
- Iterator 不能对元素进行修改或者添加元素
- ListIterator 可以在迭代中修改添加元素
-
删除元素
- 两个都可以在迭代过程中删除元素
-
遍历方式
- Iterator 只能向下遍历
- ListIterator 可以向前向后遍历,同时可以获取当前迭代元素的索引
-
synchronized 和 ReentrantLock 的区别
-
共同点
- 都是协调线程间访问互斥资源
- 可重入,同一线程可以多次获得同一锁
- 都保证了可见性和互斥性
-
不同点
-
获取锁的方式
- ReentrantLock 需要显式获取锁
- synchronized 隐式获取锁
-
灵活性
- ReentrantLock 可以响应中断,可以切换锁的公平性
- synchronized 不可以响应中断,锁的获取只能依靠系统调度
-
存在位置
- ReentrantLock 是 API 级别
- synchronized 是 JVM 级别
-
底层实现
- synchronized 是同步阻塞式的,采用悲观并发策略
- ReentrantLock 时同步非阻塞式的,采用乐观并发策略
-
-
-
hasCode,equals 的了解
- hasCode 方法是 JVM 计算对象的哈希码的方法,计算结果会放在对象头的哈希码字段中
- equals 是常用的对象对比方法
- 重写 equals,需要重写 hashCode
- equals 返回 true,hashCode 也返回相等的整数
- equasl 返回 false,hasCode 返回不一定相等
- hashCode 相等,equals 对比不一定相等
- hashCode 不相等,equals 返回 false
JVM
-
java 对象在 jvm 的组成
-
对象头
-
自身运行数据
- 哈希码
- GC 分代年龄
- 锁状态标志
- 线程锁
- 偏向线程 ID
- 偏向时间戳
-
类型指针
- 对象指向元数据的指针
-
- 实例数据
- 对齐字节
-
-
双亲委派模型的概念
- 双亲委派模型发生在类加载的过程中
- 当前类不直接负责加载,将类依次递归交给父加载器进行加载
- 若父加载器都不能加载,则当前类负责加载
-
如果我不想用这个双亲加载模型,怎么操作
- 自定义类加载器,重载 loadClass 方法
数据库
-
延迟加载是什么?Mybatis 是否支持延迟加载?
-
延迟加载
- 符合查询条件的结果只加载满足要求的部分
- 若信息需要更详细则再查询从关联表
-
延迟加载配置
- 查询语句中开启 fetchType
- 全局配置文件中
- 开启 lazyLoadingEnabled(开启全局延迟加载)
- 关闭 aggressiveLazyLoading
- 开启 lazyLoadTriggerMethods
-
-
select 语句是怎么执行的
-
连接器
- 客户端通过账户密码进入到 mysql 服务器层中
-
查询缓存
-
查询时候执行过此条 select 语句
- 若执行过,直接返回缓存结果
- 若未执行过,进入第三步
-
-
分析器
- 词法分析
- 语法分析
-
优化器
- 通过选择索引实现查询速度的优化
-
执行器
- 操作引擎,进行查询操作并返回结果
-
Spring
-
spring 的作用域
- singleton(多用于无状态)
- prototype(多用于有状态)
- session
- request
- global session
-
spring 的 bean 线程安全吗
- prototype 以及 request 再每次被调用会产生新对象,所以是线程安全的
- 无状态的 singleton 线程安全,有状态的 singleton 线程不安全
- session 以及 global session 会造成线程竞争
设计模式
-
装饰者模式的原理实现以及 java 中使用场景
-
原理以及实现
- 装饰者与被装饰者有一致的行为流程
- 定义一个接口,接口方法为一致的行为流程
- 装饰者与被装饰者实现同一个接口,并重写方法实现自身逻辑
- 当需要装饰时,传入被装饰者到装饰者的实现逻辑中,并返回装饰者的对象
-
使用场景
- java 的 IO 相关类
-
算法
-
字符串统计最后一个单词的长度(leetcode58)
-
题目
- 给定一个仅包含大小写字母和空格
' '
的字符串,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0。
-
样例
- 输入:”Hello World”
- 输出:5
- 给定一个仅包含大小写字母和空格
-
解法
- 倒序遍历去除字符串最后的所有空格
- 定义计数器缓存长度
- 循环直到遇到空格,计数器自增
-