菜鸟笔记
提升您的技术认知

Java开发面试常见问题总结

1、JAVA的跨平台原理

JVA源码被编译会生成字节码文件,通过不同平台上下载的不同版本的jvm,将字节码文件翻译成对应的机器码。注意的是,跨平台的Java程序,不是JVM。JVM是使用C/C++开发的,是编译后的字节码,不能跨平台。

2、JAVA中的数据类型及其各自的特点。

(1)基本数据类型

byte

1字节

数值型

short

2字节

数值型

int

4字节

数值型

long

8字节

数值型

float

4字节

数值型

double

8字节

数值型

boolean

1字节

布尔型

char

2字节

字符型

(2)引用数据类型:类(class)、接口(interface)、数组

3、JAVA面向对象的特征?

封装、继承、多态、抽象 封装:通过类来体现,将实体封装成类,其中包含属性和方法

继承:类与类之间可以继承特点,使得代码重用

多态:通过传递给父类对象引用不同的子类从而表现出不同的行为

抽象: 将一类实体的共同特性抽象出来,封装在一个抽象类中。

4、封箱和拆箱?

基础类型属于数据,不属于类,自然也不属于Object的子类,无法使用相关方法。装箱就是自动将基本数据类型转换为包装器类型,拆箱就是自动将包装器类型装换为基本数据类型。

eg:Integer a = Integer.valueOf(123); //装箱 int b = a.intValue(); //拆箱

5、==和equals的区别?

(1)基本数据类型之间的比较,使用双等号(==),比较两者的值

(2)复合数据类型(类)之间的比较,比较的是在内存池的地址,使用equals。在Java语言中,通常equals交给开发者自行定义,满足什么条件的Object是equals的。

6、String、StringBuilder、StringBuffer之间的区别?

(1)运行速度:StringBuilder > StringBuffer > String

String是字符串常量,其他两者属于字符串变量,String对象创建后不可以改变,对String的操作实际上是不断创建和回收的过程,执行速度慢。

(2)线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的

StringBuffer对象在字符串缓冲区被多个线程使用时,可以使用synchronized关键字,能够保证线程安全。

(3)使用场景

String适用于少量的字符串操作;StringBuilder适用于单线程下的在字符串缓冲区进行大量的操作的情况下;StringBuffer适用于多线程下的在字符串缓冲区进行大量的操作的情况下。

7、JAVA中的集合

Java中的集合分为两大类:

Collection(value):包含list和Set,其中list是有序,可重复的;set是无序,不可重复的。

Map(key-value)包含HashMap、HashTable、CurrentHashNap

8、ArrayList、Vector、LinkedList的区别?

  1. 区别:
  • Vector和ArrayList都是以类似数组的形式存储在内存中,LinkedList以链表的形式进行存储
  • Vector线程同步,ArrayList和LinkedList线程不同步
  • LinkedList适合在指定位置进行插入、删除等操作,不适合查找,Vector、ArrayList适合查找
  • Vector默认扩充为原来的两倍,ArrayList默认扩充为原来的1.5倍

9、HashMap和HashTable的区别?

  • 都是使用key-value的形式来存储数据,区别是HashTable基于Dictionary类,而HshMap是基于AbstractMap。
  • HashMap是单线程安全的,HashTable是多线程安全的
  • HashMap仅仅支持Iterator的遍历方式,HashTable支持Iterrator和Enumeration两种遍历方式
  • HashMap可以允许存在一个为null的key和若干个为null的value,但是HashTable中的key和value都不允许为null

11、线程的实现方式?怎么样启动线程?怎么区分线程?

线程的实现方式有三种:第一种是继承Thread类,第二种是实现Runnable接口,第三种是实现java.util.concurrent下的Callable接口。

线程的启动:调用start()方法—可以使得线程处于可运行状态,但是不一定会执行,如果实在main()方法中调用的话,run()会执行

区分线程:给线程设置名字

12、线程并发库和线程池的作用?

线程池的好处:

  • 限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃
  • 线程池每次都不需要去创建和销毁,节约了资源
  • 线程池不需要每次都去创建,响应时间更快

13、设计模式和常用的设计模式?

一共有23中设计模式?常用的有单例模式、工厂模式、装饰者模式、代理模式

  1. 单例模式:
  2. 工厂模式:
  3. 装饰者模式:
  4. 代理模式:

14、HTTP、GET、POST请求的区别?

  1. GET请求的数据会暴露在地址栏当中,而POST不会
  2. 对于GET,特定的浏览器和服务器对于URL有长度限制,传输数据时会受到限制
  3. POST的安全性比GET高

15、说说你对Servlet的理解?

就是运行在WEB服务器上的一个Java小程序,用来接收和响应客户端发送过来的请求,通常使用HTTP协议

使用方法:

  • 编写一个Java类,实现servlet接口
  • 把开发好的Java类部署到web服务器当中

16、Servlet的生命周期?

当用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中的init方法就会执行。任何一次请求都会创建一个线程访问Servlet中的service方法,根据请求的不同方式调用不同的doXXX()方法。当Servlet从服务器中移除或者关闭服务器,Servlet的实例就会被销毁,那么destory()方法就会执行。

17、Servlet中Forward和Redirect的区别

forward重定向:两次request,重定向可以访问自己的web应用以外的资源。重定向的过程,传输的信息会被丢失。

redirect请求转发:服务器内部把对一个request/response的处理权交给另外一个客户端,传输的信息不会丢失。

18、JSP和Servlet的相同点和不同点?

1、联系:
JSP 是 Servlet 技术的扩展,本质上是 Servlet 的简易方式,更强调应用的外表表达。
JSP编译后是”类 servlet”。
2、不同点:
- Servlet 的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。Servlet如果要实现html功能,必须使用Writer输出对应的html.
- JSP 的情况是Java和HTML可以组合成一个扩展名为.jsp 的文件。做界面展示比较方便,而嵌入逻辑复杂.
- JSP 侧重于视图,Servlet 主要用于控制逻辑

19、JSP内置对象和四大作用域

九大内置对象:

request、response、config、application、session、exception、page、out、pagecontext

四大作用域:

page—只能在当前页面使用

request—只能在同一次请求当中使用

session—只能在同一个会话(session对象)中使用

context—只能在同一个web应用中使用

20、session和cookie的区别和使用场景?

区别:
1. cookie的数据存储在客户端,session的数据存储在服务器上
2. cookie不是很安全,别人可以通过分析存放在本地的cookie并进行cookie欺骗,考虑到安全应该使用session
3. session会在一定时间内保存在服务器上,当访问增多时,会影响服务器的性能.考虑到服务器性能,应当使用cookie.
4. 单个cookie保存数据不能超过4k,很多浏览器显示一个站点最多保存20个cookie
5. 将重要信息保存在session中(登陆),将其他需要保留的信心存放在cookie中(购物车,cookie是可以在客户端禁用的,这时候要使用cookie+数据库的方式实现购物车,当cookie中不能取出数据,就从数据库中取)

21、mvC模式和MVC各部分的实现

MVC是Model(模型)—View(视图)—Controller(控制器)的缩写

22、数据库分类和常用数据库?

关系型数据库:MySQL、 ORACLE、SQL Server、IBM DB2、Sybase

非关系型数据库:Redis,Memcached,MongoDB ,Hadoop

23、关系型数据库的三范式?

范式就是规范,就是关系型数据库设计表时遵循的三个规范.要满足第二范式,必须先满足第一范式,要满足第三范式,必须先满足第二范式

第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。列数据的不可分割.
第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识.(主键)
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。(外键)
反三范式:有时候为了效率,可以设置重复或者可推导出的字段.比如:订单(总价),订单项(单价)

24、事务的四大特征

  1. 原子性:表示事务内不可分割
  2. 一致性:表示要么都成功,要么都失败。失败了,要对前面的操作进行回滚
  3. 隔离性:一个事务开启了,不能受其他事务的影响
  4. 持久性:表示事务开始了,就不能终止,提交事务后,将数据序列化到数据库

25、MySQL数据库的最大连接数

# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=100
默认的最大连接数为100

26、MySQL和Oracle上的分页语句

为什么要分页很多数据不能完全展示出来,需要进行分段显示

mysql:是使用关键字limit来进行分页的.LIMIT [offset,] rows:offset指定要返回的第一行的偏移量(也就是从哪个索引开始),rows第二个指定返回行的最大数目。初始行的偏移量是0(不是1)
oracle:一般是使用rownum 加select 嵌套查询

27、触发器的使用场景?

触发器:触发器需要有触发条件,当条件满足后,做什么操作

应用场景:某些社交软件的日志更新,会通知好友; 一些论坛中,当插入新帖时,会更改当前帖子总数以及最后发帖时间.

CREATE [or REPLACE] TRIGGER 触发器名
BEFORE | AFTER
[DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW ][WHEN(条件) ]
declare
……
begin
PLSQL 块
End ;

28、存储过程的优点

1. 存储过程只在创建时进行编译,以后每次执行它都不会再重新编译.一般SQL语句每次执行都会编译.所以存储过程会大大提高数据库执行速度
2. 通常复杂的业务逻辑需要多条SQL语句,这些语句要分别从客户机发送到服务器,当客户机和服务器之间的操作很多时,会产生大量的网络传输.如果将这些操作放在一个存储过程中,那么客户机和服务器之间的网络传输会大大减少,降低网络负载.
3. 存储过程是可重复使用的,能减少数据库开发人员的工作量.
4. 存储过程可以屏蔽对底层数据对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显示权限,安全性高.

29、JDBC调用存储的过程

加载驱动—获取连接—设置参数—执行—释放连接

30、简单说一下对JDBC的理解

JDBC:Java数据库连接

Java只定义接口,让数据库厂商自己实现接口,对于我们开发人员而言,只需要导入对应厂商开发的实现即可,然后以接口的方式进行调用(mysql+mysql驱动(实现)+jdbc)

31、数据库连接池的作用

  1. 限定数据库的连接个数,不会犹豫数据库连接过多导致系统运行缓慢或者崩溃
  2. 数据库连接不需要每次都去创建或销毁,节约了资源
  3. 数据库连接不需要每次都去创建,响应时间更快

32、简单说一下HTML、CSS、JavaScript在网页开发中的定位

Html 超文本标记语言,定义网页的结构
Css 层叠样式表,用来美化页面
Javascript 主要用来验证表单,做动态交互(其中ajax)

33、简单介绍一下AJAX

ajax就是异步的JavaScript和想xml。通过ajax可以与服务器进行数据交换,ajax可以使网页局部刷新,意味着可以在不用加载整个网页的情况下,对网页的某部分进行更新。

怎么实现ajax xmlhttpRrqueset对象,使用这个对象可以异步向服务器发送请求,获取响应,完成局部更新,open send responseText/responseXml局部响应.
使用场景:登陆失败时不跳转页面,注册时提示用户名是否存在,二级联动等等.

34、JS和JQuery的关系

JQuery是一个js框架,封装了js的属性和方法,并且增强了js的功能,让用户使用起来更加便利,并且增强了js的功能.
原来是使用js是要处理很多兼容性的问题(比如注册事件等),由JQuery封装了底层,就不用处理兼容性问题.
原生的js的dom和事件绑定和ajax等操作非常麻烦,JQuery封装了以后,操作非常方便.

35、JQuery中常用 的选择器

ID选择器
Class选择器
标签选择器
通用选择器
层次选择器
属性选择器

36、BOOTSTRAP是什么?

Bootstrap是一个移动设备优先的UI框架.我们不用写任何的css和js代码就能实现比较漂亮的有交互性的页面.我们程序员对页面的编写是有硬伤的,所以要自己写页面的话,就要使用类似bootstrap这样的UI框架.
平时经常用的:
模态框
表单,表单项
布局
栅格系统

37、JQuery页面加载完毕事件

为什么需要页面加载事件很多时候我们需要获取元素,但是必须等到该元素被加载后才能获取,我们可以把js代码放到该元素的后面,但是这样就会造成js在我们的body中存在不好管理.所有页面加载完毕后,所有的元素当然已经加载完毕,一般获取元素做操作都要在页面加载完毕后.
$(function{}表示的是页面结构被加载完毕
Window.onload表示的是页面被加载完毕

38、简单的介绍一下MVC模式?

最经典的MVC模式是:jsp(View)+servlet(Controller)+javabean(Model)

1.当控制器收到来自用户的请求
2.控制器调用javabean完成业务
3.完成业务后通过控制器跳转jsp页面的方式给用户反馈信息
4.Jsp给用户做出响应

39、SpringMVC的执行流程

  1. 当用户发送请求,被前端控制器(DispatcherServlet)捕获-----捕获请求
  2. 前端控制器进行解析,得到URL,通过URL调用HandlerMapping并获得该Handler配置的所有相关对象----查找Handler
  3. 前端控制器根据得到的Handler,选择合适的HandlerAdapter,提取Request中的模型数据,填入Handler入参,开始执行Handler,最后返回一个ModelAndView对象.(执行Handler)
  4. 前端控制器根据返回的ModelAndViewm,选择合适的ViewResolver(选择ViewResolver)
  5. 通过ViewResolver结合Model和View来渲染视图,前端控制器将渲染结果返回给客户端(渲染并返回)

40、AOP的应用?

AOP:面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常后做加入相关逻辑.
我们主要使用AOP来做:
事务处理 执行方法前,开启事务,执行方法后提交事务,出现异常后回滚事务
权限判断 在执行方法前,判断是否具有权限
日志记录 在执行方法前执行日志

41、简单介绍一下SPRING或者SPRING的两大核心?

spring是j2ee应用程序框架,是轻量级的IOC和AOP的容器框架,主要针对javabean的生命周期进行管理的轻量级容器,可以单独使用,也可以跟其它框架组合使用.

(1).IOC(inversion of control)或DI(dependency injection)控制反转
原来:我的service要调用Dao,我就在service中创建Dao对象,这时Dao对象的创建的控制权在我手中
Spring:spring发现我的service依赖于Dao,就给我的service注入Dao对象,这时Dao对象创建的控制权在spring手中
核心原理:工厂模式+反射+配置文件

(2).AOP:面向切面编程
核心原理:使用动态代理的方式在执行前后或出现异常后做相关逻辑.
我们主要使用AOP来做:
事务处理
权限判断
日志记录

42、Spring事务的传播特性和隔离级别

脏读 :一个事务读到了另一个事务的未提交的数据
不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
虚幻读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

Mysql 默认:可重复读
Oracle 默认:读已提交

45、Lilux常用命令

Cd跳转到目录
Pwd 获取当前路径
Su 切换用户
Ll 查看当前目录下文件和目录
Tail 查看文件
Rm –rf 删除文件
Vi 修改文件
Mv 移动/重命名 文件或文件夹
mkdir 创建文件夹
Rm –f 删除文件夹
Tar 打包/解压
grep 查找想要的信息

46、数据库优化

定位:查找,定位慢查询,并优化

优化:

  1. 创建索引:创建合适的索引,我们可以在索引中查询,查询到以后直接找到对应的记录
  2. 分表:当一张表的数据比较多时或者某一张表的字段的值比较多并很少使用时,采用水平分表或者垂直分表来优化
  3. 读写分离:当一台服务器不能够满足需要时,采用读写分离的方式进行集群
  4. 缓存:使用Redis来进行缓存

47、如何查询和慢查询

在项目自验或项目转测之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定的时间后,通过查看日志,找到对应的慢查询信息.

使用EXPLAIN +慢查询语句,来详细分析语句的问题.

48、选择合适的索引

索引是帮助DBMS高效获取数据的数据结构.
分类:普通索引,唯一索引,主键索引,全文索引
1.普通索引:允许重复的值出现
2.唯一索引:除了不能有重复的记录外,其它和普通索引一样.(用户名;用户身份证;手机号)
3.主键索引:是随着设定主键而创建的;也就是把某个列设为主键的时候,数据库就会给该列创建索引;唯一且没有null值
4.全文索引:用来对表中文本域(char,varchar,text)进行索引,全文索引针对myisam

49、使用索引的一些技巧

索引弊端:
1. 占用磁盘空间.
2. 对dml(插入,修改.删除)操作有影响,变慢
使用场景:
1. 肯定在where条件经常使用,如果不做查询就没有意义
2. 该字段的内容不是唯一的几个值(sex).
3. 字段内容不是频繁变化

具体技巧:
1. 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引(最左匹配)
2. 对于使用like查询,查询如果是”%aaa”不会使用到索引,而”aaa%”会使用到索引
3. 如果条件中有or,有条件没有使用索引,即使其中有条件带索引,也不会使用.简单来说,就是要求使用的所有字段,都必须单独使用时才能使用索引.
4. 如果列类型是字符串,拿一定要在条件中将数据使用引号引用起来,否则索引失效
5. 如果mysql估计使用全表扫描要比索引快,则不适用索引.例子:表里只有一条记录

50、数据库优化之分表

分表分为水平分表(按行)和垂直分表(按列)

水平:在实际操作中,mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉.水平分表能够很大程度的减少这些压力.

垂直:如果一张表中某个字段值非常多(长文本,二进制等),而且只有在很少的情况下会查询,比如商品的详情描述,这时候就可以把字段单个放到一个表,通过外键与原表关联起来

水平分表策略:
1. 按时间分表:这种分表方式有一定的局限性,当数据有较强的时效性.如微博发布纪录,微信消息纪录等,这种数据很少会有用户查询几个月前的数据,这时可以按月分表
2. 按区间范围分表:一般在有严格的自增id需求上,如按照user_id水平分表
3. Hash分表(用的多):通过一个原始目标的id或者名称通过一定的hash算法计算出数据库存储表的表名,然后访问相应的表.

51、数据库的读写分离

一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求时,可以集群处理.mysql的集群处理技术最常用的是读写分离,

1.主从同步:数据库最终会把数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据时一致的.能改变数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据
2.读写分离:使用负载均衡来实现写的操作都往主数据库去.而读的操作都往从数据库去

52、数据库优化之缓存

在持久层(dao)和数据库(db)之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问数据时从缓存中获取,不用访问数据库,而缓存是在操作内存,访问速度快

作用:减少数据库服务器压力,减少访问时间

Java中常用的缓存:
1. hibernate的二级缓存,这种缓存不支持分布式缓存
2. 可以使用redis来作为中央缓存,对缓存的数据进行集中处理

53、SQL语句优化小技巧

DDL优化:
1. 通过禁用索引来提供导入数据性能,这个操作主要针对有数据的表追加数据
2. 关闭唯一校验
3. 修改事务提交方式(导入)(变多次提交为一次)

DML优化: 把多条插入的语句合并为一条(变多次提交为一次)

DQL优化:

Order by 优化
多用索引排序
普通结果排序(非索引排序)
Group by 优化:如果对排序的结果没有排序的需求,可以考虑在其后面加上order by nul
子查询优化
Or优化:
1.or两边都是用索引字段做判读,性能好
2.or两边,有一边不用,性能差
3.如果name=”a” or name=”b”,这种方式,索引失效
Limit优化

54、Redis介绍

Redis是一个key-value的nosql数据库,先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失数据,支持的数据类型比较多.

主要用来做缓存数据库的数据和web集群时当做中央缓存存放session

使用场景:

  1. 缓存:把经常需要查询很少修改的数据放到读速度很快的空间(内存),以便减少下次访问时间,减轻db压力,
  2. 计数器:redis中的计数器是原子性的内存操作,可以解决库存溢出问题,进销存,系统存溢出
  3. Session缓存服务器:web集群时作为session的缓存服务器

55、Redis存储对象的方式?

Json字符串:需要把对象转换成json字符串,当做字符串处理,直接使用set和get来设置或获取/
优点:设置和获取比较简单
缺点:没有提供专门的方法,需要把对象转换成json

字节:需要做序列号,就是把对象序列化为字节保存.

如果是担心json转对象会消耗资源的情况,这个问题需要考量几个地方,
1. 使用的json转换lib是否就会存在性能问题
2. 数据的数据量级别,如果是存储百万级的大数据对象,建议采用存储序列化对象方式.如果是少量的数据级对象,或者是数据对象字段不多,还是建议采用json转换成string方式.毕竟redis对存储字符类型这部分优化的非常好.具体采用的方式与方法,还要看你所使用的场景

56、solr相似度匹配原理

solr将用户输入的内容使用分词器进行分词,然后将这些新词做成向量。

接下来,solr会将索引库中所有包含这些关键字的记录数做成n维向量.这个时候,solr会根据n维向量夹角的余弦值的大小来判断相似度的大小.余弦值越低,相似度越大,排名越靠前.反之,余弦值越大,相似度越小,排名越靠后.

题外话:lucene的数据模型其实是n维向量.

57、高并发问题:索引库同步

1.硬编码:在相应的代码中增加索引库同步的代码。不过,这种方法耦合度太高,将原本不相关的系统耦合在了一起,容易造成不可预估的错误,是电商项目的大忌。
2.spring的aop:编写一个索引库同步的方法,利用aop的形式,将它和数据库数据更新的方法联系起来。这种方式也会造成耦合。
3.消息队列:不过,这个方法会造成一个问题,那就是消息消费失败问题。

:解决两个系统间的通信问题。
消息消费失败:集中同步索引库,做一个定时任务。在消息队列所在的服务器上加一个数据库,我们使用的是redis缓存。消息队列中每发一条信息,就将这条信息持久化进redis中。接着定时(我们是在晚上,用户量少的时候)从redis中将消息列表取出来,批量同步索引库。

58、秒杀业务

秒杀业务最主要的操作:减库存和添加订单
1.第一种方式:数据库(中小型网站)
Update goods set num=num-1 where id=id;
Insert orders values() where goods.id=goodsid

为了保持数据的一致性,需要使用事务

优化:
①数据库服务器和秒杀服务器在同一个机房
②避免使用事务,使用数据库的存储过程来完成业务单元
存储过程逻辑:避免使用事务
(1)判断库存(num)
(2)如果num>0,执行update和insert操作
(3)如果num<0,秒杀结束

2.第二种方式:缓存(redis)(中大型网站)
将秒杀商品和订单都存在redis中,用户下单时,num>0下单(num-1):秒杀结束;

59、单点登录的核心是什么?

单点登录的核心是如何在多个系统之间共享身份信息

60、solr 的索引查询为什么比数据库要快。

Solr 使用的是 Lucene API 实现的全文检索。全文检索本质上是查询的索引。而数据库中并
不是所有的字段都建立的索引,更何况如果使用 like 查询时很大的可能是不使用索引,所以
使用 solr 查询时要比查数据库快。

61、IO和NIO

62、序列化和反序列化

序列化一般是指把结构化的对象变成无结构的字节流,便于存储、传输

首先序列化并不是JAVA所独有的,基本所有编程语言都提供了序列化的方式,序列化是编程的一种解决问题的方式。JAVA序列化就是将对象按照某种协议格式(某种约定方式)放入一个buffer中,其目的是便于网络传输或持久存储。反序列化,就是将序列化后的buffer按照序列化时还原成原来的对象,这样程序就能直接使用还原的对象了。

63、网站安全性问题(防止网站被爬)

单位时间内请求次数超过某个阈值就让输入验证码,可以极大降低抓取的速度,如果多次超
过某个阀值可以加入黑名单。还有就是页面内容使用 json 返回,数据经常变一变格式,或
者 js 动态生成页面内容

64、Spring对bean的管理

1.BeanFactory: BeanFactory采用了工厂设计模式,负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期。
2.ApplicationContext:除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:国际化支持、aop、事务等。
3.BeanFactory在解析配置文件时并不会初始化对象,只有在使用对象getBean()才会对该对象进行初始化,而ApplicationContext在解析配置文件时对配置文件中的所有对象都初始化了,getBean()方法只是获取对象的过程。

65、SpringMVC和SpringBoot的区别?

Spring 是一个“引擎”;
Spring MVC 是基于Spring的一个 MVC 框架 ;
Spring Boot 是基于Spring4的条件注册的一套快速开发整合包:
1. 创建独立的Spring应用程序
2. 嵌入的Tomcat,无需部署WAR文件
3. 简化Maven配置
4. 自动配置Spring
5. 提供生产就绪型功能,如指标,健康检查和外部配置
6. 绝对没有代码生成和对XML没有要求配置 [1]

66、JS的跨域访问如何实现?

首先,JS的跨域访问是指js在不同的域之间进行数据传输和通信,比如使用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据。只要协议,端口,域名有任何一个不同,都被当做不同的域。

实现方法:

  1. 通过jsonp跨域:通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。
  2. 通过修改document.domain来跨子域:
  3. 使用window.name来进行跨域:window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。

67、Java虚拟机的生命周期?

负责运行一个java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。

68、简单讲一下类加载机制?

类加载机制?:类的加载指的是类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区中创建一个java.lang.Class对象,用来封装方法区中的数据结构。包括五个阶段:加载、验证、准备、解析、初始化

69、外连接和内连接各自什么什么时候使用?有何作用?

  1. 内连接:返回连接表中符合连接条件和查询条件的数据行(所谓的连接表就是早数据库中在做查询的时候形成的中间表)
  • 隐式内连接: 形成的中间表为两个表的笛卡尔积

selecto.id,o.order_number,c.id,c.namefromcustomers c, orders owhere c.id=o.customer_id;

  • 显示内连接:形成的中间表为两个表经过on条件过滤后的笛卡尔积

selecto.id,o.order_number,c.id,c.namefromcustomers cinnerjoinorders oon c.id=o.customer_id;

2.外连接:外连接不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分为三类:左外连接(left outer join)、右外连接(right outer join)、全外连接(full outer join)

  • 左外连接:还会返回左标中不符合连接条件但是符合查询查询条件的数据行

selecto.id,o.order_number,o.customer_id,c.id,c.namefromorders oleftouterjoin customers conc.id=o.customer_id;

  • 右外链接:还会返回右标中不符合连接条件但是符合查询查询条件的数据行

selecto.id,o.order_number,o.customer_id,c.id,c.namefromorders orightouterjoin customers conc.id=o.customer_id;

  • 全外连接:全外=左外 union 右外,相当于数学合集(去掉重复)

selecto.id,o.order_number,o.customer_id,c.id,c.namefromorders ofullouterjoin customers conc.id=o.customer_id;

70、你知道的锁有哪些?简单介绍

锁的基本概念:同时只能有一个线程获取到这个锁,其他的线程要等待这个线程将锁释放后才可以获取到这个锁,其实“锁”从这个意义上来说,锁住的不是要访问的对象,而是代码。假如有多个线程要访问一个对象,有一个线程获取到了这个对象的锁,但是其他的对象仍然可以访问这个对象并进行修改,只是获取不到锁,完全可以不使用锁来进行修改。

答案:选择1和5

常见的锁:排它锁(synchronized)、共享锁、乐观锁和悲观锁(是一种锁的思想,不是状态)、分段锁、自旋锁、公平锁、非公平锁、可重入锁

71、解释内存泄露和内存溢出?

  1. 内存泄露–memory leak:是指程序在申请内存后,无法释放已经申请的内存空间。内存泄露的堆积最终导致内存溢出
  2. 内存溢出–out of memory:指的是申请内存时,没有足够的内存供申请者使用,或者说,就会报错OOM,即所谓的内存泄露

内存溢出的原因及其解决办法:

  1. 原因
  • 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  • 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  • 代码中存在死循环或循环产生过多重复的对象实体;
  • 使用的第三方软件中的BUG;
  • 启动参数内存值设定的过小、

2.解决办法

  • 修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。
  • 检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误
  • 对代码进行走查和分析,找出可能发生内存溢出的位置

72、解释什么是线程并发,如何解决多线程的并发问题?

线程并发是指一个类的实例对象创建了多个线程对象同时启动,调用同样的资源,造成 线程的安全问题 。

解决办法:根本–保证容易出现问题的代码的原子性(破坏产生多线程并发安全问题的条件)。

  1. 使用synchronized关键字,创建同步代码块,当执行到了synchronized(object)语句的时候,先检查object对象的标志位,如果为0状态,则表示有其他线程正在执行,那么此线程将暂时阻塞,让出CPU资源,直到另外的线程执行完毕,将标志位恢复为1后,可以继续运行。
  2. 禁止共享资源 --ThreadLocal
  3. 禁止修改 —ReadWriteLock

73、举例说明数据库三表查询的实现?

可以使用嵌套查询,实现三表的连接查询:
SELECT employee_name
FROM (table3 c LEFT JOIN TABLE1 a
ON c.employee_id=a.employee_id )
LEFT JOIN table2 b ON b.company_id=a.company_id
WHERE company_name =‘A’ and employee_age<30;

74、Spring的事务特性?

原子性 (atomicity):强调事务的不可分割.
一致性 (consistency):事务的执行的前后数据的完整性保持一致.
隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
持久性(durability) :事务一旦结束,数据就持久到数据库