文档章节

java面试总结

梦魂清风
 梦魂清风
发布于 2017/06/02 21:01
字数 5493
阅读 11
收藏 3

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

© 著作权归作者所有

梦魂清风
粉丝 1
博文 60
码字总数 45895
作品 0
长沙
程序员
私信 提问
金九银十,史上最强 Java 面试题整理。

以下会重新整理所有 Java 系列面试题答案、及各大互联网公司的面试经验,会从以下几个方面汇总,本文会长期更新。 Java 面试篇 史上最全 Java 面试题,带全部答案 史上最全 69 道 Spring 面试...

Java技术栈
2018/09/13
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
2018/07/25
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0
阿里、百度等多家公司Java面试记录与总结

算算自己大概面试了近十家公司,也拿到了几个Offer,现在面试告一段落,简单总结下面试经验。 我现在主要的方向是Java服务端开发,把遇到的问题和大家分享一下,也谈谈关于技术人员如何有方向...

2018/07/02
0
0
java编程好文章链接收集

JNDI配置原理详解 ExtJS学习笔记系列 .java中的io系统总结及一些常用的操作 java面试笔试题总结 Java基础:三步学会Java Socket编程 HTTP详解 SpringSide开发实战 SVN与源代码管理 Linux和J...

长平狐
2012/11/12
47
0

没有更多内容

加载失败,请刷新页面

加载更多

jenkins定时构建时间设置

举几个例子: 每隔5分钟构建一次 H/5 * * * * 每两小时构建一次 H H/2 * * * 每天中午12点定时构建一次 H 12 * * * 每天下午18点定时构建一次 H 18 * * * 在每个小时的前半个小时内的每10分钟...

shzwork
11分钟前
0
0
Myeclipse 问题记录

1. 创建maven聚合(pom) 工程 ,子项目会带上 maven app这些文字,删掉后会导致工程文件在working set里消失,解决办法:右键子项目 import as project 解决问题。...

无敌小学僧
38分钟前
0
0
《Chez Scheme初探》定义变量、递归、测试性能、并列代码编写

普通fib函数 (define (fact n) (if (= n 1) 1 (* n (fact (- n 1)) ) )) 尾递归fib函数 (define (fact-tail n) (fact-rec n n))(defi......

flash胜龙
39分钟前
0
0
任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击!

任正非对华为热点问题的回应亮了,终于知道华为为什么能扛过这一次的冲击! 如果你是华为的老板,看到一条传遍网络的“美国封锁华为”、“华为禁令”的消息,你会怎么办? 昨天上午,华为创始...

forespider
今天
2
0
Java HTTP 组件库选型看这篇就够了

最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性: 连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连...

Java面经
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部