应届生如何轻松通过Java面试


今年我也是20出头的毕业生,在年前,因为没赶上秋招的高峰期,在杭州投了很多份简历都没有回信,个别几家因为准备不足(面试经验不足)都被OUT了。说实话,面试官对我们这些初出茅庐的学生还是很宽容和有耐心的。回到老家这边的城市,也去了很多校招和双选会,所以对面试经验这块还是能给出点建议的๑乛◡乛๑。总结经验,以供参考。
对于我们应届生,面试官问的其实大部分都是些基础知识,当然也会有一些冷门知识。

面试时的自我介绍

根据面试的流程,你首先会开始自我介绍,面试可能会碰到1对1,1对2,或者多对多的情况,意思就是一个面试官来面你一个人或者1个面试官面2个人,这时候一般是谁知道答案谁举手答,多对多和1对2是差不多的,只不过问问题的人多一点。
在自我介绍的时候,不要太过紧张,说话结巴,你可以慢慢来,面试官也会给你一定的时间去组织语言,逻辑调理清楚就OK了。实在不行你也可以事先准备一个稿子,到时候照着背就行了,我就这样๑乛◡乛๑。在1对2和多对多的情况下,就要看你的积极性了,回答的问题比别人多,优势自然大。

JAVASE面试题

根据我面试的内容整理出了下面一些常问的面试题
1、String 是最基本的数据类型吗?
答:不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;
除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。

2、是否可以继承String类?
答:String 类是final类,不可以被继承。

3、String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。
其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。
StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,
因此它的效率也比StringBuffer要高。

4、String s = new String(“xyz”);创建了几个字符串对象?
答:两个对象,一个是静态区的”xyz”,一个是用new创建在堆上的对象。

5、描述一下JVM加载class文件的原理机制?
答:JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,
它负责在运行时查找和装入类文件中的类。
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,
JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,
通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。
当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。
最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,
就依次执行这些初始化语句。

6、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,
同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

7、Java集合类框架的基本接口有哪些?
Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含重复元素的Collection。
List:有顺序的collection,并且可以包含重复元素。
Map:可以把键(key)映射到值(value)的对象,键不能重复。

8、List、Set、Map是否继承自Collection接口?
答:List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),
List是线性结构的容器,适用于按数值索引访问元素的情形。

9、Collection和Collections的区别?
答:Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,
这些方法包括对容器的搜索、排序、线程安全化等等。

10、数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?
Array和ArrayList的不同点:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array大小是固定的,ArrayList的大小是动态变化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

11、ArrayList和LinkedList有什么区别?
ArrayList和LinkedList都实现了List接口,他们有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,
LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,
查找某个元素的时间复杂度是O(n)。
相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

12、哪些集合类是线程安全的?
Vector、HashTable、Properties和Stack是同步类,所以它们是线程安全的,可以在多线程环境下使用。Java1.5并发API包括一些集合类,
允许迭代时修改,因为它们都工作在集合的克隆上,所以它们在多线程环境中是安全的。

13、HashMap和Hashtable有什么区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。

14、Java中Exception和Error有什么区别?
Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

15、throw和throws有什么区别?
throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,

所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。

16、列出一些你常见的运行时异常?
答:

  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)

17、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?
答:会执行,在方法返回调用者前执行。

18、进程和线程的区别是什么?
进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。线程又叫做轻量级进程。

19、什么是死锁(deadlock)?
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

20、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?
答:sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,
将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态)。
wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),
进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll()方法)时才能唤醒等待池中的线程进入等锁池(lock pool),
如果线程重新获得对象的锁就可以进入就绪状态。

21、什么是线程池(thread pool)?
答:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,
以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,
这就是”池化资源”技术产生的原因。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,
使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

22、编写多线程程序有几种实现方式?
答:Java5以前实现多线程有两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,
推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。

23、同步方法和同步代码块的区别是什么?
答:在Java语言中,每一个对象有一把锁。线程可以使用synchronized关键字来获取对象上的锁。
synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,因此同步方法锁的范围比较大,
而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好。

数据库面试题

数据库阶段
1、简述结构化查询语言的分类?
答:结构化查询语言可分为:
数据定义语言DDL:Data Definition Language
数据操纵语言DML:Data Manipulation Language
事务控制语言TCL:Data Transaction Language
数据查询语言DQL:Data Query Language
数据控制语言DCL:Data Control Language

2、Oracle是怎样实现分页的?MySQL是如何实现分页的
Oracle中使用rownum来进行分页, 这个是效率最好的分页方法,hibernate也是使用rownum来进行oralce分页的
select * from
( select rownum r,a from tabName where rownum <= 20 )
where r > 10
MySQL是通过limit实现分页的
select * from tabName limit 10,20

3、怎样创建一个视图,视图的好处?
create view 视图名 as select 列名 [别名] … from 表 [unio [all] select … ] ]
好处:
1. 可以简单的将视图理解为sql查询语句,视图最大的好处是不占系统空间
2. 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构
3. 简化查询

4、什么是JDBC?
JDBC是允许用户在不同数据库之间做选择的一个抽象层。JDBC允许开发者用JAVA写数据库应用程序,而不需要关心底层特定数据库的细节。

5、解释下驱动(Driver)在JDBC中的角色。
JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这些类的实现:Connection, Statement,
PreparedStatement,CallableStatement, ResultSet和Driver。

6、阐述JDBC操作数据库的步骤。
答:下面的代码以连接本机的Oracle数据库为例,演示JDBC操作数据库的步骤。
加载驱动。
Class.forName(“oracle.jdbc.driver.OracleDriver”);
创建连接。
Connection con = DriverManager.getConnection(“jdbc:oracle:thin:@localhost:1521:orcl”, “scott”, “tiger”);
创建语句。
PreparedStatement ps = con.prepareStatement(“select * from emp where sal between ? and ?”);
ps.setInt(1, 1000);
ps.setInt(2, 3000);
执行语句。
ResultSet rs = ps.executeQuery();
处理结果。
while(rs.next()) {
System.out.println(rs.getInt(“empno”) + " - " + rs.getString(“ename”));
}
关闭资源。
finally {
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

7、Statement和PreparedStatement有什么区别?哪个性能更好?
答:与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性
(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;
③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,
下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

8、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?
答:要提升读取数据的性能,可以指定通过结果集(ResultSet)对象的setFetchSize()方法指定每次抓取的记录数(典型的空间换时间策略);
要提升更新数据的性能可以使用PreparedStatement语句构建批处理,将若干SQL语句置于一个批处理中执行。

9、数据库连接池是什么意思?
像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,
成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。
在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。

10、事务的ACID是指什么?
答:- 原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;

  • 一致性(Consistent):事务结束后系统状态是一致的;
  • 隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
  • 持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

11、JDBC中如何进行事务处理?
答:Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务;
当事务完成后用commit()显式提交事务;如果在事务处理过程中发生异常则通过rollback()进行事务回滚。
除此之外,从JDBC 3.0中还引入了Savepoint(保存点)的概念,允许通过代码设置保存点并让事务回滚到指定的保存点。

JAVAEE面试题

一 描述Spring框架的作用和优点
Spring框架的作用和优点如下:
1).Spring是一个开源的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入;

2).Spring提供的IoC和AOP应用,可以将组件的耦合度降至最低,即解耦,便于系统日后的维护和升级

3).Spring为系统提供了一个整体的解决方案,开发者可以利用它本身提供的功能外,也可以与第三方框架和技术整合应用,可以自由选择采用哪种技术进行开发。

二.如何控制Bean对象的作用域,默认作用域是什么?

1)可以通过定义的scope属性指定Bean对象的作用域或者使用注解@Scope指定Bean对象的作用域。

2)默认Bean对象的作用域为singleton。

三.描述Spring Web MVC的工作流程

Spring Web MVC的工作流程如下:

1).浏览器发出spring mvc请求,请求交给前端控制器DispatcherServlet处理。

2).控制器通过HandlerMapping维护的请求和Controller映射信息,找到相应的Controller组件处理请求

3).执行Controller组件约定方法处理请求,在约定方法中可以调用Service和DAO等组件完成数据库操作 约定方法可以返回一个ModelAndView对象,封装了模型数据和视图名称信息。

4).控制器接收ModelAndView之后,调用ViewResolver组件,定位View的JSP并传递Model信息,生成响应 界面结果。

四.描述利用Spring MVC如何实现登录检查控制。

1) 创建拦截器组件,实现拦截器接口HandlerInterceptor;

2) 在preHandle方法中,通过session获取登录信息,若登录信息为空,则重定向到登录功能,否则允许继续访问;

3) 在Spring配置文件中,声明该拦截器,使其拦截除了登录功能之外的所有请求;

五.介绍几种Spring MVC的异常处理方法

1)使用SimpleMappingExceptionResolver

2)使用自定义ExceptionResolver组件

3)使用@ExceptionHandler注解

六.列举MyBatis的常用API及方法。

在使用MyBatis框架时,主要涉及以下几个API:

1.SqlSessionFactoryBuilder该对象负责根据MyBatis配置文件SqlMapConfig.xml构建SqlSessionFactory实例。

2.SqlSessionFactory每一个MyBatis的应用程序都以一个SqlSessionFactory对象为核心。该对象负责创建SqlSession对象实例。

3.SqlSession该对象包含了所有执行SQL操作的方法,用于执行已映射的SQL语句。

七.简述对Ajax的理解

AJAX是Asynchronous JavaScript and Xml 异步的JavaScript和Xml。它一种用来改善用户体验的技术,其实质是,使用XMLHttpRequest对象异步地向服务器发请求。服务器返回部分数据,而不是一个完整的页面,以页面无刷新的效果更改页面中的局部内容。

八.简述使用AJAX进行编程的步骤

  1. 获取AJAX对象:获取 XMLHttpRequest对象。

  2. 创建请求:调用XMLHttpRequest对象的open方法。

  3. 设置回调函数:为AJAX对象的 onreadystatechange事件设定响应函数。

  4. 发送请求:调用Ajax对象的send方法。

九.简述对JSON的理解

JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON采用完全独立于语言的文本格式。

十.有6种请求方式:GET, POST,DELETE,head,Put,Options.

十一.cookie和session
  其实cookies是由网络服务器存储在你电脑硬盘上的一个txt类型的小文件,它和你的网络浏览行为有关,所以存储在你电脑上的cookies就好像你的一张身份证,cookies的作用主要是,当你访问了某些网页,并且对网页的一些设置进行修改,cookies就能跟踪并记录到这些修改,当你下一次访问这个网页的时候,这个网页会分析你电脑上的cookies,进而采取措施像你返回更符合你个性化的网页;
Session是在无状态的HTTP协议下,服务端记录用户状态时用于标识具体用户的机制。它是在服务端保存的用来跟踪用户的状态的数据结构,可以保存在文件、数据库或者集群中。在浏览器关闭后这次的Session就消失了,下次打开就不再拥有这个Session。
Session是存储在服务器端的,Cookie是存储在客户端的。

码字不易,点个赞吧。๑乛◡乛๑
如果有什么错误或者不当之处,请大家批评指正,一起学习交流!

  • 16
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值