Java经典面试题

来源:互联网 发布:java snmp agent 编辑:程序博客网 时间:2024/05/18 11:13

本题目仅针对初、中级Java工程师的面试复习,另附 Java经典笔试题


一、J2SE

1、一个.java源文件是否可以包括多个类?

可以有多个类,有且只有一个类名与文件名相同的public类

 

2、JDK与JRE的区别:

(1)JRE是Java运行环境,包含了Java虚拟机和Java基础类库

(2)JDK是Java开发工具包,除JRE外还包含编译器、调试工具和Java DOC

 

3、不使用构造器也能创建对象么?

(1)使用new()

(2)反射机制

(3)反序列化

(4).clone()

 

4、列举8种基本类型,各占多少字节内存:

byte 1字节、short 2字节、int 4字节、long 8字节、

float 4字节、double 8字节、boolean *、char 2字节

 

5、String s = new String("abc");创建了1个或2个对象;

 

6、数组有length属性,无length方法;String有length方法,无length属性;ArrayList没有length方法,有size方法;

 

7、String、StringBuilder和StringBuffer比较:

String不可变长字符串(final),StringBuilder线程不安全的可变长字符串,StringBuffer线程安全的可变长字符串

 

8、switch语句中的条件判断是否可以使用byte、long和String类型?

switch条件判断支持byte、shot、int、char、String、Enum

 

9、List和 Map区别?

List可用以存储单列有序可重复数据,而Map存储的是键值对形式的双列数据,且主键不重复无序的数据集合;

 

10、HashMap与HashTable区别:

HashTable同步的,而HashMap是非同步的;HashMap允许空键、值,而HashTable不允许

 

11、ArrayList、Vector、LinkedList区别?

ArrayList和Vector底层实现都是数组,不同之处Vector线程安全,ArrayList线程不安全,Vector容量自增是2倍,ArrayList容量自增是1.5倍

LinkedList底层实现是双向链表,与ArrayListList比,有利于增删改,不利于查询

 

12、简要介绍Java集合框架:

 

说明:短虚线是接口,长虚线是抽象类,实线是实现类

 

13、简述I/O流:

 

 

14、集合元素的比较要实现什么接口?Comparable/Comparator

集合排序

Collections.sort(list,new Comparator<T>() {

public int compare(Tt1, T2t2) {

return t1.compareTo(t2);

}

});

 

冒泡排序

for(int i=0;i<array.length-1;i++){

for(int j=0;j<array.length-1-i;j++){

if(array[j]>=array[j+1]){

int temp=array[j];

array[j]=array[j+1];

array[j+1]=temp;

}

}

}

 

15、Java三大特性:封装、继承、多态+抽象

 

16、访问权限:

 

本类

同包

子类

不同包

public

protected

 

(default)

 

 

private

 

 

 

 

17、方法重载和覆盖的区别:

(1)方法重载:同一类内,方法名相同,参数列表不同

(2)方法覆盖:父类与子类间,方法名和方法参数都相同

 

18、构造器是否可以被Override?

不能被继承,因此不能被重写Override,但可以被重载Overload

 

19、接口和抽象类的比较:

 

抽象类

接口

属性

不用限制

必须是静态常量

构造方法

可有可无

没有

普通方法

可以有

必须是抽象方法

子类

单一继承

多重实现

 

20、接口、抽象类、具体类是否可以互相继承或实现?

接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体类

 

21、匿名内部类是否可以继承类或实现接口?可以,且必须

举例:

Runnable r = new Runnable() {

public void run() {

}

};

 

22、abstract 不同与final或static同时修饰方法;synchronized不建议用于修饰静态方法;

 

23、当用final修饰变量时,是引用不可变,还是引用的对象不可变?举例说明

仅指引用不可变,引用的对象的内容还是可以改变的

举例:final StringBuffers=new StringBuffer("aaa");

s=new StringBuffer("bbb");是不被允许的,但s.append("ccc"); 可以

 

24、final、finally和finalize区别:

final用于声明属性,方法和类,分别表示属性不可交变,方法不可覆盖,类不可继承

finally是异常处理语句结构的一部分,表示总是执行

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法

 

25、sleep()和wait()的区别?

sleep()是Thread的方法,转为睡眠状态,不释放同步锁,一定时间后恢复状态;

wait()是Object的方法,转为等待状态,释放同步锁,只有当同一对象的其他线程调用notify()后才能获得竞争同步锁的机会;

 

26、sleep()和yield()的区别?

sleep()使线程转阻塞状态,让权给任意线程执行,不分优先级,可能抛异常;

yield()使线程转就绪状态,只让权给同等或更高优先权的线程,不会抛异常;

 

27、多线程的实现方式?同步的实现方式?

多线程(异步并发):(1)继承Thread类(2)实现Runnable接口;

同步:(1)synchronized修饰方法(2)调用wait()和notify()

 

匿名内部类实现多线程:

new Thread(new Runnable(){

public void run() {}

}).start();

 

28、什么是序列化?如何实现序列化?

(1)将对象做流化处理,以便于实现对象的读写和网络传输

(2)将需要被序列化的类实现Serializable接口

举例:

public class Simplements Serializable {}

public static void main(String[]args){

S s=new S();

try {

FileOutputStream fos=new FileOutputStream("D:/OOS.TXT");

ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(s);

oos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

 

29、什么是Java的内存泄漏?

当长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但因为长生命周期对象持有它的引用而导致不能被回收

 

30、简介JVM中年轻代、年老代和持久代

(1)年轻代:所有新生对象首先都是放在年轻代中的,年轻代分三个区,一个Eden区,两个Survivor区(可以配置多个且无先后顺序,两者总有一个是空的),大部分对象在Eden区中生成,当Eden区满时,还存活的对象将被复制到Survivor区,当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区”

(2)年老代:在年轻代中经历多次垃圾回收仍然存活的对象,就会被放到年老代中,因此可以认为年老代中存放的都是一些生命周期较长的对象

(3)持久代:持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大

 

31、Scavenge GC和Full GC比较

(1)Scavenge GC:当新对象生成并且在Eden申请空间失败时,就会触发Scavenge GC对Eden区域进行GC,清除非存活对象并且把尚且存活的对象移动到Survivor区,然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。

(2)Full GC:对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。

 

二、数据库

1、什么是事务?事务有哪些特点?

事务(Transaction)是访问并可能更新数据库中数据项的程序执行单元

事务的特性ACID:原子性、一致性、隔离性、持久性

多事务处理可能遇到的现象:脏读、不可重复读、幻读

事务隔离级别:读未提交、读提交、重复读、串行化读

 

2、SQL的分类:

数据定义语言(DDL)、数据操作语言(DML)、数据查询语言(DQL)、数据控制语言(DCL)、事物控制语言(TCL)

 

3、create table 表名(

column1  数据类型(),

column2  数据类型()

);

insert into 表名(字段名) values(各个字段对应的值)

update 表名 set 字段名=值 where 限定条件

select 字段名 from 表名 where 限定条件 order by 字段名 desc/asc

分页语句:select * from t order by id limit 30,10

 

4、数据库表连接方式:内连接、外连接(左连接、右连接 、全连接)、交叉连接

(1)内连接:取交集

(2)左外连接:左并集

(3)右外连接:右并集

(4)全连接:并集

(5)交叉连接:又称笛卡尔积,即两表记录的排列组合

 

5、索引的作用?索引的种类?

(1)可以大大加快数据的检索速度

2唯一索引、非唯一索引、主键索引和聚集索引

 

6、数据库性能优化方面的探讨:

(1)使用PreparedStatement而不是Statement

(2)使用更有效的SQL查询语句

(3)表建立应该有合理的外键约束,不宜过多

(4)允许表有适当的冗余,比如将帐号、密码从用户表中分离出来

(5)建立合适的索引

 

7、数据库三范式:

1NF:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性,简而言之,1NF就是无重复的列

2NF:在1NF基础上,数据库表中的每一行必须可以被唯一地区分,即实体的属性完全依赖于主关键字,简而言之,2NF就是非主属性非部分依赖于主关键字

3NF:在2NF基础上,数据库表中不包含已在其它表中已包含的非主关键字信息,简而言之,3NF就是属性不依赖于其它非主属性

 

8、JDBC编程实现步骤:

Class.forName加载驱动

getConnection获得连接

createStatement

executeQuery

ResultSet结果集

关闭资源

 

三、J2EE

1、设计模式有哪些?

(1)创建型模式:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式

(2)结构型模式:代理模式、适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式

(3)行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式

 

2、单例模式说明:

(1)私有的构造方法

(2)私有静态类对象且初始化

(3)公开静态获取该类实例的方法

 

3、模式设计原则:

里氏代换原则、迪米特法则(最少知道原则)、合成复用原则、依赖倒转原则、开闭原则、接口隔离原则

 

4、HTTP的GET和POST比较:

(1)GET方式对URL的数据长度(最大2048 字符)、数据类型有严格要求(只能是ASCII码字符),而POST方式没有限制;

(2)GET方式的请求参数在URL中可见,而POST方式的请求参数在URL中不可见,GET方式的响应数据允许缓存,而POST方式的响应数据不允许缓存;

(3)GET方式的数据安全性比POST方式差,但数据传输效率上比POST高

 

5、HTML5的新特性和新标签?

 

6、Java对xml文件读取方式:DOM4J、JDOM、DOM、SAX

XML文档定义有几种形式:dtd和schema

 

7、JSP的9大内置对象和4个作用域

(1)内置对象:page、pageContext、request、response、session、application、out、exception、config

(2)作用域:page、request、session、application

 

8、页面间对象传递的方法:

request,session,application,cookie等

 

9、Servlet与JSP比较:

JSP本质就是Servlet,但JSP更倾向于表现层,Servlet更适于控制层

 

10、Servlet生命周期:

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法

 

11、getParameter与getAttribute比较:

request.getParameter()是从浏览器传递到服务器中的参数
request.getAttribute()是服务器代码暂时保留在request的值,这些值在代码中通过setAttribute后才会有值

 

12、SpringAOP使用设计模式:代理模式

SpringIOC使用设计模式:工厂模式(+反射机制+xml的DOM解析)

Spring使用到的设计模式:单例模式、静态工厂、工厂方法、适配器、包装器、代理模式、观察者、策略、模板

 

13、SpringBean 生命周期:

(1)spring对bean进行实例化,默认bean是单例
(2)spring对bean进行依赖注入
(3)如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法
(4)如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来
(5)如果bean实现了ApplicationContextAware()接口,spring将调用setApplicationContext()方法将应用上下文的引用传入
(6)如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessBeforeInitialization接口方法
(7)如果bean实现了InitializingBean接口,spring将调用它们的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,改方法也会被调用
(8)如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessAfterInitialization接口方法
(9)此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁
(10)若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法

 

14、Spring事务传播方式:?

(1)PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务
(2)PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
(3)PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常
(4)PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起
(5)PROPAGATION_NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,就把当前事务挂起
(6)PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常

 

15、浅谈对Spring的认识:

Spring:轻量级控制反转(IOC)和面向切面(AOP)的容器框架

Spring的核心框架:核心容器(Spring Core)、应用上下文(Spring Context)、AOP模块(Spring AOP)、

JDBC和DAO模块(Spring DAO)、对象实体映射(Spring ORM)、Web模块(Spring Web)、MVC模块(Spring Web MVC)

 

IOC控制反转:创建对象的实例的控制权从代码控制剥离到IOC容器控制

DI依赖注入:创建对象实例时,注入属性值或其他对象实例

 

IOC的注入类型:构造函数注入,属性注入,接口注入,Spring支持前2个注入方式

AOP的功能:日志记录、事物处理、性能统计、异常处理

 

16、SpringMVC核心入口类:DispatcherServlet

17、SpringMVC流程:

(1)用户发送请求到前端控制器(DispatcherServlet),*调用处理器映射器(HandlerMapping),

(2)处理器映射器根据请求url找到具体的处理器,返回到*,*通过处理器适配器(HandlerAdapter)调用处理器(Handler),

(3)处理器将返回值ModelAndView通过处理器适配器传到*,*通过视图解析器(ViewResolver)获得具体的View,

(4)再由*渲染视图,并将结果返回给用户

 

18、Spring有哪些注解,分别起到什么作用?

(1)Controller类:

@Controller

@RequestMapping("/bill")

 

(2)Controller中Servie对象:

@Resource(name="billService")或者(type=BillService.class)

@Resource的装配顺序:

1)、@Resource默认通过name属性去匹配bean,找不到再按type去匹配

2)、指定了name/type则根据指定的类型去匹配bean

3)、指定了name+type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

 

@Autowired和@Resource注解的区别:

1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

2)、@Autowired是Spring的注解,@Resource是J2EE的注解

 

(3)Controller方法:

@RequestMapping(value = "/getBills", method = RequestMethod.POST)

@ResponseBody

 

(4)Service实现类:

@Service

@Transactional

 

(5)Service中Dao对象:

@Autowired

默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中

 

(6)Dao实现类:

@Repository

作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型

 

(7)实体类:

@Entity

@Table(name="bills")

 

(8)实体类中属性:

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)  

@Column

 

19、什么是ORM?ORM即对象关系映射,将Java程序中的对象自动持久化到关系数据库中

 

20、Hibernate对象的三种状态比较:

(1)瞬时态(Transient,临时态):由new操作符创建,在数据库中没有与之关联的记录,且与session实例无关

(2)持久态(Persistent):在数据库中存在与之关联的记录,且与session实例关联

(3)脱管态(Detached,游离态):由持久态对象转化而来,在数据库中存在与之关联的记录,但与session实例无关

 

21、Hibernate的get方法与load方法比较:

(1)get方法采用立即加载方式,而load方法采用延迟加载

get方法执行的时候,会立即向数据库发出查询语句,而load方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出查询语句
(2)如果数据库中没有对应的记录,get方法返回的是null,而load方法出现异常ObjectNotFoundException

 

22、Hibernate的二级缓存介绍:

(1)缓存就是将从数据库中查询到的数据暂存到内存中,下一次使用该对象时,不是直接查询数据库,而是从缓存中查找;

(2)Hibernate一级缓存使用Session存储数据;

(3)二级缓存是独立于Hibernate的软件部件,属于第三方的产品,在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中

 

23、常用加密算法简介:

(1)对称加密算法:AES、DES、3DES、RC2、RC4

(2)非对称加密算法:RSA、DSA、ECC

(3)使用单向散列函数的加密算法:MD5、SHA


原创粉丝点击