一、
1、JDK、JRE、JVM有什么区别?
JDK:为java开发者提供的开发工具包,它包含了jre,java编辑器和其他Java开发工具,JDK用于开发和调试Java应用程序
JRE:为Java应用程序提供运行的必要软件,JRE包含了JVM和java类库等运行Java应用程序所需的组件
JVM:用于在计算机上运行Java程序的虚拟机,jvm是一个抽象层,它将Java字节码解释成特定平台上的本地指令
2、int和Integer的区别
(1)int是八大基础类型之一,数字仅用作运算
(2)integer是封装类有多种方法可以使用
(3)int的默认值是0,Integer为null,容器中一般要求使用封装类
3、什么是Java程序的主类?应用程序和小程序的主类有何不同?
一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含了main()方法的类。而在Java小程序中,这个主类是一个继承自系统类的JApple或Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口。
4、Java和C++的区别
(1)都是面向对象的语言,都支持封装,继承和多态
(2)Java不提供指针来直接访问内存,程序内存更加安全
(3)Java的类是单继承的,C++支持多重继承,但Java的接口可以多继承
(4)Java有自动内存管理机制,不需要程序员手动释放无用内存
5、final有什么作用?
(1)被final修饰的类不可以被继承
(2)被final修饰的方法不可以被重写
(3)被final修饰的变量是不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的
6、this和super的区别
(1)super:他应用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中的成员数据或函数,基类与派生类中有相同成员定时如:super.变量名,super.成员函数据名(实参)
(2)this:它代表当前对象名(在程序中容易产生二义性之处,应使用this来指明当前对象,如果函数的形参与类中的成员数据同名,这时需要使用this来指明成员变量名)
(3)super()和this()类似,区别是super()在子类中调用父类的构造方法,this()在本类调用本类的其它构造方法
(4)super()和this()均需要放在构造函数方法内的第一行,尽管可以用this调用一个构造器,但却不能调用两个
(5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译也不会通过。
(6)this()和super()都指的是对象,所以,均不可以在stati环境中使用
(7)从本质上讲,this是一个指向本类对象的指针,然而super是Java关键字。
7、static关键字可以用于哪些方面?
(1)静态变量:使用static关键字定义的变量称之为静态变量,它属于类,而非实例对象。所有该类的实例对象共享同一个静态变量,修改其中一个实例对象的静态量值会影响到其它所有实例对象对改静态变量的访问。
(2)静态方法:使用static关键字定义的方法称之为静态方法,它可以直接使用类名调用,而不需要创建该类的实例对象,因为静态方法不需要访问任何实例变量,所以通常用于实现一些和类相关的工具方法。
(3)静态代码块:使用static关键字定义的代码块称为静态代码块。该代码块在类被加载时执行,仅执行一次,通常用于初始化静态变量。
(4)静态内部类:使用staic关键字定义的内部类称为静态内部类,它不随外部类的实例对象而创建,只能直接通过类名来访问。静态内部类也可以访问外部类的静态变量和静态方法。
二、
8、面向对象和面向过程的区别
(1)面向对象:是一种讲数据和行为封装在对象中,一对象之间的消息传递来实现程序功能的编程方式。它将现实世界的对象抽象成类,并通过类的继承、封装和多态等机制,实现代码的可复用性和拓展性,提高开发效率和程序可靠性等优点。
(2)面向过程:是一种将问题分解为一系列步骤,每个步骤都使用函数来表示。它的关注点是算法和流程的实现,将电脑看作执行若干个指令的一个机器,它强调的是数据和操作之间的关系,是一种比较直接,易于理解的控制的边长方式。
(3)两者之间的对比:
面向过程:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源,但它没有面向对象易维护、易复用、易拓展
面向对象:易维护、易复用、易拓展。由于面向对象有封装、继承、多态的特性,可以设计出低耦合的系统,使系统更加灵活,性能比面向过程低。
9、面向对象的三大特征
(1)封装:封装是一种将数据和方法封装在一个类中,对外部隐藏实现细节的机制。它使得对象内部状态只能通过有意义的方法来访问和修饰,避免了直接对属性操作的风险,增强了代码的安全性和可维护性。
(2)继承:继承是一种从已有类创建新的机制,新类可以继承父类的属性和方法,并可以添加自己的属性和方法,它可以减少代码的冗余,提高代码的可复用性、拓展性和维护性。
(3)多态:多态是指同一种操作或函数作用于不同的对象,可以有不同的行为和结果,它可以提高代码的灵活性和拓展性,减少代码的冗余,同时也是面向对象编程最为重要的特征之一。
10、多态机制
是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并部确定,而是在程序运行期间才能确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用的到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
11、多态的实现
三个必要条件:继承、重写、向上转型
(1)继承:在多态中必须存在有继承关系的子类和父类
(2)重写:子类对父类中某些方法进行重新定义,在调用这些方法是就会调用子类的方法
(3)向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能具备调用父类的方法和子类的方法
11、抽象类和接口
相同之处:
(1)都不能直接被实例化,需要通过继承或实现来使用
(2)都可以包含抽象方法,需要子类或实现类来实现具体的行为
不同之处:
(1)继承方式不同:抽象类是通过继承来实现,一个子类只能继承一个抽象父类;而接口
接口的特征:
(1)interface接口是一个完全抽象的类,它不会提供任何方法的实现,只会进行方法的定义
(2)接口中只能使用两种访问修饰符,一种是public,它对整个项目可见;一种是default缺省值,它是只具有包访问权限
(3)接口只是提供方法的定义,接口没有实现,但是接口可以被其它类实现。也就是说,实现接口的类需要提供方法的实现,实现接口使用implemets关键字来表示,一个接口可以有多个实现
(4)接口不能被实例化,所以接口中不能有任何构造方法,定义构造方法编译会出错
(5)接口的实现就要实现接口中的全部方法,否则必须定义为抽线类
抽象类的特征:
(1)如果一个类中有抽象方法,那么这个类一定是抽象类,也就是说,使用关键字abstract修饰的方法一定是抽象方法,具体抽线方法的类一定是抽象类。实现类方法中只有方法具体的实现
(2)抽象类中不一定只有抽象方法,抽象类中也可以有具体的方法,你可以自己去选择是否实现这些方法
(3)抽象类中的约束不像接口那么严格,你可以在抽象类中定义构造方法、抽象方法、普通属性、方法、静态属性和静态方法
12、构造器是否可被重写?
构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以谈不上继承。又由于构造器不能被继承,所以相应的就不能被重写了。
13、object中定义了哪些方法?
(1)getClass();获取类结构信息
(2)hashCode();获取哈希码
(3)equals(Object):默认比较对象的地址是否相等,子类可以重些比较规则
(4)clone():用于对象克隆
(5)toString():将对象转变成字符串
(6)notify():多线程中唤醒功能
(7)notifyAll():多线程中唤醒所有等待线程的功能
(8)wait()让持有对象锁的线程进入等待
(9)finalize()垃圾回收前执行的方法
14、写出几种单例模式实现,懒汉式和饿汉模式区别
(1)第一种(懒汉,线程不安全)
(2)第二种(懒汉,线程安全)
(3)第三种(饿汉)
(4)第四种(饿汉,变种)
(5)第五种(静态内部类)
(6)第六种(枚举)
(7)第七种(双重校验锁)
15、重载的条件
(1)方法名称必须相同
(2)参数列表必须不同(个数不同、或类型不同、参数类型排列顺序不同等)
(3)方法的返回类型可以相同也可以不相同
(4)仅仅返回类型不同不足以成为方法的重载
(5)重载是发生在编译时的,因为编译器可以根据参数的类型阿里选择使用哪一个方法
16、重写的原则
(1)重写的方法必须要和父类保持一致,包括返回值类型,方法名,参数列表也都一样
(2)重写的方法可以使用@Override注解来标识
(3)子类中重写方法的访问权限不能低于父类中方法的访问权限
17、什么是Throwable?
Throwable类是Java语言中所有错误(errors)和异常(exceptions)的父类。只有继承于Throwable的类或者其子类才能够被抛出,还有一种方式是带有Java中的@throw注解的类也可以抛出
三、
1、什么是反射
反射是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取对象的以及动态调用对象的功能称之为Java语言的反射机制。
2、什么是Java序列化?什么情况下需要序列化?
Java序列化时为了保存各种对象在内存中的状态,并且可以把保存的对象状态再读出来,以下情况需要使用Java序列化:想把内存中的对象状态保存到一个文件中或者数据库中的时候;想用套接字再网络上传说对象数据的时候;想要通过RMI传输对象的时候。
我认为,之所以需要序列化,核心目的是为了解决网路通信之间的对象传输问题。也就是说,如何把当前JVM进程里面的一个对象,跨网络传输到另一个JVM进程里面,而序列化,就是把内存里面的对象转化为字节流,以便用来实现存储或者传输;而反序列化,就是根据从文件或者网络上获取到的对象的字节流,根据字节流里面保存的对象描述信息和状态
3、动态代理时什么?有哪些应用?
动态代理是运行时生成的代理类。
动态代理的应用有Spring aop,hibernate数据查询,测试框架的后端mock,rpc,Java注解对象获取等。
4、怎么实现动态代理(原理)?
jdk原生动态代理和cglib动态代理额,jdk原生动态代理时基于接口实现的,而cglib是基于当前类的子类实现的。
原理:
(1)第一步:拿到目标对象的引用,并且通过反射获取目标对象的所有接口
(2)第二步:重新生成一个新的代理类,实现目标代理类的所有的接口方法
(3)第三步:把增强的逻辑代码加入到新生成的代理类源代码中
(4)第四步:动态编译代理类的源代码并生成字节码,也就是class文件
(5)第五步:加载并执行新生成的代理对象
5、JDK代理和CGLib代理的对比
(1)JDK是实现目标对象的接口,而CGLib是继承目标对象
(2)JDK和CGLib都是在运行期间生成字节码
(3)JDK是通过反射调用目标对象,而CGLib采用Fast Class机制来调用
6、匿名内部类是什么?它有什么特点?
匿名内部类就是没有名字的内部类
特点:
(1)没有名字
(2)匿名内部类必须继承一个抽象类或者实现一个接口
(3)匿名内部类不能定义任何静态变量和静态方法
(4)当前所在的方法的形参需要被匿名内部类使用时,必须声明为final
(5)匿名内部类不能时抽象的,它必须要实现继承的类或者实现接口的所有抽象方法
(6)匿名内部类不能访问外部类方法中的局部变量,除非该变量被声明为finall类型
7、try-catch-finally-return执行顺序
(1)如果不发生异常,不会执行catch部分
(2)不管有没有发生异常,finally都会执行到
(3)即使try和return时,finally任然会执行
(4)finally是在return后面的表达式运算完后再执行。(此时并没有返回运算后的值,而是先将要返回的值保存起来,若finally中无return,则不管finally中的代码怎么样,返回的值都不会改变,任然是保存之前的值),该情况下函数返回值在finally执行之前确定
8、简述一下面向对象的“六原则一法则”
(2)单一职责原则:一个类只做它该做的事情
(2)开闭原则:软件实体应当对外扩展开放,对修改关闭
(3)依赖倒转原则:面向接口编程
(4)接口隔离原则:接口要小而专,绝不能大而全
(5)合成聚合复用原则:优先使用聚合或合成关系复用代码
(6)迪米特法则:又叫最少知识原则,一个对象应当对其它对象尽可能少的了解
6、深拷贝和浅拷贝的区别
深拷贝和浅拷贝是用来描述对象或者对象数组这种引用类型的复制场景的。
浅拷贝:只复制某个对象的指针,而不复制对象本身,这种复制方式意味着两个引用指针指向被复制对象的同一块内存地址
深拷贝:会完全创建一个一模一样的新对象,新对象和老对象不共享内存,也就意味着新对象的修改不会影响老对象的值。
7、说说你熟悉的设计模式有哪些?
大致按照模式的应用目标分类,设计模式可以分为创建模式、结构模式和行为模式
创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式、单例模式、构建器模式、原型模式。
结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式有桥接模式、适配器模式、装饰模式、代理模式、组合模式、外观模式、享元模式等。
行为型模式,是从类或对象之间的交互。职责划分等角度总结的模式。常见的行为型模式有策略模式、解释器模式、命令模式、观察者模式、迭代器模式、模板方法模式、访问者模式。
5、线程的run()和start()有什么区别?
start()方法用于启动线程,run()方法用于执行线程的运行时代码。run()可以重复调用,而start()只能调用一次。
6、线程池的运行状态有哪些?
(1)RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务
(2)SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务
(3)STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程
(4)TIDYING:所有的任务都销毁了,workCount为0,线程池的状态在转换为TIDYING状态时,会执行钩子方法terminated().
(5)TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。
7、如何实现跨越
(1)服务器端运行跨越设置CORS等于 *
(2)在单个接口使用注解@CrossOrigin运行跨越
(3)使用jsonp跨越
8、get和post请求有哪些区别?
get请求会被浏览器主动缓存,而post不会;get传递参数大小限制,而post没有;post参数传输更安全,get的参数会明文限制在url上,post不会。
9、设计模式
(1)单例模式:保证被创建一次,节省系统开销
(2)工厂模式:解耦代码。
(3)观察者模式:定义了对象之前的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并且自动更新。
(3)模板方法模式:定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
(4)状态模式:允许对象在内部状态改变时改变它的行为。
10、简单工厂和抽象工厂有什么区别?
(1)简单工厂:用来生产同一等级结构中的任意产品,对于增加新的产品,无能为力,
(2)工厂方法:用来生产同意等级结构中的固定产品,支持增加任意产品
(3)抽象工厂:用来生产不同产品的全部产品,对于增加新的产品,无能为力;支持增加新的产品。
Java Web
11、session的工作原理
session的工作原理时客户端登录完成之后,服务器会创建对应的session,session创建完之后,会把session的id发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时。都会带着sessionid,服务器拿到sessionId之后,在内存找到与之对应的session这个样就可以正常工作了
12、jsp有哪些内置对象?作用分别时什么?
jsp有9大内置对象:
(1)request:封装客户端的请求,其中包含来自get或post请求的参数;
(2)response:封装服务器对客户端的响应;
(3)pageContext:通过该对象可以获取其他对象;
(4)session:封装用户会话的对象
(5)application:封装服务器运行环境的对象
(6)out:输出服务器响应的输出流对象
(7)config:web应用的配置对象
(8)page:jsp页面本身
(9)exception:封装页面抛出异常的对象
13、说一下jsp的4中作用域?
(1)page:代表与一个页面相关的对象和属性
(2)request:代表与客户端发出的一个请求相关的对象和属性。一个请求可能跨越多个页面涉及到多个web组件;需要在页面显示的临时数据可以置于此作用域。
(3)session:代表与某个用户与服务建立的一次会话相关的对象和属性,跟某个用户相关的数据应该放在用户自己的session中。
(4)application:代表与整个web应用程序相关的对象和属性,它的的实质是跨域整个web应用程序,包括多个页面、请求和会话的一个全局作用域。
14、session和cookie有什么区别?
(1)存储位置不同:session存储在服务器端;cookie存储在浏览器端
(2)安全性不同:cookie安全性一般,在浏览器存储,可以被伪造和修改
(3)容量和个数限制:cookie有容量限制,每个站点下的cookie也有个数限制
(4)存储的多样性:session可以存储在redis中,数据库中,应用程序中,而cookie只能存储在浏览器中。
15、说一下session的工作原理
session的工作原理是客户端登录完成之后,服务器会创建对应的session,session创建完成之后,会把session的id发送给客户端,客户端再存储到浏览器中,这样客户端每次访问服务器时,都会带着sessionId,服务器拿到sessionId之后,内存找到与之对应的session这样就可以正常工作了。
16、如果客户端禁止cookie,session还能用吗?
可以用,session只是依赖cookie存储sessionId,如果cookie被禁用了,可以在url中添加sessionId的方式保证session能正常被使用
17、jsp和servlet有什么区别?
jsp是sevlet技术的开展,本质上就是servlet的简易方式。servlet和jsp最主要的不同点在于,servlet的应用逻辑在Java文件中,并且完全从表示层中的html里分离开来,而jsp的情况是Java和html可以组合成一个扩展名为jsp的文件。jsp侧重于视图,servlet只要用于控制逻辑
四、
1、什么是关系型数据库
是指采用了关系模型来组织数据的数据库,其以行和列的形式存储数据,以便于用户理解,关系型数据库这一系列的行和列被称为表,一组表组成了数据库。用户通过查询来检索数据库中的数据,而查询是用于限定数据库中某些区域的执行代码
2、关系型数据库的优势
(1)数据一致性和完整性:关系型数据库遵循ACID(原子性、一致性、隔离性、持久化)原则,能保证数据的一致性和完整性,防止数据库出现异常或错误
(2)数据结构化:关系型数据库采用表格形式存储数据,每张表都有自己的字段和数据类型,因此能够更好地支持复杂地查询和数据分析
(3)标准化操作:关系型数据库采用标准地SQL语言进行操作,容易学习和使用,并且可以在不同地平台上进行移植和应用
(4)安全性高:关系型数据库提供强大地用户权限管理机制,能够精细地控制用户对数据的访问和修改权限
(5)可扩展性好:关系型数据库可通过水平和垂直两种扩展方式进行扩展,能够满足不同规模和性能需求的应用场景
3、什么是SQL
结构化查询语句简称SQL,是一种特殊目的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
4、CHAR和VARCHAR的区别?
CHAR是固定长度的字符类型,VARCHAR则是可变长度的字符类型
5、int(10)和bigint(10)能存储的数据大小一样吗?
不一样,int能存储字节数有符号整数;bingint能存储八字节有符号整数,即能存储的数据大小不一样,其中的数字10代表的只是数据显示宽度
6、Mysql存储引擎类型有哪些?
常用的存储引擎有InnoDB存储引擎和MyISAM存储引擎,InnoDB是MySQL的默认事务引擎
7、InnoDB存储引擎应用场景是什么?
InnoDB是MySQL的默认[事务引擎],被设置用来处理大量短期事务,短期事务大部分情况是正常提交的,很少会回滚。
8、InnoDB引擎的四大特性是什么?
(1)插入缓冲:用于非聚类集索引的插入和更新操作。先判断插入的非聚类索引是否在缓存池中,如果在则直接插入,否则插入到Insert Buffer对象,再以一定的频率进行Insert buffer和辅助索引叶子节点的merge操作,将多次插入合并到一个操作中,提高对非聚类索引的插入性能
(2)二次写:Double Write由两部分组成,一部分是内存中的double write buffer,大小为2MB,另一部分是物理磁盘上共享表空间连续的128个页,大小也为2MB。在对缓冲池的脏页进行刷新时,并不直接写入磁盘,而是通过memcpy函数将脏页先复制到内存中的该区域,之后通过doublewrite buffer在分两次,
(3)自适应哈希索引:InnoDB会根据访问的频率和模式,为热点页建立哈希索引,来提高查询效率
(4)缓存池:为了提高数据库的性能,引入缓存池的概念,通过参数innodb_buffer_pool_size可以设置缓存池的大小,参数innodb_buffer_pool_instances可以设置缓存池的实列个数。
9、MyISAM存储引擎特性有哪些?
MyISAM[不支持行级锁而是对整张表加锁]。读取时会对需要读到的所有表加锁,写入时则对表加共享锁,写入时则对表加排锁,但在表有读取操作的同时,也可以往表中插入新的记录。
MyISAM表可以手工或者自动执行检查和修复操作。但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作时非常慢的
10、MyISM与InnoDB存储引擎的区别
(1)InnoDB支持事务,而MyISAM不支持事务
(2)InnoDB支持行级锁,而MyISAM支持表级锁
(3)InnoDB支持MVCC,而MyLSAM不支持
(4)InnoDB支持外键,而MyISAM不支持
(5)InnoDB不支持全文索引,而MyISAM支持
11、数据库设计三范式
(1)一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;(只要是关系型数据库都满足1NF)
(2)二范式:2NF是对记录的唯一性约束,要求记录要有唯一标识,即实体的唯一性;
(3)三范式:3NF是对字段冗余性的约束,即任何字段不能由其它字段派生出来,它要求字段没有冗余。
12、SQL语句有哪些分类?
(1)DDL:数据定义语言
(2)DML:数据操作语句
(3)DTL:数据事务语句
(4)DCL:数据控制语句
13、数据库删除操作中的delete、drop、truncate区别在哪?
(1)delete:是一种基于条件的数据删除操作,可以通过where句子指定需要删除的记录。使用delete语句可以删除表中符合条件的记录,同时也会保留表结构和索引等相关信息。删除操作通过事务进行提交,可以进行回滚和撤销操作。但是,delete语句是逐条删除,当删除记录量很大时,性能可能会较低。
(2)drop:drop是一种删除表的操作,可以直接删除整个表及其相关信息,包括表结构和索引等信息。使用Drop语句,会立即删除整个表,并释放所占用的磁盘空间;同时,也会删除与该表相关的触发器、存储过程和其他相关对象。这种方式是不能恢复数据的,需要慎重使用此命令
(3)truncate:也是一种删除表的操作,可以快速删除整个表的数据,同时也会保留表结构和索引等相关信息。使用truncate命令,在删除表数据时,会释放所占用的磁盘空间,并重置表的自增长ID,相比delete语句,性能更高。但时truncate语句不能带where字句,也无法进行回滚和撤销操作。
14、什么是MySQL视图?
· 视图是指一种虚拟表,它并不实际存储任何数据,而是根据SQL查询语句的结果集生成的一张虚表。可以将视图理解为一个对查询结果的封装、重用和简化、使得用户在操作数据库是可以像操作普通表一样来操作视图。同时,视图还可以隐藏复杂的查询语句,保护数据安全性和隐私。
15、MySql视图的优点包括
(1)简化数据查询:可以通过视图来封装、简化数据查询、并且可以重用视图,减少SQL代码量
(2)数据安全性:可以对敏感数据进行限制和过滤,保证数据的安全性和隐私性
(3)数据独立性:在数据库结构发生改变时,只需要修改视图而不需要修改应用程序代码,保证了数据独立性
(4)提高查询性能:可以通过使用视图来优化查询,提高了查询性能。
15、什么存储过程?
是指一组预编译的SQL语句集合,以及逻辑处理代码,类似于带参数的脚本程序,MySQL存储过程可以执行并返回结果,调用其它存储过程或函数等。存储过程可由程序员自定义,以实现特定的业务功能
16、存储过程在数据库重的作用
(1)提高性能:当我们需要多次执行一个相同的操作时,每次都要提交SQL语句进行执行时低效的,而保存这个操作作为存储过程,则每次只需要调用此过程即可,从而提高了性能。
(2)操作简化:存储过程可以将一些复杂的、重复地或常用地操作封装成一个可供调用地过程,简化操作
(3)数据安全:存储过程可以对数据进行权限控制,保证了数据安全性
(4)同步多个操作:多个SQL语句可以放到同一个存储过程,同时执行,从而保证了数据地一致性。
17、存储过程和存储函数好像不多,你说说他们有什么区别?
(1)返回值不同:存储过程可以返回多个结果集,而函数只能返回单个值或表达式的值
(2)使用方式不同:存储过程通过CALL进行调用,而函数可以直接在select、where或having语句重使用
(3)参数传递不同:存储过程和函数传递方式不同,存储过程的参数可以通过IN、OUT、INOUT等方式传递,而函数的参数只能通过声明时定义的形参传递
(3)数据操作不同:存储过程主要用于数据库的数据操作,如增删改查、而函数更多用于计算值和逻辑运算
(4)执行时间不同;存储过程执行时间可能比函数长,因为存储过程一般会包含多个语句和捕获错误的代码,而函数一般只包含一种操作
(5)标识符不同:函数的标识符时function,存储过程是procedure。
18、Mysql中有哪几种锁?
(1)表级锁:开销小,加锁快,不会出现死锁;锁定粒度大,发生冲突的概率最高,并发度最低
(2)行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
(3)页面锁:开销和加锁时间介于表锁与行锁之间,会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
19、mysql中有哪些不同的表格?
5种类型:MyISAM、Heap、Merge、INNODB、ISAM。
20、mysql的事务隔离级别
事务隔离级别,是为了解决多个并行事务竞争导致的数据安全问题的一种规范
(1)读未提交:最低级别的隔离级别,事务中的修改操作对其他事务都可见
(2)读已提交:保证事务提交后对其他事务可见,但是不保证可重复读,这种隔离级别存在不可重复读和幻读的问题。
(3)可重复读:保证事务可重复读,即多次读取同一个数据会返回相同的结果。mysql默认的隔离级别就是克忠福读。但在这种隔离级别下,还可能存在幻读问题
(4)序列化:最高的隔离级别,将所有事务序列化执行,即每次只允许一个事务进行访问。这种隔离级别可以解决所有并发问题,但是由于事务序列化执行,性能较差,只适用于特定场景。
21、主键和候选键有的有什么区别
表格中的每一行读是由主键唯一标识的,一个表只有一个主键。
主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用
22、数据库的优化
(1)设计合理的数据库结构
(2)优化查询
(3)优化参数设置
(4)使用合适的存储引擎
(5)使用合适的数据类型
(6)数据库分区
(7)缓存机制:使用缓存技术来降低数据库的访问压力。redis等。
(8)定期维护数据库系统:清理无用数据、压缩数据文件、优化索引结构等操作
23、SQL语句的优化
(1)使用索引:索引可以加速SQL查询。
(2)避免在WHERE子句中使用函数或操作符
(3)使用EXPLAIN来检查查询计划
(4)避免使用select*
(5)使用连接查询而不是子查询
(6)垂直拆分:将一个大型表拆分成多个较小的表减少复杂性,提高性能。
(7)水平划分:将表拆分成多个部分,每个部分独立存储在不同的服务器上提高性能。
(8)选择合适的数据类型。
24、数据库索引原理,为什么要用B+树,为什么不用二叉树?
首先,常规的数据库存储引擎,一般都是采用B树或者B+树来实现索引的存储。
因为B树是一种多路平衡树,用这种存储结构来存储大量数据,它的高度会相比二叉树来说,会矮很多。
而对于数据库来说,所有的数据必然都是存储在磁盘上的,而磁盘IO的效率实际上是很低的,特别是在随机磁盘IO的情况下效率更低
所以树的高度能够决定磁盘IO的次数,磁盘IO次数越少,对于性能的提升就越大,这也是为什么采用B树作为索引存储结构的原因。
使用B+树的原因:
B+树非叶子节点不存储数据,所以每一层能够存储的索引量会增加,意味着B+树在层高相同的情况下存储的数据量要比B树要多,使得磁盘IO次数更少
在mysql里面,范围查询是一个比较常用的操作,而B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以查询的时候只需要查两个节点进行遍历就行,而B树需要获取所有节点,所以B+树在范围查询更高
在数据检索方面,由于所有的数据都存储在叶子节点,所以B+树的IO次数更稳定一些。因为叶子节点存储所有数据,所以B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点,但B树需要遍历整个树
基于B+树这样一种结构,如果采用自增的整形数据作为主键,还能更好的避免增加数据的时候,带来叶子节点分裂导致的大量运算的问题
25、如何选择合适的分布式主键方案呢?
(1)数据库自增长序列或字段
(2)Redis生成ID
(3)Twitter的snowflake算法
(4)利用zookeeper生成唯一ID
(5)MongDB的ObjectId
26、在高并发情况下,如何做到安全的修改同一行数据?
要安全的修改同一行数据,就要保证一个线程在修改时,其它线程无法更新这行记录,一般有悲观锁和乐观锁两种方案
悲观锁的思想:当前线程要进来修改数据时,别的线程都得拒之门外
乐观的思想:有线程过来,先放过去修改,如果看到别的线程没修改过,就可以修改成功,如果别的线程修改过,就修改失败或者重视。实现方式:乐观锁一般会使用版本号机制或CAS算法实现。
27.SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义。
SQL优化三部曲:
(1)慢SQL的定位和排查:可以通过慢查询日志和慢查询日志分析工具得到有问题的SQL列表
(2)执行计划分子:针对慢SQL,我们可以使用关键字explain来查看当前sql的执行计划。可以重点关注type key rows filter等字段,从而定位改SQL执行慢的根本原因
(3)使用show profile工具:Show Profile是Mysql提供的可以用来分析当前会话中,SQL语句资源消耗情况的工具,可用于SQL调优的测量。在当前绘画中。默认情况下处于show profile是关闭状态,打开之后保存最近15次的运行结果
28、数据库自增主键可能遇到什么问题
(1)使用自增主键对数据库做分库分表,可能会出现主键重复等问题。解决方案的话,简单点的话可以考虑使用UUID
(2)自增主键会产生表锁,从而引发问题
(3)自增主键可能用完问题
29、什么是数据库连接池?为什么需要数据库连接池呢?
首先,数据库连接池是一种池化技术,池化技术的核心思想是实现资源的复用,避免资源重复创建销毁的开销,而在数据库的应用场景里面,应用程序每次向数据库发起的CRUD操作的时候,都需要创建连接,在数据库访问较大的情况下,频繁的创建连接会带来较大的性能开销。而连接池的核心思想,就是应用程序在启动的时候提前初始化一部分连接保存到连接池中,当应用需要使用连接的时候,直接从连接池获取一个已经建立好的链接。连接池的设计,避免了每次连接的建立和释放带来的开销。
数据库连接池好处:
(1)资源重用
(2)更快的系统响应速度
(3)新的资源分配手段
(4)统一的连接管理,避免数据库连接泄露
30、Bolob 和text有什么区别?
(1)Blob用于存储二进制数据,而Text用于存储大字符串
(2)Blob值被视为二进制字符串,他们没有字符集,并且排序和比较基于列值中的字节的数值
(3)text值被视为非二进制字符串。它们有一个字符集,并根据字符集的排序规则对值进行排序和比较。
31、Hash索引和B+树区别是什么?
(1)B+树可以进行范围查询,Hash索引不能
(2)B+树支持联合索引的最左侧原则,Hash索引不支持
(3)B+树支持order by排序,Hash索引不支持
(4)Hash索引在等值查询上比B+树效率更高
(5)B+树使用like进行模糊查询的时候,like后面的话可以起到优化的作用,Hash索引根本无法进行模糊查询
32、MySQL的内连接、左连接、右连接有什么区别?
(1)Inner join内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
(2)left join两张表进行连接查询时,会返回左表所有的行,即使在右表中没有匹配的记录
(3)right join 在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录
33、索引有哪些优缺点?索引有几种类型
索引,是一种能够帮助Mysql高效从磁盘上检索数据的一种数据结构。
通过B+树的结构来存储数据,可以大大减少数据的磁盘IO次数,从而提升数据查询的性能,B+树索引在进行范围查找的时候,只需要找到起始节点,然后基于叶子节点数的链表结构往下读取即可,查询效率较高;通过唯一索引约束,可以保证表中每一行数据的唯一性。
当然,索引的不合理使用,也会带来很多的缺点
数据的增加、修改、删除,需要涉及到索引的维护,当数据量较大的情况下,索引的维护会带来较大的性能开销;一个表中允许存在一个聚簇索引和非聚簇索引,但是索引不能创建太多,否则造成的索引维护成本过高
创建索引的时候,需要考虑到索引字段的分散性,如果字段的重复数据过多,创建索引反而会带来性能降低
索引类型:
(1)主键索引
(2)唯一索引
(3)普通索引
(4)全文索引
(5)覆盖索引
33、创建索引有什么原则
(1)最左前缀匹配原则
(2)频繁作为查询条件的字段才去才去创建索引
(3)频繁更新的字段不适合创建索引
(4)索引列不能参与计算,不能有函数操作
(5)优先考虑扩展索引,而不是新建索引,避免不必要的索引
(6)在order by 或者group by 子句中,创建索引需要注意顺序
(7)区分度低的数据列不适合做索引列
(8)定义有外键的数据列一定要建立索引
(9)对于定义为text、image数据类型的列不要建立索引
(10)删除不再使用或者很少使用的索引
34、union和unionall的区别?
union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序
union all:对两个结果集进行并集操作,包括重复行,不进行排序
union的效率高于union all
35、SQL的生命周期?
(1)服务器与数据库的建立连接
(2)数据库进程拿到请求SQL
(3)解析并生成执行计划,执行
(4)读取数据到内存,并进行逻辑处理
(5)通过步骤一的连接,发送结果到客户端
(6)关掉连接、释放资源
五、
1、什么是Resdis?他有哪些特点和优点?
redis是一个内存中的数据结构存储系统,它是一个开源的,高性能的键值对数据库。redis的优点包括快速读写速度、支持多种数据结构,灵活性、可持久化等。
2、redis支持哪些数据结构?
支持字符串、哈希表、列表、有序集合等数据结构
3、redis如何直支持持久化数据?
redis有两种持久化方式:RDB和AOF。RDB通过在指定的时间间隔内将数据集快走存储到磁盘上,实现了快速的数据恢复。AOF则是记录每个写操作,以此来重建原始数据集,保证数据的完整性
4、redis支持哪些数据淘汰策略?
redis支持以下四种数据淘汰策略:noeviction(不会淘汰任何数据)、allkets-lru(当内存不足以容纳新写入数据时,在键值空间中,移除最近最少使用的key),volatile-lru(在设置了过期时间的key空间中,移除最近最少使用的key)和volatile-ttl(在设置过期时间的key空间中,移除即将过期的key)
5、redis任何实现分布式?
redis提供了集群和哨兵两种实现分布式的方式,在集群中,数据被自动分割到不同的节点上,每个节点只处理一部分数据,在哨兵模式下,多台redis服务器自动完成主从复制,实现高可用性
6、redis如何保证数据的一致性?
在主从复制模式下,redis主节点会将写操作同步到从节点,从节点通过复制主从节点数据来保证一致性,在集群模式,redi使用哈希分布算法来将数据均匀地分布在各个节点上,所有节点都存储一份相同地数据,从而保证数据的一致性
7、什么是redis事务?
redis事务是一组命令的集合,这些命令在执行时视为一个整体进行,redis事务通过multi、exec、discard和watch等命令进行管理和控制,事务可以一致性提交多个命令,从而减少客户端与服务端之间的通信次数,并且可以维护数据的完整性。