文章目录


简答

1. 简述oracle中dml、ddl的使用

dml用于检索或者修改数据
ddl用于创建修改删除对象

2. oracle中union和union all的区别

union不包括重复记录
union all包括重复记录

3. oracle经常使用的函数

count、insert、length、lower、substr

4. 什么是存储过程?和函数有什么区别?

存储过程是预先编译好的sql语句,可以重复使用,减少网络通信,提高性能。
函数是一段代码,可以直接调用,执行特定功能。
区别:

  1. 调用方式:存储过程是直接调用,函数是间接调用。
  2. 定义位置:存储过程定义在数据库中,函数定义在程序中。
  3. 调用时机:存储过程在执行时调用,函数在执行前调用。
  4. 参数:存储过程可以有输入输出参数,函数只能有输入参数。
  5. 作用域:存储过程作用于整个数据库,函数作用于局部作用域。
  6. 命名:存储过程以“create procedure”语句创建,函数以“create function”语句创建。
  7. 性能:存储过程的执行速度比函数快,因为它是预先编译好的。

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. 简述&、&& |、||区别

  1. &是位运算符,在二进制的粒度上计算,&&逻辑与运算符,操作数整体参与运算的
  2. &的操作数必须是基本类型中除了浮点型后的类型,&&必须是布尔类型
  3. |是位运算符、||是逻辑非

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+4
2=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. 对象实例化过程

  1. 在堆内存中分配内存空间
  2. 初始化对象,调用构造方法
  3. 将对象地址赋值给引用变量
  4. 对象引用变量调用方法

42. 方法重写与方法重载的区别

(1) 方法重载:是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。同名不同参,和其他无关
(2) 方法重写:父类和子类之间,方法名相同,参数列表相同,返回值的范围小于等于父类、异常范围小于等于父类、访问控制修饰符的范围大于等于父类,如果访问控制修饰符为private则不能重写该父类的方法
(3) 重载的方法能否根据返回类型进行区分,不能

43. 父类和子类中,静态代码块、代码块、构造方法、普通方法执行顺序?

静态代码块、代码块、构造方法、普通方法,先父后子

44. GET和POST的区别?

  1. GET 适合用于检索信息,并且请求不应该对服务器状态造成影响。由于数据在URL中可见,不适合传输敏感信息。
  2. POST 适合用于提交数据,可以改变服务器状态,数据在请求体中,适合传输敏感信息。

45. 多线程环境下如何选择容器?

  1. 使用线程安全的容器
    1. ConcurrentHashMap
    2. ConcurrentSkipListMap
    3. CopyOnWriteArrayList
  2. 使用工具方法包装原有的容器
    1. Collections.synchronizedList(list)
    2. Collections.synchronizedSet(set)

46. 哪些常用容器类?使用数据结构什么?

  1. list
    1. Arraylist 数组
    2. linkedlist 双向链表
  2. set
    1. HashSet 哈希表
    2. TreeSet 红黑树
    3. LinkedHashSet 哈希表+双向链表
  3. Map
    1. HashMap 哈希表
    2. TreeMapt 红黑树
    3. LinkedHashMap 哈希表+双向链表
  4. Queue
    1. BlockingQueue 先进先出、
    2. Deque

47. 多线程环境下如何选择容器?

  1. 使用工具方法包装原有的容器

    1. list list1 = new ArrayList<>();

      final List list = Collections.synchronizedList(list1);

  2. 使用线程安全的容器

    1. CopyOnWriterArrayList
    2. ConcurrentHashMap
    3. ConCurrentSkipListMap
    4. Vector HashTable废弃了,不建议用

48. List、Map、Set的区别

  1. List保持插入顺序、值允许重复、可以有多个null、可以按位置获取元素
  2. Map无序的、key/value不能包含重复的键key,值可以重复、Map集合保存键值对
  3. Set不一定保持插入顺序、元素不能重复、不可以按位置获取元素

49. HashMap和HashTable区别

  1. HashMap:非线程安全、可以存储null
  2. HashTable:线程安全、不允许null值

50. cookie、session、token的区别和联系

cookie:存储在客户端,可以存储少量数据,不安全,客户端可以访问,安全性低,内容4kb
session:会话管理,存储在服务器端,可以存储任意类型的数据,可以设置过期时间,客户端可以访问,安全性高,最后一个请求的半小时之后会失效,可以设置失效时间,在客户端的cookie中
**token:**用于身份验证,可以存储在客户端,也可以存储在服务器端,客户端可以访问,安全性高
联系:cookie和session没有关系

51. 如何防止重复提交

  1. 前端处理,通过一个标识控制表单提交后,再次提交会直接返回处理
  2. 通过点击一次按钮之后,将该按钮设置为不可用处理
  3. 后端处理 给数据库增加唯一约束
  4. 使用AOP自定义切入实现
  5. session技术的实现

52. 浏览器发请求的方式

  1. 地址栏输入地址 +get
  2. 点击超链接 +get
  3. html src href属性的元素都可以发请求
    1. img src属性的元素
    2. script src属性的元素
    3. iframe src属性的元素
  4. form表单提交 form里面button的type属性默认是submit,点击button发请求 +post|get
  5. XMLHttpRequest,想怎么发怎么发

53. java中的泛型是什么?使用泛型有什么好处?

  1. 参数类型化,把数据类型作为参数来传递,让代码跨多个类型运行
  2. 类型安全,编译器可以检查类型是否正确,避免运行时错误

54. IO流常用的设计模式?

  1. 适配器模式
  2. 装饰者模式
  3. 原型模式

55. 列举几种常用的数据库连接池

  1. c3p0
  2. dbcp
  3. druid
  4. hikariCP

56. java中有几种线程池?是什么?

  1. new ThreadPoolExecutor();Executors中创建的线城池,不过使用不同参数实例化的ThreadPoolExecutor
  2. ForkJoinPool;
  3. new ScheduledThreadPoolExecutor(); 计划任务线程池

57. 常见的四种线程池?

  1. newFixedThreadPool(int nThreads) 创建一个固定大小的线程池,线程池中的线程数量始终保持不变,当线程数达到最大值时,新提交的任务会被暂时阻塞。
  2. newCachedThreadPool() 创建一个可缓存的线程池,线程池中的线程数量不限,可以根据需要创建线程,线程空闲时会被回收。
  3. newSingleThreadExecutor() 创建一个单线程的线程池,线程池中只包含一个线程,任务按顺序执行。
  4. newScheduledThreadPool(int corePoolSize) 创建一个支持定时及周期性任务执行的线程池,线程池中的线程数量不限,可以定时或周期性地执行任务。

58. java线程实现/创建方式分别是什么?启动线程方式有几种是什么?

  1. 创建线程一种,new Thread().start();
  2. 定义线程任务的方式:继承Thread类,重写run()方法;实现Runnable接口,实现run()方法;Callable接口
  3. 多线程同步:解决的问题:多个线程之间共享数据 加锁、线程变成多份(ThreadLocal)
  4. 多线程协作:解决问题,多个线程之间配合的机制

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

  1. 形式良好的xml是指:拥有正确的语法。
  2. 合法的xml是指:不仅有正确的语法,而且符合xml的命名规则、结构规则、数据类型规则等。

61. mybatis如何获取mysql生成的主键?

  1. 使用selectKey元素:可以在插入语句执行后、通过selectKey元素来获取自动生成的主键值(useGeneratedKeys="true"表示自动开启生成主键值的功能)
  2. 使用selectKey元素的order属性:通过order属性来指定获取主键值的顺序
  3. 使用selectKey元素的statementType属性:可以通过statementType属性来指定获取主键值的方式
  4. 在标签中使用 useGeneratedKeys 和 keyProperty 两个属性来获取自动生成的主键值。

62. mybatis常用的传递参数的方式

  1. 编译器加入-parameter参数,保留方法的参数名
  2. 使用注解(@Param)
  3. 使用Map传递参数
  4. 对象传递参数

63. 使用mybatis的mapper接口调用时有哪些要求

  1. Mapper接口方法名和mapper.xml定义sql的id相同
  2. Mapper.xml中的namespace是mapper接口类路径
  3. Mapper接口方法的输入参数类型和mapper.xml中parameterType的类型一致
  4. Mapper接口方法的输出参数类型和mapper.xml中的resultType类型一致

64. jdbc编程有哪些不足之处,mybatis是如何解决这些问题的

  1. Sql语句写在代码中造成代码不易维护、实际应用sql变化可能较大,sql变动需要更改代码 解决方案:将sql语句配置在mapper.xml文件中与java代码分离
  2. 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能 解决方案:在mybatis -config.xml中配置数据连接池,使用连接池管理数据库连接
  3. 向sql语句传参数麻烦,sql语句的where条件不一定,可能多也可能少,占位符要和参数一一对应 解决方案:Mybatis自动将java对象映射至sql语句
  4. 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封成pojo对象解析比较方便 解析方案:Mybatis自动将sql执行结果映射为java对象

65. 访问关系型数据库四套方案

  1. 直接写sql语句
  2. jdbc工具包
  3. 框架(mybatis、hibernate)
  4. jpa

66. 数据库存储表的方式有几种?

  1. 链式存储:链式存储是将数据按顺序存储在一个表中,每个数据项占用固定大小的存储空间,通过指针来访问。mysql
  2. 堆存储:堆存储是将数据按顺序存储在一个大的内存块中,每个数据项占用固定大小的存储空间,通过指针来访问。oracle

67. 创建Bean对象有哪几种方式?

  1. 构造函数
  2. 静态工厂方法
  3. 实例工厂方法
  4. 类似实例工厂方法实例化,工厂需要实现FactoryBean接口

68. 使用spring步骤有哪些

  1. 导入依赖
  2. 配置xml文件
  3. 使用api

69. IOC、DI是什么?基本原理是什么

  1. IOC控制反转、DI依赖注入
  2. 是一种东西

70. AOP原理

  1. AOP面向切面编程,AOP是动态代理。
  2. 只要目标对象实现了一个接口,就使用JDK动态代理
  3. 如果目标对象未实现接口,使用CGLIB代理

71. Spring是什么?

Spring是一个轻量级的开源框架,为解决企业级应用开发复杂性问题创建的

72. 配置servlet有几种方式

  1. web.xml:修改配置不需要修改源码,配置繁琐,配置与源码是分离的
  2. @WebServlet注解:配置servlet,需要修改源码,配置简单;源码与配置在同一个位置,便与代码阅读和维护
  3. ServletContainerInitializer:配置繁琐、源码与配置是分离的;动态注册Servlet,灵活性比较高

73. spring是什么

spring是轻量级的企业级开发框架,实现业务逻辑层Service与其他层的解耦

  1. IOC|DI:通过依赖注入实现对象之间的解耦,组件之间不需要直接new对象,将对象的生命周期交由spring管理
  2. AOP:面向切面编程,可以更方便的为类实现事务管理、日志记录等功能
  3. Dao:提供了异常体系、事务管理,简化了事务控制的代码
  4. Web支持,springMVC专注于Web应用程序的开发

74. mybatis是什么

mybatis是一款优秀的持久层的框架,简化对jdbc的重复性操作

  1. SQl动态语句提供了很大的灵活性
  2. 映射java对象与数据库表,可以直接操作java对象
  3. 自动将结果集映射为java对象

75. SpringMVC是什么

SpringMVC是Spring中的一个核心模块,将Java代码分为三个角色,将视图与业务逻辑解耦

  1. MVC遵循模型(Model)、视图(View)和控制器(Controller)的设计模式,将业务逻辑、数据和表示分离
  2. 通过Controller接收请求,处理逻辑后将结果发送给视图
  3. 通过消息转换器可以将请求数据转换为Java对象
  4. 提供了数据校验机制,无需手动校验数据
    实际开发中,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事务有几种方式,作用是什么

  1. 声明式事务(只需要配置),基于xml配置的,或者基于注解配置的
  2. 基于代码实现,让spring容器实例化事务管理器,然后将事务管理注入到service中,在需要事务时代码调用相关方法。

83. java垃圾回收机制,按照什么规则回收

垃圾回收机制:当堆内存不够或者CPU空闲时,GC会执行垃圾回收。
GC先识别垃圾对象,没有引用指向的对象(没有栈变量、静态变量直接或者间接指向的对象)即为垃圾对象。
使用标记清除、标记复制、标记压缩的算法进行回收。

84. java中final的作用

  1. 类,类不能被继承
  2. 方法,方法不能被重写
  3. 成员变量、局部变量、方法参数:变量只能被初始化,不能被再次赋值

85. Springboot有哪些优点

  1. 快速创建独立运行的spring项目与主流框架的集成
  2. 使用嵌入式的servlet容器,无需打成war包
  3. starter自动依赖与版本控制
  4. 大量的自动配置,简化开发,也可以修改默认值
  5. 准生产环境的运行应用监控

86. Springboot和Spring的联系

  1. Spring Boot是Spring框架的子项目,用于快速开发单个微服务。
  2. Spring Boot的核心思想是约定大于配置,通过一系列的自动配置项,简化了Spring的配置。
  3. Spring Boot的自动配置项可以覆盖大部分的配置项,使得开发者不用再写大量的XML配置。
  4. 起步依赖可以自动引入Spring Boot所需的依赖,简化了依赖管理。
  5. 嵌入式服务支持,可以快速运行和测试Spring Boot应用。

87. Spring Boot是什么

Spring Boot提供一组工具,用于快速构建Spring应用程序,它能够彻底简化Spring应用程序的编写过程

88. Spring Boot有哪些常用的组件?

  1. spring-boot-starter-actuator:监控和管理发布到生产环境的应用
  2. spring-boot-devtools:监控编译的输出文件夹,提供热启动
  3. spring-boot-maven-plugin:打包插件,mvn默认的打包工具无法再jar文件中内嵌jar文件
  4. spring-boot-starter-web:提供web开发所需的各种依赖,包括Tomcat、Spring MVC、Spring WebFlux、Thymeleaf等
  5. spring-boot-starter-parent:提供父pom,管理Spring Boot项目的依赖版本、插件配置等

89. 数据库唯一且自增的实现方式有哪些?

  1. uuid:通过uuid生成唯一的id,优点是简单,缺点是性能差,需要对uuid进行排序,占用空间大。通常用 16 进制表示
  2. 数据库自增:通过数据库的自增特性,生成唯一的id,优点是性能高,缺点是需要数据库支持,需要对id进行排序,占用空间小
  3. 雪花算法:通过算法生成唯一的id。生成的 ID 是 64 位的长整数。既有机器标识符还有时间戳,还有序列号等等

90. restful规范的理解

  1. restful是一套编写接口的协议,协议规定了如何编写以及如何设置返回值、状态码等消息
  2. method在后端做不同的处理,get获取数据、delete删除数据、post创建数据、put和patch修改数据

91. Spring Boot使用组件的流程是什么?

Spring Boot使用组件的流程是:引入依赖、配置application.properties、编写代码、启动应用。

92. Spring Boot的常用注解有哪些?

  1. @SpringBootApplication:该注解可以将Spring Boot应用的主要配置都集中在一个注解中,简化了配置。
  2. @EnableAutoConfiguration:该注解可以根据classpath中的jar包来自动配置Spring Boot应用。
  3. @ComponentScan:该注解用于指定Spring Boot要扫描的组件。
  4. @Configuration:该注解用于声明一个类作为Spring Bean的配置类。
  5. @Bean:该注解用于注册一个Bean到Spring的IoC容器中。
  6. @Autowired:该注解用于自动注入依赖。
  7. @Value:该注解用于注入配置属性值。

93. spring中的常用注解有哪些?

  1. CompontentScan:告诉spring自动扫描指定包下及其子包中带有Compontent或其他注解的类,并将其注册为Bean
  2. EnableAspetcJProxy:启动对AOP的支持,用@Aspect声明切面,但是@Aspect并不会被扫描
  3. Transactional:标记类或方法,可以标记类中所有公开的方法都启用事务
  4. Autowried中可以指定别名,Qui…、Resource
  5. Bean创建一个
  6. Compontent、Configuration、Controller、Service、Repmotity标记spring扫描该类并创建Bean
  7. Properties、Values获取配置文件中相应字段
  8. Aspect、Before、After、Around配置切面及切点(spring感知不到Aspect的存在,需要加组件扫描)

94. springMVC中的常用注解

  1. RequestMapping映射请求到Controller中的具体方法,及其衍生注解PostMapping、GetMapping、DeleteMapping、PutMapping
  2. ResponseBody说明返回的是响应体而不是视图
  3. RestController = RequestMapping + ResponseBody
  4. RequestHeader获取请求头中对应字段
  5. RequestParam获取URL、请求体的参数,delete?id=5
  6. RequestPart获取多部分请求中的一个Part
  7. PathVariable获取URL中的变量,delete/5
  8. RequestBody获取一整个请求体,消息转换器根据contentType转换请求体为Java对象
  9. 数据来自json时需要设置RequestBody
  10. 参数校验使用Validated校验平铺参数或者JavaBean中的字段(Pattern、Min、NotBlank、NotNull、Size…)
  • 如果没有在参数中加msg说明就会抛异常,@NotNull(“不能为空”)
  • 需要额外配置异常处理,捕获对应的异常类型给出提示信息
  • 验证平铺参数需要添加对应的jackson的配置
  1. Advice是专用于MVC的切面,不会被spring感知ControllerAdvice
  2. SessionAttributes设置session的属性及值
  3. SessionAttribute从session中获取某个属性
  4. RequestAttribute从当前请求中获取某个属性
  5. CookieValue绑定某个cookie值

95. 描述springMVC和spring的关系

  1. springMVC是spring Framework 中的一个子项目,专注于构建Web层的应用
  2. spring本身是一个全面的框架,提供了DI / IOC、AOP、Dao支撑、springMVC等多方面的功能(依赖注入、面向方面编程、数据访问、Web等多方面的功能)
  3. springMVC使用spring中的DI管理Bean并与其他spring模块无缝整合

96. 覆盖springboot默认配置的方式?

命令行>系统配置>默认配置

97. 加载配置文件中的值(主配置文件、非主配置文件)

  1. 主配置文件:
  2. 非主配置文件:
  3. 优先级:非主配置文件 > 主配置文件

98. Springboot配置文件几种类型,区别是什么?

  1. application.properties:Spring Boot默认的配置文件,可以通过命令行或者系统变量来修改配置。优先级高
  2. application.yml:yml格式的配置文件,可以方便的编写复杂的配置。

99. 什么是热重启?springboot怎么实现热重启?

  1. 热重启就是不用加载整个项目,只需要加载修改的类。
  2. devtools可以实现热重启,它可以监控应用的编译输出文件夹,当文件发生变化时,devtools会自动重启应用。

100. Springboot如何实现自动配置?

配置类@Configuration

101. 为什么要使用缓存?

  1. 缓存可以提高系统的响应速度,减少数据库的压力,减少服务器的负载。
  2. 缓存可以降低数据库的连接数,提高系统的并发量。
  3. 缓存可以减少网络的流量,提高系统的整体性能。

102. 缓存的实现方案

  1. 本地缓存:通过一个Map来同步存储数据库中的热点数据,提高系统的响应速度。
  2. 集群缓存:将缓存数据分布到多台服务器上,提高缓存的命中率。
  3. 分布式缓存:将缓存数据分布到多台服务器上,通过网络访问。

103. 常见的缓存问题及解决方案?

  1. 缓存雪崩:缓存集中过期或者缓存系统出现故障。高可用,缓存持久,缓存架构
  2. 缓存穿透:查询一个数据源中一定不存在的数据。缓存空值,接口层增加校验
  3. 缓存击穿:某个key非常热点,处于集中式高并发访问的情况,当这个key在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库。热点数据设置为永不过期,分布式互斥锁
  4. 双写不一致:数据库和缓存双写。先删除缓存再更新数据库。
  5. 缓存并发竞争:客户端同时并发写一个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数据库有哪些?

  1. 键值存储数据库
  2. 列存储数据库
  3. 文档型存储数据库
  4. 图形数据库

108. NoSql是什么?

  1. 非关系型的数据库

109. Redis支持哪些数据结构,使用场景有哪些?

  1. String类型。String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。缓存,分布式锁,计数器(用户的访问次数、热点文章的点赞转发,全局id)
  2. List类型。链表是简单的字符串列表,按照插入顺序存储字符串。缓存最新内容,生产消费者队列。
  3. Sets类型。无序的字符串的集合,不能重复。判断数据是否存在,用户画像,生成随机数抽奖
  4. Sorted Sets类型。String类型元素的集合,不能重复,哈希表实现的。排行榜,弹幕
  5. Hash类型。字符串类型的键值对组成map。缓存对象,单独递增某个键对应的值(每条新闻的点赞数,评论数,浏览数)
  6. HyperLogLog类型,基数统计。一个可重复集合内不重复元素的个数就是基数。统计访问ip数量
  7. Streams类型,数据流。
  8. Geospatial类型,地理空间。定位,查看附近的人,打车距离计算
  9. Bitmap类型,位图。二进制安全的字符串,存储信息时可以节省大量的空间。各种的实时分析,与用户id关联的布尔信息,用户在线状态等等。

110. Redis为什么要持久化?

重启或者故障恢复后恢复缓存

111. 一个字符串类型的值能存储最大容量是多少?

一个字符串类型的值能存储的最大容量为512M。

112. Redis key 的过期时间和永久有效分别怎么设置?

  1. 使用expire命令对key的过期时间进行设置;
  2. 使用persist命令对key永久有效进行设置;

113. 一个 Redis 实例最多能存放多少的 keys?List、Set、Sorted Set他们最多能存放多少元素?

  1. Redis 实例最多能存放多少的 keys:Redis 实例可以存储 2^32 个 keys,每个 key 的最大容量为 512MB。
  2. 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序列化机制两种

  1. Serializable 序列化接口中没有任何抽象方法,哪个属性需要写出,只需要在属性上加static或者transient关键字即可
  2. Externalizable 序列化,接口中有两个抽象方法。
  3. writeExternal,需要定义需要序列化写出的属性。
  4. readExternal,需要如何反序列化写出的属性

122. hadoop的序列化机制有两种

  1. writeable :用于定义简单的可序列化类型。实现了 Writable 接口的对象可以通过网络传输或存储到磁盘上。
  2. writeableComparable:继承自 Writable 并添加了 Comparable<T> 接口的功能。这使得实现了该接口的对象不仅能够序列化,还能比较大小,非常适合用作 MapReduce 框架中的键(key)。

123. 通知有几种类型

* JoinPoint
* 前置通知 @Before
* 后置通知 @After
* 环绕通知 @Around  ProceedingJoinPoint
* 带返回结果的通知 @AfterReturning
* 异常通知 @AfterThrowing

124. HttpRequest和HttpResponse的获取方式(2种)

  1. 通过方法参数直接获取(适用于Spring MVC控制器或Servlet)

  2. 通过RequestContextHolder静态工具类获取(适用于非控制器层,如服务层、切面等)

125. SpringBoot和SpringCloud的版本

在这里插入图片描述

126. 微服务是什么

  1. 微服务是一种架构风格,也是一种服务。

  2. 他的每种服务只做一件事,是一种松耦合的,能够被独立开发和部署的无状态化服务

127. Spring Cloud Netflix

Netflix OSS开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件

  1. Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制
  2. Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略
  3. Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力
  4. Feign:基于Ribbon和Hystrix的声明式服务调用组件
  5. Zuul:API网关组件,对请求提供路由以及过滤功能

128. Springboot和SpringCLoud的关系

  1. SpringBoot专注于快速方便的开发单个个体微服务
  2. SpringCloud是关注全局的微服务协调整理治理框架,他将Springboot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
  3. SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。
  4. SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。

129. 分布式服务的两种调用方式RPC和Rest

RPC(过程远程调用)请求和普通的RESTFUL请求在设计理念、通信方式、协议等方面有一些区别:

  1. 设计理念:
    RPC 请求:RPC 是一种面向过程的通信模式,其设计目的是让远程调用像本地调用一样简单,它的核心思想是调用远程服务的方法。
    RESTful 请求:RESTful 是一种基于资源的通信模式,其设计目的是通过对资源的增删改查操作来进行通信,通过统一的接口实现系统之间的互操作性。

  2. 通信方式: RPC 请求:
    RPC 请求通常使用自定义的二进制协议进行通信,如Google的Protocol Buffers(protobuf)或Apache Thrift等。
    RESTful 请求:RESTful 请求通常使用 HTTP 协议进行通信,使用标准的 HTTP 方法(GET、POST、PUT、DELETE)来对资源进行操作。

  3. 调用方式:
    RPC 请求:RPC 调用是直接调用远程服务的方法,类似于本地方法调用,调用语法更接近于编程语言的原生调用。
    RESTful 请求:RESTful 请求是通过对资源的 URL 进行 HTTP 请求来实现的,通常使用 HTTP 方法对资源进行操作,如 GET 获取资源、POST 创建资源、PUT 更新资源、DELETE 删除资源。

  4. 数据传输:
    RPC 请求:RPC 通常采用二进制格式传输数据,可以提高传输效率和性能。
    RESTful 请求:RESTful 通常采用文本格式(如 JSON 或 XML)传输数据,易于阅读和理解。

  5. 协议标准:
    RPC 请求:RPC 协议通常是自定义的,不同的 RPC 框架有不同的协议实现。
    RESTful 请求:RESTful 遵循一组统一的协议标准,包括 HTTP 方法、URL 结构、状态码等,使得不同系统之间更容易进行通信和集成。

130. 微服务和微服务架构区别

  1. 微服务架构:微服务架构是一种架构模式,它将单个应用程序或服务拆分成一组小型服务,每个服务运行在自己的进程中,服务间采用轻量级的通信机制互相协作。
  2. 微服务:微服务是一种架构模式,它将单个应用程序或服务拆分成一组小型服务,每个服务运行在自己的进程中,服务间采用轻量级的通信机制互相协作。

131. 微服务的版本以及配套的问题

  1. 服务器注册发现中心:微服务架构的核心
    netflix:eureka alibaba:nacos apache:zookeeper

  2. 负载均衡组件:可选择 当同一个微服务提供商有多个的
    netflix:ribbon2020前 alibaba:springcloud feign

  3. 整合了负载均衡和客户端请求的组件:可选择 客户端提供了一种接口调用技术
    netflix:fegin 慢慢从netflix脱出来了,慢慢不再由netflix维护 openfeign

  4. 服务熔断和服务降级:可选择 一般都要添加
    netflix:Hystrix alibaba:sentinel

  5. 网关路由:
    netflix:zuul alibaba:springcloud gateway

  6. 分布式配置中心
    spring cloud config

  7. Spring Cloud 版本选择:Hoxton.SR8
    SpringBoot 2.3.3
    jdk 8-14
    maven
    tomcat:9

  8. 负载均衡解决发生在客户端的问题

  9. nginx也解决发生在客户端

132. Ribbon负载均衡算法7种(不需要全部记住,只需要记住3-4种就行)

AbstractLoadBalancerRule:负载均衡算法的抽象类,定义了算法的接口。

  1. 轮询RoundRobinRule默认情况下是
  2. 随机RandomRule
  3. 重试RetryRule
  4. WeightedResponseTimeRule(权重):响应速度最快的权重越大,权重越大则选中的概率越大。

133. Niginx负载均衡算法

134. Ribbon和Feign区别

消费者客户端有两种编程风格:

  1. eureka(服务的发现)+ribbon(客户端服务的负载均衡,自己给RestTemplate手动添加@LoadBalanced注解)+RestTemplate(HTTP请求调用远程的微服务)
  2. eureka(服务的发现,不用写ip端口号)+ribbon(客户端服务负载均衡,负载均衡不需要手动添加)+feign远程服务调用,接口的方式来做的

feign只需要关注接口的调用,不需要关注HTTP协议如何发送了,但是它的底层会把接口的调用变成HTTP协议发送

135. Hystrix的作用

  1. 服务降级(客户端):某一个微服务的所有功能进行降级的。当依赖的服务出现问题时,容错机制会自动将请求转移到备用服务,避免级联故障,提高系统的可用性。
  2. 服务熔断(服务端):某一个接口功能进行熔断降级的。当依赖的服务持续多次出现故障,熔断机制会将请求快速失败,避免请求积压,保护依赖的服务。
  3. 服务监控:Hystrix会监控微服务间的调用和响应时间,当响应时间超过阈值时,会触发熔断机制,进而熔断相应的依赖服务。

136. SpringCloud的优点

  1. 统一配置管理:Spring Cloud Config为微服务架构中的微服务提供集中化的配置管理,配置服务器可以集中存储配置文件,并为各个服务应用进行配置。
  2. 服务发现:服务发现是微服务架构中的重要组件,它负责在各个微服务实例之间进行自动化的服务注册和发现。
  3. 断路器:断路器是微服务架构中的重要组件,它实现了对依赖服务的自动熔断机制,避免级联故障,提高系统的可用性。
  4. 路由:Spring Cloud Zuul是基于Netflix的Zuul组件,它提供动态路由,监控,弹性,和安全等功能。
  5. 负载均衡:Spring Cloud Ribbon是基于Netflix的Ribbon组件,它是一个客户端负载均衡器,它可以根据负载均衡策略,自动地将请求路由到相应的服务实例。
  6. 统一的监控:Spring Cloud Sleuth为微服务架构中的服务调用提供统一的监控。
  7. 控制总线:Spring Cloud Bus为微服务架构中的各个服务提供一个总线,用于广播状态变化,如配置更新,服务实例上下线等。

136. Zuul一共有三个作用

  1. 路由:它基于请求信息,将请求路由到相应的微服务实例。
  2. 网关
  3. 过滤

137. 一般微服务框架中有哪些子模块

  1. api:微服务提供公共的配置/工具类
  2. 注册服务:服务注册/服务发现
  3. 网关服务:给微服务提供一个统一的路由地址,权限token
  4. 多个真正进行项目逻辑开发的微服务

138. Elasticsearch常用的是那些?

  1. match
  2. multi_match
  3. trem
  4. font-Size

139. Elasticsearch常用的是那些?

140. 单表查询

  1. 编写顺序:select … from where group by having order by limit
  2. 运行顺序:from where group by having select order by limit

141. 多表查询

  1. 七种

142. 联合查询 union | union all

143. 事务的四大特性ACID

原子性、一致性、隔离性、持久性

144. 一些数据库的知识点

  1. 数据库的变量、数据库流程控制{分支if case、循环loop while repeat}

  2. 数据库存储过程和函数

  3. 数据库的视图

145. MySQL高级

  1. 存储引擎
  2. 索引
  3. 优化

选择

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修饰的方法可以直接通过类名来调用


Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐