Java常见面试题

Posted 浮尘流年若往昔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java常见面试题相关的知识,希望对你有一定的参考价值。

 

基础

  1. 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

答:Java虚拟机是一个可以执行字节码的虚拟进程;Java设计的应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或是重新编译。

  1. JAVA面向对象的特征有哪些,分别谈下对其的理解?

答:继承、封装、抽象、多态。

继承:继承是原有的类派生出子类,子类自动分享父类数据和方法的机制,这是类之间的一种关系,提高了代码的复用性和可扩展性。

封装:封装是过程和数据包围起来,达到“高内聚、低耦合”的目的,防止程序相互依赖而带来的变动影响。

抽象:抽象就是找出一些事物的相似和共性,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,只注意与当前目标有关的方面。

多态:多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行中才能确定。多态是指允许不同类的对象对同一消息作出响应。编译时多态(重载),运行时多态(重写)

  1. 软件开发流程?

答:需求分析、概要设计、详细设计、编码过程、软件交付、用户验收、后期维护。

  1. 什么是反射,其作用是什么?

答:Java是审查元数据并收集关于它的类型信息的能力;反射的主要作用是用于扩展系统和动态调用程序集。

  1. JDK和JRE的区别是什么?

答:JRE是Java运行时环境,包含了java虚拟机、java基础类库,是使用java语言编写的程序运行所需的软件环境;JDK是Java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,JDK包含了JRE,同时还包含了编译源码的编译器javac等。

  1. 是否可以在static环境中访问非static变量,是否可以在static方法中内部发出非static方法的调用?

答:不可以,需要先创建非static变量所在的类,然后再来访问非static变量;

不可以,因为非static方法调用需要与对象关联在一起,需要创建一个对象,才可以通过对象调用非static方法。

  1. JAVA的基础数据类型有哪些,对应的包装数据类型,什么是自动拆装箱?

答:byte、short、int、long、float、double、boolean、char。

Byte、Short、Integer、Long、Float、Double、Boolean、Character。

自动装箱是Java编译器在基本数据类型和对应的包装类型之间做的一个转化。

  1. 什么是方法的重载与重写?

答:重载是在一个类中方法名相同,参数列表不同的方法;重写,子类重写父类的方法,子类方法的访问修饰符不能小于父类,抛出的异常不能多于父类,同时方法名和参数和父类相同。

  1. 在JAVA中,什么是构造函数,什么是构造函数重载,什么是复杂构造函数?

答:构造函数就是与类名具有一样名称的成员函数;构造函数重载也就是一种的特殊的方法重载,只需要看其参数的特点,因为它没有返回参数;复杂构造函数常出现在派生类中,是简单构造函数与构造函数初始化列表的混合形式。(有参构造函数)

  1. JAVA中是否支持多继承?

答:不支持。Java只支持单继承。

  1. JAVA中方法修饰符有哪些,各自的特点是什么?

答:public:所有的类都可以访问;

private:只有在同一个类中才可以访问;

protected:同一个类中、同一个包中、子类都可以访问;

包类型的,即默认类型,同一个类中、同一个包中可以访问到。

  1. 抽象类与接口的区别?

答:类可以实现无限个接口,仅能从一个抽象类继承,从抽象类派生出的类仍可实现接口;抽象类中可以存在非抽象的方法,接口中的方法只是一个声明必须用public来修饰,没有具体的实现;抽象类中的成员变量可以被不同的修饰符来修饰,接口中的默认都是静态常量;抽象类是对象的抽象,接口是一种行为规范。

  1. 抽象的方法是否可以同时是static的,是否可以同时是native,是否可以同时是synchronized?

答:static声明的方法表明这个方法在不生成类的实例就可以直接被类调用,而抽象的方法是不能被调用的,所以抽象的方法不可以同时是static的;

Native暗示这些方法是有实现体的,但是抽象方法却又显示的指明这些方法无实现体的,所以抽象的方法不可以同时是native;

Synchronized是用于线程同步时的,(要么作用在方法上,要么作用在代码块上,而抽象方法没有方法主体),用synchronized的前提是该方法可以被直接调用,所以抽象方法不可以同时是synchronized。

  1. String是否可以继承,如何获取其大小?

答:String不可以继承,因为它是final修饰的,调用它的length()方法获取大小。

  1. String str = new String(“abc”),该语句产生了一个对象,分别是哪些?

答:产生了两个对象,一个是New关键字创建的new String();另一个是”abc”对象,abc在一个字符串池中。

  1. ==与.equals()有什么不同,&&与&有什么不同?

答:”==”比较的是值(变量栈中存放的对象的堆内存地址),equals()用于比较两个对象的值是否相同(不是比地址);&&是逻辑运算符,同时也有短路功能,&是按位运算符。

  1. Float型float f = 1.2; 这种写法是否精确?

答:不精确,小数点在java中默认是double,double赋值给float需要转型。

  1. 什么是值传递,引用传递?

答:值传递是将要传递的值作为一副本传递;引用传递,传递的是引用对象的内存地址。(Java中只有值传递)

  1. 什么是进程,什么是线程?

答:进程和线程都是由操作系统所体现的程序运行的基本单元,但是线程划分尺度小于进程,使得多线程程序的并发性高。线程有一个程序运行的入口。顺序执行序列和程序的出口,但是线程不够独立,必须依存在应用程序中;进程是具有一定独立功能的程序关于某个数据集合上的一次运动活动,进程是系统进行资源分配和调度的一个独立单位。

  1. 实现多线程的方式?

答:(1)继承Thread类实现多线程;(2)实现Runnable接口方式实现多线程;(3)使用ExecutorService、Callable、Future实现有返回结果的多线程。

  1. 线程的几种状态?

答:新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Dead)。

  1. 如何启动一个线程?

答:调用start()方法。

  1. 什么是死锁(怎样避免死锁)?

答:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象。

  1. 谈谈对线程同步与异步的理解?

答:线程同步是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率低;线程异步是指访问资源时在空闲等待时同时访问其他资源,实现多线程机制。

  1. 如何做到线程同步?

答:同步代码块、同步方法。

  1. 有主线程A中有很多子线程,如何确保子线程执行完毕后,主线程才可以继续执行?

答:(1)让主线程等待,或者休眠;(2)使用Thread的join()等待所有的子线程执行完毕,主线程再执行;(3)使用ExecutorService线程池,等待所有任务执行完毕再执行主线程。(callable,future;对子线程进行监听)

  1. Sleep()与Wait()区别?

答:sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是它的监控状态依然保持,当指定时间到了又会自动恢复运行状态(不会释放资源);wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备获取对象锁进入锁定状态(会释放资源)。

  1. 如何确保N个线程可以访问N个资源的同时又不会出现死锁?

答:让所有的线程都是以同样的顺序加锁和释放锁。

  1. 线程同步时,synchronized与Lock有什么不同?

答:lock有比synchronized更精确的线程语义和更好的性能,synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

  1. 如何使用Socket技术实现一个服务器与客户端?

答:使用serverSocket,对服务器端口进行监听

  1. JAVA集合框架中的基本接口有哪些?

答:

Collection:是一个较高的抽象,List, Set 和 Map都是Collection的子接口;

List的特征: 允许重复元素,存储顺序与插入元素顺序一致;

Set 特征: 不允许重复元素(和数学中的集合一样),不保证元素存储顺序;

Map: 存储元素是一系列键=>值,键不可以重复。

  1. Collection与Conllections的区别是什么?

答:conllection是接口,是集合框架的顶级接口。下面有子接口以及实现类。conllections是工具类,是集合框架的工具类,对集合进行操作。里面有很多静态方法。

  1. 如何获取数组的大小?

答:lenth属性。

  1. 集合中使用泛型作用是干什么?

答:指定集合保存数据的类型,更加统一。

  1. Java中的HashMap的工作原理?

答:HashMap有一个叫做Entry的内部类,它用来存储key-value对。通过对键值,hashcode的比较进行存储

  1. Array与Arraylist有什么区别,什么时间应该用Array而不应该用Arraylist?

答:Array创建时就要指定容量,但是可以多维,只可存一种类型的数据;Arraylist创建时不用指定容量,可以存储多种类型的数据。

  1. ArrayList和Vector有何异同点?

答:ArrayList,没有同步,线程不安全,效率高;Vector是同步的,线程是安全的,效率不高。

  1. Enumeration接口和Iterator接口的区别有哪些?

答:Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。

  1. Iterater和ListIterator之间有什么区别?

答:(1)Iterator是ListIterator的父接口;

(2)Iterator是单列集合(Collection)公共取出容器中元素的方式;

(3)Iterator中具备的功能只有hashNext(),next(),remove()。

  1. HashMap与HashTable的区别?

答:(1) 继承不同;

(2) Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的;

(3) Hashtable中,key和value都不允许出现null值;

HashMap:key和value都允许出现null值,一个空值

  1. Set集合中如何做到不重复?

答:添加元素前会先判断存在不,不存在才能添加成功。

  1. Arraylist与LinkedList区别?

答:Arraylist是动态数组结构,查询效率高;LinkedList是链表结构,增删改效率高。

  1. HashSet和TreeSet有什么区别?

答:ØHashSet ,不能保证元素的排列顺序,顺序有可能发生变化 Ø 不是同步的 Ø 集合元素可以是null,但只能放入一个null;TreeSet可以确保集合元素处于排序状态,不允许放null。

  1. 集合循环中,continue与break的区别是什么?

答:break是结束整个循环体,continue是结束本次循环,进入下一次循环。

  1. 谈谈你对Java垃圾回收机制的理解,Java中垃圾回收有什么目的,什么时候进行垃圾回收,回收哪些数据?

答:垃圾回收是防止内存泄漏,可以有效使用空闲内存;目的:释放内存垃圾回收由jvm决定。回收没有用的数据。

  1. System.gc()和Runtime.gc()作用是什么,会立即执行么?

答:通知jvm进行垃圾回收,但是不能保证立即进行。

  1. 谈谈你对final,finally,finalize()的理解?

答:final是用来修饰类、方法、变量的,修饰类时,类不能被继承,修饰方法时,方法不能被重写,修饰变量,值不能被修改;finally是在处理异常时,作用是关闭一些链接,它总会被执行,在return之前执行;finalize()是在清理垃圾之前执行的方法。

  1. Java中的异常类型有哪些,区别是什么,举例说明(至少3种以上)?

答:检查异常:I/O异常,编译之前就异常

运行时异常:nullpointerexception,程序遇到空指或未经过初始化的对象;

ArrayIndexOutOfBoundsException,数组下标越界异常;

FileNotFoundException,文件未找到异常;

SQLException,数据库操作异常。

  1. Exception与Error有什么区别?

答:Exception一般是程序错误,可以被处理的;Error是系统错误或者资源错误,是不可控制的。

  1. Try-catch-finally块处理顺序?

答:先进try里面,如果有异常,就会进入catch,如果没有异常就不会进入catch,当然,finally是无论如何都要执行的,

  1. 谈谈你对ThreadLocal的理解?

答:threadLocal是指的当前线程范围, 维护对象可见(变量副本,同一个线程的子线程之间不会有影响)。

  1. 什么是JDBC,连接步骤是什么?

答:JDBC就是数据库连接,连接步骤是 加载驱动、建立连接、执行操作、关闭数据库连接。

  1. String,StringBuffer,StringBuilder三者的区别?

答: String 字符串常量,长度不可变;StringBuffer 字符串变量(线程安全),长度可变;StringBuilder 字符串变量(非线程安全),长度可变。

  1. 什么是单例模式,它的特点是什么,请手写一个单例模式?

答:单例模式就是在Java应用程序中,一个类Class只有一个实例存在。

public class Singleton {

private Singleton(){

}

private static Singleton instance = new Singleton();

public static Singleton getInstance() {

return instance;

}

}

  1. 常见的设计模式有哪些,谈谈你对工厂模式的理解?

答:工厂模式、原型模式、单例模式、适配器模式、桥接模式、装饰者模式、代理模式等;工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。

  1. Switch语句中case能否作用到String上,也就是如:case(“abc”)?

答:jdk1.7之后可以,之前不能,switch语句的判断条件可以接受int,byte,char,short,不能接受其他类型。

  1. 当关键字final分别修饰一个类,一个方法,一个变量时,各自起到什么作用?

答:修饰类,类不能被继承;修饰方法,方法不能被重写;修饰变量,变量不能被修改。

  1. 什么是JAVA的递归,什么场景下使用?

答:递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象;Java列出目录下全部文件的时候可以使用递归。(反复调用自己的技术)

  1. 匿名内部类是否可以继承其他类,是否可以实现其他接口?

答:匿名的内部类不能继承其它类,但一个内部类可以作为一个接口,由另一个内部类实现。

  1. 什么时间使用assert(断言)?

答:证明程序的正确性的时候可以使用assert(断言)。(单元测试)

  1. Math.round(11.5)等于多少,Math.round(-11.5)等于多少?

答:Math.round(11.5)等于12,Math.round(-11.5)等于-11。

  1. Short s = 1; s = s +1 ;有什么错,如果改成s += 1;呢?

答:1不是Short,是int,需要强制转换的;没有错,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。

  1. JAVA中是否有goto这个关键字?

答:goto是java语言中的保留字,目前还没有在java中使用。

  1. 接口是否可以继承接口,抽象类是否可以实现接口,抽象类是否可以继承实现类?

答:接口可以继承接口;抽象类可以实现接口;抽象类可以继承实体类,前提是实体类必须有明确的构造函数

  1. 构造器是否可以被继承,当构造器在重构时,需要注意的是什么?

答:不能说能被继承,因为只能够调用;注意写无参构造函数参数就可以了。

  1. 两个对象值相同(x.equals(y)==true),说它们的hash code值是不一样的,可对?

答:是一样的,如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

  1. Heap和stack有什么区别?

答:heap(堆):是由malloc之类函数分配的空间所在地。地址是由低向高增长的。 stack(栈):是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的,数据先存进后取出。

  1. JAVA中有几种类型的流,JDK为每种流提供了一些抽象类来继承,分别是哪些?

答:字节流和字符流;InputStream、OutputStream、InputStreamReader、OutputStreamWriter。

  1. 什么是java序列化,如何实现序列化?

答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化;(1) 实现了序列化接口Serializable,(2) 实现接口Externalizable,Externlizable。(对对象的数据进行存储的时候用到序列化)

数据库

  1. 谈谈你说知道的几种关系型数据库,并说说他们各自的特点?

答:mysql,体积小、速度快、功能性极强,小型项目;

Sqlserver,开放性、可伸缩性、并行性、性能稳定性,中大型项目;

Oracle,支持大数据库、多用户的高性能的事务处理,大型项目。

  1. PreparedStatement与Statement区别是什么?

答:无论多少次地使用同一个SQL命令,PreparedStatement(效率高)都只对它解析和编译一次。当使用Statement(效率低)对象时,每次执行一个SQL命令时,都会对它进行解析和编译,使用PreparedStatement对象比使用Statement对象的速度更快。(性能)

  1. CallableStatement在什么时间使用,用来准备CallableStatement的方法是?

答:CallableStatement 用来执行存储过程; 准备CallableStatement 的方法是CallableStament.prepareCall();

  1. 常见的关系型数据库有哪些,分页关键字是什么?

答:mysql,分页关键字是limit;sqlserver,分页关键字是top;oracle,分页关键字是rownum。

  1. 分别使用mysql、sqlserver、oracle完成一个分页语句,举例?

答:mysql:select * from user limit 0,10;

Sqlserver:select top 30 * from user ;

Oracle:select * from ( select t.*,rownum from table1 t where condition ) where rownum>(pangeNow-1)*5 and rownum<=(pageNow)*5。

  1. 数据库连接池是什么,其作用是什么?

答:数据库连接是一种有限的昂贵的资源,数据库连接影响到程序的性能指标;提高了性能的同时还保存了宝贵的资源,增强了系统的安全性和可管理性。

  1. Delete from table 和 Truncate from table 的区别?

答:(1)Truncate是整体删除, delet是逐条删除;(2) truncate不写服务器log,不能回滚,delete写服务器log,可以回滚。

  1. 什么是事务,事务有哪些属性,并简要说明下属性的含义?

答:事务是访问并可能更新数据库中各种数据项的一个程序执行单元;事务应该具有4个属性:原子性、一致性、隔离性、持续性。

原子性:一个事务是一个不可分割的工作单位;

一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态;

隔离性:一个事务的执行不能被其他事务干扰;

持续性:指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

  1. 在一个千万级的数据库查询中,如何提高查询效率?分别说说你的数据库设计,SQL语句,以及JAVA层次的解决方案。

答:数据库表:

(1)避免全表扫描,考虑在where和order by涉及的列上建立索引;

(2)尽量使用数字型字段,只含数值的字段尽量设计不要设计为字符;

(3)避免频繁的创建与删除临时表。

(表分区:将数据分段,根据用户需求在相应的段中进行查找;查询时尽量不要使用“ * ”;)

SQL语句:

(1)尽量避免where中使用!=或<>操作符;

(2)尽量避免where中使用or连接条件;

(3)慎用In和not in。

Java方面:

(1) 尽可能少的创建对象;

(2)可以适量利用缓存,减少数据库请求。

  1. 谈谈你对索引的理解,哪些操作会导致索引失效,换句话说:你认为在表中建立索引后就可以提高数据库的效率么,为什么?

答:索引是对数据库表中一个或多个列的值进行排序的结构。索引失效:隐式转换导致索引失效、对索引列进行运算导致索引失效。索引是对数据库表中一列或多列的值进行排序的一种结构,因此数据库可以根据其排序情况提高查询速度。

  1. 数据库表设计中varchar与nvarchar的区别是什么?

答:varchar是可变长度,非unicode的字符数据,长度介于1—8000;

    nvarchar是可变长度,是unicode的字符数据,长度介于1—4000。

  1. 数据库中,关于临时表的使用,需要注意什么?

答:(1)临时表其实是放在数据库tempdb里的一个用户表;

(2) 对于 本地临时表 (#开头的) 其他会话无法访问数据与表结构;

(3) 一般会话关闭后,临时表都会被删除。

  1. Char类型的字段,是否可以存储一个中文字符,为什么?

答:可以。

  1. 数据库中,什么是重做,什么是回滚?

答:回滚是未提交的事务,即该事务未被执行commit命令。

  1. 你是如何理解存储过程与函数的,两者之间分别适合的场合是什么?

答:(1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强,有输入输出时使用;(2)对于存储过程来说可以返回参数,而函数只能返回值或者表对象。

  1. 什么是数据库的触发器,触发器一般在什么场合使用?

答:触发器是数据库中由一个时间触发的特殊的存储过程,他不是由程序调用也不是手工启动的,数据的变更时。

  1. 什么是数据库的三范式,分别描述下?

答:(1)数据库表的每一列都是不可以分割的原子数据项(列不可再分);(2)在第一范式的基础上,属性完全依赖于主键(行不可重复);(3)在满足第二范式的基础上,任何非主属性不得传递依赖于主属性(不能有无关字段存在)。

  1. 数据库查询是union 和unionAll区别?

答:UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行,并排序;当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。

  1. Lefe join ,inner join ,right join 三者之间分别查询的是什么数据?

答:left join(左联接) 返回包括左表中的所有记录和右表中联结

字段相等的记录;right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,查不到返回为null;

inner join(等值连接) 只返回两个表中联结字段相等的行。

WEB

  1. 什么是servlet,其生命周期是?

答:servlet可以被认为是服务器端的applet。(CGI通用类,实现服务器和客户端的交互)

生命周期:加载和实例化、初始化、请求处理、服务终止。

  1. 什么是JSP,它与servlet有什么关系?

答:jsp:java服务页面,JSP编译以后就是Servlet,二者本质上是一样的。JSP偏重于页面显示,servlet偏重于业务逻辑处理。

  1. 你使用过哪些WEB容器,如何修改Tomcat容器服务端口?

答:tomcat;在Tomcat的conf文件夹里有个server.xml文件,里面修改端口。

  1. 表单提交的方式,区别是?

答:Get、Post

(1)从安全性上,get<post。因为get方式提交的数据会显示在浏览器的地址栏;

(2)从提交内容的大小上,get<post。get方式提交的数据受浏览器的限制;

(3)从请求响应的速度上,get>post。get方式提交的数据要求服务器立即响应,而post请求可能会形成一个请求队列,不一定立即响应。

  1. JSP的隐含对象分别有哪些,各自的作用是什么?

答:

(1) out用于发送输出流到客户端;

(2)  request被关联到每一个HTTP请求; 

(3) response把取得的数据返回到客户端;

(4)  pageContext 提供访问JSP页面的命名空间 ;

(5) session存储客户端请求的信息,因此它是有状态交互式的;

(6) application config包含了当前JSP/Servlet所在的WEB应用的配置信息;

(7) page 来源于当前被访问JSP页面的实例化。它实际使用的是JSP转换成的Servlet;

(8) exception 用于捕获JSP抛出的异常。它只有在JSP页面属性isErrorPage=true时才可用。

  1. JSP中动态包含与静态包含区别是什么?

答:动态包含:总是会检查页面的变化,只会产生一个class文件,先编译再包含,可传递参数;

静态包含:不会检查所含文件的变化,会产生多个class文件,先包含再编译。

  1. 谈谈请求转发与重定向的区别?

答:转发:是服务器行为,一次请求,URL不会改变,同时,在重定向的过程中,传输的信息会被丢失;

重定向:是客户端行为,两次请求,URL会改变,传输的信息不会丢失。

  1. 在JSP页面中,页面之间传递参数的方法有哪些?

答:(1) 直接在URL请求后添加;

(2) jsp:param;

(3) 设置session和request。

  1. 请说说Cookie与Session的区别,并简述下Session工作原理?

答: cookie采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案;Session是在cookie的基础上实现的,需要cookie得到sessionId来得到相应的session。Session工作原理:用户登录之后,将兑现存到session中,后台通过sessionId来判断

  1. Ajax技术原理是什么,我们为什么要使用?

答:Ajax(局部刷新技术)的工作原理相当于在用户和服务器之间加了—个中间层(AJAX引擎),使用户操作与服务器响应异步化;这样减少服务器的压力,同时体验也更加好。

  1. 什么情况下调用doGet()和doPost(),项目中,经常遇到doGet()中中文提交成了乱码,为什么?

答:根据客户端发送请求的方式调用对应的方法;没有设置统一的编码格式。(容器造成的)

 

框架

  1. 谈谈你对JaveEE的理解,并且说明框架的多层结构,简要说明下各层之间的作用?

答:企业级开发应用,框架的多层结构一般指的是:表现层,主要用于处理程序的数据和进行方向;

业务层,处理接收到的数据和一些逻辑问题;持久层,用于和数据库的交互。

  1. 如何使用springmvc,mybatis,spring框架技术开发web应用?

答:首先三个框架的jar包是必需的,然后是三个框架的xml配置文件,最后是在web.xml中配置配置Spring MVC 核心控制器 DispatcherServlet和一些过滤器等。Springmvc表现层框架,mybatis持久层框架,spring整合,解耦

  1. 谈谈你对mvc的理解,或者说:什么是mvc?

答:mvc是一种设计典范,用于将逻辑、数据、界面分离。

M是模型,表示应用程序核心(比如数据库记录列表);

V是视图,显示数据(数据库记录);

C是控制器,处理输入(写入数据库记录)。

  1. 谈谈你对spring框架的理解?

答:Spring是一个组合式框架,解耦,其核心是IoC(依赖于容器),

AOP面向切面编程,进行事务管理。

  1. 什么是IOC,AOP,其各自作用是什么,你们项目中在什么地方用到过?

答:IoC就是控制反转,在Java开发中,将设计好的类交给系统去控制,而不是在自己的类内部控制;AOP就是面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。主要是在记录日志的时候可以使用。

  1. Hibernate工作原理,简述下该框架的优缺点?

答:hibernate是ORM框架,它对jdbc进行了封装,在分层结构中处于持久化层。(通过configiration对象读取配置文件,)

优点:透明持久化、事务、移植性会很好;

缺点:不能进行批量操作,不灵活,性能比hibernate低。

  1. 简述下你对mybatis框架的理解?

答:mybatis根据XML配置文件或者是JAVA代码的注解,通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,半自动化的持久层框架,灵活处理类与类之间的关系,性能好,所有的sql写在配置文件中,不需要将注意点放在java代码上。

  1. Hibernate与mybatis两种持久层框架,他们各自特点是什么?

答:mybatis:小巧、方便、高效、简单、直接、半自动;

hibernate:强大、方便、高效、复杂、绕弯子、全自动。

  1. 在Hibernate中,如何实现对象的懒加载(延迟加载)?

答:在实体的映射配置文件中将class的lazy属性设置为true,来开启实体的延迟加载特性。

  1. Hibernate框架中JAVA对象有几种状态,分别是哪些,各自的特点是?

答:瞬时状态:当对象才被创建时,未被session管理;

持久状态:被session管理,与数据库操作同步;

游离状态:操作后,脱离session管理。

  1. Hibernate框架中处理实现类与类之间的关系?

答:可以通过配置文件来映射,当然也可以通过注解。(一对一、一对多、多对多)

  1. Hibernate框架中,如何实现性能调优?

答:(1)数据库的设计;

(2)映射文件的优化;

(3)合理使用缓存。

  1. Inverse=“true”,这条语句在hibernate配置中有什么作用?casecode—级联

答:控制反转。

  1. Session.get()与session.load(),两个方法有什么不同,各自的执行顺序是什么?

答:get()方法先查一级缓存,再查二级缓存,数据库,直接返回实体类,如果查不到数据则返回null;load先到缓存(session缓存/二级缓存)中去查,如果没有则返回一个代理对象(不马上到DB中去找),等后面使用这个代理对象操作的时候,才到DB中查询。

  1. 谈谈你对Hibernate二级缓存的理解?

答:Hibernate本身并未提供二级缓存的产品化实现(只提供了一个基HashTable的简单缓存以供调试)。SessionFactory,一级缓存关闭后二级缓存就生效

不能放的,经常被修改的,经常被访问的,

  1. 什么是乐观锁,什么是悲观锁,各自特点是?

答:悲观锁,认为别人访问正在改变的数据的概率是很高的,所以从数据开始更改时就将数据锁住,直到更改完成才释放,效率低。

乐观锁,认为别人访问正在改变的数据的概率是很低的,所以直到修改完成准备提交所做的的修改到数据库的时候才会将数据锁住。完成更改后释放。

  1. 说说struts2的工作流程,谈谈你对struts2核心控制器的理解?

答:工作流程:

客户端请求;

经一系列过滤器到达FilterDispatcher核心控制器;

ActionMapper来决定这个请求是否需要调用某个Action;

如果需要,FilterDispatcher把请求的处理交给ActionProxy;

ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;

ActionProxy创建一个ActionInvocation的实例;

action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Intercepter拦截器。

  1. Springmvc 框架是如何实现mvc的,核心类分别是?

答:模型:javabean,视图:  控制器:DispatcherServlet+controller+  通过配置文件,核心类是DispatcherServlet

  1. Springmvc框架的工作流程是?

答:客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果存在指定映射路径,web容器将请求转交给DispatcherServle;

DipatcherServlet接收到这个请求之后将根据请求的信息以及HandlerMapping的配置找到处理请求的处理器(Handler);

DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用;

Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet;

DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View;

Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

  1. Mybatis框架的工作原理是,我们为什么要使用?

答:Mybatis通过与自己Mapper对应的xml配置文件,来进行对数据库的操作。

  1. 谈谈Struts2 和 springmvc框架之间各自的优缺点?

答:Struts2:Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程;强大的拦截器;易于测试;易于扩展的插件机制;模块化;全局结果与声明式异常。

Springmvc:没有封装那么多,运行起来很快,控制器是单例的。

  1. 你们项目中,是如何处理事务,事务一般可以分为几种?

答:把事务交给spring处理,propagation 和 read-only。

  1. 谈谈spring事务的隔离级别和传播行为?

答:PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行;

PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常;PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起;

PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起;

PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

扩展

  1. 请谈谈你项目中用户,角色,权限三种对象模型之间的关系,并建立对应的表结构?

答:用户表中有角色表的外键,一对多,角色表和权限表为多对多,建立中间表。

  1. 如果你项目有很多版本,怎么样保证你的用户正常实现版本的新旧交替?

答:采用版本控制,没个版本有一个版本号,通过版本号找到对应的代码,每个版本之间没有任何关系

  1. 一个3升水杯,一个5升水杯,如何倒出4升水,7升水?

答:(4升)用三升的杯子先盛满水,倒入五升的杯中,然后继续盛满三升的水杯,继续倒入五升的杯中,此时,三升的杯中会剩下一升的水,此时,将五升的水倒掉,将一升装入,再装满三升水杯,倒入五升水杯中即可;

(7升)上诉步骤中再将3升杯装满,一共就是7升了。

以上是关于Java常见面试题的主要内容,如果未能解决你的问题,请参考以下文章

Java基础知识 | 常见面试题(上):基本数据类型

Java基础常见面试题总结(下)

面试题MySQL常见面试题合集

Java 并发基础常见面试题总结

Java基础常见面试题总结(中)

java基础-常见面试题