-
String、StringBuffer、StringBuilder的区别
(1)String是不可变的,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
(2)StringBuffer是线程安全,可以不需要额外的同步用于多线程中;
(3)StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;
(4)StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。
(5)String实现了三个接口:Serializable、Comparable、CarSequence
(6)StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以。
(7)执行速度 StringBuilder > StringBuffer > String
(8)单线程大量数据StringBuilder,多线程大量数据 StringBuffer,少量数据用String -
1.8新特性
(1)Lambda表达式
(2)Stream API
(3)Date Time API LocalDate.now()
(4)Optional 类 处理空指针问题
(5)函数式接口 一个接口只能有一个待实现的方法
(6)接口默认方法 默认发放就是一个在接口里面有一个或多个实现的方法
(7)接口静态方法 -
集合
(1)List 有序,可重复
(2)Set 无序,不可重复
(3)ArrayList 非线程安全,基于动态数组
(4)Linklist 链表 添加删除比ArrayList快
(5)HashSet new的时候实际是new了一个HashMap 存值存在了key里
(6)SortedSet 继承了SET 无序不可重复 但是可以自动排序 按照大小顺序排序
(7)TreeSet 底层是TreeMap new是 new了一个TreeMap 存在key里 TreeMap是一个二叉树结构 -
Map
(1) HashMap 底层是哈希表 查询速度快 无序 集合是不同步的 多线程的时候 速度快 线程不安全 可存null
(2)LinkHashMap 是HashMap的子类 哈希表+链表 有序集合
(3)Hashtable 底层哈希表 单线程线程安全 速度慢 不能存null -
Redis nosql数据库
(1)常用命令GET,SET,SETEX 设置key过期时间,SETNX 只有客厅不存在是设置key值,DEL若key存在删除,DEXISTS 建是否存在,KEYS查询符合的key,MOVE移动到数据库,APPEND追加值
(2)使用场景 登录token, 订单加锁, 定时器计数器,消息系统
(3)数据类型 字符串,hash,list.set.zset
(4)持久化方式 RDB 根据时间将数据快照并存储到磁盘, AOF 将执行指令记录下来 下次启动时从头执行一遍
(5)哨兵 主从节点故障转移,检测主节点是否存活 主要负责 监控,选主,通知
(6)集群方式 主从复制 从库自动同步主库信息,哨兵,Cluster集群-每个节点可以存储不同的内容
(7)穿透- 大量请求不存在的key-加白名单设置过滤网,雪崩 大量key集体过期-提前对热门key调整市场, 击穿热点可以过期
(8)Set和zset的区别 set 无序,zset有序,set值不允许重复 -
MyBatisPlus
(1)ORM框架 封装了JDBC 只需要关注SQL语句本身
(2)#{} 带双引号,防止sql注入, ${}不带双引号
(3)一级缓存 存储作用域为Session 默认开启一级缓存 当Serrsion flush 或 close 会清空
(4)二级缓存 作用域Mapper 开启会多一步序列化和反序列化 影响效率
(5)执行顺序 读取配置文件包括yml,xml 创建工厂,会话对象,执行器,Statement对象接收传参查询数据库输出结果 -
Linux
(1)常用命令 pwd,cd,ls,ll,cat,cp复制,mv移动,mkdir创建目录,rmdir删除目录,rm 删除,find,kill,ping, java -jar 启动jar包,nohup java -jar启动jar包 -
SpringBoot
(1)常用注解 Controller,RestController,Param,Bean,Autoware,ResquestBody,ResponseBody,Server,SpringbootApplication,CompomentScan,Data,TableId,TableName -
数据库
(1)索引 主键,唯一,普通,组合索引 多个字段集合在一起只有第一个字段被用到才会有效
(2)索引失效 对列计算/使用函数, 不匹配数据类型,where使用了isNull/is not null, like查询 ,使用or 其中一个没有索引, != , not in
(3)左连接遍历左表所有数据,右连接遍历右表所有数据
(4)事务就是用户定义的一个数据库操作序列 这些操作要不全做,要不都不做
(5)事务特性 原子性,一致性,隔离性,持续性
(6)数据库并发导致的问题 丢失修改-两个同时改一个成功一个失败,不可重复读-读取之后数据被修改, 脏读 修改后撤销,但是查询的是撤销之前的
(7)Oracle和 Mysql 分页区别 Oracle 使用 rownum 分页,只能比较小于不能比较大于先查询后排序. Mysql 使用limit limit 不能再语句中计算需要提前计算
(8)三层架构 表示层UI,业务逻辑层(BLL),数据访问层(DAL) 为了符合高内聚,低耦合
(9)数据库隔离级别 读未提交,读已提交,可重复读,可串行话 oracle 默认读已提交,mysql默认可重复读
(10)脏读 A读到了B未提交的数据, 不可重复度 A读取 B的数据前后不一致, 幻读 A读取到了B insert的数据
(11)分库分表 水平分 表结构一样,数据不一样,垂直分 根据 库接口不一样,数据不一样 -
设计模式
(1)单例模式 Redis连接,数据库连接,IO
(2)简单工厂模式 工具类
(3)抽象工厂模式 再简单工厂基础上继承并修改代码
(4)观察者模式 一个对象修改 其依赖的对象都会跟着变化
(5)装饰器模式 动态给对象添加一些额外的功能,不改变其结构
(6)模板方法模式 定义一个模板 具体内容延迟到子类去实现
(7)代理模式 给一个对象提供一个代理,并由代理对象控制队员对原对象的引用
(8)策略模式 定义一系列算法,将每个算法封装起来,并且使他们之间可以相互替换
(9)适配器模式 将一个类的接口变成所期望的另一个接口,从而使原本因接口不匹配而无法一起工作的两个类能够一起工作 -
Shiro
(1)用于认证,授权,加密,会话管理,与Web继承,缓存
(2)核心组件 Subject - 当前用户操作, SecurityManager-管理所有Subject,Realms-授权信息的验证
(3)组件 Authentication-身份认证/登录,验证用户是否拥有相应身份,Authorization 授权, SessionManager 会话管理, Cryptography 加密, Caching 缓存,Remember Me 记住我
(4)免密登录 定义类型 密码/免密登录, 自定义token继承 UsernamePasswordtoken 构造方法中判断是否免密, 自定义Realm 继承 AuthorizingRealm, 自定义Match类 继承HashedCredentialsMatcher 根据类型判断是否需要验证密码 -
Spring
(1)IOC 控制反转 上层控制下层, 使用依赖注入的方式实现控制反转
(2)AOP 面向切面编程, 底层使用动态代理, 可以降低业务逻辑之前的耦合度,提高可重用性
(3)依赖注入 构造器注入,setter注入,方法注入
(4)读取yml 注解方式, Environment , 自动装配 -
分布式事务 使用seata AT模式 一阶段业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和链接资源, 二阶段 提交异步化,回滚通过一阶段的回滚日志进行反向补偿
-
MyCat
-
关闭客户端cookie session 后台还能用吗 不能 无法携带sessionid
-
Jvm 实现了Java的平台无关性, 虚拟的计算机 , 数据区分为 方法区,堆,栈,程序计数器
-
IO
(1)三种分类 数据流方向-输入,输出流 文件读写, 处理文件单位-字节,字符,功能-节点流,处理流 -
多线程
(1)继承Thread
(2)实现Runnable
(3)实现Callable接口
(4)线程池
(5)Start和Run区别 start 会创建一个新线程去执行,run不会,线程启动后 不能重复调用start,可以重复调用run
Java常见面试题
于 2024-10-30 10:04:55 首次发布