最近有很多学生,经常问我一些关于企业招聘的一些面试问题!现在企业的面试题趋向思维与口才的人才选拔,其中我给大家归纳总结了一下,答案是灵活的,答案只针对我个人的归纳!希望对大家面试有些用处···
*********************************孤单的分割线******************************************
一.谈谈你对Java知识体系层次结构的理解?就是你认为学习Java应该重点把握那些知识方面。那么你自己对这么知识体系,哪些方面掌握的比较成熟?
【解题的思维】
Java的学习除了最基本的语法,程序语句控制块之外,有4个方面你必须重点的掌握:
$1__VE_ITEM__l Java面向对象
$1__VE_ITEM__l Java集合类框架
$1__VE_ITEM__l Java的IO
$1__VE_ITEM__l Java的数据库编程
答题的时候一定把握住你自己对哪些知识点的熟练程度,我敢肯定的告诉你:你只要答出你对某一方面的知识点的掌握说非常好,面试官一定会继续的向你追问你对这个知识点的层次的掌握。此时你若答的没有如期的效果,那此时你的面试效果就被大打折扣。所以你回答你那么方面掌握的比较好的时候,一定要注意说辞,表明你对知识的掌握程度,主要分:了解、熟悉、掌握、熟练、精通等5个不同的层次去描述。
二.对上面的1个面试问题,若你答出的是我说的上述点:那么面试官也会问你:请问为什么你觉得重点掌握的是这4点呢?那么Java的网络、反射、线程等等不是重点掌握的方向么?说说你的理由?
【解题的思维】
此时遇见面试官这样比较变态的问题的时候,一定要谈定!此时应该拿出来你应该具有的口才去回答这样的问题。你可以说Java的网络、反射、线程当然是重点,但是这些知识点就对目前的初学者来说,只需要到一个熟悉—熟练的程序就OK了,因为这些知识点主要是在写底层框架的时候,得以体现出它们的价值。对一个初学者来说,应该把精力放到经常用到的知识点方面,不掌握Java的网络、反射、线程也不会影响到你后面的学习。用李翊老师最精典的一句话来说:就是公司没有给你写这些底层框架的机会!所以我觉得重点掌握的还是经常用到的方面!等公司需要哪些知识点时候,再去精通的掌握!活学活用
三.谈谈你对Java面向对象的理解?你在哪些应用领域里面运用到Java面向对象的这个特点?谈谈你用到Java面向对象的时候,起到了哪些好处?
【解题的思维】
像这类的问题,一定注意面试管的意图是什么:不是要你答出Java面向对象的特征是什么?你可以自己问自己答也行,说出Java的面向对象的三大特征:继承、封装、多态。但这不是问题的重点。问题的重点是Java面对对象的理解?
大家都知道我们面向对象是一种编程思想,在这种思想里面,有很重要的一个理念:那就是万物皆对象。那么也就是说我们现实生活中只要是物体,都能用对象来表示!那么也就是说我们可以用Java类去描述一个对象,这样Java类去模拟现实事物
对于Java面向对象的运用的领域,在Java中就有很深刻的体现,大家都知道我们的8种基本数据类型吧?那么请问:Java不是面向对象的语言么,不是万物皆对象么?为什么我们怎么用面向对象去表示这8种基本数据类型呢?是的,很显然在Java里面只要是对象,必须会用Object超类的8大重要的方法,然后再基本数据类型里面是没有的。对此,SUN提出了另外一种包装类,对这个8种基本数据类型进行包装!这也就是我们的8种包装类的由来!
我们用到Java面向对象的编程的时候,应用的也是非常多的,比如:我们常常需要描述老师与学生之间的关系的时候,那么很显然我们必须要创建出teacher和student两个类,用这两个类去对老师和学生的数据信息进行封装!当然描述这种关系的时候,如果不创建这两个类,也能表示事物之间的业务逻辑之间的关系,那么也是可以!那么这就是典型的面向过程的编程思想,因此会对我们程序的理解很不利,杜绝“一个Main方法干到底”!!
四.Java的语言细节?Java作为一门优秀的面向对象的程序设计语言,正在被越来越多的人使用。本文试图列出作者在实际开发中碰到的一些Java语言的容易被人忽视的细节,希望能给正在学习Java语言的人有所帮助。
(1)static关键字在Java中怎么使用?static 有那些特点和使用的“局限”?static在java中到底代表什么,为何要用它?
static――静态――“指定位置“——持久层
首先,我们来看看java的内存:java把内存分为栈内存和堆内存,栈内存用来存放一些基本类型的变量和数组及对象的引用变量,而堆内存主要是来放置对象的。
用static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-static storage。这个“固定位置”也就是有些书籍里面提到的持久层概念。 既然要有“固定位置”那么他们的“大小”似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。也就是说持久层就是为了达到一个共享的目的!static修饰的东西就达到了这一点!所以它不跟对象走,而直接可以通过类名直接调用!
在Java中有一个特殊的static方法,java的主类中main()方法本身就是一个static的,所以main方法的执行就是在没有产生新的实例的情况;对于静态的东西,JVM在加载类时,就在內存中开辟了这些静态的空间。
(2)什么是Native Method?你见过没?
大家可以知道我们Object里面最重要的8大方法,全部都是native修饰的!
简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern “C”告知C++编译器去调用一个C的函数。
“A native method is a Java method whose implementation is provided by non-java code.”
在定义一个native method时,并不提供实现体(有些像定义一个java interface),因为其实现体是由非java语言在外面实现的。
(3)听说过常量池、线程池、数据库连接池、对象池的概念没?
A.大家可能经常的见到这样的面试题:
String s = new String(“xyz”);创建了几个String Object? 很显然是两个,但是请问为什么呢?
在这里我们先介绍一个高级概念:常量池
JVM虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量8种对应的基本数据类型(或者包装类型)和String字符串常量类型,对于String常量,它的值是在常量池中的。而JVM中的常量池在内存当中是以表的形式存在的, 对于String类型,有一张固定长度的CONSTANT_String_info表用来存储文字字符串值,注意:该表只存储文字字符串值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了,其中常量池本身也属于持久层的。
也就是说”xyz”是一个String常量,本身就是一个对象,放在常量池中,在通过new String(“xyz”)又创建了一个字符串引用对象!于是就有两个对象
B.线程池:
假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。那么会非常的消耗性能,浪费内存空间。那么在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目,而如果服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池大小是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处理请求时浪费时间,从而提高效率。
假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。
如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。
线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。
C.对象池技术的基本原理(和数据库连接池的概念理解类似)
对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。
实现一个对象池,一般会涉及到如下的类:
1)对象池工厂(ObjectPoolFactory)类
2)参数对象(ParameterObject)类
3)对象池(ObjectPool)类
4)池化对象工厂(PoolableObjectFactory)类
(4)位移运算越界怎么处理,考察下面的代码输出结果是多少?
int a=5;
System.out.println(a<<33); //10
按照常理推测,把a左移33位应该将a的所有有效位都移出去了,那剩下的都是零啊,所以输出结果应该是0才对啊,可是执行后发现输出结果是10,为什么呢?因为Java语言对位移运算作了优化处理,Java语言对a<<B转化为A<<(B%32)来处理,所以当要移位的位数B超过32时,实际上移位的位数是B%32的值,那么上面的代码中A<<33相当于A<<1,可以看着是一个循环的过程。
(5)可以让i!=i吗?神马东西自己都不等于它自己?什么数据用Java语言都无法表示出来?
当你看到这个命题的时候一定会以为我疯了,或者Java语言疯了。这看起来是绝对不可能的,一个数怎么可能不等于它自己呢?或许就真的是Java语言疯了,不信看下面的代码输出什么?
double i=0.0/0.0;
if(i==i){
System.out.println(“Yes i==i”);
}else{
System.out.println(“No i!=i”);
}
上面的代码输出”No i!=i”,为什么会这样呢?关键在0.0/0.0这个值,在IEEE 754浮点算术规则里保留了一个特殊的值用来表示一个不是数字的数量。这个值就是NaN(“Not a Number”的缩写),对于所有没有良好定义的浮点计算都将得到这个值,比如:0.0/0.0;其实我们还可以直接使用Double.NaN来得到这个值。在IEEE 754规范里面规定NaN不等于任何值,包括它自己。所以就有了i!=i的代码。
五.有趣的面试题:
请问在Java里面:
$1__VE_ITEM__1) “A”和’a’ 有啥区别?
$1__VE_ITEM__2) “;”和’;’代表什么啥东西?
$1__VE_ITEM__3) a++和a=a+1的区别?
$1__VE_ITEM__4) a=10,b=20在不使用第三方变量的情况下,交换a和b的值
$1__VE_ITEM__5) 循环一百次值是多少?
int b=3;
for(int i=0;i<=100;i++){
b=b++;
}
System.out.println(“b=”+b);
$1__VE_ITEM__6) 判断是否为奇偶数,这样做对么?
int i=?;
if(i%2==1){
System.out.println(“是奇数!”);
}else{
System.out.println(“不是奇数!”);
}
$1__VE_ITEM__7) int a = 4;在下列两种情况之下b的值是多少?
情况一:if(a<3 & (b=a)==0)
情况二:if(a<3 && (b=a)==0)
$1__VE_ITEM__8) OK不OK的问题?
double a=2.0,b=1.1,c=0.9;
if(a-b==c){
System.out.println(“OK”);
}else{
System.out.println(“不OK”);
}
$1__VE_ITEM__9) 眼睛请放大,这语句对不?
while();{}
for(int i=0:i<n:i++){}
do{} while()
$1__VE_ITEM__10) 请问if语句结束之后,d的值?
int a=0;b=1;c=2;d=4;
if(a>b)
if(a<2)
d=a;
else
d=b;
System.out.println(d);
$1__VE_ITEM__11) 最后结果是多少?
int a=1;
switch(a++){
case 1:a++;
case 2:a++;
case 3:a++;
case 4:a++;
case 5:a++;
default:a++;
}
System.out.println(a);
$1__VE_ITEM__12) 有趣的现象:
public static void main(String[] args){
char[] c1={‘1′,’2′,’3’};
System.out.println(c1); //不打印内存地址,直接打印其值,为什么?
}
13) 是否可以继承String类?String类是final类故不可以继承。还有那些类是不能被继承的
六,列出你学过的Java的设计模式,谈谈你对设计模式的理解,以及你平时用到的设计模式有哪些?
【解题的思维】
最常见的是我们的单例设计模式、创建对象用的工厂设计模式、SpringAOP里面的代理模式,Filter类里面的回调模式、在Android应用里面最常见的适配器模式、经典的JavaIO设计里面的装饰器模式等等。
public class Singleton {
private Singleton(){}
//在自己内部定义自己一个实例,是不是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance;
}
}
其他形式:
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
Java中的23种设计模式:
Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
Observer(观察者模式), State(状态模式), Strategy(策略模式),
Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
七,排序都有哪几种方法?请列举。用JAVA实现一个快速排序。
【解题的思维】
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
快速排序的伪代码。
/ /使用快速排序方法对a[0:n-1]排序
从a[ 0 :n- 1 ]中选择一个元素作为middle,该元素为支点
把余下的元素分割为两段left 和right,使得left中的元素都小于等于支点,而right 中的元素都大于等于支点
递归地使用快速排序方法对left 进行排序
递归地使用快速排序方法对right 进行排序
所得结果为left + middle + right
八,大家都知道Java对象都有一个具体的生命周期,但是我们只知道一味的创建对象,从未考虑过,该对象到底是怎么回收的,Java到底怎么处理这鞋我们创建过的对象,或者说是我们应该如何把握才能是我们在创建对家的时候,保证我们程序执行起来效率最高?
【解题的思维】
Java 语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管 理。由于有个垃圾回收机制,Java中的对象不再有”作用域”的概念,只有对象的引用才有”作用域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使 用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能 实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
九,对一些Java的常见技术名词,要知道他们的意思如JVM、JDK、JRE等;
以下对一些以下在J2EE中常用的名词进行解释(或简单描述)
web 容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接和容器中的环境变量接接口互,不必关注其它系统问 题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。
Web container:实现J2EE体系结构中Web组件协议的容器。这个协议规定了一个Web组件运行时的环境,包括安全,一致性,生命周期管理,事务, 配置和其它的服务。一个提供和JSP和J2EE平台APIs界面相同服务的容器。一个Web container 由Web服务器或者J2EE服务器提供。
EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并 且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。
一个实现了J2EE体系结构中EJB组件规范的容器。
这个规范指定了一个Enterprise bean的运行时环境,包括安全,一致性,生命周期,事务,
配置,和其他的服务。
JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
RMI/IIOP: (Remote Method Invocation /internet对象请求中介协议)
十,在Java中类与类之间,类与接口之间,接口与接口之间各自是一种什么样的关系?
类与类之间是一种单继承的关系,类与接口之间是多实现的关系,接口与接口之间是多继承的关系。
十一,一个“.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。
十二,switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
十三,静态变量和实例变量的区别?
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建
十四,是否可以从一个static方法内部发出对非static方法的调用?
不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
十五,请写出你最常见到的5个runtime exception。
这道题主要考你的代码量到底多大,如果你长期写代码的,应该经常都看到过一些系统方面的异常,你不一定真要回答出5个具体的系统异常,但你要能够说出什么是系统异常,以及几个系统异常就可以了,当然,这些异常完全用其英文名称来写是最好的,如果实在写不出,那就用中文吧,有总比没有强!
所谓系统异常,就是…..,它们都是RuntimeException的子类,在jdk doc中查RuntimeException类,就可以看到其所有的子类列表,也就是看到了所有的系统异常。我比较有印象的系统异常有:NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
十六,同步和异步有何异同,在什么情况下分别使用他们?举例说明。
如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
下面两个方法同步吗?(自己发明)
class Test{
synchronized static void sayHello3(){···}
synchronized void getX(){···}
}
十七,Collection 和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
十八,说出一些常用的类,包,接口,请各举5个
要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer
java.util.Date,System,Class,ArrayList,HashMap
常用的包:
java.lang
java.io
java.util
java.sql ,
javax.servlet,org.apache.strtuts.action,org.hibernate
常用的接口:
Remote
List
Map
Document NodeList ,
Servlet,
HttpServletRequest,
HttpServletResponse,
Transaction(Hibernate)、Session(Hibernate),HttpSession
十九,java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。在java.io包中还有许多其他的流,主要是为了提高性能和使用方便。
二十,什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
我们有时候将一个java对象变成字节流的形式传出去或者从一个字节流中恢复成一个java对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个java对象变成某个格式的字节流再传输,但是,jre本身就提供了这种支持,我们可以调用OutputStream的writeObject方法来做,如果要让java 帮我们做,要被传输的对象必须实现serializable接口,这样,javac编译时就会进行特殊处理,编译的类才可以被writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现Serializable接口,该接口是一个mini接口,其中没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的。
例如,在web开发中,如果对象被保存在了Session中,tomcat在重启时要把Session对象序列化到硬盘,这个对象就必须实现Serializable接口。如果对象要经过分布式系统进行网络传输或通过rmi等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现Serializable接口。
二十一,能不能自己写个类,也叫java.lang.String?这样做会出现什么样的问题?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。由于在tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。
虽然java提供了endorsed技术,可以覆盖jdk中的某些类,具体做法是….。但是,能够被覆盖的类是有限制范围,反正不包括java.lang这样的包中的类。