SE类
1.JDK和JRE有什么区别?
JDK是给开发人员用的工具包,它包含了javac编译器,也包含了jre。
JRE是java运行环境包含了jvm虚拟机等等,
简单的说如果要运行java程序只需要JRE即可。
2.==和equals的区别
==比较的是对象在内存中的地址值
equals比较的是两个对象是否相等,
在不重写equals方法的情况下,默认是和==的作用一样。
3.两个对象的hashCode()相同,则equals也一定相同对吗?
不一定,hashCode是将内存地址转换为一个整数返回,两个对象的hashcode一样,
但是如果equals方法被重写了,有可能会出现地址相同但是值不相等的情况,
所以equals不一定是true。
4.final在java中的作用?
被final修饰的类不能被继承
被final修饰的变量是常量
被final修饰的方法不能被重写
5.java中的Math.round(-1.5)等于多少?
-1
Math.round这个方法实际上是比较这个数离最近的数比如
1.6离1和2那个距离最近,很明显离2最近,因此答案就是2,
但如果出现0.5这种距离一样的情况则是比较最近的两个数哪个数最大就取哪个。
-1.5位于-2和-1之间,显然-1大答案就是-1。
6.String属于基础的数据类型吗?
不属于,String是java定义的一个最终类。
7.java中操作字符串都有哪些类,他们之间有什么区别?
String:处理长度不可变的字符串
StringBuffer和StringBulider:处理长度可变的字符串
其中StringBuffer是线程安全的,StringBulider是JDK1.5里,线程不安全的
8.
String s1="abc";
String s2=new String("abc");
s1 == s2 false
s1.equals(s2) true
简单的说String这个类很特殊,
String s1="abc"他会先去内存中看看有没有abc有的话就直接引用,没有的话就new一个出来,
而String s2=new String("abc");则不管内存中有没有abc都new一个出来。
9.如何将字符串反转
有很多种,我说两种我平时开发用的比较多的吧。
第一种是用StringBuffer中的reverse方法。
第二种是用charAt()方法根据索引拼接字符串。
10.String类的常用方法有哪些
spilt切割字符串
substring,获取索引开始到结束的指定字符串
charAt获取指定位置的字符
length字符串长度
replace 替换功能
trim 去掉首尾空格
11.抽象类必须要有抽象方法吗?
不一定。但是抽象方法一定在抽象类(接口也算抽象类的一种)。
12.普通类和抽象类有哪些区别
抽象类不能被实例化,而普通类可以被实例化
抽象类的访问修饰符不能是private
抽象类中有抽象方法,一个子类继承抽象类必须实现该抽象类的所有抽象方法,或者子类也声明为抽象类。
13.抽象类能使用final修饰吗?
不可以,抽象类要求要有子类继承,使用final修饰则无法被继承
14.接口和抽象类有什么区别?
接口由类实现,抽象类由类继承
接口中所有的方法都是抽象方法(JDK1.8之前),所有的变量都是公共的常量,抽象类中既可以有抽象方法也可以有具体的方法实现,变量为普通变量。
接口是功能的抽象,抽象类是类别的抽象
15.java中的IO流分为哪几种
两种字符流和字节流,有
InputStream和OutputStream
和Wirte和Read,
其余的流都是通过继承上面这四个抽象类继承的。
16.BIO NIO AIO有什么区别
BIO:同步并阻塞
NIO:同步非阻塞
AIO:异步非阻塞
17.File类中的常用方法
mkdir()创建文件夹
createNewFile()创建文件
getPath获取路径
getName()获取名字
length()文件字节数
容器类
1.java容器有哪些?
List Set Map
List:有序 可存放重复元素,
Set:无序 不可存放重复元素,
Map:无序,键值对,键唯一,值不唯一。
2.Colletction和Colletcions有什么区别
Colletction是Set和List的父接口
Collections是一个集合的工具类,提供比如集合元素反转类似的方法。
3.List Set Map 之间的区别是什么?
List:有序 可存放重复元素,其下有ArrayList和Vectory底层是数组实现,LinkedList底层是链表实现
Set:无序 不可存放重复元素,其下有HashSet底层由HashMap实现,TreeSet底层是红黑树实现
Map:无序,键值对,键唯一,值不唯一。其下由HashMap底层是数组+链表+红黑树(jdk1.8),TreeMap红黑树,HashTable数组+链表。
4.HashMap和HashTable的区别?
HashMap是线程不安全的执行效率比较高,可以存储null键和值
HashTable是线程安全的执行效率低,不可以存储null键和值
5.如何决定使用HashMap还是TreeMap?
大多数情况下使用的是HashMap执行速度快
如果需要排序的话使用TreeMap。
6。说一下HashMap的实现原理?
HashMap底层由数组和链表实现,是线程不安全,执行速度快,且能存储null键和null值。
他的底层基于哈希实现,我们使用put(key,value)存储对象到容器来,使用get(key)从容器中获取元素。
当我们使用put的时候,会先对键调用hashcode方法,返回的hash值作为找到entry在数组中存储位置的下标。
但是由于hashcode的值有可能会相同也就是存储的下标一样,所以hashmap也会采用链表的形式存储entry键值对。
然后在调用get方法的时候,首先把key做一次hash映射,得到对应的下标去找到对应的元素,
但是刚刚说到有可能出现hashcode的值一样,这个时候会调用key.equals去匹配链表对应的节点,从而找到值。
7.说一下HashSet的实现原理?
HashSet底层由HashMap实现,
无序且不能存储重复元素,我们在存储元素时候,
首先对元素调用一次hashcode,获得返回的hash值,这个hash值是用来存储在哈希表中的位置下标
。这个时候会出现两种情况,如果这个元素的hash值在哈希表中唯一,那么就直接存储到哈希表,
如果不唯一,这个时候会调用equals方法,如果一样则认为是重复元素,
这个时候重复元素不允许添加,如果不一样则该元素添加。
8.ArrayList和LinkedList的区别是什么?
二者都是线程不安全的,ArrayList顾名思义底层是数组,
LinkedList底层是链表,根据二者的数据结构特性,
一般查找的需求多的时候用ArrayList,增删改需求多的时候用LinkedList。
9.如何实现数组和List之间的转换?
数组转集合用的是asList(),并且数组存放的必须是引用类型的元素
集合转数组用的toArrary()。
9.ArrayList和Vector之间的区别?
ArrayList是线程不安全的,Vector是线程安全的。
ArrayList和Vectort容器都有初始大小,但是他们的容器增长倍率不一样,ArrayList是1.5,而Vector是2.
10.Array和ArrayList有什么区别
Array是数组即可以存放引用数据类型,也可以存放基本数据类型,其容量固定无法改变。
ArrayList底层是数组但是他只能存放引用数据类型,其容量有自动增长的倍率。
11.Queue中,poll()和remove()有什么区别?
这两个方法是移除第一个元素,remove和Colletction的remove类似,在容器为空的时候,会抛出异常,而poll则会返回null。
12.哪些集合类是线程安全的
Vector,HashTable
13.迭代器Iterator是什么?
Iterator是一个接口,提供了对集合元素的迭代,其实就相当于一个游标,每迭代一次,游标就向下移动一个位置,直到下一个元素为null,返回false完成迭代。
14Iterator怎么使用?有什么特点?
首先通过集合引用变量调用iterator()方法获取迭代器。通过while(迭代器.hasNext()){
迭代器.next()
}
hasNext()相当于判断是否有下一个元素,而next则是获取这个元素。
特点就是在迭代过程中,不可以使用集合自带的remove方法移除元素,而应该是用迭代器自带的remove方法移除,
还有一个注意点就是用foreach的时候迭代器自带的remove也不能用否则会报异常。
15.Iterator和ListIterator有什么区别?
首先ListIterator只能遍历List集合,他提供了add方法可以一边迭代一边添加元素,并且可以倒叙遍历集合元素
Iterator可以遍历list和Set集合,没有add方法,并且不能倒序遍历。
16.怎么确保一个集合不被修改?
用Colletcions集合工具类的unmodifiableList方法。
用final不可以因为final修饰的引用数据类型地址不变但是本身的内容是可以改变的。
多线程类
1.并行和并发有什么区别?
通俗说就是事件的交替进行,比如一个老师给2个学生辅导,他先辅导A到一半然后由A自己做然后跑去辅导B在跑来辅导A.
而并行则是把AB叫在一起同时辅导,相当于事件的同时执行。
2.线程和进程的区别?
进程是线程的容器,进程中至少要有一条线程,线程相当于一条路,不同的线程就是不同的路。
3.守护线程是什么?
就是用来守护重要线程的线程,如果重要线程挂了,守护线程也会跟着挂掉。
4.创建线程有哪几种方式?
继承Thread类或者实现Runnable接口,并重写run方法。
Thread子类的话可以直接使用Thread类的方法,但是如果类有继承其他类则没办法继承该类
Runnable的话无需担心该类是否继承了其他类,但是不能使用Thread类里面的方法。
5.runnable和callable有什么区别?
runnable执行完没有返回值他的run方法不能抛异常,callable执行完有返回值他的call方法能抛异常。
6.线程有哪些状态?
创建,就绪,运行,阻塞,死亡。
7.sleep和wait有什么区别
线程sleep休眠后会自动唤醒,而wait的话需要手动调用notify唤醒。然后sleep状态下的线程还是拥有锁,wait状态下的线程会释放锁。
8。notify()和notifyAll()有什么区别?
notify只会唤醒一个线程,notifyAll()唤醒所有线程
9.线程的run和start方法有什么区别
start方法用来启动线程
run方法用来运行线程
10.创建线程池有哪几种方式?
只有简单的了解过,通过Executors提供的4种方式创建线程池。
11.线程池种的submit和execute有什么区别
sumbmit有返回值,能抛出异常
execute没有返回值,不能抛出异常
12.在java程序中怎么保证多线程的运行安全?
使用synchronized和lock锁,以及voliate关键字。
13.多线程锁的升级原理?
无锁→偏向锁→乐观锁→悲观锁
乐观锁:认为我拿数据的时候别人都不会修改数据,所以不会上锁,但是在更新的时候会判断一下我拿数据这个过程中数据是否有被修改过。
悲观锁:认为我拿数据的时候别人肯定会修改数据,所以我在拿数据的时候我要上锁,直到我释放掉这个锁,别人才能进来。synchronized锁就是基于悲观锁实现。
14.什么是死锁?
是由于两个或多个线程互相持有对方所需要的资源,导致锁无法被释放,双方都处于僵持状态。
15.怎么避免死锁?
打破死锁所需的四个必要条件。
由于资源互斥是固有的特性无法改变
所以从破坏“不可剥夺”条件,破坏”请求与保持条件,破坏“循环等待”条件入手。
16.ThreadLoacl是什么?有哪些应用场景?
线程本地变量,这个类的作用可以将对象绑定到当前线程,关于具体的应用场景,我说一个我自己有用到的地方就是在用spring事务之前,如果对一个事务的控制需要确保当前线程上的连接是同一条,这样才能控制住事务,所以会写一个工具类,用来绑定数据库连接到当前线程上,每次只要一拿连接先判断当前线程上有没有,有的话直接用这条连接,没有的话从连接池里面拿一条连接并绑定在当前线程上。
17.说一下synchronized的底层实现原理?
我只知道synchronized的底层是基于悲观锁实现,具体的实现不是很了解,但是可以讲讲悲观锁的机制。
待解答:
18.synchronized和volatile的区别是什么?
19.synchronized和Lock的区别是什么?
20.synchronized和ReentrantLock区别是什么?
21.说一下atomic的原理?
22.你是如何理解线程不安全/安全的?
我个人的理解是,线程安不安全其实应该是指的内存安全?为什么这么说呢,这和操作系统有关,目前来说主流的操作系统都是支持多个进程同时进行的,每个进程只能访问分配给自己的内存空间,而不能访问其他的进程所在的内存空间,这个由操作系统保障。在每个进程的内存空间中通常有一块公共内存区域也就是堆,进程内的所有线程都可以访问到这个内存区域,也就是说会发生潜在的安全问题,也就是说的线程不安全,假设一个线程在处理这个堆上的数据处理到一半累了,休息了一会儿,过一会儿又回来,可能数据就不是自己休息时的那样子,也会被其他线程修改,因为这个区域是公共的嘛,就好比我拿了1万块放在小区公共区域,睡一觉回来钱可能全没了,因为公共区域人来人往,我放的东西没有看管的措施,一定是不安全的,内存中的状况也是这样,所以线程安全指的是,堆内存里面的数据由于可以被任何线程访问到,在有没有限制的情况下存在意外修改的风险。
那如何解决线程安全的问题?现实生活中很多人都会把1万块藏在,不让别人知道,不可能放在公共区域,程序中也是这样,所以操作系统会为每个线程分配自己的内存空间,也就是栈内存,其他线程无权限访问。栈通常会存放局部变量,私有的东西就不应该让别人知道在哪,由于线程的栈内存只能自己访问,所以里面的变量只属于自己。
但是这种方式是基于位置来说,也就是自己存放的地方只有自己知道,但是按照java语言,成员变量不能存放在方法体内, 所以如果想在公共场所下也做到安全,那就是要人人有份,大家不要抢,1万个人对1000瓶水肯定会哄抢,但是对10万瓶水就不会哄抢,回到程序来说,要让堆的数据对于每个线程是安全的,那就每个线程都拷贝一份,从而不会影响到其他人,也就是ThreadLocal这个类,这个类可以将对象绑定到当前线程上,但是有个地方,这些数据实际上还是存在堆里,只是每个人都有认领自己的东西,类似领地,各弄各的互不干扰。
放在公共区域上的东西只是存在安全风险,并不一定不安全,不如你放一块上百吨的石头,那肯定安全,因为没人去搬得动他,就和java里面的常量一样,加了个final,只能看但是不能动。
实际上上面这三个都是避重就轻,如果都解决不了,那就只能用最狠的,那就是先入为主,就好比高峰期我去点餐,进门发现一个空桌子,我心里想先去点餐吧,然后回来桌子被人先占了,因为桌子在公共区域谁都可以入座,解决的办法就是我叫个人看着,这样别人来的时候会发现被占了,只能等人走了他才能入座,回到程序里也就是说的锁,如果堆内存中的数据会被多个线程访问,为了安全我就在旁边放一把锁,要想改数据,先获取锁在说。
反射类
1.什么是反射?
就是把java类中的成员变量和方法映射成对象,在运行阶段就能够获取所需类的成员变量和方法。
2.什么是java序列化?什么情况下需要序列化?
把java对象转换为字节序列对象的过程。
在分布式对象里,像数据,对象都有不同的格式,有了序列化在传输时就很方便,另外需要将内存中的类对象存储到硬盘上或者数据库里就需要用到序列化。
3.动态代理是什么?有哪些运用?
动态代理就是通过一个代理对象来帮助我们为完成原本应该是由我们来做的事,特别是在不能修改源代码的前提下,动态代理的运用显得更为重要。
spring的aop底层就是基于动态代理的,一般在权限验证和日志输出的时候比较多运用到动态代理。
4.怎么实现动态代理
实现动态代理有两种方式
一种是基于接口的,一种是基于子类的
基于接口的动态代理要求被代理类必须至少实现一个接口,由官方JDK提供的newProxyInstance方法,该方法的第一个参数写的是被代理类对象的类加载器,
第二个是被代理类的字节码,第三个是用于提供需要我们提供的增强的代码,通常情况下是匿名内部类。
基于子类的动态代理,要求被代理类不能是最终类,需要第三方jar包的支持,只要提供被代理类对象的字节码和提供增强代码的匿名内部类即可。
JavaWeb类
1.jsp和servlet有什么区别?
jsp编译后就是一个servlet,只是jvm无法识别jsp的代码,需要有web容器将其编译成能够由jvm识别的java类。
jsp更注重在页面的显示,servlet更注重逻辑控制。
jsp有内置对象,servlet没有内置对象。
2.jsp有哪些内置对象
九大内置对象,其中四个作用域对象,pageContext,request,session,application
另外五个:out,excption,response,page,config。
3.说一下jsp的四个作用域?
pageCotext:作用在当前页面
request:仅限于本次请求
session:一次会话
application:整个web工程
4.session和cookie有什么区别?
cookie是在客户端上开辟的一小段存储数据的空间
session是基于cookie的一种会话机制是在服务器上开辟的一小段存储数据的内存空间
5.说一下session的工作原理?
原理就是在session会话机制中,每个客户端都有一个服务端给他生成的sessionid,
客户端将这个sessionid存储到内存中,
这样下一次的请求都会带上这个sessionid,
而服务器就能够根据这个sessionid获取客户端的信息状态。
6.如果客户端禁止cookie,session还能使用吗?
一般是不能用了,除非你自己在url里面传一个sessionid,因为客户端sessionid的发送就是依赖于cookie的存在。
7.springmvc和struct2的区别是什么?
springmvc的入口是servlet,struct2的入口是Filter
springMVC基于方法设计,struct2基于类设计
SpringMVC使用比较简介,有专门的处理json数据,struct2的OGNL表达式页面开发效率高。
8.如何避免sql注入?
sql注入就是在客户端提交数据的时候输入一些猜测数据库表信息什么的获取数据库里的信息,
一般来说只要开发人员注意对请求的参数中的值在后端处理时不要拼接在sql语句上,
而是让后端将他视为一个字符串一般就不会发生sql注入。
异常类
1.throw和throws的区别?
throw用于方法内部抛出异常对象,只能抛一个。
throws跟在方法后面抛出多个异常类名。
2.final,finally,finalize有什么区别?
final是一个修饰符,类:无法被继承,方法:无法被重写,变量:值无法被更改,变为常量
finally作为异常处理的一部分,表示无论是否正常执行都会执行finally里面的代码块。
finailze是每个对象都有该方法,在GC回收时启动,即当对象被回收时调用该方法。
3.try-catch-finally哪个部分可以省略?
finally
4.try-catch-finally中如果catch中return了,finally还会执行吗?
会,finally会在return执行之后执行,并且是在return返回之前执行
5.常见的异常类有哪些
nullPotionExcepotion,indexoutbindException,ClassCastException ,SQLException,NumberFormatException
IOException,ClassNotFoundExcpetion,
6.Error和Exception有什么区别?
Error表示程序无法克服的严重错误,可能会造成虚拟机崩溃什么的。
Exception表示可以在运行时处理的错误,通过抛出异常或者捕获异常处理。
Web类
1.http 响应码 301 和 302 代表的是什么?有什么区别?
301和302都是代表地址重定向,有服务端帮我们转发。
301代表访问地址永久性移除不可用,服务端帮助我们记录并且由客户端跳转到新地址
302代表重定向到新地址是暂时的,旧地址资源依旧可以访问。
2.forward 和 redirect 的区别?
forward代表请求转发,由由客户端发送求给服务器后,服务器内部帮助我们完成跳转,整个过程客户端只发送了一次请求。
redirect代表重定向,由客户端发送给服务器后,服务器返回301或者302由客户端跳转到指定的新页面,整个过程客户端需要两次请求,url也会发生变化。
3.简述TCP和UDP的区别?
TCP是面向连接的可靠的传输协议,全双工模式需要以三次握手为基础建立连接。传输过程保证数据的安全性和完整性,但是传输效率较低
UDP是面向无连接的不可靠的传输协议,传输过程中不保证数据的安全性和完整性。但是传输效率搞。
4.TCP为什么要三次握手?两次不行吗?
TCP要三次握手是因为他是面向连接的可靠传输协议,第一次握手时候客户端像服务端发起请求,SYN请求建立连接标志位为1,并且设置seq序号x,服务端接收到请求,发起二次挥手告知客户端我接受到了你的请求,并且同意和你建立连接,标志位为ACK1代表确认连接,以及ack确认号x+1,seq序号y,客户端在接收到服务端的数据包后,发起第三次握手,告知服务端,我接受到了你的应答,设置确认号y+1,此时三次握手完成,连接通道建立。
综上所述,两次肯定不行,少了第三次,服务端不知道客户端那边有没有接收到应答,这个时候通道就无法建立。
5.简述一下TCP粘包的是怎么产生的?
由于TCP是以无结构字节流为基础没有边界并且TCP的帧结构中也没有数据长度字段,和UDP不一样,UDP是以报文为基础,有数据长度字段,基于上述两点TCP便有可能产生粘包。
6.OSI的七层模型有哪些?
应用层 : 比如HTTP ,FTP协议
传输层:比如TCP/UDP协议
网络层:IP协议
数据链路层:封装要发送的数据包比如帧
表示层、会话层、物理层。
7.get和post请求有哪些区别?
get请求的参数跟在url后面,并且有大小限制64k。
post请求的参数包含在body里面。
从安全性可见角度来讲,post稍微安全一些,因为参数不可见,但是传输上二者其实都不算安全的,因为抓包是能拿到数据报明文,只能通过https才能在传输上做到安全。
8.如何实现跨域?
跨域这个问题主要针对js的同源策略,要跨域的话可以通过传输jsonp的数据格式,但是有个缺点就是jsonp只能发送get请求。
还有一个就是用各类代理软件,比如我开发前端用的就是nginx反向代理。还有一种在服务端上设置接受跨域的配置。
9.说一下jsonp的实现原理?
jsonp其实就是动态创建一个script标签,通过src属性跨域,并且将回调函数通过接口传递给对方。
设计模式类
1.说下你熟悉的设计模式?
单例设计模式。
单例设计模式就是确保每次拿到的对象都是同一个对象,也就是这个类产生一个对象作为公用,单例设计模式,包括懒汉式和饿汉式,他们的区别是,饿汉式上来就直接创建对象,并且私有构造器,对外提供访问对象的方法。这种属于消耗内存空间但节约了时间,因为JVM创建对象也需要时间,还有一种是懒汉式,懒汉式也是私有构造方法,并且事先声明一个对象引用,对外提供访问对象的方法,当方法被调用时,判断对象引用是否为null,为null就创建该对象。
关于懒汉式和饿汉式有个很重要的注意点就是懒汉式在多线程下有可能会出问题,就是创建出多个对象,而饿汉式则不会。
工厂设计模式
工厂设计模式就是将创建对象的权力转交给工厂进行,比如一个咖啡工厂对外提供生产咖啡,卡布奇洛,需求者只需调用工厂提供的方法就能获得对象,而无需自己创建对象,当然这么做肯定有个好处,在项目后期维护的时候如果某个类发生变化只需要去改动创建者工厂而无需每个手动更改之前创建过的对象。
装饰者设计模式
装饰者设计模式算是动态代理设计模式的低配版,从功能上来说,实际上单纯就是为了增强功能,装饰的方法在这个过程中发生了变化,区别于动态代理,装饰者模式更像是继承的一种替代方案。大家都遵循一个开发规范的接口,我想基于你的实现类开发我自己的功能,而我只需要实现这个开发规范的接口并且传入你这实现类的对象,我在使用新功能时用我自己的规范,而其他部分则使用你的对象的方法。
动态代理设计模式
而动态代理更强调的是控制访问,代理类可以对它的客户隐藏一个具体的对象信息,相当于在这个过程中我可以控制对象做其他的事,偏重在对某一个功能的把控流程和辅助(大意就是并不是在别人的方法上装饰我自己要的方法,而是在控制别人的方法替我完成我的任务)。
简单工厂和抽象工厂有什么区别?
其实和抽象类和普通类的区别很像,简单的来说简单工厂适合应单一的产品,而抽象工厂适应有多个品种的产品。
Spring/SpringMVC类
1.为什么要用Spring?
实际上讲因为方便。理论上讲 Spring是一个优秀的轻量级框架,具有IOC控制反转和AOP面向切面编程,IOC使用Spring方便解耦,将创建对象和依赖关系的维护统统交给Spring管理。AOP则可以方便的对程序实现权限控制,日志处理等等,还有Spring的声明式事务编程使得我们不需要通过编写代码,只需要配置就能完成对事务的支持,还有Spring可以对各类优秀框架的方便集成。
2.解释一下什么是AOP?
AOP是面向切面编程,也就是以动态代理为核心,将程序需要的重复代码抽离出来,在需要执行的时候使用动态代理,使得业务之间的耦合降低。
3.解释一下什么是IOC?
IOC即控制反转,也就是将创建对象的权力,反过来交给Spring创建和管理。削减项目程序之间的耦合,同时说到IOC还涉及到另外一个概念,DI即依赖注入,常用的有set注入和构造器注入,用于管理bean之间的依赖关系。
4.Spring有哪些主要模块?
Core ,核心类库,主要实现IOC功能,也是Spring所有功能的依赖
AOP,提供Spring的AOP机制的支持类库
ORM,提供对常见的ORM框架的集成支持比如mybatis,hibernate
DAO,提供对JDBC的支持
WEB,提供一些WEB工具类的支持,比如Struct2
MVC,提供的轻量MVC实现
Context,Spring提供的对bean的访问方式
5.Spring常用的注入方式?
set方法注入,构造器注入,工厂注入
6.Spring中的Bean是线程安全的吗?
结合Bean的作用域来说,Spring本身没有对单例bean封装一些多线程的处理,线程的安全需要由程序员把控,如果是多例bean的则每次拿对象都相当于new一个对象,因此是线程安全的。
7.Spring支持几种bean的作用域?
单例模式:整个Spring的容器中只有一个该bean的实例。
多例模式:每次请求获取bean的时候都new一个实例给他。
requset:只有web应用中才生效,对于每次http请求,都产生一个新的实例。
session:只有在web应用中生效,对于每次session共享一个bean。
global-session:只有在web应用中生效,对于全局整个session中共享一个bean。(这个可能是session集群?)
8.Spring的事务实现方式有哪些?
声明式事务,编程式事务。
9.说一下Spring的事务隔离?
Spring默认使用的是和数据库相同的隔离级别,其中隔离级别包括读未提交(最低级别会产生脏读,不可重复度和幻读),读已提交(解决脏读), 可重复度(解决不可重复度),串行化(解决幻读)。
脏读,读到其他事务未提交的数据,不可重复度,读到其他事务提交的更新的数据,造成查询结果不一致,幻读,读到其他事务提交的插入数据,导致多次查询结果不一致。
10.说一下Spring的bean自动装配?
@Autowire 按类型自动装配,@Qualifire在@Auotowire的基础上实现按名称装配,这个注解不能单独使用
@Resource 按名称装配。
11.说一下SpringMVC的运行流程?
用户发送请求到后天,由DispatcherServelt(前端控制器)拦截,然后解析url根据uri找对应的HandlerMapping(处理器映射器),根据返回的handler,选择一个合适的HandlerAdapter处理器适配器,然后在Handler中执行比如入参的操作,最后又Handler返回一个MolderAndView对象,在由前端控制器请求ViewResolver视图解析器解析获得视图对象。
12.说一下SpringMVC有哪些组件?
前端控制器,处理器映射器,处理器适配器,视图解析器
13.@RequstMapping的作用是什么?
建立请求url和方法之间的映射关系。
14.@Auotowire的作用是什么?
Spring的bean按类型自动装配。
Mybatis类
1.#{}和${}有什么区别?
#{}会在执行的时候将参数的部分替换成?把参数的值看成一个字符串,而${}则是直接拼接进入sql语句,有可能会引起sql注入。
2.mybatis有几种分页方式?
物理分页和逻辑分页。
3.mybatis逻辑分页和物理分页的区别?
物理分页,用sql语句的limit进行分页,逻辑分页一次性全查到后台,前端需要多少拿多少。
4.mybatis的一级缓存和二级缓存?
一级缓存:mybatis的sqlsession对象中的缓存。当我们执行查询后会将结果存入到sqlsession提供的一个区域,这个区域是一个map集合,当我们下次查询的时候会先到这个map集合中去拿,有的话直接使用。
二级缓存:mybatissqlssesionfactory工厂对象的缓存。由同一个工厂生产的sqlsession对象共享这个缓存。
5.mybatis分页插件的原理是什么?
在我们执行sql语句之前进行拦截,动态的拼接上分页语句实现它的分页功能。
MySql类
1.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
这要看数据库的数据引擎选择,如果是Innodb的话,mysql记录的最大自增id保存在内存中,重启则会丢失最大id,也就是id是6,如果是MyISAM的话,最大自增ID保存在数据库文件,因此id是8
2.如何获取当前数据库版本?
select version()
3.说一下ACID是是什么?
事务的原子性要么操作成功要么操作失败,一致性事务不能破坏数据的完整性,隔离性不同事务之间要互相隔离,持久性事务结束后对数据的改变是持久性的。
4.char和varchar的区别?
char是存储固定长度类型
varchar是存储可变长度类型。
5.float和double的区别?
float单精度,存储有效十进制8位
double双精度,存储有效十进制16位。
6.mysql的左连接,右连接,外连接有什么区别?
内连接是显示两个表中有联系的数据。
左连接是以左表为参照,显示所有数据没有的为null。右连接则相反。
7.mysql的索引是怎么实现的?
mysql两个数据库引擎的索引底传都是使用B+树为底层数据结构的索引,B+树的搜索效率高,可以达到二分法的性能。
8.怎么验证mysql的索引是否满足需求?
在select语句前加explain。
9.说一下数据库的事务隔离?
读未提交(最低级别会产生脏读,不可重复度和幻读),读已提交(解决脏读), 可重复度(解决不可重复度),串行化(解决幻读)
10.说一下mysql常用的引擎?
innodb,MyIsam,这两个引擎的索引底层都是用B+树,然后innodb支持事务和外键,Myisam不支持事务和外键。
11.说一下乐观锁和悲观锁?
乐观锁认为我拿数据的时候别人不会修改数据所以我不上锁,但是我在更新的时候会判断一下我拿数据这个过程中数据是否被修改过。
悲观锁则认为我拿数据的时候别人一定会修改,所以我必须上锁,等我拿完数据以后别人才能进来。
12.如何做到mysql的性能优化?
避免select * 要查什么就查什么。
如果确定只要查询一条记录的话,可以用limt 1 这样mysql在查询到就不会继续往下查询数据。
mysql的查询缓存还有给经常查询的字段建立索引