一.java基础
1.jdk和jre
jdk是java开发工具包,jre是java运行环境,jdk包含jre,运行java程序jre就够了,开发java程序需要jdk。
2.Object类常用方法
equals(),hashcode(),wait(),notify(),notifyAll()
3.什么情况下需要重写equals()和hashcode()方法
自定规则进行实体类比较时。
4.java特点
继承,封装,多态
5.基本数据类型
byte,short,int,long,float(4字节单精度),double(8字节双精度),char,boolean
6.String,StringBuffer,StringBuilder
String 引用类型
StringBuffer 线程安全,效率低,代码内部加锁
StringBuilder 线程不安全,效率高,推荐优先使用
7.重写和重载
重写 方法名相同,参数类型个数都相同
重载 方法名相同,参数类型个数不同
8.抽象类和接口
抽象类 单继承,可以没有抽象方法
接口 多继承,接口中只有抽象方法**注:jdk1.8开始接口中其实也可以写方法的实现
9.==和equals()
== 基本数据类型:比较值是否相等;引用类型:比较内存地址。
equals() 推荐用于字符串比较,若没有重写等效于==。
10.HashMap HashTable CurrentHashMap
HashMap 线程不安全 底层为数组+链表+红黑树 无序,允许key value为null,默认大小为16,大小一定是2的幂
HashTable 线程安全 效率低 不推荐使用
CurrentHashMap 线程安全 相较于HashTable锁的粒度更细,效率高于HashTable
11.ArrayList,LinkedList,Vector
ArrayList 底层基于动态数组,查询效率高,get()方法直接通过数组下标获取
LinkedList 底层基于双向链表,通常情况下插入和删除效率高
Vector 线程安全 内部加锁 效率低
12.构造方法
可以重载,不可继承,不可重写
13.静态变量和成员变量的区别
静态变量在类加载时加载,储存在方法区,和类共存亡
成员变量存放在堆中
14.泛型
参数化类型,把确定类型的工作推迟到使用之前
15.反射
在运行状态中,对于任意类都能知道他的属性和方法;对于任意对象,都能调用他的属性方法。
创建对象的两种方式,new和反射
二.多线程
1.开启多线程
继承Thread类,实现Runable接口,实现Callable接口,使用线程池
建议实现Runable接口,接口可以多继承,Runable和Callable的区别,Runable是void,Callable有一个泛型返回值
2.线程生命周期
创建,就绪,运行,阻塞,死亡
3.线程死锁
两个或两个以上的线程进行资源争夺相互等待的现象;避免:指定取锁顺序(使用join)
4.并发和并行
并发:时分多址,快速交替进行
并行:同时进行
5.sleep()和wait()
sleep()属于Thread类,不释放锁
wait()属于Object类,释放锁,需要和notify()在同一个对象上成对使用
6.notify()和notifyAll()
notify()随机唤醒一个线程去竞争取锁机会
notifyAll()唤醒所有线程去竞争取锁机会
7.synchronized 和Lock
synchronized java内置关键字,可以用在类,方法或者代码块上
Lock类 大多数情况下推荐使用synchronized
8.多线程之间通信
wait/notify
9.ThreadLocal
提供线程内部的局部变量,变量只在线程的生命周期起作用
10.守护线程
java中的线程分为两种类型,守护线程和非守护线程,垃圾回收线程就是一个典型的守护线程。
11.线程同步有哪几种方法
synchronized关键字,Lock类,分布锁
12.分布锁
悲观锁 select...for update
乐观锁 CAS
redis及zookeeper也可实现分布锁
13.start()和run()
start()方法才能开启多线程,run()方法只是调用了线程中的mian方法并没有开启新的线程。
14.yield()
调用后线程会回到就绪状态,只给同级或高优先级线程运行机会。
15.终止一个线程
(1).stop()不推荐 (2).等待线程运行结束
16.volatile
修饰变量 保证每次调用变量时都从主内存读取,保证多线程间的可见性。
17.线程池的好处
方便管理线程,减少资源消耗,提高响应速度
18.线程池常用参数
核心线程数,工作队列,最大线程数,拒绝策略,空闲线程存活时间
19.BIO,NIO,AIO
BIO同步阻塞线程;
NIO同步非阻塞IO;
AIO异步非阻塞IO,又叫NIO2;
三.JVM
1.JVM是什么
java虚拟机
2.JVM的结构
堆:存放对象实例,垃圾回收的主要场所,线程共享;
方法区:存放已经被虚拟机加载的类信息,常量和静态变量,还有编译后的代码,线程共享;
虚拟机栈:每个线程创建时都会创建一个虚拟机栈,线程中每个方法又对应一个栈帧,线程私有;
本地方法栈:给虚拟机提供native方法,线程私有;
程序计数器:java的指针,线程私有。
3.垃圾回收是什么
将没有被引用的对象加入可回收集合集中回收,释放内存。
4.垃圾回收算法
可达性分析算法,以“GC ROOT”对象向下搜索,所走过的路径被称为引用链,当引用链没有其他连接是,则被称为可回收对象。
5.垃圾回收的影响
频繁的垃圾回收会影响性能,垃圾回收时会“Stop the world”,造成卡顿。
6.垃圾回收的时机
自动垃圾回收,所有线程空闲时会进行垃圾回收,内存不足时也会触发垃圾回收;
主动垃圾回收System.gc();
7.内存泄漏和内存溢出
内存溢出(内存不够了)会导致内存泄漏。
8.栈溢出
栈的大小超出了栈的深度。
案例:无限递归方法造成栈溢出。
9.堆内存和栈内存
堆内存:存放对象,所有线程共享;
栈内存:占内存归属于单个线程,可以理解为线程私有内存,栈内存远远小于堆内存。
四.mysql
1.索引
索引结构B+树,索引会增加查询效率,但会影响插入和删除的效率,加索引的字段不要太长,影响效率.
2.索引失效条件
查询条件包含or
对索引运算
mysql估计全表扫描比索引快时
3.索引不适合的场景
数据量小
更新频繁
4.sql关键字调用顺序
from
join
on
where
group by
having
select
distinct
order by
limint
5.sql优化
加索引,适当分批,分库分表,读写分离
6.分库分表
水平分表,水平分库
垂直分表,垂直分库
7.事务的特点
原子性,隔离性,唯一性,持久性
8.悲观锁,乐观锁
悲观锁:select ... for update
乐观锁:CAS
9.使用数据库连接池的好处
资源复用,系统响应速度更快,统一管理连接。
10.大数据量删除怎么样更快
先删除索引,然后删除数据,最后恢复索引。
四.spring
1.spring核心思想
IOC控制反转 由spring IOC负责创建对象
AOP 面向切面编程
2.springboot优点
独立运行,简化配置,自动配置,无需部署war文件。
3.springboot自动配置原理是什么
@EnableAutoConfig,@Configuration,@ConditionalOnClass组成了spring自动配置的核心。
通过maven读取每个starter中的spring.factories文件,该文件配置了所有需要被创建再spring容器中的bean。
4.@Component和@Bean
作用对象不同:@Component作用于类,@Bean作用于方法
@Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中。
@Bean注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。
五.redis
1.redis是什么
运行在内存中的非关系型数据库,绝大部分请求是纯粹的内存操作(非常快速),采用单线程,避免了不必要的上下文切换和竞争条件,非阻塞IO,多路复用。
2.redis基本数据类型
String,list,hash,set,zset
3.缓存穿透,缓存击穿,缓存雪崩
缓存穿透:
指查询一个不存在的数据,如果查不到则不写入缓存,这将导致这个不存在的数据每次都要到数据库去查询,可能导致数据库挂掉。
解决方法:返回数据为空仍进行缓存,但过期时间较短
缓存击穿:
对于设置了过期时间的key,缓存某个时间点过期后,恰好这个key有大量请求过来,这些请求发现缓存过期都或从数据库加载数据并设回缓存,大并发量请求可能回压垮数据库。
解决方法:使用互斥锁,缓存失效时,不立即查询数据库,使用redis设置互斥锁,重新设回缓存。
缓存雪崩:
设置缓存时使用了相同的过期时间,导致某一时刻缓存全部失效,大批量请求压垮数据库,导致瞬时压力过重雪崩。
解决方法:将缓存失效时间离散开,防止集体失效。
六.netty
1.什么是netty
基于NIO的高性能网络编程框架,封装了NIO,可以承载较高的并发量。
2.netty组件
Channel:netty网络操作的抽象类,含有基本IO操作。
EventLoop:配合Channel进行IO处理。
ChannelPipeline:为Channel提供容器。
ChannelFuture:为异步方法提供返回。
ChannelHandler:出战入站数据的逻辑处理器。
3.netty默认线程数
CPU核心数量*2
七.其他
1.session和cookie和区别
session:存于服务器,安全性更高,可以存储java对象。
cookie:存于浏览器,对服务器性能压力小,只能存储String。
2.TCP和UDP
属于七层协议的传输层
TCP:需要三次握手建立连接,需要一对一进行连接,对系统资源要求较多。
UDP:不需要连接,支持多对多交互通信,对系统资源要求较少。
3.java-socket
java对TCP协议的具体实现。
4.OSI七层协议
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
5.TCP/IP五层协议
应用层,传输层,网络层,数据链路层,物理层
6.HTTP是什么
超文本传输协议,属于七层中的应用层。
7.servlet生命周期
加载类-->实例化-->初始化-->请求处理-->销毁