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

下载本文档

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

文档简介

java工程师大型企业常见面试题总结资料仅供参考企业面试总结经过一星期的紧张面试,获得了许多的面试经验,总结了面试中遇到的问题,现对一些主要问题进行总结,希望能给大家以帮助。非项目方面redis内存溢出及宕机状态的处理redis存在于内存中,内存大小有限,也会存在宕机或重启导致内存数据清空的情况,此时我们可经过对redis中的数据设置生存周期及对数据进行持久化操作来尽量避免这些情况带来的危害。设置生命周期:到期后数据销毁EXPIREkeyseconds 设置生存时间PERSISTkey 清除生命时间(重新设值也会清除生命周期)TTLkey查看剩余生存时间TTL返回值:大于0的数字:剩余生存时间,单位为秒i-1:没有生存时间,永久存储-2:数据已经被删除持久化:是把数据从内存以某种形式持久化到磁盘上。持久化方式:RDB(relationaldatabase)和AOF(appendonlymode)RDB:经过快照方式实现,当符合条件时就对内存数据进行快照并存储到硬盘上。快照的条件在配置文件中配置。由2个参数构成,时间和改动的键的个数。快照过程:使用fork函数复制一份当前进程(父进程)的副本(子进程),然后父进程继续处理任务,子进程则执行写入磁盘操作。写入完成后再用临时文件替旧的RDB文件。AOF:是将redis的每一条命令进行记录,并保存到磁盘的AOF文件中,重启后会执行该文件进行数据恢复,需要手动开启。优化:aof会记录每一条命令,包括一条数据的多次操作,这样造成了冗余。可使用BGREWRITEAOF技术来进行重写,去除数据的中间执行过程,保留最终数据命令即可。重写的策略是当aof文件的大小超过上一次大小的某个比例时就会进行重写。问题:文件是先写入缓存的,而缓存读取到硬盘需要时间,假设在这个时间数据丢失那也会导致数据的丢失。因此即使每秒做文件同步也可能导致数据丢失。Spring注解开发的配置此处会让你说出几个常见注解,说几个就行。有时还会问你注解底层怎么实现就说不太了解。在xml配置文件中开启注解功能<!--base-package:注解写在哪个包--><context:component-scanbase-package="cn.itcast.bean"/>注解:@Component(value="名称") 利用构造方法创立对象@Scope(value="singleton/prototype") 单例和多例@Lazy(value=true/false) 延迟创立问题@PostConstruct 指定方法为初始化方法@PreDestory 指定方法为销毁方法@Autowired 注入引用类型,只能按照类型进行匹配@Resource 注入引用类型,如果有name属性值,则按照bean的名称进行匹配;如果没有name属性值,则按照类型进行类型匹配数据库优化此处重点是数据库的索引问题,索引可大大提高查询效率,可是大数据量时也会影响效率。此时她还会问你当数据量很大时索引不行了该怎么处理,就回答读写分离,分库分表。提前对这两块做下了解,看看京东淘宝的处理方式。索引存储的值按索引列中的顺序排列。能够利用B-Tree索引进行全关键字、关键字范围和关键字前缀查询。数据库优化sql级别的优化sql语句的书写方式对效率也是有一定影响的。使用>=替代>select*fromempwheredeptno>=10(效率高,因为depto直接定位到10,效率高)select*fromempwheredeptno>9(先定位到9,然后还要排除9,效率低)如果使用union或者unionall了,此时如果不需要考虑去掉重复的数据,尽量不要使用union,因为union默认是去重复的,去重复过程,也会影响效率。对groupby子句的优化上面:尽量在groupby前面将数据过滤掉。selectjob,avg(sal)fromempwherejob='CLERK'groupbyjob(效率高)selectjob,avg(sal)fromempgroupbyjobhavingjob='CLERK'(效率低)使用视图:(数据量非常大的情况下)经常被查询的列数据,而且这些数据不被经常的修改,删除。数据表建立索引索引是快速搜索的关键。MySQL索引的建立对于MySQL的高效运行是很重要的。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表能够有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。MySQL索引类型包括:普通索引:这是最基本的索引,它没有任何限制。唯一索引

:它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。主键索引

:它是一种特殊的唯一索引,不允许有空值。组合索引:将多个字段建到一个索引里。有个“最左前缀”的结果。建立索引的时机:一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不完全如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。在以通配符%和_开头作查询时,MySQL不会使用索引。SELECT

*

FROM

mytable

WHERE

username

like'admin%'

而下句就不会使用:

SELECT

*

FROM

mytable

WHEREt

Name

like'%admin'

缺点:提高了查询速度,但降低了更新速度。因为更新时要额外保存索引文件。索引文件在大数据量时会膨胀很快。因此如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。使用索引的技巧和注意事项

:索引不会包含有NULL值的列

只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。因此我们在数据库设计时不要让字段的默认值为NULL。

使用短索引

对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不但能够提高查询速度而且能够节省磁盘空间和I/O操作。

索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order

by中的列是不会使用索引的。因此数据库默认排序能够符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创立复合索引。

like语句操作

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like

“%aaa%”

不会使用索引而like

“aaa%”能够使用索引。

不要在列上进行运算

select

*

from

users

where

YEAR(adddate)<;

将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们能够改成

select

*

from

users

where

adddate<‘-01-01’;

不使用NOT

IN和<>操作淘宝分库分表机制:淘宝根据订单号做拆分的,下单有两个维度,买家和卖家。淘宝将订单表拆分到16个mysql库中,而在每个库中又将订单表拆分为64份,相当于将一张表拆分为1024份,事务进行了分散,很大程度上提高了并发的事务处理能力。因此买家和卖家怎么找到对应的表呢?对于16台服务器,每台服务器64张表只需要2位买家和卖家id的后两位数字就能够准确定位到具体的库和表。订单号中同时存在买家id的最后两位和卖家id的最后两位。分别在订单号的倒数第3位,4位和最后两位数。RabbitMq消息队列此处要点是消费者没收到消息该怎么处理。应用进程之间的通信方法开发语言:Erlang–面向并发的编程语言。AMQP是消息队列的一个协议。六种模式,只用五种简单队列Work模式:两个消费者,能者多劳订阅模式1、1个生产者,多个消费者2、每一个消费者都有自己的一个队列3、生产者没有将消息直接发送到队列,而是发送到了交换机4、每个队列都要绑定到交换机5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的注意:消息发送到没有队列绑定的交换机时,消息将丢失,因为,交换机没有存储消息的能力,消息只能存在在队列中。路由模式生产者为消息指定类型,路由绑定不同的队列,队列指定接收的类型,只有类型匹配队列才接收。模式1:自动确认 只要消息从队列中获取,无论消费者获取到消息后是否成功消息,都认为是消息已经成功消费。模式2:手动确认 消费者从队列中获取消息后,服务器会将该消息标记为不可用状态,等待消费者的反馈,如果消费者一直没有反馈,那么该消息将一直处于不可用状态。Spring的IOC和AOP的底层实现IOC底层:工厂设计模式+XML技术+反射配置AOP底层:动态代理SSH中单例多例问题三层结构各用的是单例还是多例,为什么,action层是单例还是多例,什么时候用多例。单例多例主要看该层有没有定义成员变量,定义了成员变量的话由于存在多线程的共同调用相同变量因此要设置为多例。scope属性:bean的生命周期 singleton:单例(默认值)(在初始化配置文件的时候创立的对象,不是getBean()) prototype:多例(在getBean()的时候创立对象)<beanid="s5"class="cn.itcast.bean.Student"scope="singleton"></bean><beanid="s5"class="cn.itcast.bean.Student"scope="prototype"></bean>结合项目中使用场景: 分层开发的时候: dao对象:单例 biz对象:单例 action对象:必须多例的(属性或模型驱动有数据共享,因此必须多例)单例的书写及各种模式的区别面试官让我手写出一种单例模式并解释各种模式的区别,此处最好写出双重校验锁模式。//双重校验锁写法classSingleDemoProblem4{ privateSingleDemoProblem4(){} privatestaticSingleDemoProblem4sdp=null; privatestaticObjectobj=newObject(); publicstaticSingleDemoProblem4getInstance(){ /*设置双重校验锁防止多线程情况下,某个线程进来判断变量为空进入准备创立对象,但还没创立cpu被抢走, 别的线程过来发现变量还是空又进来创立对象,结果导致多个线程创立多个对象出来*/ if(sdp==null){ synchronized(obj){ if(sdp==null){ sdp=newSingleDemoProblem4(); } } } returnsdp; }}饿汉式:在类加载时就创立对象,不论对象用不用都会创立,造成内存的浪费。但能保证对象的唯一性。懒汉式:只在使用的时候创立对象,多线程下不能保证每次使用的对象唯一。SpringBuild和springBuffer的区别联系:两者都是字符串缓冲区类,作用与功能相似,内部的方法也都相同.但使用场景不同.区别:StringBuffer是线程安全的,但对于多线程效率低下(因为内部用了synchronize关键字保证线程安全,这样必然牺牲了执行效率)StringBuilder安全性稍差,但对于多线程效率稍高Mybatis中${}和#{}的区别此处要点是注意哪种能防止sql注入,为什么能防止sql注入。线程池问题问你用的线程池引用的哪个包。和线程池有关的几个概念:最大容量:一个线程池中最多能够保存的线程数量;最小容量:一个线程池中,最少保存的线程数量;最大存活时间:一个线程最多能够保持空闲的时间;如果超出这个时间,一般这个线程就会被销毁;线程的一些面试问题要多了解。Linux怎么查看文件内容的前10行,怎么查看进程Linux你肯定不能说不知道,说了解一点,然后她会问你一些常见指令,因此要记住一些常见的指令。有的答不出来就说平时用的不多,而且平时不会就会上网查。Netstat–an|grep80查看端口信息Vim中:/内容直接搜索内容Ps–ef|grepredis查看服务端口进程servicenetworkrestart重启网络服务tail-200fcatalina.log 动态显示日志最后200行head-n10catalina.log查看前10行命令tar-zcvfabc.tar.gz* 压缩当前目录下所有文件,压缩后文件名为abc.tar.gztar-zxvfabc.tar.gz-C/usr/local/xixi/ 解压到指定目录中记得指定目录前面加–C查找文件查找的是脚本文件(执行文件)whichfilename查找的是二进制的文件(执行文件)whereis-bfilename查找特定文件whereisfilename(利用数据库来查找)eclipse快捷键Alt+Shift+M任意选中一块代码,自动转换为方法,自动添加参数返回类型。ctrl+shift+x转为大写ctrl+shift+y转为小写hashmap和hashtable的区别|----:HashMap:是开发中使用最多的一个map集合类;在它的底层使用哈希表保存数据(数据是无序的);它的键和值允许使用null;是线程不安全的;|---:LinkedHashMap:是HashMap的子类,主要操作和HashMap一样;不同的是,在底层使用哈希表和链表保存数据,哈希表负责保存数据和维护数据的唯一性,链表负责记录数据添加的顺序;因此它和HashMap不同之处是,它的数据是有序的(添加和迭代的顺序一样);实际上,在HashSet底层就是使用的HashMap实现的;LinkedHashSet底层使用的是LinkedHashMap实现;|----:HashTable:出现的比较早,在JDK1.1版本就出现;它的主要操作和HashMap一样,不同之处在于,HashTable是线程安全的,效率比较低;它不允许使用null做键或值;在实际开发中现在被HashMap取代;|---:Properties:主要保存Key-Value的集合,在开发中主要用来操作配置文件(文件中的配置信息都是键值正确形式)到IO流在学;|----:TreeMap:底层使用二叉树实现,它保存的数据,在保存的时候键都是有序的;此处还问了一个课堂没讲过的实现类可取代hashTable,它是ConcurrentHashMap,这个自己可做下了解。ConcurrentHashMap与HashTable都能够用于多线程的环境,可是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。HashTable虽然性能上不如ConcurrentHashMap,但并不能完全被取代,两者的迭代器的一致性不同的,HashTable的迭代器是强一致性的,而ConcurrentHashMap是弱一致的。ConcurrentHashMap的get,clear,iterator都是弱一致性的。ArrayList怎么去重巧妙利用hashSet不能存储重复元素的原理,把arrayList放到hashSet中再放回arrayList即可。说说垃圾处理机制大致了解,能说出一点即可现在使用的Java虚拟机并不是只是使用一种内存回收机制,而是分代收集的算法。就是将内存根据对象存活的周期划分为几块。一般是把堆分为新生代、和老年代。短命对象存放在新生代中,长命对象放在老年代中。对于不同的代,采用不同的收集算法:新生代:由于存活的对象相对比较少,因此能够采用复制算法该算法效率比较快。老年代:由于存活的对象比较多哈,能够采用标记-清除算法或是标记-整理算法是否写过mysql的存储过程mysql执行语句是要先编译,然后再执行的。这样如果查询并发大的时候。会浪费很多资源和时间。造成mysql进程占用资源过多,症状就是慢。但存储过程能够把一些特别的语句封装成一个方法,再编译好成一个能够执行的方法,对外只要接收参数就能够了。这样就不用再编译。执行就快了什么时候会用到?你觉得你数据库因为同时出现太多读写操作而变得慢,那么就要用了。JDBC底层步骤Jvm机制及类的加载过程栈区,堆区,方法区类加载顺序:类加载时先在方法区中为类开辟一个空间,非静态成员加载到非静态区域,静态成员加载到静态区域,为静态成员变量分配空间并赋默认值,然后执行静态代码块或显示赋值,赋值完成类加载结束。对象创立过程:遇到new关键字在堆中开辟一个空间,为非静态成员变量分配空间并赋默认值,执行构造函数先看有没有this语句调用其它构造函数,没有就执行隐式三步:1、执行父类构造函数,2、为非静态成员变量显示赋值,3、执行构造代码块。结束后执行构造函数体中的内容,执行完对象创立结束。抽象类和接口的区别共同点:都能够有抽象函数,都不能被实例化。区别:声明上:抽象类,class;接口interface书写成员:抽象类,书写任何类成员;接口:只能书写成员变量和函数有无构造函数:抽象类,有构造函数;接口:没有构造函数。作用上:抽象类是描述的继承体系中的共同的特征和行为,如果行为不确定,就定义为抽象函数;接口描述的是不属于继承体系的共同的功能;接口能够用来定义规则。继承关系上:抽象类:单一继承,多重继承;接口:多继承,多实现。项目方面我简历上写得我在项目中承担的模块是订单模块和购物车模块,因此自己的模块一定要搞清楚。搞清楚相关技术在你承担模块中的运用。购物车模块中未登录状态下把商品放入redis中,那这个key怎么设置?此处要搞清楚怎么

温馨提示

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

评论

0/150

提交评论