遇到过的面试题
自我介绍:
1.简单的背景介绍 (Background)
第一部分,简单介绍类似于「我叫xxx,xxx大学xxx专业研究生在读,本科毕业于xxxx。目前我在xxx组织担任xxx职位,在xxx公司兼任xxx职位……」这样的信息。
2.相关工作经验介绍 (Professional)
我叫XXX,来自XX,就读于XX,专业,毕业于, 编程是一项兴趣爱好,后来就转行进入这行,
平时喜欢接触下各种各样的技术,看下各种教程等 像C#A ,U3D等。
之前在前一个公司担当批处理功能的开发,和Excel方面的交互,今天面试这个岗位是因为对金融或者支付
这方面的工作比较感兴趣,
0.说明下java的封装,多态,和继承有啥区别。
封装:通过访问修饰符来限制对类的属性和方法的访问,
子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。
特点:在继承关系中,父类更通用、子类更具体。父类具有更一般的特征和行为,而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为。
如果在子类中需要访问父类中定义的同名成员变量或方法,需要用的关键字super
多态就是以一种类型来,表现出多种状态
比如,车下,有宝马,有奇瑞,他们都属于车,定义一个车接口,两种车都实现这个接口
在new出来,都可以用车接收,调用的时候,却是调用的本身自己的方法。
1.简单说明下java的设计模式。
单例模式:在类本身就通过一个方法给new出来,外部通过这个方法去实例化,
加synchronized会线程安全,可是会影响效率。
2.left join ,inner join ,right join 的差别,他们抽出的数据是否相同。
inner join 基于连接条件两边都有会抽出。
left join 如果右边没有对应的数据,那么左边会抽出,右边为null
right join如果左边没有对应的数据那么右边会抽出,左边为null
3.mybatis如何批量删除和插入。
先在mybatis组装成insert into tablename()value(),()的数据。
提交的时候可以手动提交,每次提交1000个,以免出现内存不足。
批量删除的画,也可以采用同样的方法,delete from emp where empno in ()要删除的数据。
4.session的生命周期,存放在哪里。
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),
Sessinon在用户访问第一次访问服务器时创建,
需要注意只有访问JSP、Servlet等程序时才会创建Session,
只访问HTML、IMAGE等静态资源并不会创建Session,
可调用request.getSession(true)强制生成Session。
session的生命周期分为创建、活动、销毁三个阶段
session的销毁方式:
1.自动注销,invalidate
2.过期,超时,默认时间为30分钟,
3.服务器重启
5.如何解决两个用户同时操作一条数据,如何A 修改商品X为20 元,B同时修改商品X为30元。
可以加一个last_update,来确定最后的操作时间,可通过触发器去实现。
6.说下spring的好处。
1.方便集成各种优秀框架,如Struts,Hibernate、mybatis都可以兼容
2.AOP编程的支持,方便进行面向切面的编程。
7.在一个方法体传入一个list,在里面进行修改,之后这个list会改变么。为什么
集合这个东西跟数组一样,你把它作为实参传过去,实际上并不是传的集合对象本身,而是它的地址(或者是引用,可以这么理解),
然后你在方法中操作集合,都是直接作用于集合本身而不是集合的值。
这跟普通的变量不一样,普通的变量是值传递,你在方法内部操作一个变量只是在操作值,
原来的变量还在那里不会改变。
8.目前写过最复杂的SQL
with a_tablename as(
select xx as 1 ,ss as 2 where tablename id = 0 union all
select xx as 3 ,ss as 4 where tablename id != 0
)insert into b_tablename (xx,ss)select xx,ss from a_tablename
9.strtus拦截器
拦截器可以做到在已有的业务中插入一块共通的,
一个功能的时候记录一下客户的操作,这样与其在一个个的action分别记录,
直接在拦截器去记录会更加的方便。拦截器,可以设置默认,也可以去设置拦截某些action。
执行后一定要invoke出去,这样才能走到action
10.strtus 过滤器
过滤器实现Filter接口 ,在doFilter中写实现
11.说下重定向问题
重定向能看到页面上的地址的变化。
重定向,其实是两次request,第一次,客户端request A,
服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,
而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。
12.strtus拦截器 和过滤器的区别
1、拦截器是基于java的反射机制的,而过滤器是基于函数回调 。
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求 起作用 。
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能 。
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容 器初始化时被调用一次
13.Servlet 是什么,简单的说明一下,
Servlet 是最简单的用于进行web开发的工具,通过继承HttpServlet,能够在doget或者dopost的情况下,输出web页面。
生命周期:
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)
14.mysql性能优化
1.充分使用索引
2.开启缓存 query_cache_type 为 ON 表示已经开启
3.当只要一行数据时使用 LIMIT 1,或者加上order by
4.为搜索字段建索引
5. 千万不要 ORDER BY RAND()
6. 避免 SELECT *
15.递归
public class Main {
public static void main(String[] args) {
fun(1);
}
public static void fun(int n) {
System.out.printf("1-lexe:%d \n", n); //#1
if (n < 3)
fun(n + 1);
System.out.printf("2-lexe:%d \n", n); //#2
}
}
16.ajax如何解决js脚本缓存问题
第一种:
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate">
<META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT">
17.性能分析的命令
1.show indexes 查看表的索引
2.explain 分析表执行计划
3.information_schema 包含的表的数量和mysql的版本和存储引擎有关系。
4.show table status 可以查看表的存储引擎
19.springmvc和Struts2的区别
由于SpringMVC基于方法的拦截,有加载一次单例模式bean注入。
而Struts2是类级别的拦截,每次请求对应实例一个新的Action,需要加载所有的属性值注入,
SpringMVC开发效率和性能高于Struts2。
spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
SpringMVC可以认为已经100%零配置。
20.掌握Spring mvc架构;
21.Hibernate的优缺点
优点:兼容,和各种数据库的兼容性好
Hibernate功能强大,数据库无关性好,O/R映射能力强,
缺点:沉重,繁杂
22. 了解常用的软件工具:MQ,Redis,Memcache,
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
redis缓存,为什么要用缓存呢,举个例子,假如系统中有2千万用户信息,用户信息基本固定,一旦录入很少变动,
那么你每次加载所有用户信息时,如果都要请求数据库,数据库编译并执行你的查询语句,这样效率就会低下很多,针对这种信息不经常变动并且数据量
较大的情况,通常做法,就是把他加入缓存,每次取数前先去判断,如果缓存不为空,那么就从缓存取值,如果为空,再去请求数据库,并将数据加入缓存,
这样大大提高系统访问效率
通过该set,get来存取
23、熟悉常用设计模式,有大型分布式、高并发、高负载、高可用性系统设计开发经验;
24.2、熟练掌握Spring、SpringMVC、MyBatis、SpringBoot、Zookeeper、Duboo等常用当前流行的技术及框架;
25. Struts2的工作流程
客户端初始化一个指向Servlet容器(例如Tomcat)的请求
这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
接着StrutsPrepareAndExecuteFilter被调用,StrutsPrepareAndExecuteFilter询问ActionMapper来决定这个请求是否需要调用某个Action;
如果ActionMapper决定需要调用某个Action,StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy;
ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
ActionProxy创建一个ActionInvocation的实例。
ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。
26. 熟悉Struts/Spring/Hibernate等框架,能在开发环境中配置和使用Tomcat/nginx等;
27.Linux常用命令大全
cd /home 进入 '/ home' 目录'
pwd 显示工作路径
ls 查看目录中的文件
mkdir dir1 创建一个叫做 'dir1' 的目录'
cp dir/* . 复制一个目录下的所有文件到当前工作目录
28.JavaScript中说明“==”和“===”之间的区别?
“==”仅检查值相等,而“===”是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。
29. MySQL锁
MySQL各存储引擎使用了三种类型(级别)的锁定机制:
表级锁定,行级锁定和页级锁定。
乐观锁
乐观锁不是数据库自带的,需要我们自己去实现。
乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
通常实现是这样的:在表中的数据进行操作时(更新),
先给数据表加一个版本(version)字段,每操作一次,将那条记录的版本号加1。
也就是先查询出那条记录,获取出version字段,如果要对那条记录进行操作(更新),
则先判断此刻version的值是否与刚刚查询出来时的version的值相等,
如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,
将version字段的值加1;如果更新时发现此刻的version值与刚刚获取出来的version的值不相等,
则说明这段期间已经有其他程序对其进行操作了,则不进行更新操作。
悲观锁
共享锁
排它锁
30.HashMap 和 HashTable的区别
HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。
hashmap 是线程不安全的
HashTable的区别 是线程安全的,。
31.单一索引和联合索引的区别
单一列索引可以出现在where 条件中的任何位置,而联合索引需要按一定的顺序来写.
在多条件查询时,联合索引效率要高.
32.冒泡排序
33.递归
34.整数
22 , 022 , 0x22
35.Tomcat优化
内存优化
配置优化
三、组件优化
36.spring 工作原理及事物机制
内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,
这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,
跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的
最明显的一个例子就是sessionfactiory配置后,可以直接的调用。不用再去new
AOP(Aspect-Oriented Programming): 面向方面编程
1、 代理的两种方式:
静态代理:
针对每个具体类分别编写代理类;
针对一个接口编写一个代理类;
动态代理:
针对一个方面编写一个InvocationHandler,然后借用JDK反射包中的Proxy类为各种接口动态生成相应的代理类
37.css加载优先级
浏览器缺省 < 外部样式表 < 内部样式表 < 内联样式
38.mybatis工作原理
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,
配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。
SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,
完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
39.servlet 九大内置对象
request,response ,session ,application ,out ,page,config , exception , pageContext
40.ajax工作原理
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,
然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。
要清楚这个过程和原理,我们必须对 XMLHttpRequest有所了解。
缺点:1.即对浏览器后退机制的破坏。 2、安全问题 3、对搜索引擎的支持比较弱。
41.队列
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
42.java arraylist 和linklist区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
43.java操作xml用什么
用SAXReader创建一个xml解析器对象
44.spring常见的注解
@Resource
@Autowired
@Service
@Repository
@Service注解,其实做了两件事情:
(1)、声明Zoo.java是一个bean,这点很重要,因为Zoo.java是一个bean,其他的类才可以使用@Autowired将Zoo作为一个成员变量自动注入。
(2)、Zoo.java在bean中的id是"zoo",即类名且首字母小写。
@Controller
@Scope 默认是"singleton"即单例,"prototype"表示原型即每次都会new一个新的出来。
@Repository、@Service 和 @Controller。 @Component 是等效的
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
45.消息中间件
46.spring 好处:
轻量:Spring 是轻量的,基本的版本大约2MB。
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
容器:Spring 包含并管理应用中对象的生命周期和配置。
MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
47.Spring框架中的单例bean是线程安全的吗?
不,Spring框架中的单例bean不是线程安全的。
在 Spring中如何注入一个java集合?
48.Spring提供以下几种集合的配置元素:
<list>类型用于注入一列值,允许有相同的值。
<set> 类型用于注入一组值,不允许有相同的值。
<map> 类型用于注入一组键值对,键和值都可以为任意类型。
<props>类型用于注入一组键值对,键和值都只能为String类型。
49. Spring支持的事务管理类型
Spring支持两种类型的事务管理:
编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。
50.ajax 跨域的问题
1、使用jsonp
2、服务器代理
3、在服务端设置response header中Access-Control-Allow-Origin字段。
51.前++ 和后++ 的问题
首先,不管前++ 还是后++,被+ 的变量都是会变化的,而,他们的区别就是赋值
int b = 6;
int a = b++;
后加加的话,就是在赋值后,再执行++;这里a=6;b= 7
int c = ++b; 而前加是指在赋值前就加上,这里c=7 ;b=7