您的位置:首页 > 职场人生

java初级面试总结

2017-06-02 00:00 295 查看
1、get与post的区别
http定义了与服务器交互的4种方式:
get,查询;post,修改;put,增加;delete,删除。
get,它通过URL传参查询获取信息,它不会修改服务器上数据,从这方面讲它是数据安全的,而post是可以修改数据的,所以这是两者之间的区别之一,但是它的传递数据会受到服务器与浏览器对于URL长度的限制而有大小限制,而且地址栏会因为数据改变;

Post提交数据是把数据放在Http包的包体中,不会改变地址栏中的URL,并且理论上没有大小限制,但实际上各个WEB服务器如Apache、IIS6对post的大小各有配置。
2、servlet的生命周期,其与JSP的区别
servlet加载 > 初始化init() > 服务service() > 销毁destroy();
init()方法只执行一次,负责初始化servlet对象,无论多少客户机访问servlet都不会重复执行init();
service()是servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象就会调用一次service()方法,并且传递给这个方法一个请求ServletRequest和一个响应ServletResponse作为参数,在HttpServlet中已有servlet方法存在,并调用相应的Do方法。
destroy():仅调用一次,在服务器停止且卸载servlet方法时执行,负责释放所占用的资源。

JSP本质上就是servle的扩展的简易方式,JSP编译后就是类servlet。他们的主要不同点就是,servlet的应用逻辑是在java文件中,并且完全从表示层的HTML中分离开来;而JSP的情况是JAVA和HTML可以组合成的一个扩展名为.JSP的文件。

servlet注重于逻辑,jsp注重于视图。

3、List与Set的区别,他们的几个子类区别;
他们都是继承collection的接口。
List集合中有放入顺序,元素可重复,有索引;Set无放入顺序,元素不可重复(但是位置同样是固定的);
List有三个实现类:
ArrayList:底层是数组数据结构,是线程不同步的,查询速度很快,但是增删速度慢;
LinkedList:底层是链式数据结构,是线程不同步的,增删速度很快,但是查询速度慢;
Vector:底层也是数组数据结构,是线程同步的,所以增删查的速度都很慢。

*链表与数组两种数据结构的区别:
数组数据元素是连续有顺序的存放在栈内存中的,而且是定义固定长度的,可以快速访问数据,但是增删都会导致大量的数据移动以整理内存,导致速度慢,删除后会对内存有一定的浪费;
链表数据元素是分开存放在对内存中,通过指针HashCode联系在一起的,每个节点分为两个部分,一个是存放数据的数据域,一个是存放结点地址的指针。自由度很大,增删速度快,但是查询因为需要通过指针从第一个元素可以开始查询,一直找到需要的元素的位置,所以查询速度较慢。

*栈内存与堆内存的区别
栈内存主要用来运行程序,通过java程序临时分配出来的内存空间,在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当用它来存储数据的时候,数据的大小和生存期必须是确定的,增删数据缺乏灵活性,在超出变量的作用域后,java会自动释放掉为该变量的分配的内存空间。同时栈内存中数据是共享,当定义a=3时,先是查找内存有没有3,有则直接将a指向3,没有才将3存进栈内存中,有利于节省空间。
堆内存主要是用来存储通过new创建出来的数据和对象的,是操作系统直接分配给应用程序的的存储空间。在堆中分配的内存,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。

Set有两个实现类:
HashSet:通过哈希表hashcode保证数据唯一性;
TreeSet:可以给set集合中的数据指定方式排序,通过比较的结果是否等于0保证数据的唯一性。

4、Map的实现类及其区别
Map主要是用于存储键值对,他根据键的HashCode存储数据,所以他的键是不可重复的,具有唯一性的,但是他的值可以重复。
Map的4个实现类HashMap,HashTable,LinkedHashMap,TreeMap;
HashMap是最常用的Map类型,通过键可以直接获取到他的值,具有很快的访问速度,遍历时插入取出数据的顺序完全是随机的,可以存在Null值,但是为Null的键只有一个,值可以重复。他是不支持同步的,所以当多线程写入是,只可能被覆盖不符合数据。
HashTable与HashMap的区别主要是他不允许存在空值,并且支持线程同步,任意时刻只有一个线程可以写入HashTable,因此也导致了他写入速度较慢。
LinkedHashMap是HashMap的一个子类,他的存取是有顺序的,当通过Iterator遍历LinkedHashMap取得的第一个值肯定是第一个记录的;
TreeMap默认是升序排序,也可以指定排序的比较器;

5、equals 与 == 的区别
==是一个运算符;
equals则是string对象方法;
“==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】
比如 String s1 = new String("java");
String s2 = new String("java");

s1 == s2 返回就是false,因为他们的内存地址不一样;
s1.equals(s2) 返回就是true,因为他们值相同。

6、接口的写法与实现
使用interface来定义一个接口;通过implement来实现接口。
*类继承是单继承,而实现接口可以实现多个,每个接口使用 逗号 隔开,当常量或者方法名出现冲突时,通过类名.常量来实现,如果方法冲突则只要实现一个方法就行了。

7、对于缓存的理解
在系统架构不同的层级之间,为了加快访问速度,都可以存在缓存。

主要有5层,操作系统 > 数据库 > WEB服务器 > 客户端

操作系统主要是文件缓存Disk cache ,减少磁盘机械操作,Disk cache是由操作系统自己来操作的,不用人工干预,但是应当保存充足的物理内存,以保证操作系统有足够的空间来作为应程序的缓存空间,以便于加快访问速度;

数据库缓存是Query cache,他的工作原理是以查询sql作为键保存查询结构,当表记录被修改时时,会自动清空缓存缓存,以减少磁盘读取操作。Query cache一般设置为128M;
data buffer是数据库内存的容器,他的大小一般是设置成物理内存的60%-80%。

应用程序的缓存 主要是 对象缓存,查询缓存和页面缓存
一种是在Dao层添加缓存,一种是在service层添加缓存;
第一种方案:
优点:首先在dao层添加缓存对每条sql的执行结果进行缓存,缓存的粒度比较小,缓存的命中率会比较高。
缺点:每个sql查询数据不一样,则可能本来是同一个信息,但是可能仅仅是多了一个字段确又多了一条缓存记录,这是很大的浪费,毕竟缓存的成本还是比较高的。其次如果直接在dao层进行缓存,有些地方其实是不想进行缓存的,那么这样就比较不方便控制了。
第二种方案:
优点:在service进行缓存,首先是在原来系统的基础上添加代码比较少,其次对拼装好的数据缓存由于service的参数一般变化不大,缓存的数据就会比较少,命中率也不错。
缺点:缓存的粒度比较大,命中率不会那么理想,而且缓存的重用性也比较差。
综合上面的分析基本可以知道无论是在dao层还是service层进行缓存都既有优点又有缺点,最后经过考虑结合两者的优点,抽象出一个缓存层,在缓存层里控制是否进行缓存,以及缓存的逻辑,同时将缓存的对象改为数据库对应的一个一个对象,这样缓存对象的重用性以及命中率都有很不错的效果。

WEB服务器的缓存 是基于代理服务器模式来实现服务器缓存,如squid、nginx;工作原理就是服务器与客户端请求响应传输数据的时候,web服务器另存一份在两者之间,再次有相同请求响应式,加快访问速度;

客户端浏览器缓存
基于Ajax的cache:true
基于H5 Application cache 设置manifest生成appcache的离线缓存文件。

8、log日志级别
总共分为5个级别
debug * info * warm * error * fatal
debug 主要是在调试应用程序时为更加了解系统运行状态的一些信息,级别最低,一般不呈现在最终用户面前;
info 应该是用来反馈当前系统状态给最终用户的,它对最终用户跟交互界面文字一样应该是要有意义的,要能让最终用户看懂;
warm 也及时警告,意味着系统已经经过一些修复后恢复到了正常状态,可以正常运行下去。
error 意味着系统出现了不正常状态,修复后无法确定系统是否可以正常工作,很可能因为这个问题导致严重错误,比如当机。也可能到系统运行结束也不会发生什么严重问题,应该尝试去修复。
fatal 出现就意味着系统已经不可修复,继续运行会让系统越来越乱,这个时候最好的措施就是停止运行系统并尽可能的去保存有效数据。

9、反射机制及使用场景
反射机制是指应用程序运行中可以做到以下5点:
判断出任意一个对象所属的类;可以构造任意一个类的对象;可以判断任意一个类的成员变量和方法;调用任意一个类的方法;生成动态代理;
使用方式:通过class.forName("classname").newInstance()加载一个类并实例化。
主要的使用场景 开发构件,生成动态代理,面向切面编程。

10、@Autowired注解的作用
spring可以自动帮你把bean里面引用的对象的 setter、getter方法省略,它会自动帮你set、get;
@Autowired注释进行自动注入时,spring容器中匹配的候选Bean数目有且仅有一个。

11、依赖注入的方式及实现
接口注入,setter方法注入,构造方法注入
spring中的set注入的实现方式:
先在action类中注入service实现类对象,写好被注入对象的set方法,然后在applicationContext.xml配置通过bean标签配置注入对象跟Action的依赖关系或者通过@Autowired注解注入对象;
<bean id="logic" class="com.spring.test.logicImpl">
<bean id="loginAction" class="com.spring.test.loginAction">
<property name="logic" ref="loginAction">
<bean>

12、AJax的底层原理
Ajax全称Asynchronous Javascript and XML;本质就是在javascript中创建一个XMLHttpRequest,然后发送通过open()、onreadystatechange()方法向服务器发送异步请求。
* 非IE new XmlHttpRequest(); IE Microsoft.XMLHTTP;

13、java开发的设计模式
创建型模式-单列模式:保证一个类只有一个实例,并提供一个访问他的全局访问点。
创建型模式-工厂模式:建立一个工厂类,对实现同一接口的类进行实例的创建。
***java中23种设计模式
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

14、oracle与mysql的区别

oracle属于大型数据库,mysql是中小型数据库;mysql是免费开源的而Oracle使用费用比较昂贵;
mysql安装空间只要125M而Oracle有3GB左右,且使用Oracle时占用特别大的内存空间和其他机器性能;

自增:mysql有auto increment自动增长,Oracle需要通过序列化来实现。
双引号:mysql的sql语句中可以使用双引号,Oracle只能使用单引号。
分页处理:mysql通过LIMIT设置开始位置,记录个数实现分页。Oracle则是通过判断rownum between 开始位置 and 结束位置。
日期类型:mysql中有date和time两种类型,Oracle中只有date类型。
空字符串处理:Mysql中的非空字段允许有空的内容,Oracle不允许。
字符串模糊搜索:字段名 like '%字符串%', oracle与mysql相比不能使用索引,速度较慢。
并发性、一致性:Oracle比Mysql支持的更好。
提交方式与数据持久性: mysql是自动提交且没有保存sql操作,有时会造成数据损失。Oracle需手动提交,并通过保存sql操作在日志中可以恢复数据。

15、sql的去重查询及删除数据库重复数据。

select distinct * from 表名

select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)(可以查出peopleId相同的人)

删除表中多余的重复记录(多个字段),只留有rowid最小的记录
delete from vitae a
where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

16、集合的遍历方式和删除
for each iterator()
for(int i=0; i<list.size(); i++){
list[i].remove();
}

for(String x: list){
x.remove();
}

Iterator<T> it = list.iterator();
while(it.hasNext()){
T itme = it.next();
System.out.println(item);
it.remove();
}

17、数据库表关联实现及使用
建立学生表与成绩表; (学生表ID 与 成绩表学号相同, 成绩表学号是外键)
select * from 学生表 inner join 成绩表 where 学生表.学生ID = 成绩表.学生学号
select * from 学生表 left join 成绩表 where 学生表.学生ID = 成绩表.学生学号 (学生表是主表)
select * from 学生表 right join 成绩表 where 学生表.学生ID = 成绩表.学生学号 (成绩表是主表)

18、数据库优化及sql优化
尽量不要进行全表查询,在Order by 与 where 使用的字段中添加索引。
最好不要给数据库留NULL,尽可能使用NOT NULL 填充。
尽量避免在 where 中使用 != 、<>与or,否组会导致不去使用索引而进行全表查询。
尽量使用between 而少用 in
*索引
unique:唯一索引
clustered:聚集索引
unclustered:非聚集索引

19、jdbc的写法步骤及优缺点
先通过class.forName()加载好相应数据库驱动,然后使用DriveManager.getConnection()创建连接,创建sql语句,使用prepareStatement预编译sql,然后用预编译好的sql对象调用excute()方法执行sql。
优点:简单易学,上手快,非常灵活的构建SQL,效率高
缺点:代码繁琐,难以写出高质量的代码,开发者既要写业务逻辑,又要写对象的创建和销毁,还必须管底层数据库的语法。
适用:超大批量的数据处理,速度快

20、springMVC与struts2的原理及区别
springMVC的入口是servlet,struts2的入口是filter;
springMVC会比Struts2在性能上快一点,前者基于方法设计,后者基于类设计;
springMVC的配置文件要比Struts2的小,使用更简洁,开发效率更高;

*Struts2工作原理
客户端初始化一个执行Servlet的请求,这个请求经过一系列的过滤,被FilterDispatcher调用,询问ActionMapper是否调用Action,FilterDispatcher把请求处理交给ActionProxy创建ActionInvocation实例,ActionInvocation调用Action前后的过滤器。Action执行完毕后,根据Struts.xml配置文件找到对应的视图页面。
<action name="login" class="com.pump.LoginAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
*springMVC的工作原理
SpringMVC将所有请求提交给DispatcherServlet,他会委托其他的应用模块负责对请求进行真的处理工作;DispatcherServlet会查询一个或多个HandleMapping,按请求找到Controller。
DispatcherServlet将请求提交到目标Controller,Controller进行业务逻辑处理后会返回一个ModelandView;DispatcherServlet负责查询一个或多个ViewResolver视图解析器。找到ModelandView对象指定的视图对象,视图对象负责渲染返回给客户端。
<bean id="login" class="com.pump.loginCtrollor">
<property name="loginView" value="login/"></property>
</bean>

*spring与SpringMVC的关系
SpringMVC是Spring的一个子模块,Spring框架是一个分层框架,由7个定义好的模块组成,每个模块都可以单独存在,或组合几个存在。spring模块定义在核心容器之上
spring的7大模块有 核心容器、IOC、AOP、spring上下文、WEB上下文、DAO、ORM、SpringMVC。

核心容器主要是BeanFactory定义了创建、配置和管理bean的方法。它的目的就是让对象与对象(模块与模块)之间不用通过代码来关联,都是通过配置来管理。
ICO的原理就是建立一个工厂,并可以通过反射机制调用接口的实现类,将类的创建和依赖关系写在了配置文件中,由配置文件注入,实现低耦合。(属于工厂模式与反射的综合应用);
AOP默认使用动态代理模式实现,提供声明式事务的管理与自定义切面,将事务,安全等对于程序逻辑相对独立的功能抽离出来,利用spring的配置文件将这些功能插进去,实现了面向切面编程,完善了依赖注入,提高了复用性。

*filter与interceptor的区别
filter是基于filter接口中doFilter()的回调函数,没有servlet就无法调用doFilter()方法,interceptor与servlet无关,interceptor是基于java的反射机制;
filter可以过滤所有方法,interceptor只能拦截action请求;
intercptor可以访问action上下文、值栈里的对象。
filter在action生命周期中可以重复调用,interceptor只初始化是调用一次。

*dao、service、action简介
dao只完成增删改查
service管理具体的功能
action管理具体的service调度和管理跳转

*java事务的定义及管理
java事务本质就是数据库事务,java应用程序通过jdbc来操作数据库增删改查,会产生相应的数据库事务,当有java代码来控制事务时,就称它为java事务;
事务的作用就是保证一系列的数据库操作要么全部执行,要么全部撤销,以保证数据的安全性;
事务类型:jdbc事务、JTA事务、 容器事务
其中jdbc事务是由jdbc connection接口空置,它提供了提交,回滚和自动提交的方法来控制事务。

*声明式事务
声明式事务是由spring中一种管理事务的方式,实现方法是在application.xml中配置事务或者使用注解@Transactional(readonly=true),java方法中通过session对象getCurrentSession(); 然后用session.getTransaction().begin()、commit()、close()创建、提交、结束事务;(创建完以后用session创建sql)

21、hibernate与mybatis的区别
两者都是ORM对象关系映射框架,但是区别较大。
mybatis的sql写在xml中,对象数据、结果映射以及对象实际关系需要sql来实现和管理,但是可以减少查询字段,sql的维护优化比较方便,灵活性较强,与jdbc相似,上手容易。
<mapper namespace="com.zhao.dao.StudentDao">
<select id="getStudentListLikeName" parameterType="StudentEntity" resultMap="studentResultMap">
SELECT * from STUDENT_TBL ST
WHERE ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')
<select>
</mapper>
hibernate的hql写在DAO层中,自动生成对象数据、结果映射与对象实际关系,代码简洁,数据库移植较方便,缓存强大,日志完整。
hql = "from House h where h.agent="+agent+" and h.name LIKE '%" + findUcBlur+ "%'";

*maven 与svn类似是用来管理代码、构建项目,但是它可以将项目分模块管理构建,速度快,效率高
*ANT 用于自动化调用程序完成项目编译、打包、测试的纯java编写的流程脚本引擎

22、现在项目用到的主要技术
主要是webwork、spring。
service层: webwork 主要是用来管理 action
<action name="curvePointDataSta" class="com.resp.pump.data.actions.CurvePointDataStaAction">
<result name="success" type="freemarker">/pump/businessMgr/data/currentCurvePointDataSta.ftl</result>
<result name="hisQuery" type="freemarker">/pump/businessMgr/data/hisCurvePointDataSta.ftl</result>
</action>

Dao层是基于spring的daoSupport自我封装的
<bean id="pumpMeterDao" class="com.resp.pump.daos.impl.PumpMeterDaoImpl" parent="daoSupport"></bean>
<bean id="pumpMeterService" class="com.resp.pump.services.impl.PumpMeterServiceImpl">
<property name="pumpMeterDao"><ref bean="pumpMeterDao" /></property>
</bean>

前端交互 集成freemarker
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试