Java面试题
文章目录
- 简答
- 1. 简述oracle中dml、ddl的使用
- 2. oracle中union和union all的区别
- 3. oracle经常使用的函数
- 4. 什么是存储过程?和函数有什么区别?
- 5. 如何写出高性能的SQL语句?
- 6. 请简述session的特点有哪些
- 7. HashMap和 Hashtable的区别
- 8. java中的string 、stringbuffer和stringbuilder有什么区别
- 9. 说说跨平台性
- 10. java是如何实现跨平台性的
- 11. 简述&、&& |、||区别
- 12. int age = 1;sout(age=10)
- 13. int age;sout(age)
- 14. Java编译的过程
- 15. 一个.java源文件中是否可以包括多个类?有什么限制?
- 16. 如何不借助第三个变量,交换两个数据
- 17. 在Java中,char型变量中能不能存储一个汉字?
- 18. switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
- 19. 什么时候用for循环,什么时候用while循环?
- 20. 方法的传参过程中如何工作的?
- 21. 方法的重载
- 22. 基本数据类型和引用数据类型之间的区别
- 23. 在java中,声明一个数组过程中,是如何分配内存的
- 24. 数组的定义方式
- 25. 数组与数组变量的区别
- 26. 如何实现一个Servlet?在Servlet的过程中实现了面向对象的什么特征?
- 27.
- 28. 接口和抽象类的区别
- 29. equals和= =区别
- 30 . 创建对象的方式
- 31. final、finally、 finalize 有什么不同
- 32. cookie和session区别与联系
- 33. java里的异常
- 34. Integer包装类型,int基本类型
- 35. Java里的语句:
- 36. Collection和Collections区别
- 37. String、StringBuffer、StringBuilder的区别
- 38. 类修饰符 public、final、abstract
- 39. 方法的修饰符
- 40. java不支持实现多重继承 ,接口可以多重继承,成员内部类实现多继承
- 41. 对象实例化过程
- 42. 方法重写与方法重载的区别
- 43. 父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序?
- 44. GET和POST的区别?
- 45. 多线程环境下如何选择容器?
- 46. 哪些常用容器类?使用数据结构什么?
- 47. 多线程环境下如何选择容器?
- 48. List、Map、Set的区别
- 49. HashMap和HashTable区别
- 50. cookie、session、token的区别和联系
- 51. 如何防止重复提交
- 52. 浏览器发请求的方式
- 53. java中的泛型是什么?使用泛型有什么好处?
- 54. IO流常用的设计模式?
- 55. 列举几种常用的数据库连接池
- 56. java中有几种线程池?是什么?
- 57. 常见的四种线程池?
- 58. java线程实现/创建方式分别是什么?启动线程方式有几种是什么?
- 59. #{}和`${}`的区别?
- 60. 形式良好和符合规范的xml
- 61. mybatis如何获取mysql生成的主键?
- 62. mybatis常用的传递参数的方式
- 63. 使用mybatis的mapper接口调用时有哪些要求
- 64. jdbc编程有哪些不足之处,mybatis是如何解决这些问题的
- 65. 访问关系型数据库四套方案
- 66. 数据库存储表的方式有几种?
- 67. 创建Bean对象有哪几种方式?
- 68. 使用spring步骤有哪些
- 69. IOC、DI是什么?基本原理是什么
- 70. AOP原理
- 71. Spring是什么?
- 72. 配置servlet有几种方式
- 73. spring是什么
- 74. mybatis是什么
- 75. SpringMVC是什么
- 76. 常见的设计模式有哪些?
- 77. 常见的数据结构有哪些?
- 78. i++和++i的区别?
- 79. int和Integer的区别?
- 80. 线程的生命周期
- 81. String s = new String("abc")创建了几个对象
- 82. 开启spring事务有几种方式,作用是什么
- 83. java垃圾回收机制,按照什么规则回收
- 84. java中final的作用
- 85. Springboot有哪些优点
- 86. Springboot和Spring的联系
- 87. Spring Boot是什么
- 88. Spring Boot有哪些常用的组件?
- 89. 数据库唯一且自增的实现方式有哪些?
- 90. restful规范的理解
- 91. Spring Boot使用组件的流程是什么?
- 92. Spring Boot的常用注解有哪些?
- 93. spring中的常用注解有哪些?
- 94. springMVC中的常用注解
- 95. 描述springMVC和spring的关系
- 96. 覆盖springboot默认配置的方式?
- 97. 加载配置文件中的值(主配置文件、非主配置文件)
- 98. Springboot配置文件几种类型,区别是什么?
- 99. 什么是热重启?springboot怎么实现热重启?
- 100. Springboot如何实现自动配置?
- 101. 为什么要使用缓存?
- 102. 缓存的实现方案
- 103. 常见的缓存问题及解决方案?
- 104. 哪种类型的数据适合使用缓存?
- 105. Redis是什么
- 106. Redis的优缺点
- 107. NoSql数据库有哪些?
- 108. NoSql是什么?
- 109. Redis支持哪些数据结构,使用场景有哪些?
- 110. Redis为什么要持久化?
- 111. 一个字符串类型的值能存储最大容量是多少?
- 112. Redis key 的过期时间和永久有效分别怎么设置?
- 113. 一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
- 114. 如果这个Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
- 115.使用过 Redis 分布式锁么,它是什么回事?
- 116.如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
- 117.使用过 Redis 做异步队列么,你是怎么用的?
- 118.如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
- 119.数据库六大约束有哪些?
- 120. JavaBean:Java对象化的产物。这个类只有私有化的属性,公开的setter、getter方法
- 121. Java序列化机制两种
- 122. hadoop的序列化机制有两种
- 123. 通知有几种类型
- 124. HttpRequest和HttpResponse的获取方式(2种)
- 125. SpringBoot和SpringCloud的版本
- 126. 微服务是什么
- 127. Spring Cloud Netflix
- 128. Springboot和SpringCLoud的关系
- 129. 分布式服务的两种调用方式RPC和Rest
- 130. 微服务和微服务架构区别
- 131. 微服务的版本以及配套的问题
- 132. Ribbon负载均衡算法7种(不需要全部记住,只需要记住3-4种就行)
- 133. Niginx负载均衡算法
- 134. Ribbon和Feign区别
- 135. Hystrix的作用
- 136. SpringCloud的优点
- 136. Zuul一共有三个作用
- 137. 一般微服务框架中有哪些子模块
- 138. Elasticsearch常用的是那些?
- 139. [Elasticsearch常用的是那些?](https://www.cnblogs.com/crazymakercircle/p/16383826.html)
- 140. 单表查询
- 141. 多表查询
- 142. 联合查询 union | union all
- 143. 事务的四大特性ACID
- 144. 一些数据库的知识点
- 145. MySQL高级
- 选择
简答
1. 简述oracle中dml、ddl的使用
dml用于检索或者修改数据
ddl用于创建修改删除对象
2. oracle中union和union all的区别
union不包括重复记录
union all包括重复记录
3. oracle经常使用的函数
count、insert、length、lower、substr
4. 什么是存储过程?和函数有什么区别?
存储过程是预先编译好的sql语句,可以重复使用,减少网络通信,提高性能。
函数是一段代码,可以直接调用,执行特定功能。
区别:
- 调用方式:存储过程是直接调用,函数是间接调用。
- 定义位置:存储过程定义在数据库中,函数定义在程序中。
- 调用时机:存储过程在执行时调用,函数在执行前调用。
- 参数:存储过程可以有输入输出参数,函数只能有输入参数。
- 作用域:存储过程作用于整个数据库,函数作用于局部作用域。
- 命名:存储过程以“create procedure”语句创建,函数以“create function”语句创建。
- 性能:存储过程的执行速度比函数快,因为它是预先编译好的。
5. 如何写出高性能的SQL语句?
1.选择合适的索引
2.尽量避免使用SELECT *
3.使用连接而不是子查询
6. 请简述session的特点有哪些
session用于存储一次会话的多次请求的数据,存在服务器端
session可以存储任意类型,任意大小的数据
7. HashMap和 Hashtable的区别
一、线程安全
Hashtable 是线程安全的,HashMap 不是线程安全的。
二:性能优劣
既然 Hashtable 是线程安全的,每个方法都要阻塞其他线程,所以 Hashtable 性能较差,HashMap 性能较好,使用更广。
三:NULL
Hashtable 是不允许key为 null 的(key.hashcode()没有做判断),HashMap 的key可以为 null(里面做来判断,返回的是0)。
四:
hashtable的JDK1.0提供的API,1.2重写了些集合框架,提供了HashMap,HashMap的设计更加合理
8. java中的string 、stringbuffer和stringbuilder有什么区别
一、首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String
二、在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的
三、
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
9. 说说跨平台性
跨平台性就是希望编写好的代码,最好可以在任意的平台和环境下运行,而不需要根据不同的平台写不同的代码。比如,编写的一个博客管理系统,希望在window中运行,也可以在Linux下运行,也可以在macos环境下运行。这就是跨平台性,节省开发和运维成本。
10. java是如何实现跨平台性的
java实现跨平台性关键在于jvm虚拟机,java语言
由源文件(.java)—>字节码文件(.class)(二进制文件)-----> 解释---->Unix,Win,Linux等机器。
11. 简述&、&& |、||区别
- &是位运算符,在二进制的粒度上计算,&&逻辑与运算符,操作数整体参与运算的
- &的操作数必须是基本类型中除了浮点型后的类型,&&必须是布尔类型
- |是位运算符、||是逻辑非
12. int age = 1;sout(age=10)
赋值表达式也是有结果的,运算结果为赋值后的值
13. int age;sout(age)
编译错误,age变量未初始化
14. Java编译的过程
编写源代码,以.java结尾->预处理->编译.class->类加载->执行->垃圾回收
15. 一个.java源文件中是否可以包括多个类?有什么限制?
一个.java源文件中可以有多个类,但最多只能有一个public类
16. 如何不借助第三个变量,交换两个数据
四则运算
int a=13;
int b=23;
a=b-a;//10
b=b-a;//13
a=a+b;//23
位运算符
int x=10; // 1010
int y=5;// y= 0101
x=x^y; // x= 1111 =15
y=y^x;// y= 1010 =10
x=x^y;// x= 0101 =5
17. 在Java中,char型变量中能不能存储一个汉字?
能,因为Java中使用的是Unicode编码集,采用两个字节来表示一个字符,每一个字符使用Unicode编码表示。UTF-16
18. switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
switch可作用于char byte short int
switch可作用于char byte short int对应的包装类
switch不可作用于long double float boolean,包括他们的包装类
switch中可以是字符串类型,String(jdk1.7之后才可以作用在string上)
switch中可以是枚举类型
可以放在任何位置,但是要注意case穿透
19. 什么时候用for循环,什么时候用while循环?
知道循环几次:使用for循环。不知道循环几次,只知道结束条件就使用while循环
20. 方法的传参过程中如何工作的?
在调用方法的使用中,在方法参数写入实参,jvm运行时,把实参赋值给形参
21. 方法的重载
同一个类中,方法名相同,方法参数列表不同
22. 基本数据类型和引用数据类型之间的区别
- 基本数据类型直接存储数据值,默认值是0,
- 基本数据类型 四类八种:整数型(byte1、short2、int4、long8)、浮点型(double8、float4)、字符型(char2)、布尔型(boolean)
- char使用的字符编码为UTF-16
- 引用数据类型存储对象的引用(地址),默认值是null
- 赋值:基本数据类型赋值直接将值复制到变量中;引用数据类型赋值是复制引用(地址),两个引用对象可能指向堆内存中的同一个对象
23. 在java中,声明一个数组过程中,是如何分配内存的
在Java中,数组变量是引用类型的变量,同时因为Java是典型的静态语言,因此它的数组也是静态的,所以想要使用就必须先初始化(为数组对象的元素分配空间)。
对于Java数组的初始化,有以下两种方式:
1.静态初始化:初始化时由程序员显式指定每个数组元素的初始值,由系统决定数组长度 ,如:int[] a = {2,4,65}; 。
2.动态初始化:初始化时由程序员显示的指定数组的长度,由系统为数据每个元素分配初始值 ,如: int[] a1 = new int[2];//动态初始化数组,先分配空间。
24. 数组的定义方式
1.数组类型[] 数组名=new 数组类型[数组长度];
2.数组类型[] 数组名={数组0,数组1,数组2,数组3,....}; //只能用在初始化数组变量的时候
3.数组类型[] 数组名=new 数组类型[]{数组0,数组1,数组2,...};
//第一种 例:
String[] test1 = new String[6];
test1[0] = "数组0";
test1[1] = "数组1";
//第二种 例:
String[] test2 = {"数组0","数组1","数组2","...."};
//第三种 例:
String[] test3 = new String[]{"数组0","数组1","数组2","...."};
25. 数组与数组变量的区别
所有的引用类型:类、接口、枚举、数组 在32机器上4字节,64机器上8字节
int[] arr;
//数组变量:是一种引用型变量,存放的是地址。
//没有方法,只有一个属性arr.length
//数组:同类型,连续空间,定长的
//对象头:16字节 length:4 成员变量1024*4 一个对象最少占16字节
arr = new int[1024];
arr = new int[1] 16+4+41=24 8的倍数
arr = new int[2] 16+4+42=28 不是8的倍数 分配更多的空间,浪费空间
new的所有东西都在堆里边
26. 如何实现一个Servlet?在Servlet的过程中实现了面向对象的什么特征?
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
继承、封装、多态
27.
- 多态,运行时绑定
继承,或者实现
方法重写
引用类型向上转型 - 两种复用类的方式:组合、继承
28. 接口和抽象类的区别
- 抽象类:不完整的类,不能被实例化,抽象类中可以放成员变量、静态成员变量还有抽象方法
- 接口:用来定义规则,同样不能被实例化;接口中可以被public的静态常量、抽象方法、默认方法、静态方法、嵌套类
- 抽象类一般用于定义多个子类可以共用的内容,如方法、成员变量等;接口一般用于定义规则,如:模块之间的对接
29. equals和= =区别
= =运算符,equals是Object中定义的方法
= =:比较变量是否相同,基本类型比值,引用类型比地址
equals:判断两个对象内容是否相同,Object中实现使用的还是= =
equals相同,hashcode就得相同。快速定位已有的元素和新有的元素是否相同
30 . 创建对象的方式
- new、Student s = new Student();
- 克隆、Employee emp4 = (Employee)emp3.clone();
- 反射、Employee emp2 = Employee.class.newInstance();
- 序列化、反序列化
- ObjectInputStream in = new ObjectInputStream(new FileInputStream(“data.obj”));
- Employee emp5 = (Employee)in.readObject();
31. final、finally、 finalize 有什么不同
- final 是一个修饰符,可以用来修饰类、成员变量、方法、参数、本地变量
- finally 用来形成一个特殊的语句块,与try配合使用,确保try中的代码是否有异常都会执行finally包裹的语句块
- finalize 是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。finalize 机制现在已经不推荐使用,并且在 JDK 9 开始被标记为 deprecated。
32. cookie和session区别与联系
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
(4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
(5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
33. java里的异常

34. Integer包装类型,int基本类型
(1) 装箱:基本类型数据包装成引用类型数据
int a = 5;
Integer i = new Integer(a);
(2) 拆箱:包装类型数据转换成基本类型数据
Integer i = new Integer(5);
int a = i.intValue();
(3) 自动装箱 int a = 5;Integer i = a;
(4) 自动拆箱 Integer i = new Integer(5);int a = i;
35. Java里的语句:
表达式语句(赋值、自增、函数调用)、声明语句(变量、函数)、流程控制语句(if,switch.for.while.dowhile,return,break,continue)
36. Collection和Collections区别
Collection是set、list实现的接口
Collections是一个操作集合的工具类
37. String、StringBuffer、StringBuilder的区别
String 类不可变,对象不可变
StringBuffer 对象可变,线程安全
StringBulider 线程不安全
38. 类修饰符 public、final、abstract
39. 方法的修饰符
访问控制修饰符:公共访问控制符public、保护访问控制符protected、缺省默认default、私有访问控制符private
非访问控制符:抽象方法控制符abstract 、静态方法控制符static 、最终方法控制符final 、本地方法控制符native 、同步方法控制符synchronized
40. java不支持实现多重继承 ,接口可以多重继承,成员内部类实现多继承
41. 对象实例化过程
- 在堆内存中分配内存空间
- 初始化对象,调用构造方法
- 将对象地址赋值给引用变量
- 对象引用变量调用方法
42. 方法重写与方法重载的区别
(1) 方法重载:是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。同名不同参,和其他无关
(2) 方法重写:父类和子类之间,方法名相同,参数列表相同,返回值的范围小于等于父类、异常范围小于等于父类、访问控制修饰符的范围大于等于父类,如果访问控制修饰符为private则不能重写该父类的方法
(3) 重载的方法能否根据返回类型进行区分,不能
43. 父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序?
静态代码块、代码块、构造方法、普通方法,先父后子
44. GET和POST的区别?
- GET 适合用于检索信息,并且请求不应该对服务器状态造成影响。由于数据在URL中可见,不适合传输敏感信息。
- POST 适合用于提交数据,可以改变服务器状态,数据在请求体中,适合传输敏感信息。
45. 多线程环境下如何选择容器?
- 使用线程安全的容器
- ConcurrentHashMap
- ConcurrentSkipListMap
- CopyOnWriteArrayList
- 使用工具方法包装原有的容器
- Collections.synchronizedList(list)
- Collections.synchronizedSet(set)
46. 哪些常用容器类?使用数据结构什么?
- list
- Arraylist 数组
- linkedlist 双向链表
- set
- HashSet 哈希表
- TreeSet 红黑树
- LinkedHashSet 哈希表+双向链表
- Map
- HashMap 哈希表
- TreeMapt 红黑树
- LinkedHashMap 哈希表+双向链表
- Queue
- BlockingQueue 先进先出、
- Deque
47. 多线程环境下如何选择容器?
-
使用工具方法包装原有的容器
-
list list1 = new ArrayList<>();
final List list = Collections.synchronizedList(list1);
-
-
使用线程安全的容器
- CopyOnWriterArrayList
- ConcurrentHashMap
- ConCurrentSkipListMap
- Vector HashTable废弃了,不建议用
48. List、Map、Set的区别
- List保持插入顺序、值允许重复、可以有多个null、可以按位置获取元素
- Map无序的、key/value不能包含重复的键key,值可以重复、Map集合保存键值对
- Set不一定保持插入顺序、元素不能重复、不可以按位置获取元素
49. HashMap和HashTable区别
- HashMap:非线程安全、可以存储null
- HashTable:线程安全、不允许null值
50. cookie、session、token的区别和联系
cookie:存储在客户端,可以存储少量数据,不安全,客户端可以访问,安全性低,内容4kb
session:会话管理,存储在服务器端,可以存储任意类型的数据,可以设置过期时间,客户端可以访问,安全性高,最后一个请求的半小时之后会失效,可以设置失效时间,在客户端的cookie中
**token:**用于身份验证,可以存储在客户端,也可以存储在服务器端,客户端可以访问,安全性高
联系:cookie和session没有关系
51. 如何防止重复提交
- 前端处理,通过一个标识控制表单提交后,再次提交会直接返回处理
- 通过点击一次按钮之后,将该按钮设置为不可用处理
- 后端处理 给数据库增加唯一约束
- 使用AOP自定义切入实现
- session技术的实现
52. 浏览器发请求的方式
- 地址栏输入地址 +get
- 点击超链接 +get
- html src href属性的元素都可以发请求
- img src属性的元素
- script src属性的元素
- iframe src属性的元素
- form表单提交 form里面button的type属性默认是submit,点击button发请求 +post|get
- XMLHttpRequest,想怎么发怎么发
53. java中的泛型是什么?使用泛型有什么好处?
- 参数类型化,把数据类型作为参数来传递,让代码跨多个类型运行
- 类型安全,编译器可以检查类型是否正确,避免运行时错误
54. IO流常用的设计模式?
- 适配器模式
- 装饰者模式
- 原型模式
55. 列举几种常用的数据库连接池
- c3p0
- dbcp
- druid
- hikariCP
56. java中有几种线程池?是什么?
- new ThreadPoolExecutor();Executors中创建的线城池,不过使用不同参数实例化的ThreadPoolExecutor
- ForkJoinPool;
- new ScheduledThreadPoolExecutor(); 计划任务线程池
57. 常见的四种线程池?
- newFixedThreadPool(int nThreads) 创建一个固定大小的线程池,线程池中的线程数量始终保持不变,当线程数达到最大值时,新提交的任务会被暂时阻塞。
- newCachedThreadPool() 创建一个可缓存的线程池,线程池中的线程数量不限,可以根据需要创建线程,线程空闲时会被回收。
- newSingleThreadExecutor() 创建一个单线程的线程池,线程池中只包含一个线程,任务按顺序执行。
- newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性任务执行的线程池,线程池中的线程数量不限,可以定时或周期性地执行任务。
58. java线程实现/创建方式分别是什么?启动线程方式有几种是什么?
- 创建线程一种,new Thread().start();
- 定义线程任务的方式:继承Thread类,重写run()方法;实现Runnable接口,实现run()方法;Callable接口
- 多线程同步:解决的问题:多个线程之间共享数据 加锁、线程变成多份(ThreadLocal)
- 多线程协作:解决问题,多个线程之间配合的机制
59. #{}和${}的区别?
#{}是表达式, 是变量, {}是变量, 是变量,{}可以直接输出变量的值,而#{}需要通过toString()方法转换成字符串。
#{}可以直接输出表达式的值,而KaTeX parse error: Expected 'EOF', got '#' at position 32: …mat()方法转换成字符串。 #̲{}可以直接输出对象属性的值,…{}需要通过Map.get()方法获取。
#{}可以直接输出数组元素的值,而KaTeX parse error: Expected 'EOF', got '#' at position 15: {}需要通过数组下标获取。 #̲{}可以直接输出方法调用的返回…{}需要通过反射获取。
#{}可以直接输出System.currentTimeMillis()的值,而KaTeX parse error: Expected 'EOF', got '#' at position 39: …eMillis()方法获取。 #̲{}可以直接输出环境变量的值,…{}需要通过System.getenv()方法获取。
#{}可以直接输出表达式的值,而${}需要通过Properties.getProperty()方法获取。
`
60. 形式良好和符合规范的xml
- 形式良好的xml是指:拥有正确的语法。
- 合法的xml是指:不仅有正确的语法,而且符合xml的命名规则、结构规则、数据类型规则等。
61. mybatis如何获取mysql生成的主键?
- 使用selectKey元素:可以在插入语句执行后、通过selectKey元素来获取自动生成的主键值(useGeneratedKeys="true"表示自动开启生成主键值的功能)
- 使用selectKey元素的order属性:通过order属性来指定获取主键值的顺序
- 使用selectKey元素的statementType属性:可以通过statementType属性来指定获取主键值的方式
- 在标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。
62. mybatis常用的传递参数的方式
- 编译器加入-parameter参数,保留方法的参数名
- 使用注解(@Param)
- 使用Map传递参数
- 对象传递参数
63. 使用mybatis的mapper接口调用时有哪些要求
- Mapper接口方法名和mapper.xml定义sql的id相同
- Mapper.xml中的namespace是mapper接口类路径
- Mapper接口方法的输入参数类型和mapper.xml中parameterType的类型一致
- Mapper接口方法的输出参数类型和mapper.xml中的resultType类型一致
64. jdbc编程有哪些不足之处,mybatis是如何解决这些问题的
- Sql语句写在代码中造成代码不易维护、实际应用sql变化可能较大,sql变动需要更改代码 解决方案:将sql语句配置在mapper.xml文件中与java代码分离
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能 解决方案:在mybatis -config.xml中配置数据连接池,使用连接池管理数据库连接
- 向sql语句传参数麻烦,sql语句的where条件不一定,可能多也可能少,占位符要和参数一一对应 解决方案:Mybatis自动将java对象映射至sql语句
- 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封成pojo对象解析比较方便 解析方案:Mybatis自动将sql执行结果映射为java对象
65. 访问关系型数据库四套方案
- 直接写sql语句
- jdbc工具包
- 框架(mybatis、hibernate)
- jpa
66. 数据库存储表的方式有几种?
- 链式存储:链式存储是将数据按顺序存储在一个表中,每个数据项占用固定大小的存储空间,通过指针来访问。mysql
- 堆存储:堆存储是将数据按顺序存储在一个大的内存块中,每个数据项占用固定大小的存储空间,通过指针来访问。oracle
67. 创建Bean对象有哪几种方式?
- 构造函数
- 静态工厂方法
- 实例工厂方法
- 类似实例工厂方法实例化,工厂需要实现FactoryBean接口
68. 使用spring步骤有哪些
- 导入依赖
- 配置xml文件
- 使用api
69. IOC、DI是什么?基本原理是什么
- IOC控制反转、DI依赖注入
- 是一种东西
70. AOP原理
- AOP面向切面编程,AOP是动态代理。
- 只要目标对象实现了一个接口,就使用JDK动态代理
- 如果目标对象未实现接口,使用CGLIB代理
71. Spring是什么?
Spring是一个轻量级的开源框架,为解决企业级应用开发复杂性问题创建的
72. 配置servlet有几种方式
- web.xml:修改配置不需要修改源码,配置繁琐,配置与源码是分离的
- @WebServlet注解:配置servlet,需要修改源码,配置简单;源码与配置在同一个位置,便与代码阅读和维护
- ServletContainerInitializer:配置繁琐、源码与配置是分离的;动态注册Servlet,灵活性比较高
73. spring是什么
spring是轻量级的企业级开发框架,实现业务逻辑层Service与其他层的解耦
- IOC|DI:通过依赖注入实现对象之间的解耦,组件之间不需要直接new对象,将对象的生命周期交由spring管理
- AOP:面向切面编程,可以更方便的为类实现事务管理、日志记录等功能
- Dao:提供了异常体系、事务管理,简化了事务控制的代码
- Web支持,springMVC专注于Web应用程序的开发
74. mybatis是什么
mybatis是一款优秀的持久层的框架,简化对jdbc的重复性操作
- SQl动态语句提供了很大的灵活性
- 映射java对象与数据库表,可以直接操作java对象
- 自动将结果集映射为java对象
75. SpringMVC是什么
SpringMVC是Spring中的一个核心模块,将Java代码分为三个角色,将视图与业务逻辑解耦
- MVC遵循模型(Model)、视图(View)和控制器(Controller)的设计模式,将业务逻辑、数据和表示分离
- 通过Controller接收请求,处理逻辑后将结果发送给视图
- 通过消息转换器可以将请求数据转换为Java对象
- 提供了数据校验机制,无需手动校验数据
实际开发中,Mybatis处理数据库操作,spring管理业务逻辑和服务层,提供依赖注入、切面处理异常,日志记录等、事务管理,springMVC处理Web请求,实现视图和业务逻辑的解耦
76. 常见的设计模式有哪些?
单例模式、原型模式、MVC模式、适配器模式、装饰者模式、工厂模式、代理模式
77. 常见的数据结构有哪些?
链表、哈希表、数组、二叉树、栈、图
78. i++和++i的区别?
i++是先自增再取值,++i是先取值再自增。 但是两者最后运行结果一样
79. int和Integer的区别?
int是基本数据类型,Integer是包装类,
int默认值为0.Integer默认值为null
80. 线程的生命周期
创建、就绪、运行、阻塞、死亡
81. String s = new String(“abc”)创建了几个对象
2个。一个是字符串常量池中的对象,一个是堆内存中的对象。
82. 开启spring事务有几种方式,作用是什么
- 声明式事务(只需要配置),基于xml配置的,或者基于注解配置的
- 基于代码实现,让spring容器实例化事务管理器,然后将事务管理注入到service中,在需要事务时代码调用相关方法。
83. java垃圾回收机制,按照什么规则回收
垃圾回收机制:当堆内存不够或者CPU空闲时,GC会执行垃圾回收。
GC先识别垃圾对象,没有引用指向的对象(没有栈变量、静态变量直接或者间接指向的对象)即为垃圾对象。
使用标记清除、标记复制、标记压缩的算法进行回收。
84. java中final的作用
- 类,类不能被继承
- 方法,方法不能被重写
- 成员变量、局部变量、方法参数:变量只能被初始化,不能被再次赋值
85. Springboot有哪些优点
- 快速创建独立运行的spring项目与主流框架的集成
- 使用嵌入式的servlet容器,无需打成war包
- starter自动依赖与版本控制
- 大量的自动配置,简化开发,也可以修改默认值
- 准生产环境的运行应用监控
86. Springboot和Spring的联系
- Spring Boot是Spring框架的子项目,用于快速开发单个微服务。
- Spring Boot的核心思想是约定大于配置,通过一系列的自动配置项,简化了Spring的配置。
- Spring Boot的自动配置项可以覆盖大部分的配置项,使得开发者不用再写大量的XML配置。
- 起步依赖可以自动引入Spring Boot所需的依赖,简化了依赖管理。
- 嵌入式服务支持,可以快速运行和测试Spring Boot应用。
87. Spring Boot是什么
Spring Boot提供一组工具,用于快速构建Spring应用程序,它能够彻底简化Spring应用程序的编写过程
88. Spring Boot有哪些常用的组件?
- spring-boot-starter-actuator:监控和管理发布到生产环境的应用
- spring-boot-devtools:监控编译的输出文件夹,提供热启动
- spring-boot-maven-plugin:打包插件,mvn默认的打包工具无法再jar文件中内嵌jar文件
- spring-boot-starter-web:提供web开发所需的各种依赖,包括Tomcat、Spring MVC、Spring WebFlux、Thymeleaf等
- spring-boot-starter-parent:提供父pom,管理Spring Boot项目的依赖版本、插件配置等
89. 数据库唯一且自增的实现方式有哪些?
- uuid:通过uuid生成唯一的id,优点是简单,缺点是性能差,需要对uuid进行排序,占用空间大。通常用 16 进制表示
- 数据库自增:通过数据库的自增特性,生成唯一的id,优点是性能高,缺点是需要数据库支持,需要对id进行排序,占用空间小
- 雪花算法:通过算法生成唯一的id。生成的 ID 是 64 位的长整数。既有机器标识符还有时间戳,还有序列号等等
90. restful规范的理解
- restful是一套编写接口的协议,协议规定了如何编写以及如何设置返回值、状态码等消息
- method在后端做不同的处理,get获取数据、delete删除数据、post创建数据、put和patch修改数据
91. Spring Boot使用组件的流程是什么?
Spring Boot使用组件的流程是:引入依赖、配置application.properties、编写代码、启动应用。
92. Spring Boot的常用注解有哪些?
- @SpringBootApplication:该注解可以将Spring Boot应用的主要配置都集中在一个注解中,简化了配置。
- @EnableAutoConfiguration:该注解可以根据classpath中的jar包来自动配置Spring Boot应用。
- @ComponentScan:该注解用于指定Spring Boot要扫描的组件。
- @Configuration:该注解用于声明一个类作为Spring Bean的配置类。
- @Bean:该注解用于注册一个Bean到Spring的IoC容器中。
- @Autowired:该注解用于自动注入依赖。
- @Value:该注解用于注入配置属性值。
93. spring中的常用注解有哪些?
- CompontentScan:告诉spring自动扫描指定包下及其子包中带有Compontent或其他注解的类,并将其注册为Bean
- EnableAspetcJProxy:启动对AOP的支持,用@Aspect声明切面,但是@Aspect并不会被扫描
- Transactional:标记类或方法,可以标记类中所有公开的方法都启用事务
- Autowried中可以指定别名,Qui…、Resource
- Bean创建一个
- Compontent、Configuration、Controller、Service、Repmotity标记spring扫描该类并创建Bean
- Properties、Values获取配置文件中相应字段
- Aspect、Before、After、Around配置切面及切点(spring感知不到Aspect的存在,需要加组件扫描)
94. springMVC中的常用注解
- RequestMapping映射请求到Controller中的具体方法,及其衍生注解PostMapping、GetMapping、DeleteMapping、PutMapping
- ResponseBody说明返回的是响应体而不是视图
- RestController = RequestMapping + ResponseBody
- RequestHeader获取请求头中对应字段
- RequestParam获取URL、请求体的参数,delete?id=5
- RequestPart获取多部分请求中的一个Part
- PathVariable获取URL中的变量,delete/5
- RequestBody获取一整个请求体,消息转换器根据contentType转换请求体为Java对象
- 数据来自json时需要设置RequestBody
- 参数校验使用Validated校验平铺参数或者JavaBean中的字段(Pattern、Min、NotBlank、NotNull、Size…)
- 如果没有在参数中加msg说明就会抛异常,@NotNull(“不能为空”)
- 需要额外配置异常处理,捕获对应的异常类型给出提示信息
- 验证平铺参数需要添加对应的jackson的配置
- Advice是专用于MVC的切面,不会被spring感知ControllerAdvice
- SessionAttributes设置session的属性及值
- SessionAttribute从session中获取某个属性
- RequestAttribute从当前请求中获取某个属性
- CookieValue绑定某个cookie值
95. 描述springMVC和spring的关系
- springMVC是spring Framework 中的一个子项目,专注于构建Web层的应用
- spring本身是一个全面的框架,提供了DI / IOC、AOP、Dao支撑、springMVC等多方面的功能(依赖注入、面向方面编程、数据访问、Web等多方面的功能)
- springMVC使用spring中的DI管理Bean并与其他spring模块无缝整合
96. 覆盖springboot默认配置的方式?
命令行>系统配置>默认配置
97. 加载配置文件中的值(主配置文件、非主配置文件)
- 主配置文件:
- 非主配置文件:
- 优先级:非主配置文件 > 主配置文件
98. Springboot配置文件几种类型,区别是什么?
- application.properties:Spring Boot默认的配置文件,可以通过命令行或者系统变量来修改配置。优先级高
- application.yml:yml格式的配置文件,可以方便的编写复杂的配置。
99. 什么是热重启?springboot怎么实现热重启?
- 热重启就是不用加载整个项目,只需要加载修改的类。
- devtools可以实现热重启,它可以监控应用的编译输出文件夹,当文件发生变化时,devtools会自动重启应用。
100. Springboot如何实现自动配置?
配置类@Configuration
101. 为什么要使用缓存?
- 缓存可以提高系统的响应速度,减少数据库的压力,减少服务器的负载。
- 缓存可以降低数据库的连接数,提高系统的并发量。
- 缓存可以减少网络的流量,提高系统的整体性能。
102. 缓存的实现方案
- 本地缓存:通过一个Map来同步存储数据库中的热点数据,提高系统的响应速度。
- 集群缓存:将缓存数据分布到多台服务器上,提高缓存的命中率。
- 分布式缓存:将缓存数据分布到多台服务器上,通过网络访问。
103. 常见的缓存问题及解决方案?
- 缓存雪崩:缓存集中过期或者缓存系统出现故障。高可用,缓存持久,缓存架构
- 缓存穿透:查询一个数据源中一定不存在的数据。缓存空值,接口层增加校验
- 缓存击穿:某个key非常热点,处于集中式高并发访问的情况,当这个key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库。热点数据设置为永不过期,分布式互斥锁
- 双写不一致:数据库和缓存双写。先删除缓存再更新数据库。
- 缓存并发竞争:客户端同时并发写一个key。乐观锁
104. 哪种类型的数据适合使用缓存?
读多写少,一致性要求较低的数据适合使用缓存。
105. Redis是什么
Redis是一个用开源的c语言开发的 *基于内存的高性能的key-value的数据库。
106. Redis的优缺点
优点:
1. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
2. Redis支持数据的备份,即master-slave模式的数据备份。
3. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
4. Redis不只能作为key-value数据库使用,还提供了消息中间件的部分功能。
缺点:
1. 由于 Redis 是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。虽然 Redis本身有 Key 过期策略,但是还是需要提前预估和节约内存。如果内存增长过快,需要定期删除数据。
2. redis是单线程的(6.0变为多线程),单台服务器无法充分利用多核服务器的CPU
107. NoSql数据库有哪些?
- 键值存储数据库
- 列存储数据库
- 文档型存储数据库
- 图形数据库
108. NoSql是什么?
- 非关系型的数据库
109. Redis支持哪些数据结构,使用场景有哪些?
- String类型。String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。缓存,分布式锁,计数器(用户的访问次数、热点文章的点赞转发,全局id)
- List类型。链表是简单的字符串列表,按照插入顺序存储字符串。缓存最新内容,生产消费者队列。
- Sets类型。无序的字符串的集合,不能重复。判断数据是否存在,用户画像,生成随机数抽奖
- Sorted Sets类型。String类型元素的集合,不能重复,哈希表实现的。排行榜,弹幕
- Hash类型。字符串类型的键值对组成map。缓存对象,单独递增某个键对应的值(每条新闻的点赞数,评论数,浏览数)
- HyperLogLog类型,基数统计。一个可重复集合内不重复元素的个数就是基数。统计访问ip数量
- Streams类型,数据流。
- Geospatial类型,地理空间。定位,查看附近的人,打车距离计算
- Bitmap类型,位图。二进制安全的字符串,存储信息时可以节省大量的空间。各种的实时分析,与用户id关联的布尔信息,用户在线状态等等。
110. Redis为什么要持久化?
重启或者故障恢复后恢复缓存
111. 一个字符串类型的值能存储最大容量是多少?
一个字符串类型的值能存储的最大容量为512M。
112. Redis key 的过期时间和永久有效分别怎么设置?
- 使用expire命令对key的过期时间进行设置;
- 使用persist命令对key永久有效进行设置;
113. 一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?
- Redis 实例最多能存放多少的 keys:Redis 实例可以存储 2^32 个 keys,每个 key 的最大容量为 512MB。
- List、Set、Sorted Set 他们最多能存放多少元素:List、Set、Sorted Set 类型的数据结构的最大容量为 2^32 - 1 个元素。
114. 如果这个Redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
Redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
这个时候可以使用scan指令,scan指令可以无阻塞的提取指令模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
115.使用过 Redis 分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后再用expire给锁加一个过期时间防止锁忘记了释放。
116.如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这个时候确实锁会永远得不到释放了,但是set指令有个非常复杂的参数是可以同时把setnx和expire合成一条指令来用的。
117.使用过 Redis 做异步队列么,你是怎么用的?
一般使用list结构作为队列,rpush生产消息,lpop消费消息。
当lpop没有消息的时候,要适当sleep一会儿再重试。
追问:可不可以不使用sleep呢?
指令叫blpop,在没有消息的时候,它会阻塞住,直到消息到来。
再追问:能不能生产一次,消费多次呢?
使用pub/sub主题订阅者模式,可以使用1:N的消息队列。
再问:pub/sub有什么缺点?
在消费者下线的情况下,生产的消息会丢失,解决这样的问题得使用专业的消息队列,如RabbitMQ等。
118.如果有大量的 key 需要设置同一时间过期,一般需要注意什么?
如果大量的 key 过期时间设置的过于集中,到过期的那个时间点,Redis 可能会出现短暂的卡顿现象。
一般需要在时间上加一个随机值,使得过期时间分散一些。
119.数据库六大约束有哪些?
1. 主键约束:主键约束确保每行数据都有一个唯一标识,不能重复。
2. 唯一约束:唯一约束确保某一列或多列数据在表中不允许出现重复的值。
3. 非空约束:非空约束确保某一列或多列数据不允许为空。
4. 外键约束:外键约束确保两个表的数据一致性。
5. 检查约束:检查约束用于限制字段值的范围。
6. 默认约束:默认约束用于设置字段的默认值。
120. JavaBean:Java对象化的产物。这个类只有私有化的属性,公开的setter、getter方法
实体类:一种特殊的javaBean,实体类是数据表的抽象表示
121. Java序列化机制两种
- Serializable 序列化接口中没有任何抽象方法,哪个属性需要写出,只需要在属性上加static或者transient关键字即可
- Externalizable 序列化,接口中有两个抽象方法。
- writeExternal,需要定义需要序列化写出的属性。
- readExternal,需要如何反序列化写出的属性
122. hadoop的序列化机制有两种
- writeable :用于定义简单的可序列化类型。实现了
Writable接口的对象可以通过网络传输或存储到磁盘上。 - writeableComparable:继承自
Writable并添加了Comparable<T>接口的功能。这使得实现了该接口的对象不仅能够序列化,还能比较大小,非常适合用作 MapReduce 框架中的键(key)。
123. 通知有几种类型
* JoinPoint
* 前置通知 @Before
* 后置通知 @After
* 环绕通知 @Around ProceedingJoinPoint
* 带返回结果的通知 @AfterReturning
* 异常通知 @AfterThrowing
124. HttpRequest和HttpResponse的获取方式(2种)
-
通过方法参数直接获取(适用于Spring MVC控制器或Servlet)
-
通过
RequestContextHolder静态工具类获取(适用于非控制器层,如服务层、切面等)
125. SpringBoot和SpringCloud的版本

126. 微服务是什么
-
微服务是一种架构风格,也是一种服务。
-
他的每种服务只做一件事,是一种松耦合的,能够被独立开发和部署的无状态化服务
127. Spring Cloud Netflix
Netflix OSS开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件
- Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制
- Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略
- Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力
- Feign:基于Ribbon和Hystrix的声明式服务调用组件
- Zuul:API网关组件,对请求提供路由以及过滤功能
128. Springboot和SpringCLoud的关系
- SpringBoot专注于快速方便的开发单个个体微服务
- SpringCloud是关注全局的微服务协调整理治理框架,他将Springboot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
- SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
- SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
129. 分布式服务的两种调用方式RPC和Rest
RPC(过程远程调用)请求和普通的RESTFUL请求在设计理念、通信方式、协议等方面有一些区别:
-
设计理念:
RPC 请求:RPC 是一种面向过程的通信模式,其设计目的是让远程调用像本地调用一样简单,它的核心思想是调用远程服务的方法。
RESTful 请求:RESTful 是一种基于资源的通信模式,其设计目的是通过对资源的增删改查操作来进行通信,通过统一的接口实现系统之间的互操作性。 -
通信方式: RPC 请求:
RPC 请求通常使用自定义的二进制协议进行通信,如Google的Protocol Buffers(protobuf)或Apache Thrift等。
RESTful 请求:RESTful 请求通常使用 HTTP 协议进行通信,使用标准的 HTTP 方法(GET、POST、PUT、DELETE)来对资源进行操作。 -
调用方式:
RPC 请求:RPC 调用是直接调用远程服务的方法,类似于本地方法调用,调用语法更接近于编程语言的原生调用。
RESTful 请求:RESTful 请求是通过对资源的 URL 进行 HTTP 请求来实现的,通常使用 HTTP 方法对资源进行操作,如 GET 获取资源、POST 创建资源、PUT 更新资源、DELETE 删除资源。 -
数据传输:
RPC 请求:RPC 通常采用二进制格式传输数据,可以提高传输效率和性能。
RESTful 请求:RESTful 通常采用文本格式(如 JSON 或 XML)传输数据,易于阅读和理解。 -
协议标准:
RPC 请求:RPC 协议通常是自定义的,不同的 RPC 框架有不同的协议实现。
RESTful 请求:RESTful 遵循一组统一的协议标准,包括 HTTP 方法、URL 结构、状态码等,使得不同系统之间更容易进行通信和集成。
130. 微服务和微服务架构区别
- 微服务架构:微服务架构是一种架构模式,它将单个应用程序或服务拆分成一组小型服务,每个服务运行在自己的进程中,服务间采用轻量级的通信机制互相协作。
- 微服务:微服务是一种架构模式,它将单个应用程序或服务拆分成一组小型服务,每个服务运行在自己的进程中,服务间采用轻量级的通信机制互相协作。
131. 微服务的版本以及配套的问题
-
服务器注册发现中心:微服务架构的核心
netflix:eureka alibaba:nacos apache:zookeeper -
负载均衡组件:可选择 当同一个微服务提供商有多个的
netflix:ribbon2020前 alibaba:springcloud feign -
整合了负载均衡和客户端请求的组件:可选择 客户端提供了一种接口调用技术
netflix:fegin 慢慢从netflix脱出来了,慢慢不再由netflix维护 openfeign -
服务熔断和服务降级:可选择 一般都要添加
netflix:Hystrix alibaba:sentinel -
网关路由:
netflix:zuul alibaba:springcloud gateway -
分布式配置中心
spring cloud config -
Spring Cloud 版本选择:Hoxton.SR8
SpringBoot 2.3.3
jdk 8-14
maven
tomcat:9 -
负载均衡解决发生在客户端的问题
-
nginx也解决发生在客户端
132. Ribbon负载均衡算法7种(不需要全部记住,只需要记住3-4种就行)
AbstractLoadBalancerRule:负载均衡算法的抽象类,定义了算法的接口。
- 轮询RoundRobinRule默认情况下是
- 随机RandomRule
- 重试RetryRule
- WeightedResponseTimeRule(权重):响应速度最快的权重越大,权重越大则选中的概率越大。
133. Niginx负载均衡算法
134. Ribbon和Feign区别
消费者客户端有两种编程风格:
- eureka(服务的发现)+ribbon(客户端服务的负载均衡,自己给RestTemplate手动添加@LoadBalanced注解)+RestTemplate(HTTP请求调用远程的微服务)
- eureka(服务的发现,不用写ip端口号)+ribbon(客户端服务负载均衡,负载均衡不需要手动添加)+feign远程服务调用,接口的方式来做的
feign只需要关注接口的调用,不需要关注HTTP协议如何发送了,但是它的底层会把接口的调用变成HTTP协议发送
135. Hystrix的作用
- 服务降级(客户端):某一个微服务的所有功能进行降级的。当依赖的服务出现问题时,容错机制会自动将请求转移到备用服务,避免级联故障,提高系统的可用性。
- 服务熔断(服务端):某一个接口功能进行熔断降级的。当依赖的服务持续多次出现故障,熔断机制会将请求快速失败,避免请求积压,保护依赖的服务。
- 服务监控:Hystrix会监控微服务间的调用和响应时间,当响应时间超过阈值时,会触发熔断机制,进而熔断相应的依赖服务。
136. SpringCloud的优点
- 统一配置管理:Spring Cloud Config为微服务架构中的微服务提供集中化的配置管理,配置服务器可以集中存储配置文件,并为各个服务应用进行配置。
- 服务发现:服务发现是微服务架构中的重要组件,它负责在各个微服务实例之间进行自动化的服务注册和发现。
- 断路器:断路器是微服务架构中的重要组件,它实现了对依赖服务的自动熔断机制,避免级联故障,提高系统的可用性。
- 路由:Spring Cloud Zuul是基于Netflix的Zuul组件,它提供动态路由,监控,弹性,和安全等功能。
- 负载均衡:Spring Cloud Ribbon是基于Netflix的Ribbon组件,它是一个客户端负载均衡器,它可以根据负载均衡策略,自动地将请求路由到相应的服务实例。
- 统一的监控:Spring Cloud Sleuth为微服务架构中的服务调用提供统一的监控。
- 控制总线:Spring Cloud Bus为微服务架构中的各个服务提供一个总线,用于广播状态变化,如配置更新,服务实例上下线等。
136. Zuul一共有三个作用
- 路由:它基于请求信息,将请求路由到相应的微服务实例。
- 网关
- 过滤
137. 一般微服务框架中有哪些子模块
- api:微服务提供公共的配置/工具类
- 注册服务:服务注册/服务发现
- 网关服务:给微服务提供一个统一的路由地址,权限token
- 多个真正进行项目逻辑开发的微服务
138. Elasticsearch常用的是那些?
- match
- multi_match
- trem
- font-Size
139. Elasticsearch常用的是那些?
140. 单表查询
- 编写顺序:select … from where group by having order by limit
- 运行顺序:from where group by having select order by limit
141. 多表查询
- 七种
142. 联合查询 union | union all
143. 事务的四大特性ACID
原子性、一致性、隔离性、持久性
144. 一些数据库的知识点
-
数据库的变量、数据库流程控制{分支if case、循环loop while repeat}
-
数据库存储过程和函数
-
数据库的视图
145. MySQL高级
- 存储引擎
- 索引
- 优化
选择
1. 以下哪个方法用于定义线程的执行体?
正确答案: C
A.start()
B.init()
C.run()
D.synchronized()
run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用。
而start()的作用是启动相应的线程。启动一个线程实际是请求Java虚拟机运行相应的线程,而这个线程何时能够运行是由线程调度器决定的。start()调用结束并不表示相应线程已经开始运行,这个线程可能稍后运行,也可能永远也不会运行。
start()开启线程 run()为方法体 sleep()为休眠线程,不释放锁 wait()让线程进入等待池,释放锁 notify()唤醒单个线程 notifyAll()唤醒全部线程 join()同步线程。
2. 以下关于构造函数的描述错误的是( A )。
A. 构造函数的返回类型只能是void型。
B. 构造函数是类的一种特殊函数,它的方法名必须与类名相同。
C. 构造函数的主要作用是完成对类的对象的初始化工作。
D. 一般在创建新对象时,系统会自动调用构造函数。
构造函数没有返回值类型,包括void,因为它的作用是初始化对象,而不是返回值
3. 用static修饰的方法可以直接通过类名来调用
更多推荐


所有评论(0)