Java 面试宝典
1 Java 基础部分
1)Java 的值类型和对象类型
boolean,int,float,double,char,byte,short,long
2)垃圾回收的优点和原理
大多数垃圾回收算法使用了根集(root set)这个概念;所谓根集就量正在执行的Java程序可以访问的引用变量的集合(包括局部变量、参数、类变量),程序可以使用引用变量访问对象的属性和调用对象的方法。垃圾收集首选需要确定从根开始哪些是可达的和哪些是不可达的,从根集可达的对象都是活动对象,它们不能作为垃圾被回收,这也包括从根集间接可达的对象。而根集通过任意路径不可达的对象符合垃圾收集的条件,应该被回收。
4) Error与Exception有什么区别
Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题,比如,内存资源不足等,对于这种错误,程序基本无能为力,除了退出运行外别无选择。
Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
5)在java中一个类被声明为final类型,表示了什么意思?
表示该类不能被继承,是顶级类。
6)Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
7)Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
8)abstract class和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
9)Java中如何实现多继承?
通过内部类进行实现,子类中创建内部类分别继承需要继承的父类,在子类中使用内部类的方法。
10)Java 1.4 和1.5以及1.6 的区别
11)ArrayList和Vector的区别,HashMap和Hashtable的区别
就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value
12)描述一下JVM加载class文件的原理机制?
类从加载到释放的阶段:加载,验证,准备,解析,初始化,使用和卸载。其中验证,准备和解析三个部分为连接。
13)Java内存溢出的检查?
java.lang.OutOfMemoryError: PermGen space 加载的类太多了
java.lang.OutOfMemoryError: Java heap space
14) 各个值类型的字节大小?
15 ) Java 中引用的分类
强引用,软引用 (SoftReference实现,当内存发生溢出之前进行二次回收),弱引用(WeakReference实现,关联的对象生存到下一次垃圾回收之前),虚引用
2 多线程相关
1)请说出你所知道的线程同步的方法
2)线程间的共享
3)线程同步
3 内存相关
4 Spring框架
1)IOC使用原理
2)AOP使用原理
3)AOP使用场景
4)IOC具体的配置如何配置
5)IOC的类型
6)事务级别
为解决事务之间的3个缺陷,必须在事务之间建立隔离关系来保证事务的完整性。
ISOLATION_DEFAULT
使用数据库默认的隔离级别
ISOLATION_COMMITTED
允许读取其他并发事务已经提交的更新(防此脏读)
ISOLATION_READ_UNCOMMITTED
允许读取其他并发事务还未提交的更新,会导致事务之间的3个缺陷发生,这是速度最快的一个隔离级别,但同时它的隔离级别也是最低
ISOLATION_REPEATABLE_READ
除非事务自身修改了数据,否则规定事务多次重复读取数据必须相同(防此脏读,不可重复读)
ISOLATION_SERIALIZABLE
这是最高的隔离级别,它可以防此脏读,不可重复读和幻读等问题,但因其侵占式的数据记录完全锁定,导致它影响事务的性能,成为隔离级别中最展慢的一个。
5 Hibernate框架
1) 事务类型
2)懒加载
3)实体的状态
瞬时:一个实体进行NEW后,没有和Hibernate的Session建立关系,也没有手动赋值过该实体的持久化标识。该实体更新不会影响数据库
持久化:当一个实体和Hibernate的Session创建了关系,并获取了持久化标识,而且在Hibernate的Session生命周期内存在。此时针对该实体的任何属性的更改都会直接影响到数据库中一条记录对应字段的更新
脱管:当一个实体和Hibernate的Session创建了关系,并获得了持久化标识,而此时Hibernate的Session的生命周期结束,实体的持久化标识没有被改动过。针对该实体的任何属性的修改不会及时反映到数据库中
4)Session
开启Session:开启Session不会马上取得Connection,而是在最后真正需要连接资料库进行更新或查询时才会取得Connection,如果有设定Connection pool,则从Connection pool中取得Connection,而关闭Session时,如果有设定Connection pool,则是将Connection归还给Connection pool,而不是直接关闭Connection。
储存:透过Session,可以对资料库进行新增、删除、更新;save()之后,不会马上对资料库进行更新,而是在Transaction的commit()之后才会对资料库进行更新
获取:get()和load(),get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。如果对象为空,get()返回NULL而load()会返回代理对象,当使用具体的属性时,查询数据库中没有则报ObjectNotFoundException。
删除:delete();
更新:
合并:merge();
5)状态转换
用new创建出对象,这些对象还没有与数据库发生任何的关系,不对应于数据库中的任一笔数据;Persistent 对象通过调用delete()方法,也成为Transient 的,把Detached (脱管)对象转换成Transient (瞬时)的
当对象与数据库中的数据有对应关系,并且与Session实例有关联,并且Session实例尚未关闭,则它是在Persistent状态。例:Transient状态的对象使用Session的save()方法保存到数据库后,对象成为persistent状态
Detached状态的对象,与数据库中的具体数据对应,但脱离Session实例的管理,例如:在使用load()、get()方法查询到数据并封装为对象之后,将Session实例关闭,则对象由Persistent状态变为Detached状态。
6)快取
数据库在内存中的临时容器,从数据库中读取的数据在快取中会有一份临时拷贝,当您查询某个数据时,会先在快取中寻找是否有相对应的 拷贝,如果有的话就直接返回数据,而无需连接数据库进行查询,只有在快取中找不到数据时,才从数据库中查询数据,藉由快取,可以提升应用程序读取数据时的 效能。
7)Hibernate 代理对象
使用load()加载的对象是代理对象。代理对象为查询实体的子类。当使用具体属性时,才去数据查询。Hibernate使用的是asm.jar和cglig。在内存中修改类对象的字节码,修改后的字节码符合Class规则则可以生成代理对象
8)Hibernate Domain对象 不能为fianl
不呢进行懒加载,因为懒加载使用的是代理对象
6 Hadoop框架
7 设计模式
8 Java WEB
1)JSP中请求转发和重定向?
2) Servlet的生命周期?
9 数据库知识
1)数据库中的锁
共享锁(S锁):
如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁(X锁):
如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
2)数据不一致的类型:丢数据修改,读“脏”数据,不可重复读,产生幽灵数据
2)临时表
3)事务类型
Read Uncommited :读未提交数据( 会出现脏读,不可重复读,幻读 ,避免了 第一类丢失 更新 )
Read Commited :读已提交的数据(会出现不可重复读,幻读)
Repeatable Read :可重复读(会出现幻读)
Serializable :串行化