本文首发于 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
-
解法
- 倒序遍历去除字符串最后的所有空格
- 定义计数器缓存长度
- 循环直到遇到空格,计数器自增
原文
https://segmentfault.com/a/1190000019895040