java基础
1.JDK和JRE的区别
- JDK:java开发工具包,包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具
- JRE:java运行环境
2.== 和 equals 的区别
对于==来说
- 基本数据类型:比较两个值是否相同
- 引用数据类型:比较引用地址是否相同
对于equals来说
- 基本数据类型:比较引用地址是否相同
- 引用数据类型:比较值是否相同
3.两个对象的 hashCode()相同,则 equals()也一定为 true对吗
不对,hashcode相同,并不代表键值对等
4.final 在 java 中有什么作用
- final 修饰的类叫最终类,该类不能被继承。
- final 修饰的方法不能被重写。
- final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
5.八种基础数据类型
byte、short、int、long、float、double、boolean、char
6.StringBuilder和StringBuffer的区别
- StringBuilder单线程下使用,线程不安全,性能好
- StringBuffer多线程下使用,线程安全,性能相比差
7.常量池放在JVM中的哪里
JDK1.6中,它在方法区中,属于“永久代”
JDK1.7中,它被方法区移除,放在堆中
JDK1.8中,取消了“永久代”,常量池放在元空间,与堆独立
8.抽象类和普通类的区别
抽象类:不可以实例化,可以包含抽象方法(不一定得有抽象方法)
普通类:可以实例化,可以有抽象方法
9.抽象类和接口的区别
抽象类:类可以被单继承,自下而上,子类提出公共方法,下层决定上层,可以有构造方法
接口:类可以被多实现,自上而下,接口方法可以多实现,上层决定下层,不能有构造方法
10.java的IO流分为几种
- 按功能来分:输入流和输出流
- 按类型来分:字节流字符流
字节流与字符流区别:字节流8位,字符流16位
11.浅拷贝与深拷贝的区别
浅拷贝只拷贝地址,会改变原对象
深拷贝创建新的对象,不会改变原对象
java集合
1.如何解决hash冲突,有哪四种方法
- 开放定址法
- 再哈希法
- 链地址法
- 建立公共溢出区
2.容器
3.HashMap和HashTable
- HashMap允许空键值,而HashTable不允许
- HashMap线程不安全,HashTable线程安全
4.说一下 HashMap 的实现原理
HashMap采用链地址法实现数组加链表的方式存储,根据hashcode计算数组下标位置
1.8之前采用头插法,插入链表
1.8之后采用尾插法,链表长度超过8,则采用红黑树存储(查询快)
5.说一下 HashSet的实现原理
HashSet底层由HashMap实现
HashSet的值存放于HashMap的key上,value为PRESENT
6.ArrayList 和 LinkedList 的区别是什么
ArrayList底层是数组支持随机访问
LinkedList底层是双向循环链表,不支持随机访问
7.在 Queue 中 poll()和 remove()有什么区别?
poll() 在获取元素失败的时候会返回空
remove() 在获取元素失败的时候会抛出异常
spring
1.spring中bean的生命周期
2.springmvc请求流程
3.三级缓存
- 一级缓存:完整的bean对象
- 二级缓存:半成品bean对象
- 三级缓存:存放lamda表达式 完成代理对象覆盖过程
redis
1.内存穿透、缓存雪崩是什么,怎么解决?
- 内存穿透:指缓存查不到无效数据,去查数据库,数据库也查不到,导致大数据库服务器负荷以及浪费大量计算机和网络资源。
解决方法:设置默认值,查询缓存不存在后,如果默认值没有则查数据库,默认值存在则不查,或者使用布隆过滤器 - 内存雪崩:指大量缓存同时过期,导致去查数据库,数据库服务器负荷
解决方法:设置不同的过期时间 - 内存击穿:指个别缓存过期,导致去查数据库,数据库服务器负荷
解决方法:可以设置锁来控制,同步操作减少数据库负荷
2.redis 支持的数据类型有哪些
hash、list、string、zset、set
3.redis分布式锁使用注意
1.避免死锁
2.设置过期时间,防止死锁带来的问题