面试题汇总

技术面试(二)

2017-12-05  本文已影响33人  zhihaoZzz

40 ajax平时是怎么用的,为什么用

有时候只要更新的是页面某一块内容,这样页面的其他内容是不需要重新获取的。

用ajax去服务端获取这一块的内容,一是可以减轻服务器压力,二是用户体验会更流畅点,不会出现因为网络延迟而导致整个页面一片空白的情况。

41 是否设计过数据库,需要注意什么

1.在针对表结构设计时如果是n对n的关系,尽可能的设计成1对N的关系。避免表关联太复杂,以便于提高查询效率。

2.首先在定义字段名称是尽可能以简单字符串来完成,建议是能读懂字段所存储内容的大概意思,同时字段名称的长度在14个字符以内。

3.明确表字段是否允许为空,不建议表字段都为可为空,因为当为null时就会影响到查询效率。

4.在设置字段类型时需要考虑字段应该存放哪些值,有效的节省空间大小:

只存在两个是否两个值使用bit类型;

数字值建议使用int,大数据使用bigint,极小数据使用tinyint;

如果是跟钱打交道字段,或者精度维度的地理位置,或者是有小数的,使用decimal;

时间值得使用datetime类型

如果是在有中文的字段建议使用nvarchar,nchar

如果只是字符使用varchar,char

如果是大文本可使用text,ntext(Unicode码)

5.每张表建聚集索引

6.针对查询功能适当对表建立非聚集索引,但不建议建太多索引,索引太多会影响插入效率。

42 arraylist和hashmap是不是线程安全的,如果不是怎么办

解决arraylist的线程不安全:

一:使用synchronized关键字,这个大家应该都很熟悉了,不解释了;

二:使用Collections.synchronizedList();使用方法如下:

假如你创建的代码如下:List> data=new ArrayList>();

那么为了解决这个线程安全问题你可以这么使用Collections.synchronizedList(),如:

List> data=Collections.synchronizedList(new ArrayList>());

其他的都没变,使用的方法也几乎与ArrayList一样,大家可以参考下api文档;

解决hashmap线程不安全的问题:

方法一:通过Collections.synchronizedMap()返回一个新的Map,这个新的map就是线程安全的. 这个要求大家习惯基于接口编程,因为返回的并不是HashMap,而是一个Map的实现.

方法二:重新改写了HashMap,具体的可以查看java.util.concurrent.ConcurrentHashMap. 这个方法比方法一有了很大的改进

43 jsp有哪些内置对象,常用哪些,介绍一下

request对象:客户端请求,此请求包含来自GET/POST的请求参数,通过它才能了解到客户的需求,然后做出相应。

response对象:响应客户端的请求的有关信息。

session对象:它之客户端与服务起的一次会话,从客户端到服务器的一个WebApplication开始,直到客户端与服务器的链接断开为止。

out 对象:它是JspWriter类的实力,是向客户端输出内容常用的对象

page对象:它指当前JSP页面本身,有点类似this指针,它是java.lang.object类的一个实例

applicationd对象:它实现用户间的数据共享,可以改变全局变量,它从服务器启动开始直到服务器关闭。

exception对象:它是一个例外对象当一个页面的运行过程中发生了例外,就产生这个对象。

pageContext对象:它提供了对JSP页所有对象及名字空间的访问。

config对象:它是在一个Servlet初始化时,JSP引擎向它传递信息用的。

44 分页介绍,怎么实现的

分页的方法主要有以下两种思路:

(1)取出符合条件的数据,放到数据集或者内存当中,然后逐页浏览。例如,有可能每页只浏览20条记录,但使用这种分页方法需要把所有记录取出来。这种分页的方法叫做“指针分页”。指针分页法主要是利用数据集的指针(或者说集合的下标)来标识。比如分页要显示20条数据,那么第一页的指针从1开始,第二页的指针从(2-1)*20+1开始到2*20结束,依次类推。“指针分页”适合数据量和并发量不是很高的应用程序,不适合海量的数据查询。

(2)对于海量的数据查询,看多少就取多少,显然是最佳的解决方法,假如某个表中有200万条记录,第一页取前20条,第二页取21~40条记录。此时可以使用:

select top 当前页*每页记录数查询字段列表 from 表A where 主键字段 not in (select top (当前页-1)*当前页记录数主键字段 from 表A)

这样的语句来实现,因为这种查询方式要使用主键,所以叫他做“主键分页”。(mysql可以使用select * from admin limit 2,2进行分页查询,从主键id=2+1开始(索引从下标为0开始数,第二条,就是id=3这条),往后2条)

对于一个完整的分页,应当包括记录数、页数、当前页数、上一页、下一页、首页、最后一页等。所以,无论是指针分页还是主键分页。需获获得一个类似“select count(*) as 记录总数 from 表名”这样的语句,从而获得记录数。

为了简便起见,这里就以一个电子商城中的分页显示作为一个案例,采用指针分页法。在新品展示页面中需要在页面显示的是originalList对象中的商品,设计每页从originalList对象中位置start开始,显示至位置over(不包含over)结束,则分页的主要工作在于确定start和over

<%

for(int i = start; i

GoodEntity originalGoods = (GoodEntity)originalList.get(i);

}

%>

45 sql中如何统计内容相同的记录(通过id去重)

这是单个字段的:

查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

代码如下:

select * from people

where peopleId in (select   peopleId from   people group by   peopleId having count

(peopleId) > 1)

这是多个字段的:

查找表中多余的重复记录(多个字段)

代码如下:

select * from vitae a

where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having

count(*) > 1)

46 如何删除内容相同的记录

这是单个字段的:

删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

代码如下:

delete from people

where peopleId in (select   peopleId from people group by   peopleId   having count

(peopleId) > 1)

and rowid not in (select min(rowid) from   people group by peopleId having count(peopleId

)>1)

这是多个字段的:

删除表中多余的重复记录(多个字段),只留有rowid最小的记录

代码如下:

delete from vitae a

where (a.peopleId,a.seq) in   (select peopleId,seq from vitae group by peopleId,seq having

count(*) > 1)

and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

47 左连接、右连接

关于左连接和右连接总结性的一句话:

左连接where只影响右表,右连接where只影响左表。

Left Join

select * from tbl1 Left Join tbl2 where tbl1.ID = tbl2.ID

左连接后的检索结果是显示tbl1的所有数据和tbl2中满足where 条件的数据。

简言之Left Join影响到的是右边的表

Right Join

select * from tbl1 Right Join tbl2 where tbl1.ID = tbl2.ID

检索结果是tbl2的所有数据和tbl1中满足where 条件的数据。

简言之Right Join影响到的是左边的表。

inner join

select * FROM tbl1 INNER JOIN tbl2 ON tbl1.ID = tbl2.ID

功能和select * from tbl1,tbl2 where tbl1.id=tbl2.id相同。

inner join:理解为“有效连接”,两张表中都有的数据才会显示

48 json是什么,在哪里用了,如何使用

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式

1、数据格式比较简单,易于读写,格式都是压缩的,占用宽带小

2、易于解析这种语言,客户端JavaScript可以简单的通过eval()进行JSON数据的读取

Json在前端的应用,使用Ajax登录,ajax处理登录验证信息,解析json格式的String类型对象和ajax获得服务端的响应数据的方式request.responseText

用ajax将表单的数据提交给服务端,客户端解析从服务端传过来的json格式的List类型的数据:

用ajax来获取服务器端的数据,如果从服务器传到前端的数据都是JSON的字符串形式,在前端要读取数据,需要先将字符串转化成json格式的对象。

49 restful的理解

1、首先REST只是一种风格,不是一种标准

2、REST是以资源为中心的

3、REST充分利用HTTP协议基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

50 redis是做什么的,怎么用的

众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。

首先需要在你本地安装redis软件,然后启动redis服务器。

接下去就需要创建你的项目,并导入redis-client的jar包

然后就是最重要的使用工具类把数据放进去了

51 单点登录实现

登录,接受用户账号密码,校验账号密码,如果存在,登录成功,可以使用UUID创建一个随机数token,将此token作为key把用户信息存储到redis中.将token设置到cookie中.

如果用户再次浏览其他需要登录的系统,从cookie中取token,若token存在,再通过token取redis中的用户信息,判断是否过时,如果用户信息可用,则不用再次登录,不可用跳转到登录页面

Sesion版本的

用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

sso认证中心发现用户未登录,将用户引导至登录页面

用户输入用户名密码提交登录申请

sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌

sso认证中心带着令牌跳转会最初的请求地址(系统1)

系统1拿到令牌,去sso认证中心校验令牌是否有效

sso认证中心校验令牌,返回有效,注册系统1

系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源

用户访问系统2的受保护资源

系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数

sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌

系统2拿到令牌,去sso认证中心校验令牌是否有效

sso认证中心校验令牌,返回有效,注册系统2

系统2使用该令牌创建与用户的局部会话,返回受保护资源

52 负载均衡实现

每个集群都需要一个负载均衡器,其负责根据一定的算法将外界发送到集群的请求尽量均匀地分配到集群中的每个服务器,使得集群中所有服务器的负载尽量平衡。对外界的客户端而言其并不知道具体访问了集群中的哪台服务器,多台服务器从逻辑上对外界而言可以看作一台“大"服务器。这样,当集群的服务能力不能满足当前的需要时,可以非常方便地再向集群中添加新的服务器来满足需要。可以看出,使用了集群之后,系统具有非常好的可扩展性。当不幸集群中有某台服务器突然当机时,负载均衡系统中其用户状态数据可以迁移到其他服务器上,不影响在线用户的使用。这样,通过使用集群技术可以方便地实现系统的高可靠性。

Tomcat的安装后,就可以开始搭建Tomcat集群了,具体步骤如下:

将系统根目录(/)下的“apache-tomcat-6.0.14"的文件夹改名为“TC6_A"

提示:进行上述步骤操作的原因是,本案例中集群的各个负载均衡Tomcat服务器实例运行在同一个物理服务器上,因此集群中有几个Tomcat实例一般就需要几个Tomcat的安装。另外,由于集群中的各个Tomcat实例位于同一个物理服务器上的一个操作系统下,因此各个实例占用的各种网络端口不能相同,否则集群中的多个Tomcat实例不能同时正常启动,下面的步骤将介绍如何修改 Tomcat实例需要使用的各个网络端口。

Ii.打开“TC6_A"文件夹下“conf"文件夹下的“server.xml"文件以及“TC6_B"文件夹下“conf"文件夹下的“server.xml"文件。

说明:由于Apache作为Tomcat集群的负载均衡器,使用的是轮换算法,其均匀地将请求发送到集群中的各个Tomcat实例。因此,是轮换访问两个不同Tomcat实例中的Hello.jsp页面的。当然,看到轮换的情况也就说明Apache负载均衡器正常工作了。

53 session共享如何实现的

基于cookie的session共享

因为session保存在服务器上,当ip或者端口发生改变的时候,session信息不能共享,而此时可以使用cookie来解决这个文件;

把session信息保存在cookie,cookie在本地浏览器中,该ip改变的时候不会影响到cookie;保存在cookie的时候需要加密,cookie设置的路径必须是/  ,域名必须统一:

Sso.taobao.com

Goods.taobao.com

Order.taobao.com

www.baidu.com

News.baidu.com

Bbs.baidu.com

这种方式适用于多个子系统并且用不同域名访问时,作为单点登录的问题讨论。

基于数据库的session共享

把session信息保存到数据库中,设置失效时间。使用redis集群做session共享。

配置tomcat的sesson共享,搭建tomcat集群,tomcat集群搭建好之后,会自动向其他的tomcat里面广播session信息,

Tomcat不易太多;否则tomcat之间大量传输session数据会影响性能,此方法不推荐在生产环境中使用。

54 java解析xml的方式有几种

目前在Java中用于解析XML的技术很多,主流的有DOM、SAX、JDOM、DOM4j四种。

1、JDOM生成和解析XML文档(代码量少)

为减少DOM、SAX的编码量,出现了JDOM

优点:20-80原则,极大减少了代码量。

使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

2、SAX生成和解析XML文档(占用资源少)

为解决DOM的问题,出现了SAX,SAX 事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时发送事件,程序员编写响应这些事件的代码,保存数据。

优点:不用事先调入整个文档,占用资源少。SAX解析器代码比DOM解析器代码小,适于Applet下载。

缺点:不是持久的,事件过后若没保存数据,那么数据就丢了。无状态性,从事件中只能得到文本,但不知该文本属于哪个元素。

使用场合:Applet。只需XML文档的少量内容,很少回头访问,机器内存少。

3、DOM生成和解析XML文档(便于操作)

为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。

优点:整个文档树在内存中,便于操作,支持删除、修改、重新排列等多种功能。

缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间。

使用场合:一旦解析了文档还需多次访问这些数据,硬件资源充足(内存、CPU)。

4、DOM4J生成和解析XML文档(性能好,功能强大,极端易用)

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

55 spring中bean的作用域有什么

单例

原型

request

session

global session

Spring 3中为Bean定义了5中作用域,分别为singleton(单例)、prototype(原型)、request、session和global session。

1.singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:

2.prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。

3.request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。

,针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当当前Http请求结束,该bean实例也将会被销毁。

4.session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。

,同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。

5.global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效

56 你用过的设计模式

抽象工厂模式,创建者模式,原型模式,单态模式,代理模式

57 你用过的排序算法

冒泡

58 问一下简历中的项目

59 override和overload的区别

override:1、方法名、参数、返回值相同

2、子类方法不能缩小父类方法的访问权限

3、子类方法不能抛出比父类方法更多的异常

4、存在于父类和子类之间

5、方法被定义为final不能被重写

overload:1、参数类型、个数、顺序至少有一个不相同,

2、不能重载只有返回值不同的方法名

3、存在于父类和子类、同类中

60 java的异常机制

1、try:放置可能引发异常的代码块

2、catch:处理异常类型的代码块

3、finally:回收try块里打开的物理资源(如数据库连接、网络连接和磁盘文件),在异常机制中总是保证finally块总是被执行

4、throw:用于抛出一个世纪的异常、可以单独作为语句使用,抛出一个具体的异常对象

5、throws:声明该方法可能抛出的异常

两种异常:checked异常(编译时异常)和runtime(运行时异常)

61 java什么时候可能产生内存溢出

堆溢出,情况主要有两种,一是对象太多,java内存不够用,这是可以通过设置堆内存大小来调节,如:Xms500m,Xmx1000m,来给堆分配较大的内存。

第二种就不是那么好弄,很多对象本身你是不用的,但是由于又被其它对象引用,导出gc没法回收。

栈内存溢出主要又两个原因:

(1)栈深度超过限制。jvm虚拟机对虚拟机栈是有大小限制的,如果单一性线程的栈深度超过了这限制,会抛出StackOverFlowError(其中,每个栈的栈大小也影响这个限制的,比如在一个栈中只做一个复制操作栈深度超过10000就溢出了,但是如果一个栈中还定义了很多变量,分配了一些内存,可能超过6000就会溢出)

(2)虚拟机在扩展是无法分配到足够的内存。

被生命周期极长的集合类不当持有,号称是Java内存泄漏的首因

Java 堆 OutOfMemoryError:无限创建对象时候会出现堆内存溢出

线程过多

StackOverflowError :无限递归时会出现栈内存溢出

62 java支持多继承吗

java是不允许多继承的。从Java 8之前说起。要区分“声明多继承”与“实现多继承”。Java是不允许“实现多继承”,简称不允许“多继承”。但是Java支持“声明多继承”——Java的接口的多继承——一个类可以实现多个接口(“继承”了多个接口上的方法声明),而一个接口可以继承多个接口(同样是“继承”了多个接口上的方法声明)

63 序列化和反序列化

Java序列化是指把Java对象转换为字节序列的过程;

而Java反序列化是指把字节序列恢复为Java对象的过程。

64 mvc是什么

MVC (Modal View Controler),是一个设计模式,它强制性的使应用程序的输入、处理和输出分开.

首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。

三层架构:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)

MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

65 final、finally、finalize、static、public、private、protected、abstract

66 工厂模式、单例模式、代理模式

67 面向对象的特征

所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏

所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式

68 如何把一段逗号分隔的字符串转换为数组

public class Test{

public static void main(String[] args) {

String orgStr="a,b,c,d,e,f";

String [] result = orgStr.split(",");

for(int a = 0;a

System.out.print(result[a]+"\t");

}

}

}

69 sleep和wait有什么区别

sleep是Thread 类的方法,wait是Object类的方法

一个线程调用sleep方法后,会释放cpu,睡眠指定的时间,但是不会释放锁,后续的线程不能执行它获取的资源,调用sleep后,线程会自己醒来获取cpu资源,再次启动

调用wait方法,释放cpu时会同时释放掉获取的锁,进去到线程池内等待,后续的线程获取它锁释放的锁资源并执行,调用wait方法的线程只能调用notify()方法来唤醒,自己不会自动醒来

70 java有几种常用的流,分别举常用的例子

输入流(继承自InputStream抽象类):通过输入流的read方法读取字节数据;

输出流(继承自OutputStream抽象类):可以通过write方法写入字节数据;

71.hibernate 实体对象的三种状态以及转换关系。

最新的Hibernate文档中为Hibernate对象定义了四种状态(原来是三种状态,面试的时候基本上问的也是三种状态),分别是:瞬时态(new, or transient)、持久态(managed, or persistent)、游离态(detached)和移除态(removed,以前Hibernate文档中定义的三种状态中没有移除态),如下图所示,就以前的Hibernate文档中移除态被视为是瞬时态。

不支持该协议取消重新上传

瞬时态:当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。

持久态:持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。

游离态:当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。

72.数据库删除语句Drop/Delete/Truncate比较

Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行)。

删除某一行:Delete from 数据表名称 where 列名称=值;

删除所有行:Delete * from 数据表名称

Drop :删除数据表或数据库,或删除数据表字段。

删除数据库:drop database 数据库名称

删除数据表:(表的结构、属性、索引也会被删除)

use 数据库名称

drop table 数据表1名称,数据表2名称

删除数据表字段(列):

use 数据库名称

alter table 数据表名称

drop column 字段名(列名称)

Truncate:删除数据表中的数据(仅数据表中的数据,不删除表)。

truncate table 数据表名称

“ TRUNCATE TABLE语句是一种快速、无日志记录的方法。TRUNCATE TABLE语句与不含有 WHERE 子句的 DELETE 语句在功能上相同。但是,TRUNCATE TABLE语句速度更快,并且使用更少的系统资源和事务日志资源。”

删除数据的速度,一般来说: drop> truncate > delete

“与 DELETE 语句相比,TRUNCATE TABLE语句具有以下优点:

所用的事务日志空间较少。

DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放用于存储表数据的数据页来删除数据,并且在事务日志中只记录页释放。

使用的锁通常较少。

当使用行锁执行DELETE 语句时,将锁定表中各行以便删除。TRUNCATE TABLE 始终锁定表和页,而不是锁定各行。

如无例外,在表中不会留有任何页。

执行DELETE 语句后,表仍会包含空页。例如,必须至少使用一个排他 (LCK_M_X) 表锁,才能释放堆中的空表。如果执行删除操作时没有使用表锁,表(堆)中将包含许多空页。对于索引,删除操作会留下一些空页,尽管这些页会通过后台清除进程迅速释放。

与DELETE 语句相同,使用 TRUNCATE TABLE语句清空的表的定义与其索引和其他关联对象一起保留在数据库中。

73.什么是数据库索引?

数据库索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。

①一些情况下,索引还可用于避免排序操作;

②对于非聚集索引,有些查询甚至可以不访问数据页;

③索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页;

④聚集索引可以避免数据插入操作集中于表的最后一个数据页。

当然,虽然数据库索引可以有效提高数据库数据的查询速度,但是也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。

Mybatis中$和#的区别是什么?

#相当于对数据 加上 双引号,$相当于直接显示数据

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id,  如果传入的值是id,则解析成的sql为order by id.

3. #方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.

6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

字符串替换

默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

ORDER BY ${columnName}

这里MyBatis不会修改或转义字符串。

重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

在SpringMVC中有几种形式可以把数据共享到session中,分别怎么实现?(7分)

httpSession.setAttribute("manager", manager);

@SessionAttributes("manager")  注解,就把manager对象放入session中.

Spring的两大核心功能是什么,分别说明是什么?(3分)

Ioc控制反转,是spring的核心,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转

AOP即面向切面编程,可以说是面向对象编程的补充和完善。AOP技术是一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,即切面,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。


                                                                        其他一些问题汇总

懒加载

ajax+jsonp跨域咋实现的?

1.jsonp

但是要注意JSONP只支持GET请求,不支持POST请求。

什么是jsonp

jsonp(JSON with padding)是一个非官方的协议, 它允许在服务器端集成Script tags返回至客户端, 通过javascript callback的形式实现跨域访问.

jsonp有什么用

由于同源策略的限制, xmlHttpRequest只允许请求当前源的资源, 为了实现跨域请求, 可以通过script标签实现跨域请求, 然后在服务端输出json数据并执行回调函数, 从而解决了跨域的数据请求.

如何使用jsonp

jsonp原理:

首先在客户端注册一个callback, 然后把callback的名字传给服务器

此时, 服务器先生成json数据

然后以 javascript 语法的形式, 生成一个function, function 名字就是传递上来的参数jsonp.

最后将json数据直接以入参的方式, 放置到function 中, 这样就生成一段js语法的文档, 返回给客户端.

客户端浏览器, 解析script标签, 并执行返回的javascript 文档, 此时数据作为参数, 传入到了客户端预先定义好的 callback 函数里(动态执行回调函数)

主要提示:

JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。

第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。

JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。

懒汉式 与 饿汉式 的区别

所谓“懒汉式”与“饿汉式”的区别,是在与建立单例对象的时间不同。

“懒汉式”是在你真正用到的时候才去建这个单例对象:

懒汉式在多线程情况下存在安全问题

比如:有个单例对象

private static Student student = null;  //不建立对象

Student getInstance(){

if(student == null) {        //先判断是否为空

student = new Student();  //懒汉式做法

}

return student;

}

“饿汉式”是在不管你用的用不上,一开始就建立这个单例对象:

比如:有个单例对象

private static Student student = new Student(); //建立对象

Student getInstance(){

return student;  //直接返回单例对象

}

并发&并行:

并行是在不同实体上的多个事件

并发是在同一实体上的多个事件。

包装类与基本数据类型

Spring注解 工作原理图

MySQL表间关系

SQL优化

Linux 创建文件夹/创建文件命令

mkdir  touch

linux查看进程

ps aux|grep

nio  管道

负载均衡  nginx负载均衡

高可用

支付流程

单元测试(完整流程) 查-增-查-

怎么解决高并发

数据库表设计注意点

视频存储在什么地方

Springmvc与Struts2的区别

shiro 认证授权流程(怎么拦截的)

为什么离职

前台数据网络传输安全

如何验证是否是手机登录

单点登录如何实现的

jsonp跨域

pagehelper实现原理

常用集合类  ArrayList线程安全的实现

垃圾回收机制

多线程用来做什么

枚举 是什么为什么怎么做

框架 Spring模式-工厂模式技术实现

单例模式-优缺点  手写

ioc aop原理

mybatis #$

shiro 理解 用法

redis 项目哪里用 怎么用 原理 项目中redis用几台

MySQL 删库删表 (drop)

ajax 介绍 同步异步的区别

java处理json 处理xml

业余做什么

职业规划

架构师理解

对公司的理解

遇到技术问题怎么解决

linux 常用命令 查看cpu 内存

git svn 怎么用 是什么 区别

项目组 多少人 开发周期

并发怎么实现

主要工作

几个Tomcat

互联网与传统行业的特点

Tomcat 集群

分布式

表多少张

模块几个

接口数量

http返回码

webservice返回值

几个月上线

分布式

谈到分布式架构,我们必须对比传统架构才能彰显其优势。

①最为明显的一点,在传统的架构中,如果某个功能需要进行维护,那么我们必须停掉整个服务,这对于公司的运营会造成损失。分布式系统在核心功能模块使用单独服务器,维护部分模块不影响用户的其他操作。

②在海量数据处理方面,传统架构显得比较乏力;分布式系统架构采用服务器集群,使用负载均衡,海量数据处理游刃有余!

③在性能(检索)以及维护方面,分布式系统架构也有较为明显的优势。

商品添加前后台校验

Redis主从复制

主从复制

复制初始化:当一个从数据库启动时,会向主数据库发送SYNC命令,主数据库收到命令后会开始在后台保存快照(即RDB持久化过程),并将保存快照期间收到的命令缓存起来。当快照完成后,Redis会将快照文件和缓存的命令发送给从数据库,从数据库接收到数据后,会载入快照文件并执行缓存的命令。

复制同步阶段:复制初始化结束后,主数据库每收到写命令时就会将命令同步给从数据库,从而保证主从数据库数据一致。

solr分词,搭建过程

上一篇下一篇

猜你喜欢

热点阅读