JAVA基础
一、特殊字符
\t 相当于tab键 --空格
\b 退格--删除后面第一个字符 缩进
\f 控制台输出相当于如图 ---一个箭头的形状
\n 换行--换到下一行开始
\r 回车--重新回到本行开头开始
SE\EE\ME-->标准版\企业版\微型版
1. Java 是如何实现跨平台的?
我们编写的 Java 源,编译后会生成一种 .class 文件,称为字节码文件,Java 虚拟机(JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行,只要在不同平台上安装对应的 JVM,就可以运行我们编写的 Java 程序。通过 JVM 这一 “中间层” ,就能在不同平台上运行.
2. 什么是 JVM ?
是JAVA虚拟机,JVM 能够跨计算机体系结构来执行 Java 字节码,主要是由于 JVM 屏蔽了与各个计算机相关的软件或者硬件之间的差异,使得与平台相关的耦合统一由 JVM 提供者来实现。
3. JVM 由哪些部分组成?
类加载器:JVM 启动时将class 文件加载到 JVM 内存中
执行引擎:负责执行 class 文件中包含的字节码指令
本地方法库:主要是调用C或C++实现的本地方法及返回结果
运行时数据区:方法区、java堆、java栈、本地方法栈和程序计数器
4. JDK 是什么?
JDK是java语言的软件开发工具包开发环境,JDK是整个java开发的核心(java开发工具\基础开发库\基础开发库源码)。主要给开发人员使用
在JDK目录结构中,lib目录下存放的都是库文件,而bin目录下有编译器、解释器和许多工具(如服务器工具、IDL、package工具和jdb等)
5. JRE是什么?
JRE是java运行环境,如果只是运行Java程序,安装JRE即可.主要给用户使用
6. Java中JVM的内存结构?
栈内存:一些基本对象的引用都是在栈内存中进行分配,是私有线程
堆内存:存放new创建的对象,是线程共享
方法区:存放所有class和static变量还有常量,也是线程共享
本地方法栈:和栈内存的作用差不多,栈是服务java方法的,本地方发栈服务虚拟机调用Native方法的
程序计数器:也称寄存器.用来存储程序运行时JVM的指令,是私有线程
7. 面向对象的特征?
面向对象就是把现实中的事务都抽象成为程序设计中的“对象”
继承:子类继承父类的成员和方法,拥有和父类同样的功能 (extends--代码复用,减少子类代码,子类重写)
封装:指隐藏对象的属性和实现细节,控制成员的访问和修改权限,通过特定公开的方法暴露给外面访问 (private--保证了程序安全性)
多态:指同一个行为具有多个不同的表现方式(程序灵活性 比如重载\重写父类引用指向子类对象)
8. 创建对象的几种方式?
- New关键字
- 使用Class类的newInstance方法--反射
- 使用反序列化--当我们序列化和反序列化时,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数.反序列化需要实现Serializable接口
10.变量的定义?
全局变量(成员变量):类里方法外,可以用于本程序所有对象或函数
局部变量:方法里,只能用于本方法里,它与全局变量作用域不同
静态变量:被static关键字修饰,可通过类名直接引用,在类加载的过程中只会分配一次内存空间 private static int staticInt = 2;
实例变量:没有修饰的变量 必须创建了实例对象(如new)才可以,每次创建对象,都会为每个对象分配内存空间private int random = 2;
11. 常量的定义final?
静态常量 作用域是全局的,通过类名可直接调用public static final double PI = 3.14;
成员常量 类里方法外 final int y = 10;
局部常量 方法里 final double x = 3.3;
类-->无法被继承 方法-->无法被重写 属性-->无法被重新赋值
12. 常用的类\包\接口个举例子?
类:string integer class BufferedReader BufferedWiter FileReader FileWirter
包:java.lang java.io java.util java.sql java.servlet
java.lang 包含java中的核心类 string integer
java.io 包含能提供多种输入输出功能的类
java.util 包含一些工具类
java.sql 包含与数据库进行操作的一些类
java.servlet 包含一些使用java开发web应用的类
接口:list Map servlet Remote NoList
13. Java中访问修饰符?
Private 同类
Default 同包 默认
Protectde 本包的任意子类
Public 任意
14. Int和integer有什么区别?
Int是基本类型
Integer是java为int提供的封装类型
Integer变量必须实例化后才能使用;int变量不需要
引用类型和原始类型的行为完全不同,并且它们具有不同的语义
Int默认值为0 而integer默认值为null
15. &和&&的区别,三元(三目)运算是什么?
&是位运算符,表示按位与运算 两边都是1结果才为1
&&:双与,是逻辑运算符,一边为falise则结果为false,并不判断另一边&&具有短路与功能
三元:条件表达式?A:B---三目
16. 数组的创建?
静态创建:
char[] c1 = { 'h', 'e', 'l', 'l', 'o' };
char[] c2 = new char[] { 'h', 'e', 'l', 'l', 'o' };
动态创建:知道数组的长度 后期再动态存数据
char[] c3 = new char[5];
c3[0]='h'; c3[1]='e'; c3[2]='l';
Arrays.toSrting-->查看数组里的元素
Arrays.sort-->数组快速排序
Arrays.copyOF-->对数组进行扩容 可以指定扩大或缩小但是不改变原数组
17. 冒泡排序
public static int[] f(int[] a) {
for (int i = 1; i <= a.length - 1; i++) { // 外层循环控制比较的轮数 n个数 就是n-1
for (int j = 0; j < a.length - i; j++) { // 内层循环控制的是每轮中相邻比较+互换位置
if (a[j] > a[j + 1]) { // 相邻比较 用if来判断
// 交换数据
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
System.out.println("第"+i+"轮的结果" + Arrays.toString(a));
return a;// 把排好顺序的数组a返回
}
18. String和stringBuffer\stringBuilder的区别?
都是java中处理字符串的常用类,属于引用数据类型
执行速度StringBuilder > StringBuffer > String
String:字符串常量,被final修饰,不能被继承,创建后不能更改适用于少量的字符串操作
StringBuilder:字符串变量,非线程安全适用于单线程下在字符缓冲区进行大量操作
StringBuffer:字符串变量,线程安全,也是final修饰不允许被继承,适用多线程下在字符缓冲区进行大量操作的情况
由于String并不是修改而是将原先的对象先回收在创建新对象赋值所以执行速度慢,StringBuilder和StringBuffer是变量,对对象操作时是直接进行更改,而不进行创建和回收操作,所以执行速度要快
19. string字符串操作的常用函数?
Length() toString() charAt(获取指定下标字符) substring(开始截取字符串)
toString() hashCode() equse() getClass() Object常用函数
20. 描述Math.abs(x) //Math.random() //Math.round(x)函数的作用?
Math.abs(x)求绝对值
Math.random()求随机数,一般是0-1不包括1也可以自己定义取值范围
Math.round(x)四舍五入 将数值整体加0.5,向下取整
21. ==与.equals()的区别?
术语来讲的区别:
1.==是比较用算符,判断两个变量或实例是不是指向同一个内存空间
equals是判断两个变量或实例所指向的内存空间的值是不是相同
2.==是指对内存地址进行比较
equals()是对字符串的内容进行比较
3.==指引用是否相等
equals()指的是值是否相同
22. 重载(Overload)与重写(Override)的区别?
重载:在一个类里,方法名相同但是方法的参数列表不同,对方进行重载
重写:子类于父类之间,子类重写方法的参数列表必须与父类被重写的方法相同,访问修饰符必须大于或等于被重写的方法修饰符
23. 接口(interface)和抽象类(abstract)的区别?
1.首先接口的方法是默认被public修饰的,并且没有方法体
抽象类可以有非抽象方法。
2. 接口中的属性都是被public static final修饰的,只有常量没有变量,
抽象类既可以定义变量也可以定义常量。
3. 一个类可以实现多个接口,但是只能继承一个抽象类。实现接口的时候必须实现接口所有的方法;
但是继承抽象类时如果不实现所有的抽象方法,该类也必须是抽象类。
24. this和super的区别?
This访问本类,super访问父类,构造方法不能被继承不符合语法要求(构造方法需要与类同名)
This可以代表当前对象,而super不可以
25. Mybatis中${}与#{}的区别?
#{}将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.例如select * from user where name = 'zhangsan'
$符号一般当做占位符,将传入的数据直接显示生成在sql中.例如select * from user where name = zhangsan
总结:一般我们使用#{},不使用${}因为这样可以有效防止SQL注入的问题
#{}会进行预编译,安全.${}会引起sql注入,${}会直接参与sql编译。
26. Sleep和wait的区别?
sleep的作用是让线程休眠制定的时间,在时间到达时恢复 属于Thread类
wait方法将会将调用者的线程挂起,直到其他线程调用对象才会重新激活调用者
sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源 属于Object
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常。
休眠拓展
java之TimeUnit.SECONDS.sleep()详细分析
TimeUnit是java.util.concurrent包下的一个类名
主要功能是暂停线程的操作
与Thread.sleep()一样的功能都是暂停线程
但是他的可读性更高,下面是TimeUnit具体使用变量
TimeUnit与 Thread.sleep()对比
与Thread.sleep()一样的功能都是暂停线程
但是TimeUnit.SECONDS.sleep()更具有可读性
Thread.sleep()只是精确到毫秒,参数选择也只有毫秒数,可读性低,但调用都是同样功能,而TimeUnit.SECONDS.sleep()参数选择多,枚举变量的参数具体可查看上方
Thread.sleep()代码实列比如
Thread.sleep(5*60*1000);这样比较有可读性,但乘起来可读性较低
27. final和finally和finalize的区别?
Final表示最终的不可变的,可以用来修饰属性\方法\类
Finally则是异常结构的一部分,在try-catch后面添加,表示都会执行的一部分
finalize是方法名,finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的
28. 构造器Constructor
构造器=构造方法 没有返回值类型 不能被继承无法重写但是可以重载
Java类必须有一个及以上的构造器,构造器的名字必须与类名相同
系统或默认提供一个无参数的构造器,也可以自定义构造器,
29. 代码块执行的顺序
静态代码块-->构造代码块-->构造方法-->局部代码块
1)静态代码块:专门用来完成一些需要第一时间加载并且只加载一次的资源
2)构造代码块:创建对象时才会触发,用来提取构造方法中的共性内容
3)构造方法:创建对象时调用,用来创建对象,在构造代码块执行后执行
4)局部代码块:调用所在的方法时才会调用,用来控制变量的作用范围
30. 对象的初始化过程
- 给对象分配对象
- 将对象的实例变量初始化为其变量类型的默认值
- 初始化对象,给变量实例赋予正确的初始值
31. 能否可以从一个static方法内部发出对非static方法的调用?
不可以,static方法调用时不需要创建对象
非static方法是要与对象关联在一起
32. session和cookies的区别?
两个都是用来跟踪浏览器用户身份的会话方式。
Session将数据存到服务器端,cokkie将数据存储到客户端
Cokkie是不安全的别人可以通过分析本地的cookie并进行cookie欺骗
33. Session的生产和销毁?
Web容器加载,session生命周期开始,通过拦截器判断用户是否是首次登陆(调用方法将用户信息与sessionid进行绑定),这样在后续的访问中,首先进入拦截器看一下是否能通过,通过就进行访问反之则进行拦截,服务器关闭或服务停止sessin销毁
34. 监听器和过滤器和拦截器?
监听器:监听客户端的请求和服务器端状态变化的组件,监听发生变化时执行监听代码
watch:{监听器名称(当监听器生效属性的数据)}
过滤器:实际上就是对web资源进行拦截,做一些处理后交给下一个过滤器或者servlet处理,通常都是用来拦截的 设置字符编码\过滤敏感词汇
Vue.filter(‘过滤器的名称’,过滤器执行的方法) 用|线隔开
拦截器:依赖于web框架,拦截未登录\审计日志等
35. servlet?
Servlet是浏览器与服务器进行交互的一种机制,实际上是一个java接口,定义一套网络请求规范
两个核心对象Request包含了用户的所有请求相关信息(参数\协议\地址)
Response包含了服务器相关的信息(服务器地址\返回的数据)
浏览器向服务器(web)发起请求,服务器里面包括servlet,servlet负责处理服务器接收过来的请求,处理时有时候还需要通过mybatis处理数据库并返回,然后通过html/jsp返回浏览器,浏览器进行解析并展现
36. Servlet的生命周期?
第一次访问servlet或访问服务器的时候创建实例,serlet实例创建后执行init()方法,用于执行一些servlet初始化操作,然后调用servlet()方法,根据请求方式调用doGet()或doPost()方法,服务器关闭执行distroy()方法完成销毁
37. 前端:控件中的Click和Change区别?
Click事件是选择列表项,而Change事件则是编辑内容,这两个事件的结果都是使控件中内容发生变化,但是一个是通过鼠标点击,即Click;另一个是通过在输入框中编辑内容,即Change。
38. 前端调用后端执行过程?
用户html页面中触发ajax请求,访问后端服务器,Web中间件拦截用户请求,转发后端程序进行数据处理,一般还需访问数据库,然后逐层返回。数据库返回数据处理服务,数据处理服务返回Web中间件,Web中间件返回ajax调用,将数据封装到返回的js对象中,目前主流返回数据为json字符串。在回调callback的方法中解析json中的数据,最终回显到页面上。
39. 前端一些概念?
Html 页面展示,形成静态网页
Css 页面美化,用来修饰页面效果,配合HTML,用style属性
Js(JavaScript) 形成页面交互进行前后端交互
Jquery 就是为了简化了JSJavaScript代码,内部分装了js
Json 是轻量级的客户端和服务器之间数据交换的格式,本质上就是一个字符串
Ajax 为了提高浏览器的响应速度,ajax可以实现异步访问-局部刷新,使用JQuery提供的ajax技术 ---后面还有axios
Vue 构建用户界面的渐进式框架
NodeJS 基于Chrome的V8引擎执行js速度非常快
Maven 项目管理工具.主要是管理jar包.包括:jar包的下载,安装,保存
Git 是一个项目托管工具
40. JavaScripr三种弹出消息提醒的命令?
警告窗口 alert
确认窗口 confirm
信息输入窗口 prompt
41. JavaScripr中的事件?
鼠标点击事件 onclick
失去焦点事件 onblur
键盘事件 onkeydown
42. JavaScripr中怎么解决事件冒泡?
由于事件操作的过程中可能有嵌套的关系,所以会触发冒泡机制如果需要阻止冒泡,通常使用.stop进行修饰
43. Ajax请求中携带哪些参数?
Url地址 \ 提交数据 \ 回调函数 \ 返回值类型
44. Ajax请求方式有几种?
Get / post /delete / put
45. Get和post请求的区别?
都是向服务器提交数据,并且都会从服务器获取数据
传参方式:get通过url地址传输 post通过请求体传输
传输长度:get有长度限制(7-8k) post无限制
安全性:get不安全因为数据放在url中 post安全因为用户看不到
46. Jquery 中each方法如何跳出和结束当前循环?
return true 跳出当前循环(普通的循环中使用’continue’)
return false 停止循环(普通的循环中使用’break’)
47. Break \ continue \ return的区别?
Break 停止当前所有循环体
Continue 跳出当前循环体,继续执行下一个循环
Return 和循环没有关系,就是跳出该函数,结束一个方法
48. Var 和const和let的区别(前端定义属性修饰符)?
Var是声明变量的修饰符,没有作用域
Const有作用域的常量声明
Let有作用域的变量声明
49. Jquery如何通过id获取value值?
通过jquery.js插件 通过$(“#id”).val()获取
50. Jquery的选择器?
基本选择器 #id(根据id匹配) .class(根据类匹配) *(匹配所有)
层次选择器
过滤选择器
51. Vue的理解?
构建用户界面的框架,前端框架.Vue有八大生命周期,可以使用钩子来调用八大生命周期
52. Vue中常见标签?
V-model 双向绑定
V-text 优化数据后展现
V-bind 动态绑定样式(CSS样式)
53. Vue中组件?
组件系统是Vue的另一个概念,允许我们使用小型的独立的可复用的组件构建一个大型的应用.各个组件单独维护
有全局组件(所有的Vue对象都可以使用)
局部组件(只有在自己定义的Vue对象中使用)
54. Vue中路由?
可以简单理解为指向,点击一下跳转到指定页面,重定向//路由嵌套
55. Vue-cli工厂中常用的npm命令?
Npm install 下载资源包的命令
Npm run dev 启动vue-cli开发环境的命令
Npm run build 生成生产环境部署的命令
Npm run build 查看生成生产环境部署资源文件大小的命令
56. Jsp和servelt?
Jsp本质就是servlet,只不过是JVM不识别jsp代码,只识别java代码,web容器将jsp代码转换成jvm可以识别的java代码,就是servlet
Jsp有内置对象 HttpServlet \HttpServletRequest \HttpServletResponse
57. http和https的区别?
http是超文本传输协议 端口是80
https是具有安全性的加密传输协议 端口是443
58. http常见状态码?
200 请求成功
400 请求语法错误或者参数错误
404 找不到请求路径
500 内部服务器错误
59. Java中进程/线程?
进程:指正在运行的程序.有独立性\动态性\并发性
线程:是进程的单位,实际运行的单位
一个操作系统中可以有多个进程,一个进程中至少包含一个线程(单线程程序),也可以包含多个线程(多线程程序)
多线程的创建
方式一:继承Thread 简单但是无法继承其他类 (重写run方法,调用start()方法来启动该线程)
方式二:实现Runnable接口 复杂可以继承其他类 (重写run方法,调用start()方法来启动该线程)
方式三:实现callable接口 (重写call方法)
方式四:线程池
60. 并行和并发?
并发:多个进程抢占CPU
并行:同一时刻,多个CPU各自处理各自进程
61. 线程的状态
- 新建状态 new 当线程创建对象之后
- 可运行状态(就绪状态)runuble 当调用线程对象方法的时候
- 运行状态 runing 当CPU调度了处于就绪状态的线程
- 阻塞状态 blocked 由于某种异常放弃对CPU的使用
- 结束状态 dead 线程以结束或退出run方法
62. 线程中.run()和.start()方法的区别?
Run()在执行的时候只能是当作一个顺序执行的单线程普通方法执行,并没有多线程编程的效果
Start()对应的是就绪状态,要想使用多线程,必须调用start()才是真正的启动
63. 线程中同步于异步(抢票案例)?
同步:体现了排队的效果,同一时刻只能有一个线程独占资源,其他没有权利的线程排队。
坏处就是效率会降低,不过保证了安全。例如银行转账
异步:体现了多线程抢占资源的效果,线程间互相不等待,互相抢占资源。
坏处就是有安全隐患,效率要高一些。 例如逛网页
同步调用:客户端等待调用执行完成并返回结果
异步调用:客户端不等待执行完成返回结果,不过依然可以通过回调函数接收到返回结果的通知.
如何解决互锁?
进程间的互锁,假设有两个线程,线程1的完成需要用线程2 的资源,线程2的完成需要用线程1的资源。当两个线程都启动后,线程1 等待线程2 的资源, 线程2 等待线程1 的资源,以致于两个线程都没办法完成,都在等待状态。这种现象就叫做线程间的互锁。
- 加锁顺序(线程按照一定的顺序加锁)
- 加锁时限(线程尝试获取锁的时候加上一定的时限,超过时限则放弃对该锁的请求,并释放自己占有的锁)
64. 线程中的悲观锁与乐观锁?
都是实现并发控制的主要手段,是一种思想.
乐观锁比较使用于读多写少的情况,悲观锁适用于写多读少的情况
65. 如何选择用悲观锁还是乐观锁?
为了保证多线程执行的情况和单线程一样保证多线程安全所以使用锁
响应效率:就用乐观锁 可以用版本号机制和CAS算法实现 ReentrantReadWriteLock 读写锁
冲突频率:就用悲观锁 一般使用数据库的锁机制实现 synchronized 互斥锁 ReentrantLock 排他锁 ABA问题
在多线程程序中 + 有共享数据 + 多条语句操作共享数据(线程不安全)
66. synchronized互斥锁 与ReentrantLock排他锁 的区别?
都是悲观锁,synchronized互斥锁 当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里.ReentrantLock 排它锁在同一时间内仅有一个线程可以访问.
ReentrantLock 只适用于代码块锁,而 synchronized 可用于修饰方法、代码块等。
67. Java中主要有几种流?
字节流 字符流 字节流继承inputStream outputStream 字符流继承Reader Wreter
68. Java中序列化与如何实现序列化?
序列化就是将对象的状态信息装换成可以存储或传输形式的过程
序列化:利用ObjectOutputStream,把对象的信息,按照固定的格式转成一串字节值输出并持久保存到磁盘
反序列化:利用ObjectInputStream,读取磁盘中之前序列化好的数据,重新恢复成对象
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,实现它只是为了标注该对象是可被序列化的,然后使用一个输出流来构造一个 ObjectOutputStream(对象流)对象,接着使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
序列化中serialVersionUID的作用是什么?
当程序执行序列化的时候,需要将对象信息写入到磁盘中,会根据当前这个类的结构生成一个版本号ID,当反序列化的时候,程序会比较磁盘中的版本号和当前的类的结构生成的版本号ID进行比较,如果一直则反序列化成功,加上版本号有助于我们的类结构发生了变化,依然可以之前已经序列化的对象反序列化成功
69. Java中反射?
是 Java 程序开发语言的特征之一,类不是你创建的,是你同事或者直接是第三方公司,此时你要或得这个类的底层功能调用,就需要反射技术实现。
70. Java中反射的前提以及如何通过反射获取对象实例?
获取字节码对象,获取字节码对象有三种方式
Class.forName(“类的全路径”);
类名.class
对象.getClass();
71. 数据库中的聚合函数?
Max min sum svg平均值 group by分组 order by+asc//desc排序 like(模糊查询) limit(分页) like(模糊查询)--%多个字符 _一个字符 where(条件) and(与条件) or(或条件) dietinct(去重)
count(列名 | *) count(列名)则表示当前列有多少值 (多行函数会默认过滤null值,即不统计`null值)
Count(*)则表示行为单位,统计有多少行记录
分页 :Select * from 表名 limit (页码-1) * 每页显示条数, 每页显示条数
最大值:select max(列名) from 表名;
查询班里男生总人数:select count(*) from 表名 where 性别 = 男 ;
查询班里男/女生各总人数:select count(*) from 表名 group by 性别;
查询某一个班里男女生人数:select count(*) from 表名 where 班级=班级 group by 性别
查询每个班里男女生总人数:select sum(性别=男),sum(性别=女),班级字段 from 表名 group by 班级字段
模糊查询:select * from 表名 where 字段名称 like “%赵_”
查询工资从低到高:select 工资,姓名 from 表名 order by 工资字段名 默认升序 desc降序
查重:根据部门职位进行去重 select distinct job,dept from emp;
查询1993年到1995年出生的员工:select name,birthday from emp WHERE YEAR(birthday) BETWEEN 1993 and 1995
查询本月过生日的员工:select name from emp where month(now())=month(birthday )
查询薪资,并且薪资后面添加元:select name,concat(sal,'元') 薪资 from emp;
如果数据表中有null值,用ifnull关键字,里面两个参数(字段名,0)
查询季度问题:select year sum(case when month=1 then sale end) as 第一 sum(case when month=2 then sale end) as 第二 sum(case when month=3 then sale end) as 第三 sum(case when month=4 then sale end) as 第四 from 表明 group by year
删除id不同,其余信息都相同的信息:delete from 表 where id not in (select id from (select main(id) from 表 group by name age ) AS c)
72. 数据库中的常用数据类型?
数值 int double
字符 char varchar
时间 datatime timestamp
73. 数据库中的时间函数?
#year(当前年) month(当前月) day(当前日)
#hour(当前时) minute(当前分) second(当前秒)
74. 数据库中多表查询?
中间添加union all关键字查询两张表所有
left join on左边的所有数据和右面满足了的数据
right join on右边的所有数据和左面满足了的数据
例如:
select * from emp right join dept #右连接,取右边的所有和左边满足了的
on emp.deptno = dept.id #描述了两张表的关系
and emp.ename='tony' #过滤条件
75. 数据库中where和having的区别?
都是进行条件判断筛选过滤的
Where是在分组之前判断是约束声明 having是在分组之后进行判断是过滤声明
Where后面不可以使用聚合函数 having中可以使用
76. 数据库中语法?
insert into 表名(字段1,字段2,字段3) values (值1,值2,值3);
delete from 表名 [where 条件]
update 表名 set 字段 = 值,字段2=值[where 条件]
select 查询的内容(字段名1,字段名2) from 表名 where 条件
77. 数据库中的事务?
事务就是将一堆的SQL语句绑定在一起执行, 所有SQL都执行成功了才算成功, 但凡有一条失败就按全失败来处理
原子性:都成功才成功,一个执行不成功都失败,如果失败回滚到事务开始之前的状态
一致性 :事务在执行前后的业务数据之和是保持一致的,比如转账
隔离性:当多个用户 并发的 访问数据库时,如果操作同一张表,数据库则为每一个用户都开启一个事务,且事务之间互不干扰,也就是说事务之间的并发是隔离的
持久性:一旦提交将会永久保存,及时宕机或者断电也不会丢失提交的实务操作
begin;---开始事务 rollback;---回滚事务 commit;---提交数据
78. 数据库中的隔离级别?
脏读:是指在一个事务处理过程中读取了另一个事务未提交的数据。
不可重复读:对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询过程中,数据被另外一个事务修改并提交了。
幻读:事务非独立执行时发生的一种现象,即在一个事务读的过程中,另外一个事务可能插入了新数据记录,影响了该事务读的结果
79. 数据库里的索引和约束是什么?
索引是一种组合数据结构为了提高数据的检索速度,索引是建立在数据表上,根据一个或多个字段建立的,可以帮助我们快速的进行数据的查找(索引采用B+数的数据结构存放数据,横向数据越多纵向就越少,和磁盘的交互就越少),不适合有太多占用内存,一般不超过5个 普通索引index主键索引primary key唯一索引unique 复合索引
约束是为了保持数据的完整性,约束有非空约束not null,唯一约束unique ,主键约束primary key auto_increment,外键约束foreing key等等。
80. 数据库里的索引的创建与删除?
创建: Create index 索引名 on 表名(列名) create index i_name on emp(name)
删除: drop index 索引名 on 表名 drop index i_name on emp
81. 数据库里的约束的创建与删除?
在建表的时候进行设置
create table dept(
id int primary key auto_increment, -- 部门编号
name varchar(20) -- 部门名称
);
82. 数据库里索引的类型?
普通索引:不允许有空值,指字段 唯一、不为空值 的列
唯一索引:索引列的值必须唯一,但允许有空值;主键会自动创建唯一索引
复合索引:一个索引同时包括多列
主键索引: 是一种特殊的唯一索引,在一张表中只能定义一个主键索引
In // or关键字就不走索引 ,like模糊查询,前通配不走索引,后通配走索引
83. 主键约束和(非空\唯一约束)的区别?
- 主键约束 和 非空+唯一 特点是相同的, 都是不能为空且不能重复
- 主键约束除了非空且不能重复之外, 还可以表示唯 一一行表记录, 即作为表记录的唯一标识。
外键约束是用于表示两张表数据之间的对应关系
84. 怎么优化sql语句?
1)查询的时候尽量不适用select *而是用具体字段
2)避免在where中使用or来连接条件
3)使用varchar代替char
4)创建name字段的索引
5)尽量使用数值代替字符串类型,比如用0/1代替男/女
6)频繁查询的字段上添加索引
7)索引不宜过多,一般5个以内
8)索引不适合建在有大量重复数据的字段上
9)Where限定查询的数据
10)批量添加数据 /分批次删除大量数据 /把数据进行伪删除
11)先使用where判断再使用分组group by
85. 什么时候不能添加索引?
- 数据唯一性差,一个字段有几种值的时候
- 频繁跟新的字段
- 降低了对数据库增、删、改的效率
86. left join 和inner join和right join的区别?
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
87. 说说分库与分表的设计?
分库与分表目的在于减轻单库或单表负担,提高查询性能,缩短查询时间
分表分为垂直拆分和水平拆分
水平拆分就属于随机分表
垂直拆分就按照不同功能\不同字段\不经常修改的字段\大文本字段登的方式来拆分
88. 数据库存储过程?
Mysql存储过程是一组为了完成特定功能的sql语句集,经过编译后存储在数据库中,当需要使用该sql语句时,用户只需要通过制定存储过程的名字并给定参数就可以执行调用它
89. Char与varchar的区别?
存储数量不同,varchar存储多65532,char255
Char属于定长字符串,r如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。Varchar属于变长字符串
char的存储速度要高于varchar,但是会占用多余的空间
扩展:char 型变量中能不能存贮一个中文汉字,为什么?
可以 由于char类型是用来存储unicode编码字符的,unicode编码字符集包括了汉子所以可以存储汉子.但是有些特殊汉子没有包括在unicode字符集里面,所以不能存储特殊汉字
90. 数据库中Datetime和timestamp的区别?
datetime年月日时分秒,存储和显示是一样的
timestamp时间戳,存储的不是个日期,而是从1970年1月1日到指定日期的毫秒数
91. 数据库中drop\delete和truncate之间的区别?
drop删除表,包含数据和结构定义
delete和truncate只是删除表的数据,不删除表的结构
delete可以指定where条件,删除满足条件的记录,tuncate删除所有数据(清空数据)
92. Collection和collections的区别?
Collection是集合类的上级接口,继承他的主要接口有list和set
Collections是针对集合类的一个帮助类,它提供了一系列的静态方法实现对集合的搜索\排序
93. 集合中List Set Map的区别?
List集中的值允许重复,有序的数据结构,有下表(ArrayList底层是数组适合查询线程不安全初始容量是10,不够会以1.5倍的容量增长 LinkedList底层是链表结构适合增删 Cector底层数数组结构线程安全效率比arraylist底) 允许有多个null值
Set其中的值不允许重复,无序的数据结果(HashSet底层维护的是哈希表(实际上是hashMap的实例)一般用来去重 TreeSet底层是二叉树(实际上就是TreeMap)可以用来排序) 允许有一个null值
Map是成对的数据结构,键(K)值必须具有唯一性不可重复,如果重复值就会覆盖,是无序的数据结果(hashMap底层有数组和链表 TreeMap的实现就是红黑树数据结构) 允许有一个null值的key,value值null可以多个
94. 集合中hashSet为什么不能重复?
因为它的存储方式是把hashMap中key作为set的对应存储项,因为hashMap中的key值不可以重复
95. 集合中hashSet实现原理?
它是基于hashMap实现的,底层使用hashMap来保存元素,基本上都是调用hashMAP的相关方法来完成.
对于HashSet中保存的对象,正确重写其equals和hashCode方法,以保证放入的对象的唯一性
96. 集合中hashMap的数据结构?
hashMap实际上一个”数组+链表+红黑树”的结构
97. 集合中hashMap的存取实现原理?
HashMap实现Map接口,非线程安全的,当我们向hashMap中存元素的时候,先根据key的hashcode重新计算hash值,根据hash值找到该元素的下标位置,如果该位置有元素那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先存的放在链尾,如果该位置上没有元素,就直接将该元素放到此位置上.
98. hashMap与hashTable的区别?
hashMap不是线程安全的,继承父类AbstractMap,允许有一个null的key值,以2倍进行扩容
hashTable是线程安全的,继承父类Dictionary,不允许有null值的key和value,否则会报空指针异常,扩容机制是以2倍加1进行扩展.hashMap由于是非线程安全,效率高于hashTable,它们的父类不同
99. list/set和map的取值方式?
list/set :
先创建一个集合,new Arraylist,然后向里面添加参数,.add,直接可以通过打印list获取到里面的值:也可以循环获取里面的值,通过for(int=0;i<list.size();i++){system.out.prinle(list.get(i))}:也可以使用超级for循环for(string l;list){system.out.prinle(l)}:最后也可以使用迭代器list.iterator()通过while循环hasNext判断里面有没有下一个元素,通过next获取本次得到的元素while(it.hasNext()){system.out.prinle(list.next())}
map:
先创建一个map集合,new HashMap,然后向里面添加参数,.put(key,value)然后可以通过打印map获取值:也可以循环获取里面的值,先用keyset()方法将把map集合转换成set集合,然后再通过循环key得到对应的value值:也可以使用迭代器进行遍历已经将map转换成list的集合,map.iterator()--获取迭代器,通过while(it.hasNext()){Integer A=it.next(); String B=map.get(A); system.out.prinln(A+B);}
map取值并排序的方法:
100. 集合与数组的区别
数组可以储存基本数据类型和对象,而集合中只能储存对象
数组的长度是固定的,集合长度是可以改变的
数组存放的类型只能是一种,集合存放的类型可以不是一种(泛型为object)
101. 数组有没有length()这个方法? String有没有length()这个方法?
数组没有length()这个方法,但是有length的属性,string有length()这个方法
102. 什么事泛型技术?有什么作用?
又称为参数化类型,是一种类型代换的概念
作用:减少类型转换\提高执行效率\在编译时检查类型安全\提高代码的重用性
103. 常用的设计模式?
经过前辈反复实践总结出可以反复使用的方法
- 单例模式 (Singleton) 一个类只有一个实例(懒汉式\饿汉式)
懒汉:线程不安全(解决方式--加锁)
public class A {
Private static A a;
Private A (){}
Public static synchronized A geta(){
If(a==null){
a =new A();
} return a;
}
}
饿汉:线程安全
public class A {
Private static A a=new A();
Private A (){}
Public static A geta(){
return a;
}
}
- 代理模式 就是为其他对象提供一种代理机制以控制这个对象的访问
- 工厂模式 是用来创建对象的一种最常用的设计模式,我们不暴露创建对象的具体逻辑,而是讲逻辑封装在一个函数中,那么这个函数就可以被称为一个工厂 springIOC
Java中的23种设计模式:
Factory(工厂模式) Builder(建造模式) Factory Method(工厂方法模式)
Prototype(原始模型模式) Singleton(单例模式) Facade(门面模式)
Adapter(适配器模式) Bridge(桥梁模式) Composite(合成模式)
Decorator(装饰模式) Flyweight(享元模式) Proxy(代理模式)
Command(命令模式) Interpreter(解释器模式) Visitor(访问者模式)
Iterator(迭代子模式) Mediator(调停者模式) Memento(备忘录模式)
Observer(观察者模式) State(状态模式) Strategy(策略模式)
Template Method(模板方法模式) Chain Of Responsibleity(责任链模式)
104. 框架知识梳理?
SSM三大框架spring\springMVC\mybatis都是在MVC上继续演化
MVC是一种设计思想(Model模型、View视图、Control控制层) 分层达到松耦合
Spring MVC属于SpringFrameWork的后续产品已经融合在Spring Web Flow里面
Spring整合许多框架, 减轻开发者开发的难度,减少重复的代码
springBoot 简化新Spring应用的初始搭建以及开发过程
SSH 框架(Strut2+Spring+Hibernate)但是已被SSM框架替代,新的产品SpringBoot+SpringCloud 微服务
105. Mybatis框架?
MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架
简化了JDBC 跟好的完成了对象关系映射
<------代表小于 >----代表大于 <![CDATA[任意]]>-----万能符号
在mybatisPlus当中引入了条件构造器(querMapper)
106. JDBC和Mybatis的区别?
JDBC是java提供了一套专门用于和数据库对接的API,
MyBatis框架是轻量级封装了JDBC,我们已经看不到这些api,关注的是mybatis框架体系如何去使用,sql语句封装在配置文件中,便于管理与维护,降低了耦合度
107. Mybatis和MybatisPlus的区别?
MybatisPlus是mybatis的增强工具,用于简化开发提高频率,只作增强不做改变,支持mybatis的所有特性
Mybatis需要自己手写sql语句,
MybatisPlus提供了基本的CRUD功能,不需要自己编写,少量配置即可实现大部分CRUD操作,引入了条件构造器(querMapper)
108. Mybatis的(懒加载)延迟加载怎么设置?它的实现原理是什么
在mybatis配置文件(xml文件)中进行设置 setting标签
<setting name="lazyLoadingEnable" value="true">
<setting name="aggressiceLazyLoading" value="false">
它的原理就是使用CGLIB创建目标对象的代理对象,当调用目标方法进入拦截器方法
109. JDBC的执行流程?
1.引入jdbc驱动 2.连接数据库 3.获取传输器 4.编写sql语句 5.执行sql语句 6.对结果进行解析 7.关闭传输器对象
110. statement和preparedstatement的区别(jdbc获取传输器)?
preparedstatement 继承自statement,都是接口
Preparedstatement可以使用占位符,有预编译的效果,执行效率要高于statement
createStatement 也是获取传输器但是有sql的问题 推荐使用Preparedstatement
111. Mybatis框架是怎么操作数据库的?
MyBatis提供了两种操作数据库的方式,一种是通过xml映射文件,一种是通过java的接口类。按面向对象方式更加推荐接口方式,但如果复杂的多表映射,仍然需要使用xml映射文件的ResultMap方式实现。 在程序中通过[ namespace + id ]定位到要执行哪一条SQL语句不可重复
接口只是假象,其底层仍然是通过xml实现
112. mybatis中ResultMap和ResultType的区别?
都是用来映射sql语句的
ResultType只能完成简单的ORM,如果字段名和属性名一致 适用于单表查询
ResultMap只能完成复杂的ORM,如果字段名和属性名不一样,需要单独处理 适用于关联查询的结果封装,一般采用第三方的对象接收
ORM是指对象关系映射,是指从表里获取字段的值自动交给类里的属性保存
113. Mybatis中接口方式是怎么找到xml执行的?
SqlSession的getMapper方法找到类,通过反射可以获取到类的全路径(包名.类名),相加后就定位到某个xml的命名空间namespace,在根据调用的方法去找到xml中某个标签的id属性。从而实现价值接口,调用接口的方法而间接找到xml中的标签,通过解析xml获取这个标签的内容,从而获取到sql语句。
114. mybatis怎么映射sql语句?
首先配置mybatis-config配置文件,在里面进行配置连接数据库,然后在该配置文件中设置导入Mapper.xml配置文件,此文件里主要用来写sql语句,里面必须添加namespace和id的标签,因为程序根据name名称加id找到并执行sql语句
115. 重定向与转发?
redirect 重定向 当用户发起请求时,由服务器返回有效的网址信息.之后由用户再次发起请求的结构 由于是多次请求,所以不会携带用户的数据,用户的浏览器的地址会发生变化
forward 转发 由服务器内部进行页面的跳转.一般情况下 SpringMVC内部,以转化为主.会携带用户提交的数据.用户浏览器的地址不会发生改变
116.0 spring中懒加载(延迟加载)机制原理
spring默认初始化的过程中创建配置为单例的bean,但是如果bean非常多,spring就会花大量时间来创建bean.spring懒加载就是可以指定bean不在启动时就创建,减轻时间和内存的消耗.( 懒加载机制只对单例bean有作用,对于多例bean设置懒加载没有意义,因为多例bean本来就是在使用时才创建的)
在spring的配置文件(xml文件)中通过配置 lazy-init="true"来启用懒加载,也可以通过@Lazy注解开启懒加载
116. Spring中IOC和DI和AOP?
IOC控制反转 就是指将对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)交给了spring容器 底层实现利用了java自身提供的反射技术来创建对象
DI依赖注入 更加准确地描述了IOC的设计理念,动态的向某个对象提供它所依赖的其他对象,意思就是在我们创建对象之后,如何为对象的属性赋值
AOP面向切面编程 不改变程序的基础上添加一些额外功能(日志的记录\记录目标方法报错的日志\权限的检查)
117. Springboot与spring与springMVC与springCloud的区别?
spring是一个整合了许多第三方框架,其核心技术是IOC(控制反转,也称依赖注入,降低了程序的耦合性,将对象的创建的权利交给Spring管理,由Spring(第三方)管理对象的生命周期)和AOP(面向切面编程,在不改变原有程序逻辑的基础上增加一些额外的功能比 如日志、持久性、事务等)
Springboot特点开箱即用,简化了spring框架的初始搭建,是微服务框架的起点,他简化了开发过程,配置过程,使得我们能够更专注于程序功能的开发。Springboot专注于单体微服务接口开发和前端解耦
springMVC是spring基础之上的MVC框架,主要处理web开发的路径映射和视图渲染
Springcloud大部分功能都是基于springboot去实现的,它关注与全局的微服务整合与管理,将多个springboot单体微服务进行整合管理,它依赖于springboot开发,但是springboot可以单独开发
118. Spring中IOC实现原理?
IOC控制反转,是一种思想,以前创建对象都由自己把控,现在交由spring进行控制,实现了解耦.它是通过反射机制和工厂模式实现的,通过反射调用类中的set方法将事先保存在map集合中的类的属性注入到类中
DI--依赖注入,由容器动态的将某个依赖关系的目标对象注入到组件之中.其实就是在创建对象之后,如何为对象的属性赋值(get/set方法和构造方法注入)
119. Spring中AOP实现原理?
AOP面向切面编程是一种编程思想,利用代理模式扩展区业务功能,降低程序的耦合度(日志\权限的检查)
120. SpringBoot自动装配原理?
Springboot项目启动的时候会通过启动类上有个注解 @SpringBootApplication是一个复合注解,三个核心注解@componentScan注解意思是开启扫描注解的意思,扫描当前类下所有注解加载到IOC容器中并交给spring管理,@SpringBootConfiguration这个注解的底层是一个@Configuration注解,意思被@Configuration注解修饰的类是一个IOC容器。主要的注解@EnableAutoConfiguration意思是开启自动装配,下面有个@import注解,有个核心的方法selectimport中利用springfegtresloder工具类从springfeger文件中加载所以自动启动配置,然后排除过滤减少没有相关以来的配置的类,达到减少spring启动的时间,最终确定要配置得类,实现自动装配
121. SpringMVC运行流程?
- 用户发起请求,被前端控制器拦截
- 前端控制器不知道请求对应的执行方法,查询处理器映射器
- 当tomcat服务器启动的时候,处理器映射器就会加载@RequesMapping注解已经将请求路径与方法进行绑定,传回给前端控制器,以便后续执行
- 由于松耦合的思想,前端控制器拿到方法和将方法教给处理器适配器,无需人为干涉处理器适配器挑选合适的处理器进行执行程序,当业务执行成功之后,返回同一个ModalAndView对象,其中包含2部分,一个是Model(服务器数据)一个是View(页面逻辑名称)
- 前端控制器拿到对象后,交给视图解析器,通过解析页面逻辑名称,动态的拼接前缀+页面逻辑名称,最终形成了用户的页面展现
- 将Model服务器数据填充到页面中叫页面渲染,将数据传给前端控制器,页面完成展现,最终得到完整页面展现给用户
122. Spring中主要注解?
@Autowired(按照类型进行注入)完成自动装配的工作 和 @Qualifier(“名称”) 配合使用)
@resource(默认按照名程进行注入,找不到则按照类型进行注入)完成自动装配的工作
@Configuration 声明当前类是一个配置类
@Bean 注解的方法将会实例化、配置和初始化一个新对象
@value 为当前属性赋值
@Repository @service @controller @componet
@Aspect 表示切面
123. Spring中@Autowire\@Qualifier\@resource的区别?
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
个人总结:
@Autowired 默认按type注入
@Qualifier("cusInfoService") 一般作为@Autowired()的修饰用
@Resource(name="cusInfoService")//默认按name注入,可以通过name和type属性进行选择性注入
一般@Autowired和@Qualifier一起用,@Resource单独用。
当然没有冲突的话@Autowired也可以单独用
124. SpringBoot中主要注解?
@SpringBootApplication: 包含@Configuration、@EnableAutoConfiguration启动类
125. SpringMVC中主要注解?
@RequestMapping是一个用来处理请求地址映射的注解
@PathVariable用于restFul分格的参数获取
@Responsebody表示该方法返回值为json串返回给前端
@RestController表示该类返回值为json串返回给前端 (相当于注解@Responsebody+@Controller注解)
@RequestBody接收从前端传来的参数放到方法的参数中
@Transactional 表示service层 重写构造方法上用于对事物进行控制
126. MVC设计模式
Model:业务层 与数据库进行交互的代码(Mybatis-dao层)
View:视图层 一般指用户看到的内容(页面)
Controller:控制层 完成某项业务的具体操作过程(Controller层----Service层)
将代码写到一起不便于维护,通过mvc将代码进行分离
127. Spring中的AOP代理模式?
面向切面编程利用代理模式,降低程序耦合度,扩展业务功能的方法(解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭……让应用开发者可以只关心他的业务)
静态代理:事先写好代理类,需要为每一个对象都创建一个代理类,增加了维护成本和开发成本。缺点是每个业务类都要对应一个代理类,非常不灵活,所以出现了动态代理。
JDK动态代理:基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象
CGLIB动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类。
动态代理主要涉及三个要素:
1)抽象类接口
2)被代理类(具体实现抽象接口的类)
3)动态代理类:实际调用被代理类的方法和属性的类
128. Spring中AOP的基本概念?
连接点:用户可以被扩展的方法
切入点:用户实际扩展的方法
通知:扩展方法的具体实现
切面:将通知应用到切入点的过程 (通知+切入点表达式)
通知的类型:
1) before 在目标方法执行前执行
2) afertRetusning 在目标方法执行后执行
3)afterThrowing 在目标方法执行之后,抛出异常时执行
4)after 无论程序是否执行成功,都要最后执行的通知
5)around: 在目标方法执行前后 都要执行的通知
切入点表达式:
1).bean(“bean的ID”) 根据beanId进行拦截 只能匹配一个
2).within(“包名.类名”) 可以使用通配符*? 能匹配多个.
粒度: 上述的切入点表达式 粒度是类级别的. 粗粒度.
3).execution(返回值类型 包名.类名.方法名(参数列表…))
粒度: 控制的是方法参数级别. 所以粒度较细. 最常用的.
4).@annotation(包名.注解名) 只拦截注解.
129. Servelt是什么?
Servelt就是浏览器与服务器进行交互的一种机制
核心对象包括Request:包含了用户的所有请求(参数\协议\地址)
Response:包含了服务器相关信息(服务器地址\返回的数据)
130. 如何解决跨域?
违反了同源策略即为跨域 域名\协议\端口号不同即为违反同源策略
是由于JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。换句话说,只有JavaScript存在跨域问题
使用注解@CrossOrigin 可以添加到类上,也可以添加到方法上
通过Nginx反向代理 需要搭建一个中转nginx服务器,用于转发请求。
131. 常见的异常类有哪些?
NullPointerException 空指针异常
ClassNotFoundException 指定类不存在
NumberFormatException 字符串转换为数字异常
IndexOutOfBoundsException 数组下标越界异常
ClassCastException 数据类型转换异常
FileNotFoundException 文件未找到异常
NoSuchMethodException 方法不存在异常
IOException IO 异常
SQLException SQL异常
132. Java中异常处理机制的简单原理?
当java程序违反了Java的语义规则,java虚拟机会将发生的错误表示为一个异常.异常包扩2种情况,一种是java内置语义检查,如数组下标过界.另一种是程序员扩展的语义检查,程序员可以创建自己的异常
133. Java中异常如何处理,有什么关键字?
Jana中通过面向对象的方式进行异常处理,把各种不同的异常进行分类,每一个异常都是一个对象,它是Throwable类或者是其他子类的实例,当一个方法出现异常便抛出一个异常对象,该对象中包含异常信息,调用这个对象的方法可以捕获到这个异常并进行处理.
error是虚拟机内部错误,不是程序可以解决的(内存溢出问题)
Exception 是我们编写的程序错误,属于异常
Throw作用于方法内,用于主动抛出异常,确定会抛出的异常
Throws作用于方法声明上,用来表明一个成员方法可能抛出某些异常
Try用来指定一块预防所有异常的程序
Catch指定你要捕捉的异常类型
Finally为确保一段代码不管发生什么异常都执行的一段代码
微服务
134. Nginx中正向代理与反向代理?
正向代理:介于用户和目标服务器之间,用户明确知道目标服务器的地址,但目标服务器具体不知道哪个用户访问,保护了用户信息
反向代理:介于用户和目标服务器之间,很多用户访问目标服务器,由于目标服务器不止一台,所以nginx将不同用户按照业务需求分配给不同目标服务器处理,此时对于服务器哪个用户的信息是明确的,但是对于用户具体是那个服务器处理业务就不清楚了,保护了目标服务器的信息
135. Tomcat和netty的区别?
Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,Netty通过编程自定义各种协议
136. 什么是微服务?
微服务架构更多是指把系统里公共的业务抽取出来单独运维管理的思想,提高代码的复用率
137. 软件架构演变历程?
单体架构-->分布式-->微服务
138. 分布式架构中的关键技术?
Docker // nginx // redis
139. 为什么要用分布式?
程序的可用性 // 数据的容量
140. 分布式下的三高问题?
高可用:服务器一直运行说明100%性能 不能停止服务 使用集群
高并发:保证系统可以同时并行处理很多请求.可以增加单机硬件性能/提升单机架构性能/增加服务器
高性能:运行效率更高所占内存少CPU占用率低. 优化程序
141. 分布式架构的base理论?
Basically Available(基本可用)分布式系统在出现不可预知故障的时候,允许损失部分可用性,保证核心服务可以 比如损失响应时间\秒杀的时候损失别的服务(抢购功能暂时关闭)
Soft state(弱状态)运行系统在不同节点的数据在同步的时候存在延时
Eventually consistent(最终一致性)指数据副本在经过一段时间的同步之后最终达到一致,不需要实时同步,比如转账
142. 分布式架构下的CAP问题?
Consistency:指数据的强一致性。如果写入某个数据成功,之后读取,读到的都是新写入的数据;如果写入失败,读到的都不是写入失败的数据。
Availability:指服务的可用性 服务的每一个请求都会得到一个回应
Partition-tolerance:指分区容错 由于一些原因导致网络之间出现问题,各个子网之间不能连接但是子网内部是可以正常连接,导致整个系统的网络处于若干个不能相互连接但是可以自己在局部正常访问并满足用户服务
cp(zookeeper) // ap(eureka) 由于p是系统故障不可避免
143. 分布式架构的数据切分问题?
分库 // 分表
144. 分布式架构中用户的认证和授权问题?
Sso单点登录问题
145. 分布式架构中的服务注册和发现问题?
Nacos 底层是key/value结构
146. 分布式架构中的服务配置问题?
动态加载和刷新 保证了高可用-->数据变化不用重启服务器
147. 分布式架构中服务调度问题?
RestTemplate // openFeign-->调用过程更简单,但有可能影响性能
148. 分布式架构中负载均衡?
Ribbon (随机 权重 轮询 一致性hash算法 也可以自己定义)
149. 分布式架构中的限流\熔断问题?
Sentinel // hystrix (滑动窗口限流算法 漏桶算法 令牌桶算法 固定窗口限流)
150. 分布式架构中的黑白名单?
在网关geteway哪里设置,决定只让谁访问或者不让谁访问
151. 分布式架构中跨域问题?
Gateway
152. 分布式架构中的监控问题?
Zipkin,seluth
153. 分布式架构中聚合工程项目的创建\打包\部署问题?
Docker技术
154. Springboot和springcloud的区别?
- SpringBoot简化了xml配置,快速整合框架
- Springcloud是一套微服务解决方案
- Springcloud依赖与SpringBoot
- maven是springboot的基础 springboot是springcloud的基础
155. 微服务能解决那些问题?
配置管理、(注册中心eureka、zk)、服务发现、服务注册、断路器、路由策略、全局锁、分布式会话、客户端调用、接口网关(zuul)、服务管理系统
156. 微服务中02-sca主要执行流程
- 用户访问前端url地址
- 通过地址进行访问对应url地址的controller层
- Controller层进行执行对应业务,如果有切面则先执行切面
- 执行完切面之后将对应数据通过OpenFegin调用方式返回给下一个访问对象.需要在 OpenFegin接口中与远程调用的服务建立对应的url地址,
- 然后远程访问服务通过与OpenFegin一样的url地址进行获取
157. 微服务中主要注解:
@EnableHystrix 启动熔断降级服务
@EnableEurekaServer在项目启动类上使用可以将项目作为SpringCloud中的注册中心
@FeignClient(定义feign客户端)用于微服务之间的调用
@EnableFeignClients启用feign客户端
158. 微服务主要骨架介绍
Spring cloud 微服务
集成多种工具,解决微服务中的各种问题
注册和发现 (nacos//eureka) 专门负责服务的注册与发现
远程调用 负载均衡/重试 (openfeign) 实现各个服务之间的调用
负载均衡 (Ribbon) 实现本地服务器负载均衡
系统容错和限流 降级和熔断(sentinel//hystrix)
错误监控 (sentinel//hystrix Dashboard) hystrix仪表盘
配置中心 (nocas//config) 默认git存储
服务网关 (getway//zuul) 统一的调用入口 统一的权限校验
链路追踪 (zipkin//sleuth)
159. springcoud常用组件?
Eureka 服务的注册与发现
每一个服务里都有一个eureka client组件,负责将服务注册到eureka service中,
eureka service中有一个注册表,保存了各个服务所在的机器和端口号,
Ribbon 客户端负载均衡
Hystrix 服务器容错保护 (隔离\熔断\降级)
Feign 服务之间的调用
Zuul 网关 (统一的权限认证\限流\)
160. springcoud Alibaba常用组件?
Nacos 配置中心与服务的注册与发现
openFeign 服务之间的调用
Sentinel 分布式流控(实现限流\熔断\降级)
config 配置中心
getway 网关 权限认证和限流
ribbon 客户端负载均衡
zipkin 链路监控
161. 微服务中服务熔断?服务降级
服务熔断:当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
服务降级:为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的处理信息。
162. 什么是Nginx?Nginx的特性以及负载均衡策略有哪些?
Ngibx是高性能服务器,是一个解决并发访问服务器的东西,同时也是一个代理服务器
特点:高可用 \ 高并发 \ 低消耗
负载均衡策略有:随机 轮询 权重 一致性hash
163. Ribbon和Nginx的区别?
Nginx性能好,但Ribbon可以剔除不健康节点,Nginx剔除比较麻烦,
Ribbon是客户端负载均衡,Nginx是服务端负载均衡
164. Redis持久化机制?
Redis是一个持久化的分布式缓存数据库,是一个ke-value存储系统,是一个高性能的内存数据库,把内存中的数据同步到硬盘文件来保证数据持久化,重启后通过把硬盘文件重新加载到内存
165. Redis事务?
Redis是单线程,提交命令时其他命令无法插入其中,利用单线程实现了事务的原子性
multi 开启事务
exec 提交事务
discard 取消事务
watch 监控,如果监控的值发生变化,则提交事务时会失败
unwatch 去掉监控
166. Redis和mysql的区别?
类型不同 一个是关系型数据库 一个是非关系型缓存数据库
存储地址不同 一个存储在硬盘中,功能强大单数读取速度慢
一个存储在缓存中,读写速度要快于硬盘,一般是配合使用,简单稳定,支持丰富的数据类型(五种),丰富的特性
非关系型数据库存储的格式是key-value,可以存储基础类型以及对象或者集合,而关系型则只支持基础类型
167. Redis默认有16个数据库,不支持自定义数据库名称
selece关键字选择数据库 select 1
Keys * 查看所有redis里的数据 // keys ? // keys test[12] //
flushall 命令会清空所有数据库的数据 返回ok
type 查看键值的数据类型 返回string、hash、list、set、zset
exists///hexists
del///hdel///del
incr//incrby
decr//decrby
append
strlen///hlen///llen 计算字符串长度 如果没有键值则返回0
mset//mget hmset//hmget一次性多次赋值和取值 返回ok
expire 设置键值的存活时间 单位秒
ttl 查看键值存活时间
persist 取消键值设置存活时间
hkeys//kvals
lpush
rpush
lrange
linsert 向list列表里指定位置之前或之后放入元素 返回字符串长度
(before前//after后) linsert key键 fefore//after val键 添加的键
lset 向list列表里指定修改下标位置的参数 下表从0开始数 最后一位为-1
lpop 从头部开始删除 返回删除元素
rpop 从尾部开始删除 返回删除元素
lindex 查看list列表指定下标位置的元素
rpoplpush 从第一个列表删除尾部第一个元素并将此元素添加到第二个列表的头部
spop 随机删除set集合里的元素 返回删除的元素名
scard 获取set集合里的元素个数
smove 移动一个元素到另一个集合里 smove 集合A 集合B 元素名
sunion 合并两个集合进行显示 本质并没有合并 sunion 集合A 集合B
168. Redis的类型有哪几种?
String字符串 最常规的set/get操作
hash哈希 最常规的是hset/hget操作 hest user id 1 username jony mobile 11212
list列表 其实就是一个每个子元素都是string类型的双向链表 lpush/rpush/lrange
set集合 无序集合 不可重复 常见的sadd/smembers操作
Zset 有序集合
169. 如何让Redis某个key失效?
设置key值的生存时间 用expire
170. Redis怎样实现持久化机制?
默认是RDB持久化方式,RDB会对redis中的数据进行周期性的持久化后者手动持久化
,手动持久化就是输入save或者输入bgsave即可
另一种持久化方式就是AOF机制,对每条写入命令作为日志写入到有个日志文件中,redis重启的时候通过回放日志的命令来构建数据集.需要在redis的配置文件中修改appendonly no改为appendonly yes然后重启redis,这时候就会生成一个appendonly.aof的日志文件夹
说明:在生产环境中一般都是使用AOF持久化机制因为安全,但是在配置文件里AOF机制有三种模式可以选择,可根据自己需求设定
171. Redis中的save和bgsave有什么不同?
都是为了实现RDB的持久化机制,save是阻塞性的同步操作;.bgsave是异步操作
172. Redis中的RDB和AOF的优缺点?
RDB:性能影响小.保存的数据更加完整,缺点就是redis宕机或者重启数据有可能会丢失
AOF:保证了数据的可靠性,性能影响大
企业中是两种结合使用
173. Redis缓存型数据库中常见问题?
缓存雪崩:原有缓存失效过期,新缓存未到期间,大量用户访问该数据只能去数据库操作导致数据库压力过大出现宕机 考虑双缓存或者避免大量数据一起失效
缓存穿透:大量用户故意访问不存在的数据导致数据库崩溃 添加互斥锁
热点数据集中失效:大量用户同时访问一个热门的数据导致该数据失效
缓存一致性:要保证缓存数据库里的信息和数据库的信息要一致
缓存不一致:订票和查票就是不一致
174. Redis的过期策略都有哪些?内存淘汰机制都有哪些?
过期策略有定期删除(每隔一点时间随机抽取删除一些设置了过期时间的key)和惰性删除(有时候定期删除删不干净出现了惰性删除)
缓存垃圾淘汰算法:LRU(最少使用) LFU(最不经常使用) FIFO(先进先出原则)
175. Redis多机部署怎么保证数据一致性?
主从复制,读写分离(主数据库可进行读写操作,当发生写操作自动将同步到从数据库,从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。)
176. Redis是怎么处理大量请求?
redis是一个单线程程序,也就说同一时刻它只能处理一个客户端请求;
redis是通过IO多路复用(不同平台采用不同的实现)来处理多个客户端请求的
177. redis 和 memcached 有什么区别?
都是缓存数据库,区别是redis会周期性的把更新数据写入磁盘中,并在此基础上实现了主从同步
178. Linux常用命令?
Cd / 到更目录
Cd .. 到上一级目录
Pwd 查看当前目录位置
Ls / ll 查看当前目录下的所有文件夹
Mkdir 创建目录
Vi / vim 打开编辑文件 2、输入“/关键字”,按enter键查找
3、查找下一个,按“n”即可
4、退出 :wq保存退出 :q!不保存退出
chmod 修改文件权限
cp 或者copy 用来拷贝复制
find 快速查找以某个字符开头
more 显示一页内容
df 查看空间大小
查看日志常用命令 实时日志:tail -f XXX.log
tail:
-n 是显示行号;相当于nl命令;例子如下:
tail -100f test.log 实时监控100行日志
tail -n 10 test.log 查询日志尾部最后10行的日志;
tail -n +10 test.log 查询10行之后的所有日志;
head:
跟tail是相反的,tail是看后多少行日志,而head是查看日志文件的头多少行,例子如下:
head -n 10 test.log 查询日志文件中的头10行日志;
head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;
cat:
tac是倒序查看,是cat单词反写;例子如下:
cat -n test.log |grep "debug" 查询关键字的日志(常用!~)
列出几种常见的应用场景⬇⬇⬇:
查看日志应用场景一:按行号查看:过滤出关键字附近的日志
(1) cat -n test.log |grep "debug" 得到关键日志的行号
(2) cat -n test.log |tail -n +92|head -n 20 选择关键字所在的中间一行. 然后查看这个关键字前10行和后10行的日志:
tail -n +92表示查询92行之后的日志
head -n 20 则表示在前面的查询结果里再查前20条记录
查看日志应用场景二:根据日期查询日志
(1) sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log
特别说明:
上面的两个日期必须是日志中打印出来的日志,否则无效
先 grep '2014-12-17 16:17:20' test.log 来确定日志中是否有该时间点
查看日志应用场景三:日志内容特别多,打印在屏幕上不方便查看,分页/保存文件查看
(1)使用more和less命令,
如: cat -n test.log |grep "debug" |more 这样就分页打印了,通过点击空格键翻页
(2)使用 >xxx.txt 将其保存到文件中,到时可以拉下这个文件分析
如:cat -n test.log |grep "debug" >debug.txt
179. git常用命令
pull 拉取
push 上传
180. maven项目打包命令
IDEA的右侧边栏有一个竖着写的 Maven,
点击打开它:Maven >> 项目名称 >> Lifecycle
首先单击clean,其实相当于执行了:mvn clean命令。(或直接右键clean >> Run Maven
Build) 然后单击package,操作同上即可打包成功。
注:package和install打包的区别:
– package命令:会执行 编译(mvn compile) >> 测试(mvn test) >> 打包(mvn package)等一系列操作,最后得到我们需要的包。
– install命令:会执行 编译(mvn compile) >> 测试(mvn test) >> 打包(mvn package) >> 安装(mvn install)操作。这个安装操作,就是会在你Maven本地仓库中安装打包好的这个包。
项目整理
181. 实现商品的怎删改查
前端用户通过ajax请求进行访问(局部刷新,异步访问),然后后端通过springMVC框架进行业务处理,controller层进行拦截,service层进行业务操作,dao层操作数据库层,pojo层为实体类(定义一些属性及重写get、set、tostring、方法),层进行操作数据库,mapper层使用myBatisPlus,需要继承baseMapper父类(必须指定泛型)可以实现简单的CRUD操作。