JAVA面试题专项练习
1.char和varchar的区别?
2Array和ArrayList的区别?
3.ArrayList和Vector的区别?
4.ArrayList和LinkedList的区别是什么?
5、CSS中margin、padding的作用、以及单参、双参、四参数在方向上的顺序?
6、java.sql.Date和java.util.Date的联系和区别?
7、http响应码401和403代表的是什么?
8、PreparedStatement比Statement有什么优势?
9.Servlet的生命周期?
10.从表login中选出name字段包含admin的前10条结果所有信息的sql语句?
11.Spring是什么?
12.数据库的隔离别有哪些?
13.cookie的实现原理?
14.AOP的实现原理?
15.AOP用在什么地方?
16.Spring中的Bean生命周期?
17.Spring框架中使用到了什么设计?
18.HashSet与HashMap区别?
19.ACID是什么?
20.表单提交中get和post的区别?
21.@Resource和@Autowired区别?
22.请写出Spring中基于xml的事务配置过程!I?
23、HashMap 与HashTable有什么区别?
24、创建线程的方式有几种?
25、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写和重载的区别?
26、接口和抽象类的区别是什么?
27、Java中Exception和Error有什么区别?
28、throw和throws有什么区别?
29、sql语句分类是哪些?
30、delete、drop、truncate区别?
31、SpringMVC中常用的注解有哪些?
32、阐述JDBC操作数据库的步骤。
33、线程的生命周期?
34、final finally finalize区别?
35、==和equals的区别是什么?
36、什么是java序列化?什么情况下需要序列化?
37、在java程序中怎么保证多线程的运行安全? 重点!!
38、说一下synchronized 底层实现原理?
39、获取数组长度?获取String长度?
40、JVM内存模型
41、事务四大特性
42、String能被继承吗?为什么?
43、两个对象的hashCode()相同,则equals()也一定为true,对吗?
44、ThreadLocal用过么,用途是什么
45、Java创建线程之后最终都会执行run()方法,但是直接调用start()方法和run()的区别
46、sleep()和wait()有什么区别?
47、forward和redirect的区别?
48、session和cookie有什么区别?
49、说一下JSP的4种作用域?
50、JSP和servlet有什么区别?
51、数据库索引的作用及其索引原理?
52、Eunumeration和lterator接口的区别?
53、SQL语句的执行顺序
54、事务在什么时候会失效
55、什么是Spring的Bean循环依赖,如何解决?
56、mysql int(10)和int(11)的区别
57、js中json字符串转换集json对象、json对象转换json字符串
58、for和for-each区别,哪个效率更快,原因?
59、常见的异常类有哪些,说出10个?
60、springMVC拦截器怎么配置
61.bean的生命周期
62.题目:学生表:|学号│姓名│专业|班级│
成绩表:|学号│课程编号│成绩│
63.MyBatis中collection和assosication区别?
collection:关联集合的,一对多
assosication:关联实体类,一对一
64、什么是MyBatis的一级缓存和二级缓存?
66、什么是双亲委派模型
67、Lock锁的使用
68、jsp动态include和及静态include有什么区别
69、List l1 = new ArrayList();List l2 = new ArrayList(); System.out.printIn(l1.getClass() == l2.getClass());输出是啥?
70、a=a+b和a+=b的区别
71、java中this和super的区别
72、SpringMVC的工作流
81、InnoDB和MylSAM的区别
82、使用synchronized修饰静态方法和非静态方法有什么区别
83、高并发下,如何做到安全的修改同一行数据
84、int和Integer有什么区别
85、简述synchronized和java.util.concurrent.locks.Lock的异同
86、得一个类的类对象有哪些方式
87、什么是CAS
88、类加载器工作机制
89、Java 中,Comparator 与Comparable有什么不同?
90、请说明一下eden区和survial区的含义以及工作原理?
91.Ajax的状态值与状态码有哪些?
92.写一个安全的单例模式?
93.线程池有哪些?
94.两个对象的hashCode()相同,则equals()也一定为true,对吗?
95.Java中的Math. round(-1.5)等于多少?
Math. round(-1.5)— 输出±0.5
96.HTTP有哪些method
97.String、StringBuilder、StringBuffer区别?
99.Collection和Collections有什么区别?
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
100.在Queue中poll()和remove()有什么区别?
101、SpringMVC的执行流程
102、Integer a= 127 与lnteger b = 127相等吗?
103、Mybatis的一级、二级缓存
104、列举工作中常用的几个git命令?
105、提交时发生冲突,你能解释冲突是如何产生的吗?你是如何解决的?
106、Git中如果代码出现bug,你们是如何解决的?
107、项目中常见的分支有哪些?
108、String a = “ab” ; String b = “a”+ “b”; a == b是否相等,为什么?
109、volatile作用?
110、Java中,Comparate和
111.CAS的原理及作用?
112.如何实现Ajax的跨域?
113.String内部如何实现equals方法?
114、ArrayList如何实现线程安全
115、冒泡排序算法
116、Spring中事务在什么情况下回失效。
117、主键索引和普通索引的区别,为什么主键要比普通快?
118、什么是脏读、幻读、不可重复读
119、如何防止表单重复提交
200.原生Ajax的请求步骤
201.ArrayList和Vector的区别
202.List, Set,Map三个接口,存取元素时,各有什么特点?
203.Collection和Collections的区别
204.HashMap的实现原理
205.volatile关键字的作用?能否保证线程安全?
206.高并发应该使用什么Map
207.什么是乐观锁悲观锁
208.数据库的三大范式
209.synchronized锁是公平锁还是非公平锁
210.十进制数12的二进制表示应该是?
211.ConcurrentHashMap在JDK1.8之后结构做了哪些改进?
改进一:取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。
212.Spring Bean作用域的有哪些?
213.Spring中Bean的注入方式有哪些
214.如何获取自动生成的(主)键值?
215.了解过哪些JDK8的新特性,举例描述下相应的特性?
216.hashCode的作用?
217.深拷贝和浅拷贝区别
218.JAVA遍历Map的方式有几种
219.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
220.forward和redirect的区别?
1.char和varchar的区别?
char固定,varchar可变
2Array和ArrayList的区别?
Array:数组,固定长度,确定了数据类型
ArrayaList:集合,可变 ,,object都可以 get/remove/add
3.ArrayList和Vector的区别?
ArrayList:查询快
Vector:线程安全,但是效率低,扩容2倍
ArrayList:线程不安全,扩容1.5倍
4.ArrayList和LinkedList的区别是什么?
LinkedList:底层是双向链表,删除和修改块
5、CSS中margin、padding的作用、以及单参、双参、四参数在方向上的顺序?
6、java.sql.Date和java.util.Date的联系和区别?
java.sql.Date extends java.util.Date
7、http响应码401和403代表的是什么?
401: 未授权
403: 禁止
404:文件找到
503:服务器内部错误
200:成功
302:重定向
8、PreparedStatement比Statement有什么优势?
PreparedStatement extends Statement
PreparedStatement性能高于Statement,采用占位符,防止sql注入,性能高。
9.Servlet的生命周期?
1.调用构造方法创建servlet对象(servlet是单例的构造方法,只能执行一次)
2.调用int方法,进行初始化操作(只会执行一次)
3.当有请求访问servlet时,会执行service方法(每次请求都会执行),在父类HttpServlet中,
重写了service方法,会把请求分给doPost()和doGet()方法
4.当容器关闭的时候,会执行destory方法,销毁对象,释放资源。
10.从表login中选出name字段包含admin的前10条结果所有信息的sql语句?
select*from login where name like ‘%admin%’ limit 0,10
11.Spring是什么?
项目管理框架,框架三层, Ioc/DI
12.数据库的隔离别有哪些?
read uncommitted(脏读):读取了其他事务未提交的数据
read committed(不可重复读):在一个事务中读取了另一个数据中update之后的数据
repeatable read(幻读):在一个事务中读取了另外一个事务中insert,delete之后的数据
serializable()
13.cookie的实现原理?
cookie数据存储在客户端的浏览器中,默认是放在浏览器的缓存中,所以关闭浏览器就被删除了,我们也可以设置cookie的有效期,这个时候会将cookie数据存储在本地磁盘中。cook不能存储对象,只能存储字符串,存储数量和大小有限制,安全性低。cookie是通过HTTP协议实现传输的。
14.AOP的实现原理?
动态代理,JDK,Cglib
15.AOP用在什么地方?
日志,事务,权限控制
16.Spring中的Bean生命周期?
单例:启动创建对象->set注入->后置处理器的前置过程->int方法初始化->后置处理的后置过程->使用->工厂关闭,对象销毁destory
多例:被使用时创建对象->set注入->后置处理器的前置过程->int方法初始化->后置处理的后置过程->使用->JVM进行垃圾处理,对象销毁
17.Spring框架中使用到了什么设计?
工厂、单例、代理、模板模式、jdbcTemplate
18.HashSet与HashMap区别?
HashSet:底层是HashMap
HashMap:数组+链表+红色黑树
19.ACID是什么?
数据库管理系统的四个特性:原子性、一致性、隔离性、持久性
20.表单提交中get和post的区别?
get:参数值通过地址栏传值 url?key=value&key=value
post:参数值通过http传值
21.@Resource和@Autowired区别?
Resource:基于名称,JDK
Autowired:基于类型,Qualifier,基于名称,Spring
22.请写出Spring中基于xml的事务配置过程!I?
1>配置事务管理器
2>配置事务特性
<tx:advice transaction-manager=“txManager”>
tx:attributes
<tx:method name=“insert” rollback-for=“Exception”/>
</tx:attributes>
</tx:advice>
3>配置事务切面
aop:config
<aop:pointcut id=“myPointcut” expression=“execution(public void com.qf.service.UserService.insert(…))”/>
<aop:advisor advice-ref=“myAdvice” pointcut-ref=“myPointcut”/>
</aop:config>
23、HashMap 与HashTable有什么区别?
共同点:都是双列集合,底层都是哈希算法。
不同点:HashMap 可存储null键和null值 线程不安全,效率高,JDK1.2版本
HashTable 不可存储null键和null值 线程安全,效率低,JDK1.0版本
24、创建线程的方式有几种?
继承Thread
实现Runnable
实现Callable
线程池
25、Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写和重载的区别?
重写:子类重写父类方法
重载:同类中方法名相同而参数不同的方法
26、接口和抽象类的区别是什么?
接口;接口不能包含字段、构造函数、析构函数、静态成员或常量。成员被定义为公共的,成员不能有 public、protected、internal、private 等修饰符
抽象类:可以提供方法的部分实现,成员也可以是私有的、受保护的、内部的或受保护的内部成员
27、Java中Exception和Error有什么区别?
28、throw和throws有什么区别?
throw:产生异常
throws:抛出异常
29、sql语句分类是哪些?
DQL DML DDL DCL
30、delete、drop、truncate区别?
delete:删除数据
truncate:删除数据以及表内存结构
drop:删表删库
31、SpringMVC中常用的注解有哪些?
@RequestMapping
@ResponseBody
@PathVariable
@Session
32、阐述JDBC操作数据库的步骤。
加载驱动—建立数据连接—创建statement—操作Resultset结果集—释放资源
33、线程的生命周期?
34、final finally finalize区别?
final:最终修饰符,最终类不能被继承,最终属性和变量不能被修改,最终方法不可被覆盖或重写。
finally:异常 System.exit(0)/return最终
finalize:Object类型 回收垃圾对象最后执行的方法
35、==和equals的区别是什么?
假设Object1和Object2
比较引用对象的两个地址,表示地址指向同一个引用对象
equals()重写后比较对象的内容,重写前与“”一致。
36、什么是java序列化?什么情况下需要序列化?
Student s = new Student(); --> file
内存–》转换–》磁盘
s —>
String s = “abc” 这是反序列化
序列化:指把Java对象转化字节序列存储的过程,用于远程数据传输。反之成为“反序列化”
37、在java程序中怎么保证多线程的运行安全? 重点!!
38、说一下synchronized 底层实现原理?
面试标准回答:
1> synchronized是JVM实现的一种互斥同步访问方式,底层是基于每个对象的监视器(monitor)来实现的。被synchronized修饰的代码,在被编译器编译后在被修饰的代码前后加上了一组字节指令。
2> 在代码开始加入了monitorenter,在代码后面加入了monitorexit,这两个字节码指令配合完成了synchronized关键字修饰代码的互斥访问。
3> 在虚拟机执行到monitorenter指令的时候,会请求获取对象的monitor锁,基于monitor锁又衍生出一个锁计数器的概念。
4> 当执行monitorenter时,若对象未被锁定时,或者当前线程已经拥有了此对象的monitor锁,则锁计数器+1,该线程获取该对象锁。
5> 当执行monitorexit时,锁计数器-1,当计数器为0时,此对象锁就被释放了。那么其他阻塞的线程则可以请求获取该monitor锁。
39、获取数组长度?获取String长度?
arr数组.length;
“字符串”.length( );
40、JVM内存模型
41、事务四大特性
ACID :原子、一致、隔离、持久
42、String能被继承吗?为什么?
不能,因为被final修饰为最终类、变量、方法
43、两个对象的hashCode()相同,则equals()也一定为true,对吗?
不一定,equals被重写
44、ThreadLocal用过么,用途是什么
线程本地变量,又叫线程本地存储。用于解决安全性问题
45、Java创建线程之后最终都会执行run()方法,但是直接调用start()方法和run()的区别
start():启动线程 在直接调用start()方法后,run()方法执行时被当作线程执行体 —>正确执行方式
run():线程执行 在调用run()方法后,它仅被当作普通方法执行 ----》非正常
46、sleep()和wait()有什么区别?
sleep():设置时间,不会释放锁
wait():唤醒,释放锁、notify/notifyall
47、forward和redirect的区别?
forward:内部转发,一次
redirect:重定向,俩次
48、session和cookie有什么区别?
session:运行在服务器,存储在服务器,各种类型数据,大小无限制,默认存储保存30分钟
cookie:运行在客户端,存储在客户端,只存储字符串,只存储较小数据 客户端关闭后存储消失
49、说一下JSP的4种作用域?
application、request、session、page
50、JSP和servlet有什么区别?
Servlet
一种服务器端的Java应用程序
由 Web 容器加载和管理
用于生成动态 Web 内容
负责处理客户端请求
Jsp
是 Servlet 的扩展,本质上还是 Servlet
每个 Jsp 页面就是一个 Servlet 实例
Jsp 页面会被 Web 容器编译成 Servlet,Servlet 再负责响应用户请求
区别
Servlet 适合动态输出 Web 数据和业务逻辑处理,对于 html 页面内容的修改非常不方便;Jsp 是在 Html 代码中嵌入 Java 代码,适合页面的显示
内置对象不同,获取内置对象的方式不同
51、数据库索引的作用及其索引原理?
作用:提高查询效率 全表扫描
原理:采用某种数据结构(二叉树、平衡树、Hash表、BTree、B+Tree)存储索引
主键索引(聚集索引)、唯一索引、联合索引、普通索引
create unique index索引名(字段)
52、Eunumeration和lterator接口的区别?
共同点:都是接口,都可以对集合进行迭代
不同点:Enumeration一般对Hashtable和Vector这种安全类型的集合进行迭代
lterator可以对实现了Collection接口的集合进行迭代
lterator支持fail-fast(Concurrent Modification Exception)
推荐使用lterator
53、SQL语句的执行顺序
语句结构:select字段—from表1—join表2— on链表条件----where筛选条件 -----group by分组字段----having分组过滤----order by排序字段----limit xxxx限制取值
执行顺序:1.from:得到一个虚拟表v1
2.join之后的带一个笛卡尔表v2
3.on 对v2表中的数据进行过滤v3
4.where对v3中的数据进行筛选v4
5.select选择v4表中的对应字段v5
6.group by 对v5进行分组v6
7.having 对v6进行筛选v7
8.order by 对v7进行排序v8
9.limit 对v8进行限制v9
54、事务在什么时候会失效
1 .spring声明事务管理默认对非检查型异常和运行时异常进行事务回滚
2.当绕过代理对象, 直接调用添加事务管理的方法时, 事务管理将无法生效.
55、什么是Spring的Bean循环依赖,如何解决?
概念:两个或者两个以上的Bean互相持有对方而相互引用。
解决办法:set注入可以解决
56、mysql int(10)和int(11)的区别
括号里表示显示的宽度,最大存储长度!!11是最大值
57、js中json字符串转换集json对象、json对象转换json字符串
json对象-》string JSON.stringify(json对象)
string-》json对象 JSON.parse(json字符串)
58、for和for-each区别,哪个效率更快,原因?
For和for-each都是循环语句:for:通过下标,效率低,复杂语境下更便捷
简化版for-each:通过迭代器进行迭代,效率高,安全性强,但不适用复杂循环
59、常见的异常类有哪些,说出10个?
算数异常类:ArithmeticExecption
空指针异常类型:NullPointerException
类型强制转换类型:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
方法未找到异常:NoSuchMethodException
下标越界异常:IndexOutOfBoundsExecption
系统异常:SystemException
创建一个大小为负数的数组错误异常:NegativeArraySizeException
数据格式异常:NumberFormatException
安全异常:SecurityException
不支持的操作异常:UnsupportedOperationException
60、springMVC拦截器怎么配置
mvc:interceptors
mvc:interceptor
<mvc:mapping path="/user/login">
</mvc:mapping>
</mvc:interceptor>
</mvc:interceptors>
61.bean的生命周期
62.题目:学生表:|学号│姓名│专业|班级│
成绩表:|学号│课程编号│成绩│
1、查找显示成绩表中"学号"字段的全部数据,要求查询结果中不包含重复记录
2、在成绩表中,找出02号课程成绩中的最高分
3、在学生表中找出姓刘或姓李的学生
4、查找01号课程成绩介于60与80之间的学生记录
5、把成绩表中课程编号='01’的所有学生记录按成绩从高到低排列显示出来
6、统计每个课程的平级成绩
7、找出挂科最多的课程
8、在成绩表中,计算每个学生各门功课的总成绩和平均成绩,并按照总成绩降序排列
9、查询01号课程成绩进前三名的同学的课程编号,成绩
10、将课程编号='01’中最高分的学员姓名显示出来
63.MyBatis中collection和assosication区别?
collection:关联集合的,一对多
assosication:关联实体类,一对一
64、什么是MyBatis的一级缓存和二级缓存?
使用缓存目的:使用缓存是为了减少和数据库的交互次数,提高执行效率。
适用缓存的数据要求:经常查询并且不经常改变的,并且的数据的正确与否对最终结果影响不大的。
一级缓存:它指的是Mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入到SqlSession为我们提供的一块区域中,该区域的结构是一个Map,当我们再次查询同样的数据,mybatis会先去sqlsession中查询是否有,的话直接拿出来用,当SqlSession对象消失时,mybatis的一级缓存也就消失了,同时一级缓存是SqlSession范围的缓存,当调用SqlSession的修改、添加、删除、commit(),close等方法时,就会清空一级缓存。
二级缓存:他指的是Mybatis中SqlSessionFactory对象的缓存,由同一个SqlSessionFactory对象创建的SqlSession共享其缓存,但是其中缓存的是数据而不是对象,所以从二级缓存再次查询出得结果的对象与第一次存入的对象是不一样的。
65、JVM中类的加载过程是怎么样的
过程:加载(应用程序局部参与、Java虚拟机主导)→连接(验证【文件格式验证-元数据验证-字节码验证-符号引用验证】→准备→解析)→初始化(Java虚拟机编译Java代码,主导权移交应用程序)
66、什么是双亲委派模型
双亲委派模型中将 类加载器进行等级划分,当一个类加载器收到一个类加载的请求时,自己先不会处理这个请求,而是将这个请求交给父类加载器,最终请求会传到启动类加载器,如果父类加载器不能完成这个请求,就会向下一级进行加载,直到将类加载进来。
67、Lock锁的使用
synchroniezed:关键词,通过JVM的底层实现,锁的升级过程,推荐!不可中断锁
Lock:接口,通过代码实现锁的过程,状态+CAS+链表(一个记录连接的状态),可中断锁
68、jsp动态include和及静态include有什么区别
静态包含:<%@include file=“文件”%>
动态包含: <jsp:include page=“文件”/>
69、List l1 = new ArrayList();List l2 = new ArrayList(); System.out.printIn(l1.getClass() == l2.getClass());输出是啥?
true,泛型擦除,在程序运行中是没有泛型类型的了
70、a=a+b和a+=b的区别
第一个有类型转换问题,最后的值总会转换成int类型;第二个没有类型转换;
a=(强转)(a+b)才可以变想要的类型。
71、java中this和super的区别
(1)this代表本类对应的引用。
(2)super代表父类存储空间的标识(可以理解为父类引用可以操作父类的成员)
72、SpringMVC的工作流
①客户端通过url发送请求—②核心控制器Dispatcher Servlet接收到请求—映射器配置找到handler,将url映射的控制器controller返回给核心控制器—③通过核心控制器找到系统或默认的适配器—④调用实现对应接口的处理器,将结果返回适配器,由适配器返回核心控制器—⑤核心控制器将获取的数据和视图结合的对象传递给视图解析器,解析得到的结果由视图解析器响应给核心控制器—⑥核心控制器将结果返回给客户端
81、InnoDB和MylSAM的区别
lnnoDB:支持事务、主外键,效率要低,索引结构不同(索引和数据在一起)
MylSAM:都不支持,效率高(索引和数据是分开);
Mysql的默认事务隔离级别是“可重复读”
82、使用synchronized修饰静态方法和非静态方法有什么区别
synchronized在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。
83、高并发下,如何做到安全的修改同一行数据
一:基于 jvm 解决方式。
1>.将全局变量, 自增时得代码块 加Synchorized 关键字
2>. lock lock= new ReentranLock()
try{
lock.lock()
//将全局变量, 自增时得代码块
}finally{
lock.unlock();
}
二: 分布式 解决方式
数据库锁 : 悲观锁。性能非常差
redis 锁 : 容易产生死锁,或被别人修改。
Zookeeper 锁
数据监听触发器
84、int和Integer有什么区别
int:是基本数据类型,直接存储,默认值0
Integer:是int的包装类,对象的引用,默认值null
85、简述synchronized和java.util.concurrent.locks.Lock的异同
synchronized:可重复锁,不能中断,不能看状态,自动解锁,资源竞争激烈时性能低
Lock:阻塞中会中断,可查看状态,手动释放锁,性能稳定
86、得一个类的类对象有哪些方式
87、什么是CAS
概念:即比较并交换,是并发编程中一种常用的算法。它包含了三个参数:V,A,B。
其中,V 表示要读写的内存位置,A 表示旧的预期值,B 表示新值。
使用规则:线程冲突时就使用一种叫做 CAS (比较交换) 的技术来鉴别线程冲突,如果检测到冲突发生,就重试当前操作到没有冲突为止。
CAS原理:获取旧的内存值V,获取当前内存值A,只有当V==A,才将内存值修改成B
88、类加载器工作机制
在JVM中类加载机制主要有3种:
- 全盘加载, 顾名思义就是当某一个类加载器加载某个.class文件时, 默认也会连同该文件所依赖的.class一起加载(除非显示声明通过某个指定的类加载器加载)。
- 缓存机制, 即所有类加载器已经加载过的.class文件都会被保存到缓存中, 下次使用该.class文件时, JVM会优先从缓存中查找, 如果没有才会去加载指定的字节码文件, 这也是为什么当字节码文件变化后,需要重启JVM后才能看到修改效果的原因。
- 双亲委派,大白话解释:儿子(App)要星星, 他自己实现不了,就找他老爹(Ext)要,他老爹能实现的话就给他了,实现不了,就找他爷爷(BootStrap)要说:你孙子要天上的星星,他爷爷如果能实现就给了,如果也实现不了, 就会告诉他爹(Ext),让你儿子(App)自己实现吧。这种情况有点极,属于谁都没有加载,则程序报错,会抛出异常。
89、Java 中,Comparator 与Comparable有什么不同?
List list
Collections.sort(list);
java.lang.Comparable public int compareTo(T o);用在类上,内部比较器
java.util.Comparator int compare(T o1,T o2);外部比较器
90、请说明一下eden区和survial区的含义以及工作原理?
扩展:目前主流的虚拟机实现都采用了分代收集的思想,把整个堆区划分为新生代和老年代;新生代又被划分成Eden 空间、 From Survivor 和 To Survivor 三块区域。
eden区: Eden区位于Java堆的年轻代,是新对象分配内存的地方,由于堆是所有线程共享的,因此在堆上分配内存需要加锁。如果Eden区内存也用完了,则会进行一次Minor GC(young GC)。
survial区:Survival区与Eden区相同都在Java堆的年轻代。
Survival区有两块,一块称为from区,另一块为to区,这两个区是相对的,在发生一次Minor GC后,from区就会和to区互换。在发生Minor GC时,Eden区和Survivalfrom区会把一些仍然存活的对象复制进Survival to区,并清除内存。Survival to区会把一些存活得足够旧的对象移至年老代。
老年代:年老代里存放的都是存活时间较久的,大小较大的对象,因此年老代使用标记整理算法。当年老代容量满的时候,会触发一次Major GC(full GC),回收年老代和年轻代中不再被使用的对象资源。
91.Ajax的状态值与状态码有哪些?
AJAX状态值是指:运行AJAX所经历过的几种状态,无论访问是否成功都将响应的步骤,可以理解成为AJAX运行步骤
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了
AJAX状态码是指,无论AJAX访问是否成功,由HTTP协议根据所提交的信息,服务器所返回的HTTP头信息代码,该信息使用“ajax.status”所获得
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功
204——请求收到,但返回信息为空
304——客户端已经执行了GET,但文件未变化
400——错误请求,如语法错误
404——没有发现文件、查询或URl
500——服务器产生内部错误
505——服务器不支持或拒绝支请求头中指定的HTTP版本
92.写一个安全的单例模式?
单线程单例模式
优化线程,但安全性低:
再优化性能,提高安全性:
93.线程池有哪些?
*newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有任务的执行顺序
按照任务的提交顺序执行。
*newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到
线程达到线程池的最大大小。
*newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线
程池大小完全依赖于操作系统(或者说 JVM)能够创建的最大线程大小。
*newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执
行任务的需求。
94.两个对象的hashCode()相同,则equals()也一定为true,对吗?
#两个对象的hashCode()相同,方法重写后equals()不一定为true;
#两个对象的equals为true,则两个对象的hashcode一定为true;
95.Java中的Math. round(-1.5)等于多少?
Math. round(-1.5)— 输出±0.5
96.HTTP有哪些method
GET的请求应该只被用于获取数据.
POST方法用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用.
PUT方法用请求有效载荷替换目标资源的所有当前表示。
HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体.
DELETE方法删除指定的资源。
97.String、StringBuilder、StringBuffer区别?
相同点:都用来封装字符串;都实现了CharSequence接口。
不同点:
1.可变与不可变:String类是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的,直到这个对象被销毁。StringBuffer与StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,是可变类。
2.初始化方式不同:创建String对象时,可以利用构造方法String str = new String(“Java”)的方式来对其进行初始化,也可以直接用赋值的方式String s = "Java"来初始化。而StringBuffer只能使用构造方法StringBuffer sb = new StringBuffer(“hello”)的方式初始化。
3.字符串修改方式不同:String字符串修改方法是首先创建一个StringBuffer,其次调用StringBuffer的append方法,最后调用StringBuffer的toString()方法把结果返回。StringBuffer和StringBuilder在修改字符串方面比String的性能要高。
4.是否实现equals和hashCode方法:String实现了,而StringBuffer没有。因此,new StringBuffer(“java”).equals(new StringBuffer(“java”))的结果为false,将StringBuffer对象存储进Java集合类中会出现问题。
5.线程是否安全:StringBuilder是线程不安全的,StringBuffer是线程安全的。
6.效率高低:执行效率方面,StringBuilder最高(单线程中),StringBuffer次之(多线程访问),String最低(数据量比较小)。
98.String类的常用方法都有那些?
length() 字符串的长度、charAt() 截取一个字符、 getChars() 截取多个字符、equals()和equalsIgnoreCase() 比较两个字符串、startsWith()和endsWith()、equals()和==、
indexOf()和lastIndexOf()查找字符或者子串第一次出现的地方和后一次出现的地方。
valueOf() 转换为字符串
99.Collection和Collections有什么区别?
Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。
java.util.Collection 是一个集合接口,其直接继承接口有List与Set。
100.在Queue中poll()和remove()有什么区别?
poll():不会抛异常,只会返回 null
remove():会抛NoSuchElementException异常
101、SpringMVC的执行流程
102、Integer a= 127 与lnteger b = 127相等吗?
对于对象引用类型:==比较的是对象的内存地址。
对于基本数据类型:比较的是值。
如果整型字面量的值在-128到127之间,那么自动装箱时不会new新的Integer对象,而是直接引用常量池中的Integer对象,超过范围 ab的结果是false
103、Mybatis的一级、二级缓存
Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
104、列举工作中常用的几个git命令?
git int 初始化:创建了一个git仓库
git add 修改:添加文件到缓冲区
git commit 提交
git rm 删除文件
git status 查看状态
git log 查看日志
git reflog 查看仓库操作历史
git reset 版本回退
git push分支合并
git pull 从远端更新到本地
git clone 从远端克隆到本地
git checkout 切换当前分支到指定分支
git branch -d 分支名 删除分支
105、提交时发生冲突,你能解释冲突是如何产生的吗?你是如何解决的?
106、Git中如果代码出现bug,你们是如何解决的?
开启一个Bug分支,
107、项目中常见的分支有哪些?
master:主分支,对外发布
dev:开发分支
test:测试分支
bug:修复bug分支
feature:特性分支
hotfixes:热线分支
108、String a = “ab” ; String b = “a”+ “b”; a == b是否相等,为什么?
abcd自己拼接成一个字符串a,所以只有一个对象和一个引用地址,因此相等
109、volatile作用?
110、Java中,Comparate和
111.CAS的原理及作用?
CAS原理:获取旧的内存值V,获取当前内存值A,只有当V==A,才将内存值修改成B。
原子变量都是基于CAS实现的
Atomiclnteger,AtomitLong
问题;ABA问题,通过版本号解决
112.如何实现Ajax的跨域?
jsonp(带有回调函数的json)
CORS(跨域资源共享)
代理
113.String内部如何实现equals方法?
1、首先是和自己比;
2、被比较的对象是否是String类型的;
3、再看它的长度是否相等;
4、比较它里面的每一个字符串;
114、ArrayList如何实现线程安全
一:使用synchronized关键字
二:使用Collections.synchronizedList()
115、冒泡排序算法
每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序,一次冒泡至少让一个元素移动到它应该排列的位置,重复N次,就完成了冒泡排序
116、Spring中事务在什么情况下回失效。
a、try,catch
b、抛出检测检测异常
c、数据库引擎不支持,MyISAM
117、主键索引和普通索引的区别,为什么主键要比普通快?
数据库的引擎是lnnodb
主键索引:索引的叶子节点存储的是行数据,主键索引建议用自增
普通索引:索引的叶子节点存储的是主键值,存储在二次索引过程
118、什么是脏读、幻读、不可重复读
脏读:在事务A修改数据之后提交数据之前,这时另一个事务B来读取数据,如果不加控制,事务B读取到A修改过数据,之后A又对数据做了修改再提交,则B读到的数据是脏数据,此过程称为脏读Dirty Read。
幻读:事务A在按查询条件读取某个范围的记录时,事务B又在该范围内插入了新的满足条件的记录,当事务A再次按条件查询记录时,会产生新的满足条件的记录(幻行 Phantom Row)
不可重复读:一个事务内在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了变更、或者某些记录已经被删除了。
扩展:不可重复读与幻读有什么区别?
不可重复读的重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的「数据不一样」。(因为中间有其他事务提交了修改)
幻读的重点在于新增或者删除:在同一事务中,同样的条件,第一次和第二次读出来的「记录数不一样」。(因为中间有其他事务提交了插入/删除)
119、如何防止表单重复提交
1、JavaScript防止表单重复提交(主要用于网络延迟情况下用户点击多次submit按钮导致表单重复提交)
2、将提交按钮设置为不可用,让用户点击第一次提交之后,没有机会点击第二次提交按钮的机会。(也可以将提交按钮隐藏起来,在点击第一次之后,将提交按钮隐藏起来)
3、利用Session防止表单重复提交(主要用于表单提交之后,点击浏览器刷新按钮导致表单重复提交,以及点击浏览器返回按钮退回到表单页面后进行再次提交)
200.原生Ajax的请求步骤
get请求:
var xhr = new XMLHttpRequest();
xhr.open(“get”,“validate.php?username=”+name);
xhr.send(null);
xhr.onreadystatechange = function(){
if(xhr.status == 200 && xhr.readyState == 4){ console.log(xhr.responseText); document.querySelector(".showmsg").innerHTML = xhr.responseText;;
}
}
post请求:
var xhr = new XMLHttpRequest();
xhr.open(“post”,“validate.php”);
xhr.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”);
xhr.send(“username=”+name);
xhr.onreadystatechange = function(){
// 判断服务器是否响应,判断异步对象的响应状态
if(xhr.status == 200 && xhr.readyState == 4){
document.querySelector(".showmsg").innerHTML = xhr.responseText;
}
}
201.ArrayList和Vector的区别
(1)同步性: Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的的
(2)扩容:当其容量超过初始值时,扩容大小不一致。ArrayList扩容原有初始容量的50%,而Vector扩容原有初始容量的100%
202.List, Set,Map三个接口,存取元素时,各有什么特点?
存放时:
1.List以特定的索引(有顺序的存放)来存放元素,可以有重复的元素
2.Set存放元素是无序的,而且不可重复
3.Map保存键值对的映射,映射关系可以是一对一(键值)或者多对一,需要注意到的是:键无序不可重复,值可以重复
取出时:
(1)List取出元素for循环,foreach循环,Iterator迭代器迭代
(2)Set取出元素foreach循环,Iterator迭代器迭代
(3)Map取出元素需转换为Set,然后进行Iterator迭代器迭代,或转换为Entry对象进行Iterator迭代器迭代
203.Collection和Collections的区别
Collection接口
Collection类(集合)
204.HashMap的实现原理
数组+链表+红黑树
205.volatile关键字的作用?能否保证线程安全?
特点:更轻量级,因为它不会引起线程上下文的切换和调度
volatile不能保证线程安全问题,原因在于它不能保证作用于变量的代码是原子操作,只能保证可见性和有序性。
206.高并发应该使用什么Map
HashTable
ConcurrentHashMap
207.什么是乐观锁悲观锁
乐观锁:假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁
208.数据库的三大范式
目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式。
即:第一范式(1NF),一个表中每个字段都是独立的
第二范式(2NF),表中每一行数据都是唯一的,所有非主键字段都和主键字段关联,不能存在间接依赖
第三范式(3NF),表中不能存在传递依赖
209.synchronized锁是公平锁还是非公平锁
公平锁:(Lock)
获取不到锁的时候,会自动加入队列,等待线程释放后,队列的第一个线程获取锁
非公平锁:
获取不到锁的时候,会自动加入队列,等待线程释放锁后所有等待的线程同时去竞争
什么是可重入?
同一个线程可以反复获取锁多次,然后需要释放多次
回答标题问题:synchronized 是非公平锁,可以重入。
在来看几个问题:
1、 synchronized 加在 static 修饰的 方法上锁的是哪个对象?
答:锁的是 Class 对象
2、synchronized(this) 锁的是哪个对象?
答:锁的是当前对象的实例也就是 new 出来的对象
3、synchronized() 锁的是哪个对象?
答:同 synchronized(this) 锁的也是当前对象的实例
4、synchronized(lock) 锁的是哪个对象?
答:锁的是 lock 对象。
5、同一个对象里面 有 static 方法加了 synchronized 还有一个普通方法也加了 synchronized 如果这个时候有2个线程,一个先获取 了 static 方法上的锁,另外一个线程可以在 第一个线程释放锁之前获取 普通方法上的锁吗?反过来呢?
答:可以的,因为这是 2 把锁,2 个线程分别获取2把锁,没有任何问题。
210.十进制数12的二进制表示应该是?
1100
!!.CAS原理
当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做
211.ConcurrentHashMap在JDK1.8之后结构做了哪些改进?
改进一:取消segments字段,直接采用transient volatile HashEntry<K,V>[] table保存数据,采用table数组元素作为锁,从而实现了对每一行数据进行加锁,进一步减少并发冲突的概率。
改进二:将原先table数组+单向链表的数据结构,变更为table数组+单向链表+红黑树的结构。对于hash表来说,最核心的能力在于将key hash之后能均匀的分布在数组中。如果hash之后散列的很均匀,那么table数组中的每个队列长度主要为0或者1。但实际情况并非总是如此理想,虽然ConcurrentHashMap类默认的加载因子为0.75,但是在数据量过大或者运气不佳的情况下,还是会存在一些队列长度过长的情况,如果还是采用单向列表方式,那么查询某个节点的时间复杂度为O(n);因此,对于个数超过8(默认值)的列表,jdk1.8中采用了红黑树的结构,那么查询的时间复杂度可以降低到O(logN),可以改进性能。
212.Spring Bean作用域的有哪些?
注意:Spring Bean 中所说的作用域,在配置文件中即是“scope”
在面向对象程序设计中作用域一般指对象或变量之间的可见范围。
而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。
-
singleton
-
prototype:
-
request:
-
session:
-
global session:
213.Spring中Bean的注入方式有哪些
注:Spring通过xml进行IOC配置的方式。
set方法注入:
构造器注入:
静态工厂注入:
实例工厂注入:
214.如何获取自动生成的(主)键值?
设置userGeneratedKeys属性值为true:使用自动增长的主键。使用keyProperty设置把主键值设置给哪一个属性
1
2 insert into tbl_employee(last_name,email,gender)
3 values(#{lastName},#{gender},#{email})
4
215.了解过哪些JDK8的新特性,举例描述下相应的特性?
Lambda 表达式、关键字来传递方法或者构造函数引用、直接在lambda表达式中访问外层的局部变量、
216.hashCode的作用?
hashcode方法返回该对象的哈希码值从Hash表中根据值取对象
217.深拷贝和浅拷贝区别
浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝把要复制的对象所引用的对象都复制了一遍。
218.JAVA遍历Map的方式有几种
方法一 在for-each循环中使用entries来遍历
方法二 在for-each循环中遍历keys或values。
方法三 使用Iterator遍历
方法四 通过键找值遍历(效率低)
219.怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
或者简写:
220.forward和redirect的区别?
注:servlet中的两种主要的跳转方式
forward(转发)特点:
地址栏路径不发生变化
转发只能访问当前服务器下的资源
forward是一次请求,传递的信息不会丢失,可以使用request对象共享数据
redirect(重定向)特点:
地址栏路径发生变化(forward:服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。redirect:服务器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,所以地址栏显示的是新的地址)
redirect可以访问其他站点(服务器)的资源
redirect是两次请求,传递的信息会丢失,不能使用request对象共享数据
forword转发是服务器上的行为,而redirect重定向是客户端的行为
221、Shiro认证和授权的流程?
222、传递一个集合作为参数给函数时,如何能确保函数将无法对其进行修改?
223、哪一个List实现了最快插入?
LinkedList
224、Java的concurrent包中的有哪些API?
newFixedThreadPool,newScheduledThreadPool,CyclicBarrier,ThreadPoolExecutor,原子变量(Atomic ),CompletionService,
225、怎么判断对象是否可以被回收?
1.引用计数算法
为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。
在两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。正是因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。
2.可达性分析算法
以 GC Roots 为起始点进行搜索,可达的对象都是存活的,不可达的对象可被回收。
Java 虚拟机使用该算法来判断对象是否可被回收,GC Roots 一般包含以下内容:
虚拟机栈中局部变量表中引用的对象
本地方法栈中 JNI 中引用的对象
方法区中类静态属性引用的对象
方法区中的常量引用的对象
226、一张自增表里面总共有7条数据,删除了最后⒉条数据,重启mysql数据库,又插入了一条数据,此时id是几?
是8,MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。
注意:InnoDB引擎下—内存内—6
227、AQS是什么
AQS(AbstractQueuedSynchronizer),AQS是JDK下提供的一套用于实现基于FIFO等待队列的阻塞锁和相关的同步器的一个同步框架。这个抽象类被设计为作为一些可用原子int值来表示状态的同步器的基类。如果你有看过类似 CountDownLatch 类的源码实现,会发现其内部有一个继承了 AbstractQueuedSynchronizer 的内部类 Sync 。可见 CountDownLatch 是基于AQS框架来实现的一个同步器.类似的同步器在JUC下还有不少。
228、java的基础类型和字节大小
byte(-128,127)一字节 < short(-32768,32767)二字节 < int(-2147483648,2147485647)三字节 < long(-263,263-1)四字节 < float(-3.4E38- 3.4E38)四字节 < double(默认值是0.0d)
boolean一字节 char二字节
229、CAS机制是什么,如何解决ABA问题。
CAS(Compare And Swap),即比较并交换。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。无论哪种情况,它都会在CAS指令之前返回该位置的值。CAS有效地说明了“我认为位置V应该包含值A;如果包含该值,则将B放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。
解决ABA问题:叠加版本号
230、http1.0和http1.1有什么区别
长连接:HTTP1.1支持长连接,HTTP 1.0默认使用短连接,
Host域: HTTP1.1在Request消息头里头多了一个Host域,而且是必传的,HTTP1.0则没有这个域。
带宽优化: HTTP/1.0中,存在一些浪费带宽的现象,要部分必须完整下载和断连重新下载 , 而HTTP/1.1中在请求消息中引入了range头域,它支持只请求资源的某个部分
消息传递:
缓存:
231、多线程Thread类的底层是实现了Runnable接口,那为什么要写Thread类
Java中规定的是单继承,也就是继承了Thread类后不能再继承其他类
232、Java创建对象的几种方式?
① new 关键字
这是最常用的方式了,这种方式是通过调用构造器来初始化对象及实例字段的。每个类的构造器皆会直接或间接调用父类的构造器,并且在同一个实例中初始化相应的字段。
注意,调用构造器时,如果继承自父类,要显式用 super() 关键字或隐式用 this 关键字传入父类构造器的参数。
② 反射机制
这种方式也是通过反射方法,调用构造器来初始化对象。
③ Object.clone()
这种方式直接复制已有的数据,来初始化新建对象的实例字段,当然,包含浅克隆和深克隆。
④ 反序列化
与 ③ 原理相同。
⑤ Unsafe.allocateInstance()
233、JDK1.8中stream流怎么用?
获取Stream流对象----使用Stream流对象获取集合的长度—对数据进行重组—收集处理的数据整理集合----循环遍历
234、2个字节多少位,范围是多大
2字节 16位 范围:-2的15次方到2的15次方-1
235、事务在spring如何实现
基于 TransactionProxyFactoryBean的声明式事务管理
236、String底层原理是什么
底层是Value数组,不可变,可以被共享
237、 shiro中,与shiro相关的类,说几个出来
Authentication 校验,验证
Authorization(Access Control):授权
Cipher,加密,
Permission,英文翻译是许可,这里翻译为权限,表示能做什么事,与subject无关。
Principal,主题,
Real,这个是用来存储我们定义好的用户、角色以及权限的地方
Role,就是角色,我们在开发中经常用到用户–>角色–>权限,角色就是这里的Role
Session,类似于我们的HttpSession,但是shiro的session功能更强悍
subject,就是用户,user。
238、介绍一下索引,索引有什么优缺点;
索引的优点:
- 建立索引的列可以保证行的唯一性,生成唯一的rowId;
- 建立索引可以有效缩短数据的检索时间;
- 建立索引可以加快表与表之间的连接;
- 为用来排序或者是分组的字段添加索引可以加快分组和排序顺序。
索引的缺点: - 创建索引和维护索引需要时间成本,这个成本随着数据量的增加而加大;
- 创建索引和维护索引需要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间),从而会降低表的增删改的效率,因为每次增删改索引需要进行动态维护,这样会导致时间变长。
239、Compent,Service,Repository有什么区别?
@Component, @Service, @Controller, @Repository是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
@Component是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
@Repository注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
@Controller层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
240、线程池工作原理?
作用:提高效率、节省资源、减少占用
执行流程:
1)提交一个新任务到线程池时,线程池判断corePoolSize(核心线程数量,线程池维护线程的最少数量)线程池是否都在执行任务,如果有空闲线程,则创建一个新的工作线程来执行任务,直到当前线程数等于corePoolSize;
2)如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;
3)如果阻塞队列满了,那就创建新的线程执行当前任务,直到线程池中的线程数达到maxPoolSize(线程池维护线程的最大数量),这时再有任务来,由饱和策略来处理提交的任务
241、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?
/ ./ …/ ~ cd
242、如何禁用其他用户读取该文件
chmod o-r
243、ls命令执行什么功能?可以带哪些参数,有什么区别?
-l -a -d
244、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?5、查看文件内容有哪些命令可以使用?
mkdir
touch
cp
245、查看文件内容有哪些命令可以使用?
cat/more/head/tail/vi/less/
246、移动文件用哪个命令?改名用哪个命令?
mv mv
247、复制文件用哪个命令?如果需要连同文件夹一块复制呢?
248、删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?
249、常用监控日志的命令是什么?
250、终止进程用什么命令?带什么参数?
kill -9 pid
251、什么是RESTful?
252、什么是接口的幂等性?
253、防范常见的Web攻击
254、如何解决跨域
jsonp(带有回调函数的json)
CORS(跨域资源共享)
代理
255、什么是xml,使用xml的优缺点,xml的解析器有哪几种,分别有什么区别?
扩展标记语言,支持自定义标签,使用DTD和Schema约束
优点:用于配置信息,格式统一,不受约束
缺点:解析麻烦
256、监控服务器性能的常用命令是哪些?
top
free
du/df
ps -ef
netstat
257、tomcat的目录结构是怎么样的?
bin
logs
config
webapps
work
260、已知一个HashMap<Integer ,User>集合,User有 name (String)和age (int)属性。请写一个方法实现对HashMap的排序功能,该方法接收 HashMap< Integer ,User>为形参,返回类型为HashMap<Integer,User>,要求对HashMap中的User的age倒序进行排序。排序时key=value键值对不得拆散
public class a {
public static void main(String[] args) {
HashMap<Integer, user> ss=new HashMap<Integer, user>();
ss.put(1, new user(“s”, 23));
ss.put(2, new user(“ss”, 15));
ss.put(3, new user(“sss”, 35));
System.out.println(ss);
//{1=user [name=s, age=23], 2=user [name=ss, age=15], 3=user [name=sss, age=35]}
HashMap<Integer, user> hashMap = dd(ss);
System.out.println(hashMap);
//{3=user [name=sss, age=35], 1=user [name=s, age=23], 2=user [name=ss, age=15]}
}
public static HashMap<Integer, user> dd(HashMap<Integer, user> map){
//拿到集合
Set<Entry<Integer, user>> set=map.entrySet();
//方便排序
List<Entry<Integer, user>>list=new ArrayList<Entry<Integer,user>>(set);
// 使用Collections集合工具类对list进行排序,排序规则使用匿名内部类来实现
Collections.sort(list,new Comparator<Entry<Integer, user>>() {
public int compare(Entry<Integer, user> o1, Entry<Integer, user> o2) {
// TODO Auto-generated method stub
//降序
return o2.getValue().getAge()-o1.getValue().getAge();
}
});
//保存排序后的集合
LinkedHashMap<Integer, user> linkedHashMap= new LinkedHashMap<Integer, user>();
for (Entry<Integer, user> entry : list) {
linkedHashMap.put(entry.getKey(), entry.getValue());
}
return linkedHashMap;
}
}
写一个定义类
package com.ssh.entity;
public class user {
public String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public user(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public user() {
super();
}
@Override
public String toString() {
return “user [name=” + name + “, age=” + age + “]”;
}
}
261.docker中构建镜像的命令
执行构建命令: docker build -t second:v1.0 .
-t second : v1.0 给新构建的镜像取名为 second, 并设定版本为 v1.0 。
262.删除镜像的命令
docker rmi 镜像ID
docker rm
263.查看、停止、启动、删除、删除所有容器的命令
docker ps
docker stop镜像ld
docker start镜像ld
docker rm $(docker ps -qa)
264.设置数据卷映射的方式有哪些,区别是什么?
docker volume create名称 【/var/lib/docker/volumes/名称/_data】
docker volume inspect名称
docker volume ls
docker run -v 名称:容器路径 镜像ID
更灵活:docker run -v 路径:容器路径 镜像ID
265.Dockerfile作用是什么
自定义镜像
docker build -t
266.docker-compose的作用是什么?
批量管理容器
267.docker-compose启动容器的命令
docker-compose up -d
268.docker-compose关闭并删除的命令
docker-compose down
269.docker-compose开启、关闭、重启的命令
docker-compose start/stop/restart
270.docker-compose查看容器日志的命令?
docker-compose logs -f
271.请解释Nginx服务器上的Master和Worker进程分别是什么?
Master进程
master进程为主进程,该进程会创建Manager进程和Reactor线程等工作进/线程。
Reactor线程实际运行epoll实例,用于接受客户端的链接和发来的请求。Manager进程是管理进程,该进程是为了创建管理所有的worker进程和TaskWorker进程,而TaskWorker则是manager直接生成的子进程。
Worker进程
worker进程是工作进程,所有的业务逻辑都在该进程中进行,当Reactor线程接收到来自客户端的数据后,会将数据打包通过管道发送给某个Worker进程。
272.Nginx的作用?
反向代理、虚拟机、负载均衡、动静分离
273.String与Date如何相互转化?
274.启动nginx容器,并挂载(mount)本地文件目录到容器html的命令
275.top命令的主要显示哪些信息?
Linux系统可以通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息
276.Linux查看端口号和进程号,还有查看命令文件的最后5行
查看端口号使用的进程号使用 lsof 命令:lsof -i:端口号
277.Nginx负载均衡策略
278.有哪些常用的IO流?
(Stream结尾的是字节流,是万能流,通常的视频,声音,图片等2进制文件,
Reader/Writer结尾的是字符流,字符流适合读取纯文本文件,
而类前面带Buffered为其相应的缓冲流)
InputStreamReader;
OutputStreamWriter;
PrinterWriter;
PrintStream;//标准输出流(输出地点是控制台psvm)
279.在Java中Executor和Executors的区别
Executor使用线程池来bai管理线程,可以重复利用已经创建du出来的线程而不是每次都必zhi须新创建线程,节dao省了一部分的开销。
线程池也可以很方便的管理线程的大小和当前在执行的线程数量。
你可以认为Executor是帮助你管理Thread的一个前人帮你封装好的工具。
区别:Executors 工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务 的需求。
Executor 接口对象能执行我们的线程任务。
280.如果一个对象的引用被设置为null, gc会立即释放该对象的内存么?
不会
281、redis操作string类型常用命令 (至少5个) ?
#1. 添加值
set key value
#2. 取值
get key
#3. 批量操作
mset key value [key value…]
mget key [key…]
#4. 自增命令(自增1)
incr key
#5. 自减命令(自减1)
decr key
#6. 自增或自减指定数量
incrby key increment
decrby key increment
#7. 设置值的同时,指定生存时间(每次向Redis中添加数据时,尽量都设置上生存时间)
setex key second value
#8. 设置值,如果当前key不存在的话(如果这个key存在,什么事都不做,如果这个key不存在,和set命令一样)
setnx key value
#9. 在key对应的value后,追加内容
append key value
#10. 查看value字符串的长度
strlen key
#11. TTL 查看变量的生存时间
TTL name
(integer) -1 #表示没有设置生存时间
(integer) -2 #变量已经消失了
#12. EXPIRE 设置变量的生存时间
127.0.0.1:6379> expire name 20 #设置name变量存活20秒钟
#13. 综合 name不存在时,设置name的值为zhangsan,并且有效期为100秒
ex设置有效期
nx不存在则设置变量
xx存在则设置变量
set name zhangsan ex 100 nx
#13.DEL
127.0.0.1:6379> DEL name #将key为name的进行删除
282、redis操作hash类型常用命令(至少5个) ?
#1. 存储数据
hset key field value
#2. 获取数据
hget key field
#3. 批量操作
hmset key field value [field value …]
hmget key field [field …]
#4. 自增(指定自增的值)
hincrby key field increment
#5. 设置值(如果key-field不存在,那么就正常添加,如果存在,什么事都不做)
hsetnx key field value
#6. 检查field是否存在
hexists key field
#7. 删除key对应的field,可以删除多个
hdel key field [field …]
#8. 获取当前hash结构中的全部field和value
hgetall key
#9. 获取当前hash结构中的全部field
hkeys key
#10. 获取当前hash结构中的全部value
hvals key
#11. 获取当前hash结构中field的数量
hlen key
283、redis操作list类型常用命令 (至少5个) ?
#1. 存储数据(从左侧插入数据,从右侧插入数据)
lpush key value [value …]
rpush key value [value …]
#2. 存储数据(如果key不存在,什么事都不做,如果key存在,但是不是list结构,什么都不做)
lpushx key value
rpushx key value
#3. 修改数据(在存储数据时,指定好你的索引位置,覆盖之前索引位置的数据,index超出整个列表的长度,也会失败)
lset key index value
#4. 弹栈方式获取数据(左侧弹出数据,从右侧弹出数据)
lpop key
rpop key
#5. 获取指定索引范围的数据(start从0开始,stop输入-1,代表最后一个,-2代表倒数第二个)
lrange key start stop
#6. 获取指定索引位置的数据
lindex key index
#7. 获取整个列表的长度
llen key
#8. 删除列表中的数据(他是删除当前列表中的count个value值,count > 0从左侧向右侧删除,count < 0从右侧向左侧删除,count == 0删除列表中全部的value)
lrem key count value
#9. 保留列表中的数据(保留你指定索引范围内的数据,超过整个索引范围被移除掉)
ltrim key start stop
#10. 将一个列表中最后的一个数据,插入到另外一个列表的头部位置
rpoplpush list1 list2
284、redis操作set类型常用命令 (至少5个) ?
#1. 存储数据
sadd key member [member …]
#2. 获取数据(获取全部数据)
smembers key
#3. 随机获取一个数据(获取的同时,移除数据,count默认为1,代表弹出数据的数量)
spop key [count]
#4. 交集(取多个set集合交集)
sinter set1 set2 …
#5. 并集(获取全部集合中的数据)
sunion set1 set2 …
#6. 差集(获取多个集合中不一样的数据)
sdiff set1 set2 …
7. 删除数据
srem key member [member …]
8. 查看当前的set集合中是否包含这个值
sismember key member
285、redis操作zset类型常用命令 (至少5个) ?
#1. 添加数据(score必须是数值。member不允许重复的。)
zadd key score member [score member …]
#2. 修改member的分数(如果member是存在于key中的,正常增加分数,如果memeber不存在,这个命令就相当于zadd)
zincrby key increment member
#3. 查看指定的member的分数
zscore key member
#4. 获取zset中数据的数量
zcard key
#5. 根据score的范围查询member数量
zcount key min max
#6. 删除zset中的成员
zrem key member [member…]
#7. 根据分数从小到大排序,获取指定范围内的数据(withscores如果添加这个参数,那么会返回member对应的分数)
zrange key start stop [withscores]
#8. 根据分数从大到小排序,获取指定范围内的数据(withscores如果添加这个参数,那么会返回member对应的分数)
zrevrange key start stop [withscores]
#9. 根据分数的返回去获取member(withscores代表同时返回score,添加limit,就和MySQL中一样,如果不希望等于min或者max的值被查询出来可以采用 ‘(分数’ 相当于 < 但是不等于的方式,最大值和最小值使用+inf和-inf来标识)
zrangebyscore key min max [withscores] [limit offset count]
#10. 根据分数的返回去获取member(withscores代表同时返回score,添加limit,就和MySQL中一样)
zrangebyscore key max min [withscores] [limit offset count]
286、 maven中怎么解决jar包冲突,怎么保证jar包的版一 致
路径最短原则
声明优先原则
依赖排除
287、session共享有什么方案,具体怎么实现;
通过cookie、tomcat
288、 介绍一 下索引,索引有什么优缺点;
快速定位、提高效率
289、 MySQL中Int(10)和int(11)区别?
290、Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全
部找出来?
291、@Autowired@Qualifier区别
@Autowired默认是按照类型进行装配注入,默认情况下,它要求依赖对象必须存在,如果允许 null 值,可以设置它 required 为false。
@Qualifier在类型的基础上按名称注入
292、Redis是单线程的,但Redis为什么这么快?
完全基于内存、数据结构简单、采用单线程、自己构建了VM 机制、多路 I/O 复用模型
(为什么redis是单线程?因为完全基于内存,所以瓶颈不是CPU而是内存和宽带,所以单线程更方便)
293、 事务在什么情况下回失效。
MyISAM引擎本身不支持事务;如果改成InnoDB,则可以…
Service类没有被Spring管理
不带事务的方法调用该类中带事务的方法,不会回滚
抛出检测异常
294、AOP的原理
静态代理、
动态代理:JDK实现的动态代理,cglib动态代理,asm,javaassit
(Spring AOP框架对AOP代理类采用了两种方式:Cglib和JDK本身的动态代理,如果在目标对象的实现类是有实现接口的,那么Spring AOP将会采用JDK动态代理来生成AOP代理类,如果目标对象的实现类本身是没有实现接口的,则通过Cglib来生成AOP代理类。
由于Spring本身就是一个IoC容器,因此对于特定对象生成AOP代理,并非难事,整个Spring的AOP代理本身就是由Spring的IoC容器负责生成、管理。AOP代理类本身拥有目标对象的全部方法,但是会在特定的切入点添加增强处理,并回调目标对象的方法。)
295、InnoDB存储弓|擎和MylSAM存储弓|擎的区别?
MySQL中的储存引擎InnoDB储存引擎是mysql5.5版本以后默认的储存引擎
1.容灾恢复性比较好
2.支持事物
3.支持高并发:使用粒度行为锁
4.支持外键
5.缓存管理,加快查询速度
MySQL中的储存引擎mylsam
1.不支持事物
2.不支持外键
3.没有缓存
4.容灾恢复性差
296、redis用在了 项目中的那些地方,是怎么实现的
分布式锁
接口限流器
订单缓存
Redis和DB数据一致性处理
防止缓存穿透和雪崩
分布式session共享:会有session工厂的问题
297、Aop用在哪些地方
AOP面向切面编程:事务、数据库的数据分离
参数校验与判空
日志记录
性能统计
服务降级与限流
权限管控、角色判定
分库分表路由
事务管理
异常处理
缓存
298、Spring的缓存
Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。
299、SQL语句的执行顺序
select distinct字段from表1 join 表2 on条件where group by having order by
limit
from—join—on—where—select—group by-----having----order by—limit
300、MyBatis中的ResultMap
301.redis中set和zset的区别
set:存储无序集合
zset:存储有序集合
302.什么是缓存穿透、缓存击穿、缓存雪崩、缓存倾斜以及解决的方案有哪些?
缓存穿透:redis没有,数据库也没有【在redis中保存最大的ID,保存所有ID】
缓存穿击:热点数据到期,导致大量请求访问数据库【删除热点数据的生存时间】
缓存雪崩:大量数据到期【给数据设置随机值,随机生成有效期】
缓存倾斜:热点数据可能集中到某台节点中【增加服务器节点】
303.Redis内存的淘汰策略有哪些
volatile-lru | volatile-lfu
allkeys-lru | allkeys-lfu所有key使用频率最少的删除一个
volatile-random设置了过期key中随机删一个 | allkeys-random所有key随机删除
volatile-ttl:删除过期时间最近的
noeviction:直接报错
304.Redis集群数据存储原理
hash槽(0-16383)
CRC16(key)%16384
305.Redis支持哪些数据类型?
string/set/list/hash/zset/geo/bit/hyperloglogs
306.如果你多个系统同时操作(并发)Redis带来的数据问题?
具体问题:多个人对同一个数据进行修改操作,导致并发问题发生
解决方法:
悲观锁是有限制的,在某些场景中是不适应的,因为和数据的耦合度太高了,可能会影响到其他业务的操作
redis的分布式锁:redis的存储指令中有一个setnx方法,这个方法有一个特性,就是当键不存在的时候,会将这条数据插入,并且返回1,如果这个键已经存在了,那么就不会插入这条数据,并且返回0。
307.集群和分布式区别?
集群是个物理形态,分布式是个工作方式。只要是一堆机器,就可以叫集群
一个程序或系统,只要运行在不同的机器上,就可以叫分布式
一个集群可以有多个分布式
308.Redis的线程模型?
Redis单线程模型:
多个 Socket
IO 多路复用程序
文件事件分派器
事件处理器
309.Redis中Key过期了是否立即删除?
Redis对于过期键有三种清除策略:
被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动淘汰一批已过期的key
当前已用内存超过maxmemory限定时,触发主动清理策略
310.Redis中持久化方案有哪些,有什么区别?
RDB:每隔一段时间,将Redis写入硬盘一次; Redis默认的持久化方案;
AOF:Redis每次操作都会及时写入硬盘,会降低Redis的效率;
优缺点:
RBD: 读取速度快,效率高,缺点 会丢失部分数据;
AOF:安全性高,不会丢失数据,但是读取速度下降,效率慢,不建议使用;
311.冒泡排序算法
312.synchronized锁升级过程?
synchronized锁优化的过程,通过应对不同竞争而选择合适的锁实现就是升级过程。
注意点
锁的状态只有4种,无锁->偏向锁->轻量级锁->重量级锁
升级过程不可逆,不同阶段通过从轻到重的方式获取锁
自旋这个操作是通过线程死循环,而防止被双重,试图避免用户态和内核态的切换,所 以本身不属于锁的状态,是配合轻量级锁使用的一种方式
313.js中null,undefined的区别?
null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。
null表示”没有对象”,即该处不应该有值
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
undefined表示”缺省值”,就是此处应该有一个值,但是还没有定义
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
314.如何防止表单重复提交
我们可以使用redis缓存,相比于session,它并不仅仅针对于特定用户会话,也就是说它可以处理多个用户同时提交同一类请求的情况。
原理:
每个请求都将带有表示某块资源的唯一标识KEY_NAME,当第一次请求时,redis 会执行INCR KEY_NAME命令,这是个原子递增操作,值变为1,于是后续同类请求会将它依次递增为2,3,4…,当值大于1时,表示资源已在处理中,后续请求被抛弃或处于等待状态,待处理完毕,将值重新设为0,表示资源已解锁可用。这是借助redis缓存实现的类加锁机制,解决多服务器多用户场景下请求重复提交的情况。
315.事务的四个特性,什么是脏读、幻读、不可重复读
脏读 :
一个事务读取到另一个事务中尚未提交的数据
不可重复读 :
一个事务中两次读取的数据内容不一致.要求的是一个事务中多次读取时数据时一致的,这是事务update时引发的问题
幻读 :
一个事务中两次读取的数据的数量不一致,要求在一个事务多次读取的数据的数量是一致的,这是insert或delete时引发的问题.
解决隔离问题的方案:
1.读未提交(不解决任何问题)
2.读已提交(解决脏读,oracle默认解决方案)
3.可重复读(解决脏读和不可重复读的问题,mysql默认解决方案)
4.串行化(解决所有问题)
316.springMVC的执行流程
用户请求发送到前端控制器DispatcherServlet。
前端控制器DispatcherServlet接收到请求后,DispatcherServlet会使用HandlerMapping来处理,HandlerMapping会查找到具体进行处理请求的Handler对象。
HandlerMapping找到对应的Handler之后,并不是返回一个Handler原始对象,另一个一个Handler执行链(HandlerExecutionChain),在这个执行链中包括了拦截器和处理请求的Handler。HandlerMapping返回一个执行链给DispatcherServlet。
DispatcherServlet接收到执行链之后,会调用Handler适配器去执行Handler。
HandlerAdapter执行完成Handler之后会得到一个ModelAndView,并返回给DispatcherServlet。
DispatcherServlet接收到HandlerAdapter返回的ModelAndView之后,会根据其中的视图名称调用ViewResolver。
ViewResolver根据逻辑视图名解析成一个真正的View预览,并返回给DispatcherServlet。
DispatcherServlet接收到视图之后,会根据上面的ModelAndView中的模型来进行视图中数据的填充,也就是所谓的视图渲染。
渲染完成之后,DispatcherServlet就可以将结果返回给用户了。
317.Lock 与 Synchronized的区别。
synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。
318.MyBatis中#{}和KaTeX parse error: Expected 'EOF', got '#' at position 9: {}的区别 使用#̲传入参数是,sql语句解析是会…的好处是比较明显对的吧,#{}传参能防止sql注入,如果你传入的参数为 单引号’,那么如果使用
,
这
种
方
式
那
么
是
会
报
错
的
,
另
外
一
种
场
景
是
,
如
果
你
要
做
动
态
的
排
序
,
比
如
o
r
d
e
r
b
y
c
o
l
u
m
n
,
这
个
时
候
务
必
要
用
{},这种方式 那么是会报错的, 另外一种场景是,如果你要做动态的排序,比如 order by column,这个时候务必要用
,这种方式那么是会报错的,另外一种场景是,如果你要做动态的排序,比如orderbycolumn,这个时候务必要用{},因为如果你使用了#{},那么打印出来的将会是
select * from table order by ‘name’ ,这样是没用,
目前来看,能用#就不要用$,
319.线程池的配置参数有哪些
corePoolSize 线程池核心线程大小
maximumPoolSize 线程池最大线程数量
keepAliveTime 空闲线程存活时间
unit 空间线程存活时间单位
workQueue 工作队列
threadFactory 线程工厂
handler 拒绝策略
320.Autowired和@Resource之间的区别
spring中,@ Resource和@Autowired都是做bean的注入时使用。使用过程中,有时候@Resource和@Autowired可以替换使用;有时,则不可以。
一,共同点
@Resource和@Autowired都可以作为注入属性的修饰,在接口仅有单个实现类时,两个注解的修饰效果相同,可以互相替换,不影响使用。
二,不同点
@Resource是Java自己的注解,@ Resource有两个属性是比较重要的,分是名称和类型;Spring将@Resource注解的名称属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用名称属性,则使用按名称的自动注入策略,而使用类型属性时则使用byType自动注入策略。如果既未指定名称也不指定类型属性,这时将通过反射机制使用byName自动注入策略。
@Autowired是spring的注解,是spring2.5版本约会的,Autowired只根据类型进行注入,不会去匹配名称。如果涉及到类型无法辨别注入对象时,那需要依赖@Qualifier或@Primary注解一起来修饰。
321、elasticsearch的倒排索引是什么、
倒排列表的元数据结构:
(DocID;TF;)
其中:
DocID:出现某单词的文档ID
TF(词频):单词在该文档中出现的次数
POS:单词在文档中的位置
322、scroll+size分页的好处?
方式一: from+size
ES的标准分页方法是from+size。from相当于postgresql的offset,size相当于limit的作用。每页10条数据,获取第11页的数据
方式二:scroll
scroll api提供了一个全局深度翻页的操作,首次请求会返回一个scroll_id,使用该scroll_id可以顺序获取下一批次的数据
方式三: search_after
5.0以后版本提供的功能
search_after分页方式,第一次搜索需要指定sort,并保证值是唯一的,用前一次查询结果中最后一条记录的 sort 结果值作为下一次的查询条件
323、elasticsearch搜索的过程
324、根据如下条件写出查询的APl:
#查询省份为武汉或者北京
#运营商不是联通
#smsContent中包含中国和平安
GET /index/type/_search{
“query”:{
“bool”:{
“should”:{
}
}
}
}
325、对象头包含哪些信息?
包括:
identity hashcode
GC
锁
326、线程池的配置参数有哪些
corePoolSize线程池的核心线程数
maximumPoolSize最大线程数
keepAliveTime存活时间
workQueue工作量
threadFactory螺纹工厂
对列长度
拒绝策略
327、描述一下JVM加载class文件的原理机制?
装载(查找并加载类的二进制数据)----链接(验证:确保被加载类的正确性;准备:为类的静态变量分配内存,并将其初始化为默认值;解析:把类中的符号引用转换为直接引用;)-----初始化(为类的静态变量赋予正确的初始值)
327.1 类什么时候才被初始化:
1)创建类的实例,也就是new一个对象
2)访问某个类或接口的静态变量,或者对该静态变量赋值
3)调用类的静态方法
4)反射(Class.forName(“com.lyj.load”))
5)初始化一个类的子类(会首先初始化子类的父类)
6)JVM启动时标明的启动类,即文件名和类名相同的那个类
只有这6中情况才会导致类的类的初始化。
327.2 类的初始化步骤:
1)如果这个类还没有被加载和链接,那先进行加载和链接
2)假如这个类存在直接父类,并且这个类还没有被初始化(注意:在一个类加载器中,类只能初始化一次),那就初始化直接的父类(不适用于接口)
3)加入类中存在初始化语句(如static变量和static块),那就依次执行这些初始化语句。
328、Java中会存在内存泄漏吗,请简单描述
一般来说内存泄漏有两种情况。一种情况 如在C/C++ 语言中的,在堆中的分配的内存,在没有将其释放掉的时候,就将所有能访问这块内存的方式都删掉(如指针重新赋值) ;另一种情况则是 在内存对象明明已经不需要的时候,还仍然保留着这块 内存 和它的 访问方式 (引用) 。第一种情况,在 Java 中已经由于垃圾回收机制的引入,得到了很好的解决。所以, Java 中的内存泄漏,主要指的是第二种情况。
注意:Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。我们有时也将其称为“对象游离”。
328.1 java 的垃圾回收机制:
1.垃圾回收是由虚拟机自动执行,不能人为地干预。
2.系统比较空闲(垃圾回收线程)
3.对象不在被引用.对象处于引用的隔离岛状态(隔离引用),对象具备了回收的条件
4.gc()方法,可以建议虚拟机执行垃圾回收,但是不能确定是否会执行回收。
329、Statement和PreparedStatement有什么区别?
statement执行的时候,sql语句是拼装进去的,比如 delete from table where id=’"+id+"’ 这样写如果遇到会编程的,可能会产生sql注入攻击,比如上面的那句sql,id值我传的是234 or 1=1,那么服务器实际执行的语句就算delete from table where id=234 or 1=1,返回的就是执行成功
preparedstatement的成员是add进去的,这样的话,sql语句注入攻击就无效了,即使写的是代码,也被当做普通的字符串,所以连接数据库用preparedstatement安全一些,其他没有什么大的区别
330、synchronized锁升级过程
无锁–偏向锁–轻量级锁(自旋锁CAS)–重量级锁
- 偏向锁
专属于一个线程,偏向一个线程的锁,比如线程id - 轻量级锁
当有多个线程竞争一个锁时,升级轻量级锁,指向栈中所记录的指针,这个过程叫做CAS - 重量级锁
当竞争的线程超过10次,升级为重量级锁,用户态升级为了内核态,效率慢
331.Spring Boot、Spring MVC和Spring有什么区别?
Spring:提供loc/Dl、AOP功能的一种框架
SprngMVC:基于Spring实现MVC结构的框架
SpringBoot:基于Spring实现自动配置的框架
332.Spring Boot的核心注解是哪个?它主要由哪几个注解组成的?
@SpringBootApplication—
SpringBootConfiguration
EnableAutoConfiguration
ComponentScan
333.Spring Boot自动配置原理是什么?
springboot自身的autoconfigure包里有大量的java配置类,我们也可以在自己的工程中写这些配置类,这些配置类需要在相应的META-INF/spring.facotries文件中配置好, 这样就会因为在@EnableAutoConfiguration注解的存在,这些配置类里面的bean被注册进ioc容器
334.阐述JDBC操作数据库的步骤?
1.注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
2.创建连接
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/dbName?characterEncoding=utf-8”);
3.创建语句
PreparedStatement ps = con.prepareStatement(“select * from user where age between ? and ?”);
ps.setInt(1,1000);
ps.setInt(2,1000);
4.执行语句
ResultSet rs = ps.executeQuery();
5.处理结果集
while(rs.next()){
System.out.println(rs.getInt(“age”) + " - " + rs.getString(“name”));
}
6.关闭资源
finally {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
335.ArrayList、Vector、LinkedList的存储性能和特性?
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始
ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.
Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.
LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.
335.1 arraylist和vector的区别?
1).同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的
2).数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
336.阐述final、finally、finalize的区别?
final可以用于修饰变量,方法,类,被修饰的变量的值不能被改变,被修饰的方法不能被重写,被修饰的类不能被继承,它和abstract是反义词
finally通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常运行还是发生异常,这里的代码只要JVM不关闭都会执行,可以将释放外部资源的代码写在finally块中
finalize:Object类的方法,Java中允许使用finalize()方法在垃圾回收器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾回收器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作
337.抽象类(abstract class)和接口(interface)有什么异同?
不同:
抽象类:
1.抽象类中可以定义构造器
2.可以有抽象方法和具体方法
3.接口中的成员全都是 public 的
4.抽象类中可以定义成员变量
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
6.抽象类中可以包含静态方法
7.一个类只能继承一个抽象类
接口:
1.接口中不能定义构造器
2.方法全部都是抽象方法
3.抽象类中的成员可以是 private、默认、 protected、 public
4.接口中定义的成员变量实际上都是常量
5.接口中不能有静态方法
6.一个类可以实现多个接口
相同:
1.不能够实例化
2.可以将抽象类和接口类型作为引用类型
3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要
被声明为抽象类
338.Redis如何解决数据一致性问题?
延迟双删()
1.删除缓存
⒉修改数据库
3.延迟一段时间(时间有项目自行去确定)
4.删除缓存
对列:并行边串行,“流量削峰”
339.什么是缓存预热?
将热点数据加载到缓存中
340.spring bean的生命周期
341.缓存穿透.与缓存击穿的区别,及解决办法?
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。------办法:空值缓存、bloom filter
缓存击穿实际上是缓存雪崩的一个特例,缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。击穿与雪崩的区别即在于击穿是对于某一特定的热点数据来说,而雪崩是全部数据。-----办法:分布式锁
342.Redis如何保证数据一致性?
- Redis里的数据不立刻更新,等redis里数据自然过期。然后去DB里取,顺带重新set redis。这种用法被称作“Cache Aside”。好处是代码比较简单,坏处是会有一段时间DB和Redis里的数据不一致。这个不一致的时间取决于redis里数据设定的有效期,比如10min。但如果Redis里数据没设置有效期,这招就不灵了。
- 更新DB时总是不直接触碰DB,而是通过代码。而代码做的显式更新DB,然后马上del掉redis里的数据。在下次取数据时,模式就恢复到了上一条说的方式。这也算是一种Cache Aside的变体。这要做的好处是,数据的一致性会比较好,一般正常情况下,数据不一致的时间会在1s以下,对于绝大部分的场景是足够了。但是有极少几率,由于更新时序,下Redis数据会和DB不一致(这个有文章解释,这里不展开)。
343.redis的过期策略以及内存淘汰机制
过期策略:定期删除+惰性删除
内存淘汰机制:干掉不常用的数据,保留常用的数据
344.Java中垃圾收集的方法有哪些
1.标记-清除
2.复制算法
3.标记-整理
4.分代收集
345.spring bean的生命周期
346.spring常用的注入方式有哪些?
1、构造器注入
2、Setter注入
3、基于注解的 @Autowired 自动装配(Field 注入)
347.聚集索引与非聚集索引的区别
1、表记录的排列顺序和与索引的排列顺序是否一致。
2、聚集索引一个表只有一个,非聚集索引一个表可以存在多个。
3、聚集索引存储记录是物理上连续存在,非聚集索引是逻辑上的连续。
聚集索引优点:
1、以最快的速度缩小查询范围。
2、以最快的速度进行字段排序。
聚集索引使用场合:
1、此列包含有限数目的不同值。
2、查询的结果返回一个区间的值。
3、查询的结果返回某值相同的大量结果集。
非聚集索引优点:
1、非聚集索引比聚集索引层次多。
3、添加记录不会引起数据顺序的重组。
非聚集索引使用场合:
1、此列包含了大量数目不同的值。
2、查询的结束返回的是少量的结果集。
348.事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?
不考虑隔离性,事务存在3种并发访问问题 :
1、脏读:B事务读取到了A事务尚未提交的数据
2、不可重复读:一个事务中两次读取的数据的内容不一致
3、幻读/虚读:一个事务中两次读取的数据的数量不一致
都有哪些隔离级别?用于解决?
读未提交、读已提交(脏读)、可重复读(脏读、不可重复读)、串行化(幻读)
MySQL默认的事务隔离级别是“可重复读”
349.SQL优化方法有哪些?
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描
5.对于连续的数值,能用 between 就不要用 in 了
6.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:where num/2=100,应该是where num=100*2
350.什么是Java的双亲委派机制?
用户自定义的类加载器,可加载指定路径的class文件,按照委派机制流程:
向上委托,向下查找。
Boostrap Classloader->ExtenderClassloader->App Classloader->自定义加载器
350.1 双亲委派作用:
1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。
351.MVC设计思想
MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。
352.说说Spring AOP
面向切面编程,把实际业务抽离成一个模块(切面),然后通过代理方式嵌入目标业务中
353.SpringAOP实现原理
sping本身是一个Ioc容器,对于特定对象生成特定的AOP代理类,在特定的切入点添加增强处理,并回调目标对象
354.SpringBean的生命周期
解释:在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)
singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
Spring bean 默认是单例模式。
Spring怎么实现单例模式
单例模式也属于创建型模式,所谓单例,顾名思义,所指的就是单个实例,也就是说要保证一个类仅有一个实例。
单例模式有以下的特点:
①单例类只能有一个实例
②单例类必须自己创建自己的唯一实例
③单例类必须给所有其他对象提供这一实例
355SpringlOC如何实现?
控制反转,依于“反射”
356.SPring框架中用到了哪些设计模式
2. 工厂方法(Factory Method)
3. 单例(Singleton)
4. 适配器(Adapter)
5.包装器(Decorator)
6. 代理(Proxy)
7.观察者(Observer)
8. 策略(Strategy)
9.模板方法(Template Method)
357.Spring的单例实现原理
Spring为实现单例类可继承,使用的是单例注册表的方式。
什么是单例注册表呢,
- 使用map实现注册表;
- 使用protect修饰构造方法;
358.Spring事务实现方式
1.使用@Transactional声明
2.使用事务管理器
3.xml配置
4.基于Aspectj AOP开启事务
359.Spring事务底层实现原理.
AOP–》代理
360.SpringMVC启动流程