java工程师大型企业常见面试题总结_第1页
java工程师大型企业常见面试题总结_第2页
java工程师大型企业常见面试题总结_第3页
java工程师大型企业常见面试题总结_第4页
java工程师大型企业常见面试题总结_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

企业面试总结

通过一星期H勺紧张面试,获得了许多的面试经验,总结了面试中碰到的问题,现对某些重要

问题进行总结,但愿能给大家以协助。

非项目方面

1.redis内存溢出及宕机状态的处理

redis存在于内存中,内存大小有限,也会存在宕机或重启导致内存数据清空的状况,此时

我们可通过对redis中的数据设置生存周期及对数据进行持久化操作来尽量防止这些状况带

来的危害。

・设置生命周期:到期后数据销毁

EXPIREkeyseconds设置生存时间

PERSISTkey清除生命时间(重新设值也会清除生命周期)

TTLkey查看剩余生存时间

TTL返回值:

不不大于0的数字:剩余生存时间,单位为秒i

-1:没有生存时间,永久存储

-2:数据已经被删除

•持久化:是把数据从内存以某种形式持久化到磁盘上。

持久化方式:RDB(relationaldatabase)和AOF(appendonlymode)

RDB:

通过快照方式实现,当符合条件时就对内存数据进行快照并存储到硬盘上。快照的条件在配

置文献中配置。由2个参数构成,时间和改动的键H勺个数。

在配置文件中己经预置了3个条件:

save9001#15分钟内有至少1个键被更改则进行快照

save30010#5分钟内至少有10个键被更改则进行快照

save6010000#1分钟内至少有10000个健被更改则进行快照

以上条件之间是“或”的关系。

快照过程:

使用fork函数复制一份目前进程(父进程)的副本(子进程),然后父进程继续处理任务,

子进程则执行写入磁盘操作。写入完毕后再用临时文献替旧的RDB文献。

可以通过SAVE和BGSAVE命令来尹动快照,茯个命令的区别是前者是由£

进程进行快照,会阻塞其他请求,后者是通过fork子进程快照操作。

注意:由于Redis使用fork来复制一份当前进程,那么子进程就会占有和主

进程一样的内存资源.比如说主进程8G内存,那么在备份的时候必须保证

有16G的内存,要不然会信用虚拟内存,性能韭常惹.___________________

AOF:

是将redis的每一条命令进行记录,并保留到磁盘的AOF文献中,重启后会执行该文献进行

数据恢复,需要手动启动,

优化:aof会记录每一条命令,包括一条数据的多次操作,这样导致了冗余。可使用

BGREWRITEAOF技术来进行重写,清除数据的中间执行过程,保留最终数据命令即可。重写

日勺方略是当aof文献的大小超过上一次大小日勺某个比例时就会进行重写。

问题:文献是先写入缓存的,而缓存读取到硬盘需要时间,假设在这个时间数据丢失那也会

导致数据的丢失。因此虽然每秒做文献同步也也许导致数据丢失。

2.Spring注解开发的配置

此处会让你说出几种常用注解,说几种就行:。有时还会向作注解底层怎么实现就说不太理解。

在xml配置文献中启动注解功能

<!--base-package:注解写在哪个包

<context:component-scanbase-package="cn.itcast.bean"/>

注解:

@Component(value="名称')运用构造措施创立对象

@Scope(value="singleton/prototype")单例和多例

@Lazy(value=true/false)延迟创立问题

@PostConstruct指定措施为初始化措施

@PreDestory指定措施为销毁措施

@Aulowired注入引用类型,只能按照类型进行匹配

@Resource注入引用类型,假如有name属性值,则按照bean口勺名称进行匹配;假

如没有name属性值,则按照类型进行类型匹配

索引是迅速搜索口勺关键。MySQL索引的建立对于MySQL的高效运行是很重要的。索引分单

列索引和组合索引。单列索引,即一种索引只包括单个列,一种表可以有多种单列索弓,但

这不是组合索引。组合索引,即一种索包括多种列。

MySQL索引类型包括:

一般索引:这是最基本的索引,它没有任何限制。

唯一索引:它与前面的一般索引类似,不同样H勺就是:索引列时值必须唯一,但容许有空

值。假如是组合索引,则列值的组合必须唯一。

主键索引:它是一种特殊的唯一索引,不容许有空值。

组合索引:将多种字段建到一种索引里。有个“最左前提”的成果。

建立索引日勺时机:

一般来说,在WHERE和」OIN中出现的)列需要建立索引,但也不完全如此,由于MySQL只

对<,<=,=,>,>=,BETWEEN,IN,以及某些时候日勺LIKE才会使用索引。在以通配符%和_

开头作查询时,MySQL不会使用索引。

SELECT*FROMmytableWHEREusernamelike'admin%'而下句就不会使用:

SELECT*FROMmytableWHEREtNamelike^admin'

缺陷:

提高了查询速度,但减少了更新速度。由于更新时要额外保留索引文献。

索引文献在大数据量时会影胀很快。

因此假如你日勺MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询

语句。

使用索引的技巧和注意事项:

1)索引不会包具有NULL值的列

只要列中包具有NULL值都将不会被包括在索引中,复合索引中只要有一列具有NULL值,

那么这一列对于此复合索引就是无效的。因此我们在数据库设计时不要让字段口勺默认值为

NULL.

2)使用短索引

对串列进行索引,假如也许应当指定一种前缀长度。例如,假如有一种CHAR(255)的歹L,假

如在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅

可以提高查询速度并且可以节省磁盘空间和I/O操作。

3)索引列排序

MySQL杳询只使用一种索引,因此假如where子句中已经使用了索引B勺话,那么orderby

中的列是不会使用索引的,因此数据库默认排序可以符合规定口勺状况下不要使用排序操作;

尽量不要包括多种列的排序,假如需要最佳给这些列创;复合索引。

4)like语句操作

一般状况下不鼓励使用like操作,假如非使用不可,怎样使用也是一种问题。like"%aaa%”不

会使用索引而like“aaa%”可以使用索引。

5)不要在列上进行运算

select*fromuserswhereYEAR(adddate)<2023;将在每个行上进行运算,这将导致索引失效而

进行全表扫描,因此我们可以改成

select*fromuserswhereadddate</2023-01-01,;

6)不使用NOTIN和<>操作

淘宝分库分表机制:

淘宝根据订单号做拆分的,下单有两个维度,买家和卖家。

淘宝将订单表拆分到16个mysql库中,而在每个库中又将订单表拆分为64份,相称于将一

张表拆分为1024份,事务进行了分散,很大程度上提高了并发的事务处理能力。

因此买家和卖家怎么找到对应口勺表呢?

对于16台服务器,每台服务器64张表只需要2位买家和卖家id的后两位数字就可以精确

定位到详细的库和表。订单号中同步存在买家id的最终两位和卖家id的最终两位。分别在

订单号的倒数第3位,4位和最终两位数。

4.RabbitMq消息队列

此处要点是消费者没收到消息该怎么处理。

应用进程之间H勺通信措施

开发语言:Erlang-面向并发的编程语言。

AMQP是消息队列的一种协议。

六种模式,只用五种

1、简朴队列

2、Work模式:两个消费者,能者多劳

3、订阅模式

1、1个生产者,多种消费者

2、每一种消费者均有自己的一种队列

3、生产者没有将消息直接发送到队列,而是发送到了互换机

4、每个队列都要绑定到互换机

5、生产者发送的消息,通过互换机,抵达队列,实现,一种消息被多种消费者获取的目的

注意:消息发送到没有队列绑定日勺互换机时,消息将丢失,由丁,互换机没有存储消息日勺能

力,消息只能存在在队列中。

4、路由模式

amqp.gen-S9b..*

error

re

type=di5^^jnfoamqp.gen-Agl..

COY■AYA

生产者为消息指定类型,路由绑定不同样的队列,队列指定接受的类型,只有类型匹配队列

才接受。

TopicExchang•-将路由批和某视式进行理。此时从方盛要?淀要一个横式上]符号同一个或多个词,符号一匹配不多不少一个词•旷前婚陪

到-auditKscorporal,但是.auSt一只会工配到.初狈心、找在RcdHal的胆友1丁-•蒙F18的雷,泉衰明1然空担机是JU何工柞的:

模式1:自动确认

只要消息从队列中获取,无论消费者获取到消息后与否成功消息,都认为是消息已经成

功消费。

模式2:手动确认

消葫者从队列中获取消息后,服舞器会将该消息标识为不可用状态,等待消假者的反馈,

假如消费者•直没有反馈,那么该消息将•直处在不可用状态。

5.Spring的IOC和AOP的底层实现

IOC底层:工厂设计模式+XML技术+反射配置

AOP底层:动态代理

6.SSH中单例多例问题

三层构造各用的是单例还是多例,为何,action层是单例还是多例,什么时候用多例。

单例多例重要看该层有无定义组员变量,定义了组员变量的话由于存在多线程的共同调用相

似变量因此要设置为多例,

scope属性:bean的生命周期

singleton:单例(默认值)(在初始化配置文献的时候创立H勺对象,不是getBean。)

prototype:多例(在getBean()的时候创立对象)

<beanid=*'s5"class="cn.itcast.bean.Student"scope="singleton"x/bean>

<beanid="s5"class="cn.itcast.bean.Student"scope="prototype"x/bean>

结合项目中使用场景:

分层开发日勺时候:

dao对象:单例

biz对象:单例

action对象:必须多例的(属性或模型驱动有数据共享,因此必须多例)

7.单例的书写及多种模式的区别

面试官让我手写出一种单例模式并解释多种模式欧I区别,此处最佳写出双重校验锁模式。

〃双重校验锁写法

classSingleDemoProblem4{

privateSingleDemoProblem4(){}

privatestaticSingleDemoProblem4sdp=null;

privatestaticObjectobj=newObject();

publicstaticSingleDemoProblem4getlnstance(){

/*设置双重校验锁防止多线程状况下,某个线程进来判断变量为空进入准备创立

对象,但还没创立CDU被抢走.

别日勺线程过来发现变量还是空又进来创立对象,成果导致多种线程创立多种对象出

来*/

if(sdp==null){

synchronized(obj){

if(sdp==null){

sdo=newSingleDemoProblem4();

)

)

)

returnsdp;

)

}

饿汉式:在类加载时就创立对象,不管对象用不用都会创立,导致内存H勺挥霍。但能保证对

象的唯一性。

懒汉式:只在使用的时候创立对象,多线程下不能保证每次使用的对象唯一。

8.SpringBuild和springBuffer时区别

联络:两者都是字符串缓冲区类,作用与功能相似,内部啊措施也都相似.但使用场景不同样.

区别:

StringBuffer是线程安全的但对「多线程效率低下(由「内部用了synchronize关键字保证线

程安全,这样必然牺牲了执行效率)

StringBuilder安全性稍差,但对于多线程效率稍高

9.Mybatis中${}和#{}的区别

此处要点是注意哪种能防止sql注入,为何能防止sql注入。

在Mybatis的mapper中,参数传递有2种方式,一种是#0另一种是$0,两者有着很大的区别:

”()实现的是sql语句的预处理参数.之后执行sql中用。号代替.使用时不需要关注数据类型.

Mybatis自动实现数据类型的转换。并且可以防止SQL注入。

$0实现是sql语句的直接拼接,不做数据类型转换,需要自行判断数据类型。不能防止SQL注入

O

是不是$0就没用了呢?不是的,有些情况下就必须使用$0,举个例子:

在分表存储的情况下,我们从哪张表查询是不确定的,也就是说sql语句不能写死,表名是动态

的,查询条件的固定的,这样:SELECT"FROM${tableName}WHEREid=#{id}

总结,

到}占位符,用于参数传递。

${}用于SQ助接.

10.线程池问题

问你用的线程池引用的I哪个包。

加…门类提供了用于此包中所提供的执行程序服务的工厂方法,

和线程池有关H勺几种概念:

最大容量:一种线程池中最多可以保留的线程数量;

最小容量:一种线程池中,至少保留的线程数量;

最大存活时间:i种线程最多可以保持空闲II勺时间;假如超过这个时间,一般这个线程就会

被销毁;

线程的某些面试问题要多理解。

ILLinux怎么查看文献内容的前10行,怎么查看进程

Linux你肯定不能说不懂得,说理解一点,然后他会问你某些常用指令,因此要记住某些常

用的指令。有的答不出来就说平时用的J不多,并且平时不会就会上网查。

1、Netstat-an|grep80查看端口信息

2、Vim中:/内容直接搜索内容

3、Ps-ef|grepredis杳看服务端II进程

4、servicenetworkrestart重启网络服务

5、tail-200fcatalina.log动态显示日志最终200行

6、head-n10catalina.log查看前10行命令

7、tar-zcvfabc.tar.gz*压缩目前目录卜所有文献,压缩后文献名为

tar-zxvfabc.tar.gz-C/usr/local/xixi/解压到指定目录中记得指定目录前

面加-C

8、查找文献

查找的是脚本文献(执行文献)whichfilename

查找的I是二进制H勺文献(执行文献)whereis-bfilename

查找特定文献whereisfilename(运用数据库来查找)

12>eclipse快捷键

Alt+Shift+M任意选中一块代码,自动转换为措施,自动添加参数返回类型。

ctrl+shift+x转为大写ctrl-shift+y转为小写

13、hashmap和hashtableaI区另!]

I--:HashMap:是开发中,吏用最多的一种m叩集合类;在它的底层使用哈希表保留数据(数

据是无序欧I):它的键和值容许使用null;是线程不安全的;

|…:LinkedHashMap:是HashMap日勺子类,重要操作和HashMap同样;不同样日勺是,在底

层使用哈希表和链表保留数据,哈希表负责保留数据和维护数据的唯一性,链表负责记录数

据添加的次序;因此它和HashMap不同样之处是,它的数据是有序口勺(添加和迭代的次序

同样);

实际上,在HashSet底层就是使用H勺HashMap实现的;LinkedHashSet底层使用的是

LinkedHashMap实现;

I--:HashTable:出现B勺比较早,在JDK1.1版本就出现;它的重要操作和HashMap同样,

不同样之处在于,HashTable是线程安全日勺,效率比较低;它不容许使用null做键或值;在

实际开发中目前被HashMap取代;

I-:Properties:重要保留Key-Value的集合,在开发中重要用来操作配置文献(文献中的

配置信息都是键值对时形式)到I。流在学;

I--:TreeMap:底层使用二又树实现,它保留的数据,在保留的时候键都是有序W、J;

此处还问了--种课堂没讲过欧j实现类可取代hashTable,它是ConcurrentHashMap,这个自己

可做下理解。

ConcurrentHashMap与HashTable都可以用「多线程日勺环境,不过当Hashtable日勺大小增长到

一定的时候,性能会急剧下降,由于迭代时需要被锁定很长R勺时间。由于ConcurrentHashMap

引入了分割(segmentation),不管它变得多么大,仅仅需要锁定mapH勺某个部分,而其他H勺

线程不需要等到迭代完毕才能访问mapo简而言之,在迭代FI勺过程中,ConcurrentHashMap

仅仅锁定mapU勺某个部分,而Hashtable则会锁定整个map。

HashTable虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器H勺一

致性不同样的,HashTableI时迭代器是强一致性”勺,而ConcurrentHashMap是弱一致的。

ConcurrentHashMapget,clear,iterator都是弱一致性的。

14、ArrayList怎么去重

巧妙运用hashSet不能存储反复元素的原理,把arrayLis:放到hashSet中再放I可arrayLst即

15、说说垃圾处理机制

大体理解,能说出一点即可

目前使用於JJava虚拟机并不是只是使用一种内存回收机制,而是分代搜集的J算法。就是将

内存根据对象存活口勺周期划分为几块。一般是把堆分为新生代、和老年代。短命对象寄存在

新生代中,长命对象放在老年代中。

对于不同样的代,采用不同样的搜集算法:

新生代:由于存活的对象相对比较少,因此可以采用复制算法该算法效率比较快。

老年代:由于存活的I对象比较多哈,可以采用标识•清除算法或是标识•整顿算法

16、与否写过mysql的存储过程

mysql执行语句是要先编译,然后再执行的。这样假如查询并发大的时候。会挥霍诸多资源

和时间。导致mysql进程占用资源过多,症状就是慢。

但存储过程可以把某些尤其H勺语句封装成一种措施,再编译好成一种可以执行的措施,对

外只要接受参数就可以了,这样就不用再编译。执行就快了

什么时候会用到?你觉得你数据库由于同步出现太多读写操作而变得慢,那么就要用了。

17、JDBC底层环节

1、注册驱动..

Class.forNameCcom.mysql.jdbc.Driver");

2、获得型据库连接

Connectionconn=DriverManager.getConnection(url,user,password)

3、创建向数据库发送sql的statement对盘

Statementstmt=conn.CreateStatement();

4、向数据库发送sq]

Resultsetrs=stmt.executeQuery(sql);//select语句

intupdateSum=stmt.executeUpdate(sql);//insertsupdate、delete语句

5、处理结果集

while(rs.nextO){

rs.getString(列名或者列的别名)

rs.getlnt(列卸

6、关闭资源

rs.closeO;

stmt.closeO;

conn.closet);

18、Jvm机制及类附加载过程

栈区,堆区,措施区

类加载次序:

类加载时先在措施区中为类开辟一种空间.非静态组员加载到非静态区域,静态绢员加载到

静态区域,为静态组员变量分派空间并赋默认值,然后执行静态代码块或显示赋值,赋值完

毕类加载结束。

对象创立过程:

碰到new关键字在堆中开辟•种空间,为非静态组员变量分派空间并赋默认值,执行构造

函数先看有无this语句调用其他构造函数,没有就执行隐式三步:1、执行父类构造函数,2、

为非静态组员变量显示赋值,3、执行构造代码块。结束后执行构造函数体中的内容,执行

完对象创立结束。

19、抽象类和接口的区别

共同点:都可以有抽象函数,都不能被实例化。

区别:

申明上:抽象类,class:接口interface

书写组员:抽象类,书写任何类组员;接口:只能书写组员变量和函数

有无构造函数:抽象类,有构造函数;接口:没有构造函数。

作用上:抽象类是描述的继承体系中的共同的特性和行为,假如行为不确定,就定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论