面试总结【1%~100%:提问率】
温馨提示:(以下仅代表个人面试中遇到的问题和个人观点,如不认同,按自己的来就好)
(欢迎继续添加问题,添加完最好更新到班级群)
问的比较多的是其实还是核心功能模块的开发细节问题,比如你们考虑到并发问题了没有?你们是怎么解决的?用xx技术解决有什么优点/缺点?遇到这种问题的时候不要慌,如果会就直接说,如果不会可以先想一会儿,最好不要超过30秒,嘴里唠叨一下,装的像一点,不然不吱声人家以为你不会呢,具体靠自己现场发挥,切记回答的中间不要卡壳,你卡在哪,基本就会在这个地方问和你说不出来的这个有关的问题,如果确实不会,就说具体的可能忘了,但拿起来就能用或者直接不知道,不要不说话,如果面试中有3~5个不会,你还不吱声的,基本这场面试就快结束了。
(送大家两句话:1没有你不行,只是不适合你;2总会有眼瞎的公司的)
祝大家早日找到工作,么么哒!
- 基础部分
- HashMap、HashSet、HashTable的区别?(60%)
- hashSet底层使用的是hashMap进行实现的,,但是没有key-value,只要hashMap的keyset视图,hashSet不允许有重复的对象
- hashTable是基于Dictionary类的,而HashMap是基于map接口的一个实现
- hashTable里默认的方法同步的,而hashMap是非同步的,因此hashtable 是多线程安全的,hashMap的多线程安全问题手动设置(Collections的方法)
- HashMap的键和值都可以为空,但键只能一个为空,值可以多个为空,但hashtable不允许null值
- 内存初始大小不同,HashTable初始大小为11,hashMap初始大小是16
- 内存扩容时采取的方式也不同,hashTable采用的是2*old+1,而hashMap采用的是2*old
- Hash值的计算方法不同,hashtable直接使用的是对象的hashcode值,而hashMap则是在对象的hashcode值上进行了一些变化
- ArrayList和LinkedList;(各种Map和List)(50%)
ArrayList:本身是一个可改变大小的数组,它允许null值,没有同步,增删慢,但同步快
LinkedList:实现了list接口,允许null值,不是同步的(线程不安全),增删快,查询慢
Set:无序,不可重复,查询效率低,删除和插入效率高,因为不会引起其他元素的位置发生变化
List:有序,可重复,查询效率快,插入和删除效率低,因为会引起其他元素的位置发生变化
- wait和sleep方法的区别?(40%)
相同点:可以让线程处于冻结状态
不同点:wait是object中的方法,sleep是thread类中定义的方法
Sleep必须人为的指定时间,wait可以指定时间,也可以不指定时间
Sleep时间到,线程处于临时堵塞状态或者运行状态,wait方法如果没有设置时间,必须通过notify或者notifyAll来唤醒
Sleep不一定非要定义在同步中,wait方法必须定义在同步中
当两者都定义在同步中时,线程执行到sleep,不会释放锁,线程执行到wait会释放锁
- Hashcode和equals(30%)
(1) equals:没有覆盖以前,用的是object的equals方法,比较的是对象的地址值,覆盖以后比较的是内容
(2)hashcode方法在集合中用到,
(3)将一个对象放入集合中时,首先判断放入对象的hashcode值与集合中的任意元素的hashcode值是否相等,如果不相等直接将对象放入集合中,如果相等,然后再通过equals方法再判断要放入的对象与集合中的任意一个对象是否相等,如果equals判断不相等,直接放入
- Equals和==的区别(有的问比较值和地址用什么关键字;或者两个字符串比较用什么)(30%)
基本类型:比较的都是值的大小
引用类型:栈内存中的值是否相等(地址)
字符串变量:==比较的是地址,equals:比较的是内容
- 方法重载和重写的区别(10%)
方法重载:方法名相同,参数个数和类型不同
方法重写:对父类的函数进行重新定义
重写方法的规则:
1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:
父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。
而重载的规则:
1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;
4、可以抛出不同的异常;
重写与重载的区别在于:
重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。
用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.
- 你们项目中那些地方涉及多线程?(包括会问各种线程问题;解决线程高并发;优化线 程池的方法;优化死锁的方法;内部是怎么执行的;多线程的原理什么之类的……)(80%)
- 进程和线程的区别(20%)
进程和线程之间的关系:1.一个进程可以有多个线程,一个线程只能属于一个进程
2.资源分配给进程,同一进程的所有线程共享该线程的所有资源
3.真正在处理机上运行的是线程
4. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体.
进程和线程之间的区别:1.线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
2.进程之间可以并发执行,同一进程之间的多个线程也可以并发执行
3.进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程报的资源
4.在创建或者撤销进程时,由于系统要为之分配和回收资源,导致系统的开销明显大于创建或者撤销线程时的开销
- 集合部分(70%)
- 类加载器的执行流程(20%)
装载----链接(验证、准备、解析)-----初始化
装载:查找并加载类的二进制数据
链接:验证:确保被加载类的正确性
准备:为类的静态变量分配内存,并将其初始化为默认值;
解析:将类中的符号引用转换为直接引用
初始化:为类中的静态变量赋予正确的初始值
- 有几个同学都遇到问二叉树和红黑树(40%)
- 你知道的java排序有几种?冒泡什么的;(30%)
- junit中before和beforeclass区别 ;(20%)
@before:在每个测试方法之前都会执行,只需声明成public
@beforeclass:在类中运行一次,必须声明成public static
- java的执行顺序
- 父类的公共静态属性和静态代码块
- 自身的静态属性和静态代码块
- 父类的非静态属性和非静态代码块
- 父类的构造器
- 自身的非静态属性和非静态代码块
- 自身的构造器
- 堆内存溢出和线程栈溢出
outOfMemoryError:java heap space
outOfMemoryError:permgem space
如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出,
线程栈溢出(java.lang.StackOverflowError):
原因:递归太深,方法调用层级过多导致的
为了避免内存泄露,在编写代码的过程中可以参考下面的建议:
1、尽早释放无用对象的引用
2、使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域
3、尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收
4、避免在循环中创建对象
5、开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
- WEB部分
- 谈谈cookie和session区别?(80%)
- Cookie存在客户端,session存在服务器端(内存中)
- Cookie不安全,session安全
- Session是基于Cookie实现的
- Cookie若不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,关闭浏览器窗口,Cookie就会消失,成为会话期的cookie,一般保存在内存中
- 设置了过期时间,浏览器就会把cookie保存在硬盘中,关闭浏览器窗口,cookie若没有超过设定的过期时间,cookie仍然有效,存放在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个Ie窗口。
- Session会在一定时间内保存在服务器上,当访问增多,占用服务器的性能,考虑减轻服务器的性能,考虑使用cookie
- 单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
- 服务器会把长时间没有活动的session从服务器内存中清除,此时session失效,或者调用session的invalidate方法,默认时间是20分钟
- 服务器会把长时间没有活动的session从服务器内存中清除,此时session失效,或者调用session的invalidate方法,默认时间是20分钟
- Cookie过期时间的设置:-1:会话级cookie;0:不记录cookie
- 说几个运行时异常(30%)
ClassCastException(类转换异常)
IndexOutOfBoundsException(数组越界)
NullPointerException(空指针)
ArrayStoreException(数据存储异常,操作数组时类型不一致)
还有IO操作的BufferOverflowException异常
- 谈一谈你了解几种java设计模式?(90%简历上写了就肯定问你)
- AJAX的怎样实现同步或者怎样实现异步?(30%)async
- star法则这个也会问到(30%具体问法是:给你一个功能,比如简单的一个添加,说一下你的实现思路;)
- 框架部分
【具体面试中问的方式不一样,基本就从这几方面问】
- ssm和ssh的区别或者优势(60%)
- struts2和springMVC之间的区别?(80%
SpringMVC的入口是一个前端控制器(servlet),Struts2的入口是一个filter过滤器
Springmvc是基于方法的,Struts是基于类的
Springmvc传递参数是通过方法的形参传递的,struts2传递参数是通过类的属性,
Springmvc可以为单例,也可以为多例(建议单例),struts2只能设置为多例
Struts采用值栈存储请求和响应数据,通过OGNL存取数据,springmvc通过参数解析器将request对象内容解析成方法参数,将响应数据和页面封装成modeAndView对象,最后将模型数据通过request对象传输到页面,jsp视图解析器默认使用jstl
- Hibernate和mybatis的区别?(90%)
Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的缺点是学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件架构都是好架构,所以框架只有适合才是最好。
- springmvc的工作流程?(70%)
用户发送请求到前端控制器DispatherServlet
DispatherServlet收到请求后会调用handlerMapping处理器映射器
处理器映射器根据url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成),全部返回给前端控制器
前端控制器就会调用处理器适配器
处理器适配器经过适配调用具体的处理器(后端处理器)
后端处理器处理完将结果放在modelAndview
处理器适配器将modelAndView传给视图解析器
视图解析器解析后返回具体的view
前端控制器根据view进行渲染视图(模型数据封装到视图中)
前端控制器响应给用户
- 谈一谈对mvc的理解?(70%)
- 用spring怎样实现单例?(40%)
@Scope("prototype") spring依赖注入时,使用了双重判断加锁的单例模式,首先从缓存中获取bean实例,如果为null,对缓存map加锁,然后再从缓存中获取bean,如果继续为null,就创建一个bean。这样双重判断,能够避免在加锁的瞬间,有其他依赖注入引发bean实例的创建,从而造成重复创建的结果。
在这里Spring并没有使用私有构造方法来创建bean,而是通过singletonFactory.getObject()返回具体beanName对应的ObjectFactory来创建bean。我们一路跟踪下去,发现实际上是调用了AbstractAutowireCapableBeanFactory的doCreateBean方法,返回了BeanWrapper包装并创建的bean实例。
(ObjectFactory主要检查是否有用户定义的BeanPostProcessor后处理内容,并在创建bean时进行处理,如果没有,就直接返回bean本身)
- Hibernate的一级缓存和二级缓存你说一下(50%)
A:hibernate一级缓存
(1)hibernate支持两个级别的缓存,默认只支持一级缓存;
(2)每个Session内部自带一个一级缓存;
(3)某个Session被关闭时,其对应的一级缓存自动清除;
B:hibernate二级缓存
(1) 二级缓存独立于session,默认不开启;
- spring的事务管理你说一下(40%)
- 从Struts2的配置文件来看,属于哪种java设计模式(40%前边如果问过你设计模式,问这个的概率极大)
- 还了解过什么开源框架?(20%)
- 其他技术点
【小公司有的可能某些都没用过,互联网公司用的比较多,有的会可劲问你这些】
- dubbo服务开发流程,运行流程?zookeeper注册中心的作用?端口是多少?(100%简历写了dubbo必问,可能不会问这么多)
运行流程:0、服务容器负责启动、加载、运行服务提供者;
- 服务提供者在启动时,向注册中心注册自己提供的服务;
- 服务消费者在启动时,向注册中心订阅自己所需的服务;
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长链接推送变更数据给消费者
- 服务消费者,从提供者列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台
- 服务消费者和服务提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和服务消费者只要在启动时与注册中心交互,注册中心不转发请求,压力较小。
端口号是20880
- redis为什么可以做缓存?redis都是怎么用的?都用来存什么了?你知道redis的存储 结构是什么吗?Redis集群会搭吗?说一下redis的事务;redis丢失问题(100%建议多研究一下这个,也是必问项;单说技术的话,如果你的期望薪资在12k之上,这个一定要往深了研究一下,redis搞透了,12k左右没什么大问题)
Redis解决了什么问题:
- 对数据库高并发读写的需求
- 对海量数据的高效率存储和访问的需求
- 对数据库的高扩展性和高可用性的需求
键值对存储数据库:redis,主要应用于缓存,处理大量数据的高访问负载
列存储数据库:HBase,分布式的文件系统,以列簇式存储,将同一列数据存在一起,查找速度快,可扩展性强,更容易进行分布式扩展
存储类型:字符串、散列、列表、集合、有序集合
应用场景:1.缓存
2.分布式集群架构中的session分离
3.聊天室的在线好友列表
4.任务队列(秒杀、抢购、12306)
5.应用排行榜
6.网站访问统计
7.数据过期处理
Redis默认有16个数据库,角标从0-15,默认在0库,默认端口6379
建议不同的数据放在不同的redis实例中,以保证互不影响
Java操作redis的客户端Jedis
Hash:散列类型(键、字段、字段值),字段值只能是字符串类型,不支持散列类型、集合类型或者其他类型
Redis的数据存在内存中,为了使redis重启后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程叫做持久化。
两种方式的持久化,一种是RDB方式,一种是AOF方式,可以单独使用其中一种或者两者结合使用
RDB方式:通过快照完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘中,是Redis默认采用的持久化方式
在redis.conf中配置
Save 300 10:表示5分钟内至少10个键被修改则进行快照
配置dir指定rdb快照文件的位置
配置dbfilename指定rdb快照文件的名称
Redis重启后会自动读取RDB快照文件,将数据从硬盘载入到内存中,根据数据量的大小与结构和服务器的性能不同,时间也不同。通常1千万个字符串类型的键。大小为1GB的快照文件载入需要20-30分钟
注意:一旦redis异常退出,就会丢失最后一次快照以后更改的所有数据,根据场合,通过组合设置快照条件的方式将可能发生的数据损失控制在可以接受的范围。如果无法承担任何损失,则可以考虑使用aof的方式实现持久化
AOF持久化:默认情况下没有开启,通过appendonly参数开启:
Appendonly yes开启AOF持久化后每执行一条会更改Redis中数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改.aof文件过大时,采用了bgrewriteaof指令对appendonly.aof文件进行重新整理
RequirePass:设置客户端连接后进行任何其他指定前需要使用的密码
Maxmemory:设置redis能够使用的最大内存
Appendfsync:设置对appendonly.aof文件进行同步的频率
Vm-enabled:是否开启虚拟内存的支持,内存慢时,把value值放入交换区中,所有的key都会放在内存中
- 消息中间件acitveMQ的作用、原理?MQ发送消息失败怎么办?(90%)
- Git和Svn有什么区别?(20%)
- 说一下事务;你们项目中事务是怎么处理的?(40%)
- Webservice是什么?它的引擎是什么?(40%)
- Tomcat集群中怎么实现共享(70%)
- fastDFS的各种问题(40%)
- Dubbo......挂机了怎么处理?(70%这个问各种挂机、接收不到消息、一直发送.........各种问题)
五、项目中细节
- 项目中单点登录/购物车怎么实现的?讲一下具体步骤/思想(100%写了必问)
- 项目中数据库怎么设计的?有几张表?列举一些表里字段?单点登录安全问题怎么考 虑的?(70%问数据库的时候会顺便问到这个问题)
假设用户A是正常用户,通过登陆服务进行了登陆,用户凭证被COOKIE记录下来,假设这时黑客B截获了A的用户凭证,那么当B连接到登陆服务验证时,B可以把截获的用户凭证附加到COOKIE中,因为登陆服务通过COOKIE来判断登陆状态,所以登陆服务会认为B以前登陆过,并且告诉登陆代理B的用户凭证,这样B就欺骗了登陆服务而拥有了用户A的操作权限。
首先应该避免用户凭证的COOKIE泄露,在用户端,因为内存COOKIE比文件COOKIE更难被截取,特别是经过特殊处理的浏览器,要截取内存COOKIE几乎不可能,而且当浏览器关闭时,内存COOKIE失效,所以应该使用内存COOKIE而非文件COOKIE,这也是很多使用文件COOKIE的论坛帐号经常被盗的原因。
其次,为进一步减少风险,不应该在COOKIE中直接保存用户凭证,而是使用一个无意义的标识符如UUID来表示,而登陆服务可以通过这个UUID查找到真正的用户凭证,这个标志符随机生成,即使同一用户登陆,得到的UUID也不一样,所以不能重复使用,这样即使偶尔泄露一次,也不会造成长期影响。为了提高COOKIE的截取难度,可以设置一个有效时间,只有在有效期内的COOKIE是合法的,超过有效期的COOKIE将被忽略,使用超过有效期的用户依然需要重新输入验证信息。这样也带来一个不便的地方,就是用户如果两次业务逻辑之间的切换时间超过了COOKIE的有效期,那么用户还得重新输入验证信息,达不到单点登陆的效果,所以如何取舍,要根据业务逻辑而定。
其次因为http使用明文传输,通过网络侦听的方式很容易获取COOKIE,所以用户到登陆服务间的连接应该采用https。
然后考察登陆代理中使用COOKIE来保存SESSION的情况,这是大多数Web应用服务器采用的方法。这种情况类似登陆服务使用COOKIE来保存用户凭证,典型的欺骗是黑客B截获了正常用户A的SESSION COOKIE,然后B访问业务逻辑时附带这个COOKIE,Web应用服务器会认为B就是A,于是A能得到的用户凭证,B也能得到,B就成了A的影子,与A具有相同的操作权限。所以关键问题还是如何避免SESSION COOKIE的泄露,因为这个COOKIE由Web应用服务器控制,所以除了在网络传输时使用https,基本上没有其他办法可以降低风险。除了使用COOKIE作为SESSION标记,很多Web应用服务器也支持隐式域的方式,就是Web应用服务器在页面自动创建一个隐藏的表单项作为SESSION标记,页面提交时该表单自动被提交,Web应用服务器通过这个表单项来确定用户SESSION。这个是更不安全的做法,因为很多很简单的方法就可以获取页面表单项的数据,比获取内存COOKIE容易很多。
消息传递安全性
业务逻辑、登陆代理、登陆服务间存在消息传递,业务逻辑和登陆代理部署在一个Web应用服务器中,消息传递比较安全。登陆代理和登陆服务通常处在不同的Web应用服务器中,并且通常在地域上也不一致,登陆代理和登陆服务间的安全隐患除了消息泄露,还有相互信任的问题。
首先是消息泄露,使用https可以避免消息泄露。
其次是登陆代理和登陆服务间如何相互信任,这就需要安全证书。关于证书的更多信息参考http://en.wikipedia.org/wiki/Certificate_authority,也可以去google搜索。证书的原理是基于非对称加密和数字摘要,非对称加密由一对密钥(p, s)组成,使用p加密的数据只能使用s解密,使用s加密的数据只能使用p解密,著名的非对称加密算法是RSA,数字摘要通过一个不可逆运算可以把数据a变成数据b,b通常数据长度固定并且很小,而且不能用过b反运算得到a,常用的数字摘要算法有MD5和SHA1。
制作证书时,首先将证书信息i使用数字摘要算法如SHA1进行运算得到s,s = SHA1(i),然后把i和s使用非对称加密算法如RSA的s加密得到证书c,c = RSA(s, i+s)。获取证书信息刚好是一个逆过程,i+s = RSA(p, c),然后把i和s分离,并且比较s和SHA1(i)是否一致,如果一致,则这个证书信息是可信赖的。
证书通常由权威机构制作,这个机构妥善保管s,公布p,那么互不相识的A和B通信,A要核对B的身份,A要求B的证书,然后核对解密后的证书信息就可以了。
同样登陆代理和登陆服务在传递信息时也要核对身份,否则黑客可以将登陆代理引导到假冒的登陆服务,或者传递给登陆代理预先设定的用户凭证,进行认证欺骗。使用证书后,登陆代理请求登陆服务进行登陆时,首先核对登陆服务的证书,登陆代理处理登陆服务返回的用户凭证时,也核对登陆服务的证书,双方信息传递在https中进行,所以存在消息篡改和泄漏,保证登陆服务是可信赖的。登陆服务的证书必须妥善保管,并且定期更换。
也可以根据证书原理自定义处理过程,登陆代理和登陆服务各自掌握p和s,证书代理发送消息使用p加密,接收消息使用p解密,登陆服务接收消息使用s解密,发送消息使用s加密,消息附带SHA1数字摘要,这样登陆代理和登陆服务也可相互信任。这种方案下,可以不使用https,因为消息已经被加密。但是这样有一个漏洞,就是会被重播,比如黑客可以截获登陆服务发送给登陆代理的整个加密的消息,然后完整地发送给登陆代理,这样登陆代理不能识别究竟真伪而被欺骗。可以在消息里面附加随机数据来解决这个漏洞,登陆代理发送消息前,先随机产生一段数据,并附加到消息中,然后加密发送给登陆服务,登陆服务发送消息给登陆代理时也附带这个数据,登陆代理核对这个数据来确定有效性,每次登陆代理和登陆服务传输的数据都不一样,重播不再有效。
- 你们电商项目URL是多少?(20%问这个说明开始对你有怀疑了,最好提前说明没上线就离职了)
- 你们的商品库存是如何控制的?(40%)
- 个别公司会问你的其他项目,极个别而已(10%一般都是直接让你说一下自己最熟悉的项目)
- 有的问购物车,用户购买时web层要写个什么类,做什么用方法,参数,返回值(40%)
- 如果两个浏览器同时登录一个账户,购物车的数据是怎么合并的(50%)
- 购买商品时,用户的信息和商品的信息可以通过页面传递到后台吗?为什么不安全?(50%)
六、数据库部分(银行、金融等传统项目公司问的比较多)
1、第一问你们公司用的什么数据库?(100%必问项)
2、面试官经常会出一个sql题,让你说出sql语句(80%)
3、数据库优化问题(80%)
4、如果数据库里边的大表添加字段 怎么弄效率最高?(50%)
答:alter table ~ add ~ 添加列
- mysql默认的最大连接数是多少?(40%)
- mysql分页;limit关键字(70%)
- 创建索引库的优缺点?(50%)
- 集合去重,数据去重;(集合去重有contains方法;数据库去重用group by)(80%)
- 怎样建立索引?(80%)
七、部分公司
- 去银河创想科技有限公司的注意啦.小主已试水,很深!!!基本只要投简历就让去,简单说一 下机试五道题:顺序忘了.不建议去!!
第一个:有两个用户 User1 fromUser , User2 toUser,交易金额int amount . 提示,User1可能不存在,需要判断.User2也可能不存在,需要判断.转账额度不能是负数,需要判断,转账人的钱够不够转账也需要判断. 成功返回Y,失败返回N.题目: public String demo(User fromUser,User toUser, int amount){ return ""}.
第二题给你一段英文,里边有空格和逗号还有句号,要求判断查询每个单词出现的次数,返回一个Map集合,key是单词,value是出现的次数.public Map<String , Integer> demo<String 传进来的句子>{ return Map;}.
第三题,给你一个Map,key是字符串,value是数字,要求你查询出value数值最大的那个value对应的key.public String demo(Map map){ return "value最大的key"}.
第四题,给你一串数字,如果是13531 和121 这种类型的 返回Y,1221 等不属于那种格式的返回N,public String demo(int count){}
- 精励联讯,没有笔试,公司还凑合,10以上的可以去试试
3、博文卡特,全球顺,人瑞,云起融通,搜狐,航天信息(同学已试水,较深,不推荐,大神可以去试试,3-5年左右)
4、金融工场,不建议去,大神可以试试,公司态度不好
5、宏泰科技、积分客、神州岳泰、创想天空、亚信、亿维融智(积分客已经有同学被拆穿,公司态度不好)
- 其他同学面试总结
(因个人没有遇到其中某些问题,所以放在下面大家看下,排名不分前后)
静静同学:
1.平常怎么测试的,最后会整体运行测试吗
2.是开发时进行测试,最后还会测试吗,测试时的数据从哪来的
2.进行断言测试吗
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启 用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终 用户在遇到问题时可以重新启用断言。
3. junit中before和beforeclass区别
4. 问了dubbo,redis,solr,分词器如何实现
5.购物车,单点登录如何实现
6.springmvc的注解都有哪些
7.日志文件用了哪些
8.Log4j的输出级别都有哪些
你经常用哪个,我说debug,貌似不是
9.Freemaker页面静态化怎么实现的,商品下架怎么删除,静态化页面可以发送异步请求吗?Freemaker放在那里,如何访问
10.消息中间件ActiveMQ,如果接受不到消息怎么办
11.主键如何自增 increment 如果是字符串呢?就是将自增数据加上一个字符串作为id
12.购物车里面的cookie数据加密了没,需要吗
10.mysql的优化:
11.索引什么时候不能建
12.hashMap和hashTable的区别:线程安全,线程不安全 问,什么是线程安全?
13.如何实现二级联动
14.异步请求中都有哪些参数
15.springmvc的执行流程
16.如何将一条数据级联添加到两张表中(好像不能)
17.jquery有哪些选择器
18.sql里面用过 case when了没,具体怎么用,就是完整的语法
19.mybatis和hibernate的区别
20.Datagrid都有哪些参数,他的样式怎么设置
21.mysql不支持子查询?
22.说一些你常见的运行时异常
23.说一些你项目中用到的工具类(pom文件中)
24.事务的特性,隔离级别有哪些?mysql默认的隔离级别,它可以防止哪些操作
25.Redis的数据结构有哪些(5种)
26.自我介绍
27.说一下你的项目
28.你还有什么要问的吗?(技术,人事都有问)
29.说一下你的优点和缺点(说完之后要最好用例子说明一下)
30.有一个父类和子类,都有静态代码块,现在创建一个子类,执行的顺序是什么?
30.JS组成部分:
31.Arraylist,linkedList,IO,线程
32.POI数据量大怎么办
33.排序,冒泡排序
34.sql语句的函数都有哪些
35.spring的事务
36.mysql存储过程
37.四大域对象,九大内置对象
38.redis数据类型
39.hibernate的优化
40.dubbo的服务端挂机怎么办?
41.dubooy用的版本是什么?看过源码吗?
42.单例模式知道吗?手写一下
42.给一个有序的数组,有正数和负数,求出绝对值最小的数字
43.设计一个表结构,要求查处联通号码的后四位是客户指定的数字,如果是后六位呢?请设计这个表结构
44.多线程
45.hibernate的五个核心类
46.zookeeper存在什么缺陷