-
JAVA基础
- java中有几种基本类型?
Java的基本类型有8种:四种基本类型(byte,short, int, long)。两种浮点类型(float,double)。一种字符类型(char),一种布尔类型(boolean)
- String能被继承吗?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的。
- String,StringBuffer, StringBuilder的区别
两种维度来说:第一个维度:可变与不可变。String字符串因为被final修饰,所以他是不可变对象。StringBuffer,StringBuilder都继承AbstractStringBuilder,这两种对象都是可变的。第二个维度:是否线程安全。String的对象是不可变的,可以理解为常量,显然是线程安全的。StringBuffer字符串常量也是线程安全的,他也是final类别的,synchronized修饰。
StringBuilder 线程不安全,并没有对方法进行加同步锁。
- ArrayList和LinkedList的区别
首先,ArrayList和LinkedList都实现了list接口,它们有以下不同点: ArrayList是基于索引的数据接口,它的底层是数组,而LinkedList是以元素列表的形式存储数据的,linkedList的插入、添加、删除操作速度更快。LinkedList比ArrayList更占内存。
- HashMap和HashTable区别
hashMap不是线程安全的,它允许null key和null value ,而HashTable不允许,所以它是线程安全的,从执行效率上来看,因为hashMap允许null key,null value,要高于HashTable。
- BIO和NIO的区别
BIO(IO)是面向流的,NIO是面向缓冲区的。
BIO: 同步阻塞式IO,就是我们平时使用的传统IO, 它的特点是模式简单,使用方便,并发处理能力低。
NIO: 同步非阻塞Io, 是传统IO的升级,客户端和服务器端通过channel(通道)通讯,实现了多路复用。
- java中的IO流分为几种?
按功能来分:分为输入流(input)输出流(outPut)
按类型来分:字节流和字符流
字节流和字符流的区别:字节流按8位传输字节为单元输入输出数据,字符流按16位传输以字符为单位输入输出数据。
-
多线程应用
-
-
JVM知识
- 什么情况下会发生栈内存溢出
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。如果虚拟机在动态扩展栈时,无法申请到足够的内存空间。则抛出OutOfMemoryError异常。
- JVM原理
Jvm是java的核心和基础,在java编译器和OS平台之间的虚拟处理器,他可以在上面执行java的字节码程序,java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源码文件经编译后成字节码程序,通过JVM将每一条指令翻译成不同平台的机器码,通过特定平台运行。
- JVM体系结构
类加载器:加载class文件;执行引擎:执行字节码或者本地方法。运行时数据区:包括方法区,堆,java栈,pc寄存器,本地方法栈。
- 垃圾收集算法
标记清除算法,复制算法,标记整理算法。
- JVM调优
调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现。
-Xms: 初始堆大小
-Xmx: 最大堆大小
-XX:NewSize=n:设置年轻代大小
-
数据库调优
- Mysql定位慢sql
Show variables like ‘%query%’
在要执行的sql前加上explain
-
微服务架构
-
Spring Cloud全家桶组件
-
Spring cloud Netflix Eureka(服务注册与发现)
- 常见的注册中心解决方案有:Eureka,Consul,Zookeeper,Nacos,redis
- 推送方式:push/pull
- 非持久化存储、AP(模型)、集群节点的角色是相等的。
- 2.X停止开源 -Netflix oss
- 替换方案:spring cloud zookeeper spring cloud consul
- Eureka 数据同步,主从/高低水位,AP特性
- 三级缓存、自动保护机制、续约、服务注册
- 自我保护机制:心跳失败的比例在15分钟之内,低于85%的节点,Eureka server会认为这个实例出现了网络故障,直接剔除这个有问题的服务。
-
Spring cloud Netflix Ribbon (客户端负载均衡)
- 解析配置中的服务列表
- 基于负载均衡的方法来实现请求的分发(默认是用轮询的算法)
- 涉及到算法有轮询、随机、根据响应时间来计算、权重的轮询
-
Spring Cloud Netflix OpenFeign(声明式伪RPC)
- 通过接口注入@FeignClient(“目标接口”)
- Openfeign默认通过HttpClient方式请求目标服务地址,也可以通过配置更改为其他的方式请求。
- Controller层则调用注入了@FeignClient的接口,生成动态代理,从而实现调用目标服务地址。
- Http通信:ip/port/url; method type: post/get parameter: 参数
- 参数的解析和装载
- 针对指定的feignclient中的方法描述进行解析
- 组装成一个Request对象,发起请求。
-
Spring cloud Netflix Hystrix: 断路器
-
Spring cloud Netflix Zuul: 服务网关
-
Spring cloud Config(分布式配置中心)
- 配置文件application.properites: 数据库连接、常量、线程池大小等等。
- Apoll(携程),spring cloud,nacos(alibaba)都可以做分布式配置中心
- 配置的后缀写法:/{application}/{profile}/{lable} 或{application}-{profile}
- application-应用名称,profile-不同的配置分组,label-分支
- 外部更改配置文件后,可调用monitor接口实现动态刷新数据,从而达到配置客户端获取到的都是最新数据
- Environment远程加载配置实现
-
Redis
- 缓存雪崩
设置失效时间时,再加上一个随机的时间数,避免在同一个时间点去查询数据库
- 缓存穿透
布隆过滤器可解决
-
Mybatis
-
mybatis的框架结构
- mybatis和数据库的交互有两种方式:
- 1、通过传统的传递statement id和查询参数给sqlsession对象。使用sqlsession对象完成和数据库的交互。
- mybatis提供了非常方便和简单的API,供用户实现对增删改查数据操作。
- 2、面向接口调用方式:mybatis将配置中的每一个<mapper>节点抽象为一个Mapper接口,而接口声明的方法跟<mapper>节点中的<select/update/delete/insert>
- 节点中的id值为Mapper接口中的方法,parameterType值表示Mapper对应方法的入参类型,resultMap值对应Mapper接口表示的返回值类型。
-
mybatis的实现原理
- 利用反射打通java类与sql语句之间的相互切换
- Configuration Mybatis:所有的配置信息都保存在Configuration对象中。
- SqlSession:作为Mybatis工作的主要顶层API,表示和数据库交互时的会话,完成必要的数据库增删改查功能。
- Executor Mybatis:执行器,是Mybatis调度的核心,负责SQL语句的生成和查询缓存的维护。
- StatementHandler:封装了JDBC statement操作,负责对JDBC statemnet操作,如设置参数等。
- ParameterHandler:负责对用户传递的参数转换成JDBC statement所对应的数据类型。
- ResultSetHandler:负责将JDBC返回的ResultSet结果集对象转换成List类型的集合。
- TypeHandler:负责java数据类型和jdbc数据类型之间的映射和转换。
-
Kafka
-
-
高并发
-
什么是高并发
高并发是互联网分布式架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用一些指标有:响应时间,吞吐量,每秒查询率QPS,并发用户数
- 如何提升系统的并发能力?
垂直扩展:如果预算不是问题的话,通过“增强单机硬件性能”的方式来提升系统的并发能力。
水平扩展:
-
分布式
-