java工程师大型企业常见面试题总结(共12页).docx

上传人:飞****2 文档编号:16310529 上传时间:2022-05-16 格式:DOCX 页数:12 大小:268.51KB
返回 下载 相关 举报
java工程师大型企业常见面试题总结(共12页).docx_第1页
第1页 / 共12页
java工程师大型企业常见面试题总结(共12页).docx_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《java工程师大型企业常见面试题总结(共12页).docx》由会员分享,可在线阅读,更多相关《java工程师大型企业常见面试题总结(共12页).docx(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上企业面试总结经过一星期的紧张面试,获得了许多的面试经验,总结了面试中遇到的问题,现对一些主要问题进行总结,希望能给大家以帮助。非项目方面1. redis内存溢出及宕机状态的处理redis存在于内存中,内存大小有限,也会存在宕机或重启导致内存数据清空的情况,此时我们可通过对redis中的数据设置生存周期及对数据进行持久化操作来尽量避免这些情况带来的危害。l 设置生命周期:到期后数据销毁EXPIRE key seconds 设置生存时间PERSIST key 清除生命时间(重新设值也会清除生命周期)TTL key 查看剩余生存时间TTL返回值:大于0的数字:剩余生存时间,

2、单位为秒i-1 : 没有生存时间,永久存储-2 : 数据已经被删除l 持久化:是把数据从内存以某种形式持久化到磁盘上。持久化方式:RDB(relational database)和 AOF(append only mode)RDB:通过快照方式实现,当符合条件时就对内存数据进行快照并存储到硬盘上。快照的条件在配置文件中配置。由2个参数构成,时间和改动的键的个数。快照过程:使用fork函数复制一份当前进程(父进程)的副本(子进程),然后父进程继续处理任务,子进程则执行写入磁盘操作。写入完成后再用临时文件替旧的RDB文件。AOF:是将redis的每一条命令进行记录,并保存到磁盘的AOF文件中,重启

3、后会执行该文件进行数据恢复,需要手动开启。优化:aof会记录每一条命令,包括一条数据的多次操作,这样造成了冗余。可使用BGREWRITEAOF技术来进行重写,去除数据的中间执行过程,保留最终数据命令即可。重写的策略是当aof文件的大小超过上一次大小的某个比例时就会进行重写。问题:文件是先写入缓存的,而缓存读取到硬盘需要时间,假设在这个时间数据丢失那也会导致数据的丢失。所以即使每秒做文件同步也可能导致数据丢失。2. Spring注解开发的配置此处会让你说出几个常用注解,说几个就行。有时还会问你注解底层怎么实现就说不太了解。在xml配置文件中开启注解功能 注解:Component(value=名称

4、) 利用构造方法创建对象Scope(value=singleton/prototype) 单例和多例Lazy(value=true/false)延迟创建问题PostConstruct 指定方法为初始化方法PreDestory 指定方法为销毁方法Autowired 注入引用类型,只能按照类型进行匹配Resource 注入引用类型,如果有name属性值,则按照bean的名称进行匹配;如果没有name属性值,则按照类型进行类型匹配3. 数据库优化此处重点是数据库的索引问题,索引可大大提高查询效率,但是大数据量时也会影响效率。此时他还会问你当数据量很大时索引不行了该怎么处理,就回答读写分离,分库分表。

5、提前对这两块做下了解,看看京东淘宝的处理方式。索引存储的值按索引列中的顺序排列。可以利用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。1. 数据库优化l sql级别的优化sql语句的书写方式对效率也是有一定影响的。1) 使用= 替代 select * from emp where deptno=10(效率高,因为depto直接定位到10,效率高) select * from emp where deptno9(先定位到9 ,然后还要排除9 ,效率低)2) 如果使用union或者union all了,此时如果不需要考虑去掉重复的数据,尽量不要使用union ,因为union默认是去重

6、复的,去重复过程,也会影响效率。3) 对group by子句的优化上面:尽量在group by前面将数据过滤掉。 select job,avg(sal) from emp where job=CLERK group by job (效率高) select job,avg(sal) from emp group by job having job=CLERK (效率低)4) 使用视图: (数据量非常大的情况下)经常被查询的列数据,并且这些数据不被经常的修改,删除。l 数据表建立索引索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。索引分单列索引和组合索引。单列索引,即

7、一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。MySQL索引类型包括:普通索引:这是最基本的索引,它没有任何限制。唯一索引:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引:它是一种特殊的唯一索引,不允许有空值。组合索引:将多个字段建到一个索引里。有个“最左前缀”的结果。建立索引的时机:一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对,=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。在以通配符%和_开头作查询时,MySQL

8、不会使用索引。SELECT*FROMmytableWHEREusernamelikeadmin%而下句就不会使用:SELECT*FROMmytableWHEREtNamelike%admin缺点:提高了查询速度,但降低了更新速度。因为更新时要额外保存索引文件。索引文件在大数据量时会膨胀很快。所以如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。使用索引的技巧和注意事项:1) 索引不会包含有NULL值的列只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值

9、为NULL。2) 使用短索引对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。3) 索引列排序MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么orderby中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。4) like语句操作一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like“

10、%aaa%”不会使用索引而like“aaa%”可以使用索引。5) 不要在列上进行运算select*fromuserswhereYEAR(adddate)2007;将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select*fromuserswhereadddate2007-01-01;6) 不使用NOTIN和操作淘宝分库分表机制:淘宝根据订单号做拆分的,下单有两个维度,买家和卖家。淘宝将订单表拆分到16个mysql库中,而在每个库中又将订单表拆分为64份,相当于将一张表拆分为1024份,事务进行了分散,很大程度上提高了并发的事务处理能力。因此买家和卖家怎么找到对应的表呢

11、?对于16台服务器,每台服务器64张表只需要2位买家和卖家id的后两位数字就可以准确定位到具体的库和表。订单号中同时存在买家id的最后两位和卖家id的最后两位。分别在订单号的倒数第3位,4位和最后两位数。4. RabbitMq 消息队列此处要点是消费者没收到消息该怎么处理。应用进程之间的通信方法开发语言:Erlang 面向并发的编程语言。AMQP是消息队列的一个协议。六种模式,只用五种1、 简单队列2、 Work模式:两个消费者,能者多劳3、 订阅模式1、1个生产者,多个消费者2、每一个消费者都有自己的一个队列3、生产者没有将消息直接发送到队列,而是发送到了交换机4、每个队列都要绑定到交换机5

12、、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。4、 路由模式生产者为消息指定类型,路由绑定不同的队列,队列指定接收的类型,只有类型匹配队列才接收。模式1:自动确认只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。模式2:手动确认消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。5. Spring的IOC和AOP的底层实现IOC底层:工厂设计模

13、式+XML技术+反射配置AOP底层:动态代理6. SSH中单例多例问题三层结构各用的是单例还是多例,为什么,action层是单例还是多例,什么时候用多例。单例多例主要看该层有没有定义成员变量,定义了成员变量的话由于存在多线程的共同调用相同变量所以要设置为多例。scope属性:bean的生命周期singleton: 单例(默认值)(在初始化配置文件的时候创建的对象,不是getBean())prototype: 多例 (在getBean()的时候创建对象)结合项目中使用场景:分层开发的时候:dao对象: 单例biz对象: 单例action对象: 必须多例的(属性或模型驱动有数据共享,所以必须多例)

14、7. 单例的书写及各种模式的区别面试官让我手写出一种单例模式并解释各种模式的区别,此处最好写出双重校验锁模式。/双重校验锁写法class SingleDemoProblem4private SingleDemoProblem4()private static SingleDemoProblem4 sdp = null;private static Object obj = new Object();public static SingleDemoProblem4 getInstance()/*设置双重校验锁防止多线程情况下,某个线程进来判断变量为空进入准备创建对象,但还没创建cpu被抢走,别的

15、线程过来发现变量还是空又进来创建对象,结果导致多个线程创建多个对象出来*/if(sdp = null)synchronized (obj) if(sdp = null)sdp = new SingleDemoProblem4();return sdp;饿汉式:在类加载时就创建对象,不管对象用不用都会创建,造成内存的浪费。但能保证对象的唯一性。懒汉式:只在使用的时候创建对象,多线程下不能保证每次使用的对象唯一。8. SpringBuild和springBuffer的区别联系:两者都是字符串缓冲区类,作用与功能相似,内部的方法也都相同.但使用场景不同.区别:StringBuffer是线程安全的,但

16、对于多线程效率低下(因为内部用了synchronize关键字保证线程安全,这样必然牺牲了执行效率)StringBuilder安全性稍差,但对于多线程效率稍高9. Mybatis中$和#的区别此处要点是注意哪种能防止sql注入,为什么能防止sql注入。10. 线程池问题问你用的线程池引用的哪个包。和线程池有关的几个概念:最大容量:一个线程池中最多可以保存的线程数量;最小容量:一个线程池中,最少保存的线程数量;最大存活时间:一个线程最多可以保持空闲的时间;如果超出这个时间,一般这个线程就会被销毁;线程的一些面试问题要多了解。11. Linux怎么查看文件内容的前10行,怎么查看进程Linux你肯定

17、不能说不知道,说了解一点,然后他会问你一些常用指令,所以要记住一些常用的指令。有的答不出来就说平时用的不多,而且平时不会就会上网查。1、 Netstat an | grep 80 查看端口信息2、 Vim中 :/内容 直接搜索内容3、 Ps ef | grep redis 查看服务端口进程4、 service network restart重启网络服务5、 tail -200f catalina.log动态显示日志最后200行6、 head -n 10 catalina.log 查看前10行命令7、 tar -zcvf abc.tar.gz * 压缩当前目录下所有文件,压缩后文件名为abc.t

18、ar.gztar -zxvf abc.tar.gz -C /usr/local/xixi/解压到指定目录中 记得指定目录前面加 C8、 查找文件查找的是脚本文件(执行文件)which filename查找的是二进制的文件(执行文件)whereis -b filename查找特定文件 whereis filename (利用数据库来查找)12、 eclipse快捷键Alt + Shift + M任意选中一块代码,自动转换为方法,自动添加参数返回类型。ctrl+shift+x 转为大写 ctrl+shift+y 转为小写13、 hashmap和hashtable的区别|-:HashMap:是开发中

19、使用最多的一个map集合类;在它的底层使用哈希表保存数据(数据是无序的);它的键和值允许使用null;是线程不安全的;|-:LinkedHashMap:是HashMap的子类,主要操作和HashMap一样;不同的是,在底层使用哈希表和链表保存数据,哈希表负责保存数据和维护数据的唯一性,链表负责记录数据添加的顺序;所以它和HashMap不同之处是,它的数据是有序的(添加和迭代的顺序一样);实际上,在HashSet底层就是使用的HashMap实现的;LinkedHashSet底层使用的是LinkedHashMap实现;|-:HashTable:出现的比较早,在JDK1.1版本就出现;它的主要操作和

20、HashMap一样,不同之处在于,HashTable是线程安全的,效率比较低;它不允许使用null做键或值;在实际开发中现在被HashMap取代;|-:Properties:主要保存Key-Value的集合,在开发中主要用来操作配置文件(文件中的配置信息都是键值对的形式)到IO流在学;|-:TreeMap:底层使用二叉树实现,它保存的数据,在保存的时候键都是有序的;此处还问了一个课堂没讲过的实现类可取代hashTable,它是ConcurrentHashMap,这个自己可做下了解。ConcurrentHashMap与HashTable都可以用于多线程的环境,但是当Hashtable的大小增加到

21、一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。HashTable虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器的一致性不同的,HashTable的迭代器是强一致性的,而ConcurrentHashMap是弱一致的。 ConcurrentHashMap的

22、get,clear,iterator 都是弱一致性的。14、 ArrayList怎么去重巧妙利用hashSet不能存储重复元素的原理,把arrayList放到hashSet中再放回arrayList即可。15、 说说垃圾处理机制大致了解,能说出一点即可现在使用的Java虚拟机并不是只是使用一种内存回收机制,而是分代收集的算法。就是将内存根据对象存活的周期划分为几块。一般是把堆分为新生代、和老年代。短命对象存放在新生代中,长命对象放在老年代中。对于不同的代,采用不同的收集算法:新生代:由于存活的对象相对比较少,因此可以采用复制算法该算法效率比较快。老年代:由于存活的对象比较多哈,可以采用标记-清

23、除算法或是标记-整理算法16、 是否写过mysql的存储过程mysql 执行语句是要先编译,然后再执行的。这样如果查询并发大的时候。会浪费很多资源和时间。造成mysql进程占用资源过多,症状就是慢。但存储过程可以把一些特别的语句封装成一个方法 ,再编译好成一个可以执行的方法,对外只要接收参数就可以了。这样就不用再编译。执行就快了什么时候会用到?你觉得你数据库因为同时出现太多读写操作而变得慢 ,那么就要用了。17、 JDBC底层步骤18、 Jvm机制及类的加载过程栈区,堆区,方法区类加载顺序:类加载时先在方法区中为类开辟一个空间,非静态成员加载到非静态区域,静态成员加载到静态区域,为静态成员变量

24、分配空间并赋默认值,然后执行静态代码块或显示赋值,赋值完成类加载结束。对象创建过程:遇到new关键字在堆中开辟一个空间,为非静态成员变量分配空间并赋默认值,执行构造函数先看有没有this语句调用其他构造函数,没有就执行隐式三步:1、执行父类构造函数,2、为非静态成员变量显示赋值,3、执行构造代码块。结束后执行构造函数体中的内容,执行完对象创建结束。19、 抽象类和接口的区别共同点:都可以有抽象函数,都不能被实例化。区别:声明上:抽象类,class; 接口 interface书写成员:抽象类,书写任何类成员; 接口:只能书写成员变量和函数有无构造函数:抽象类,有构造函数; 接口:没有构造函数。作

25、用上:抽象类是描述的继承体系中的共同的特征和行为,如果行为不确定,就定义为抽象函数;接口描述的是不属于继承体系的共同的功能;接口可以用来定义规则。继承关系上:抽象类:单一继承,多重继承; 接口:多继承,多实现。项目方面我简历上写得我在项目中承担的模块是订单模块和购物车模块,所以自己的模块一定要搞清楚。搞清楚相关技术在你承担模块中的运用。1. 购物车模块中未登录状态下把商品放入redis中,那这个key怎么设置?此处要搞清楚怎么通过cookie来找到对应的redis中的对应数据。要知道一个用户不同时间在未登录状态下添加商品怎么和之前已经添加的进行联系。用户未登录,购物车商品保存在cookie,由

26、于cookie对存储的数据大小有限制解决方案 : 将数据保存到redis 快 在cookie中保存一个key,这个key同时关联redis的key每次取值都经历了转换成List 然后遍历,找到对应的商品这个过程redis的key field(商品的id) value(购物车商品的值)用户的cookie_key = redis_key = REDIS_2. Httpclient在项目中的运用。用于系统之间接口的调用。3. Redis和rabbitMq在项目中的体现。redis用于缓存,减少与数据库的不必要连接次数。RabbitMq用于修改数据库时及时通知redis更新里面的数据。4. 项目中定时

27、模块QuartZ的运用。订单失效时就运用到了定时任务,指定时间未付款自动失效。Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。1、Job表示一个任务(工作),要执行的具体内容。2、JobDetailJobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。3、Trigger代表一个调度参数的配置,什么时候去调。4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。5. 订单的支付模块怎么处理?此时直接说我不负责支付模块,我们有负责这个模块的,我们只要调用接口就行。6. 购物商城涉及到多线程吗?肯定设计到多线程的,此时就是想问并发怎么处理。专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com