Java基础面试题

2014-06-03 06:30:01 阅读( 86 )

2597人 收藏本页

标签:Java面试题

基础知识:
1.Java中的异常处理机制的简单原理和应用。

2.Java的接口和C++的虚类的相同和不同处。

3.垃圾回收的优点和原理。并考虑2种回收机制。

4.你所知道的线程同步的方法。

5.讲一讲析构函数和虚函数的用法和作用。

6.Error与Exception有什么区别?

7.在Java种一个类被声明为final类型,表示了什么意思?

8.描述下最常用的编程风格。

9.Heap和stack有什么区别。

10.如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算。

11.如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现。

12.谈谈final,finally,finalize的区别。

13.Anonymous Inner Class(匿名内部类)是否可以extends(继承)其他类,是否可以implement(实现)interface(接口)?

14.Static Nested Class和Inner Class的不同。

15.HashMap和Hashtable的区别。
1)历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java1.2引进的Map接口的一个实现。
2)同步性:Hashtable是线程安全的,是同步的,而HashMap是线程不安全的,不是同步的
3)值:只有HashMap可以设置一个null键(Key)和多个null值(value)。
16.Collection和Collections的区别。

17.什么时候用assert。

18.GC是什么?为什么要有GC?

19.String s=new String(“xyz”); 创建了几个String Object?

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

21.short s1 = 1; s1 = s1+1; 有什么错? short s1 = 1; s1 += 1; 有什么错?

22.sleep() 和 wait() 有什么区别?

23.Java有没有goto?

24.数组有没有length()这个方法?String有没有length()这个方法?

25.Overload和Override区别。Overloaded的方法是否可以改变返回值的类型?

26.Set里德元素是不能重复的,那么用什么方法来区分重复与否?是用==还是equals()?它们有何区别?

27.给出最常见到的runtiem exception。

28.List,Set,Map是否继承自Collection接口?

29.abstract class和interface有什么区别?

30.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

31.接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承实体类?

32.启动一个线程是用run()还是start()?

33.构造器Constructor是否可被override?

34.是否可以继承String类?

35.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

36.try{}里有一个return语句,那么紧跟在这个try后的finally{}里德code会不会被执行,什么时候被执行,在return前还是后?

37.用最有效率的方法算出2乘以8等于几?

38.两个对象值相同(x.equals(y)==true),但却可有不同的hashcode,对么?

39.当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

40.switch是否能作用在byte上,long和String上?

41.写一个Singleton。

42.描述一下JVM加载class文件的原理机制?
1)java中的所有类,必须被加载到JVM中才能运行,这个装载工作是由JVM中的类装载器完成的。类装载器嗦做的工作实质是把类文件从硬盘读取到内存中。
2)java中的类大致分为三种:
a)系统类
b)扩展类
c)由程序员自定义的类
3)装载类的方法有两种:
a)隐式装载:程序运行中当通过new等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
b)显式装载:通过class.forname()等方法,显式加载需要的类。
4)类加载的动态性体现
一个应用程序总是由n多个类组成,Java程序启动时,并不是一次性把所有的类全部加载后再运行。它总是先保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销。
5)java类装载器
Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下:
BootstrapLoader —负责加载系统类
|
– ExtClassLoader —负责加载扩展类
|
–AppClassLoader —负责加载应用类
一方面是分工,各自负责各自的区块,另一方面为了实现委托模型。
6)类加载器之间是如何协调工作的

http://hwhuang.iteye.com/blog/808214

7)预先加载与依需求加载
Java 运行环境为了优化系统,提高程序的执行速度,在 JRE 运行的开始会将 Java 运行所需要的基本类采用预先加载( pre-loading )的方法全部加载要内存当中,因为这些单元在 Java 程序运行的过程当中经常要使用的,主要包括 JRE 的 rt.jar 文件里面所有的 .class 文件。
当 java.exe 虚拟机开始运行以后,它会找到安装在机器上的 JRE 环境,然后把控制权交给 JRE , JRE 的类加载器会将 lib 目录下的 rt.jar 基础类别文件库加载进内存,这些文件是 Java 程序执行所必须的,所以系统在开始就将这些文件加载,避免以后的多次 IO 操作,从而提高程序执行效率。
8)自定义类加载机制
利用java提供的java.net.URLClassLoader类就可以实现。
try{
URL url = new URL(“file:/d:/test/lib/”);
URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class c = urlCL.loadClass(“TestClassA”);
TestClassA object = (TestClassA)c.newInstance();
object.method();
}catch(Exception e){
e.printStackTrace();
}
9)类加载器的阶层体系
Java的类加载器的工作原理:
当执行 java ***.class 的时候, java.exe 会帮助我们找到 JRE ,接着找到位于 JRE 内部的 jvm.dll ,这才是真正的 Java 虚拟机器 , 最后加载动态库,激活 Java 虚拟机器。虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所撰写而成,这个 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前产生的 ExtClassLoader 实体。这两个加载器都是以静态类的形式存在的。这里要请大家注意的是, Launcher$ExtClassLoader.class 与 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有关系。
43.试举例说明一个典型的垃圾回收算法。

44.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来。

45.请写一个java程序实现线程连接池功能。

46.给定一个C语言函数,要求实现在java类中进行调用。

47.在控制台输入一组数字后,排序后在控制台输出。

48.列出某文件夹下的所有文件。

49.调用系统命令实现删除文件的操作。

50.实现从文件中一次读出一个字符的操作。

51.列出一些控制流程的方法。
顺序结构、选择结构(if语句,switch语句)、循环结构(for语句,while语句,do-while)
52.多线程有哪些状态?
1)新状态:线程已被创建但未执行(start()未被调用)
2)可执行状态:线程可以执行,虽然不一定正在执行。CPU时间随时可能被分配给该线程,从而使得它执行。
3)死亡状态:正常情况下run() 返回使得线程死亡。调用stop() 或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。
4)阻塞状态:线程不会被分配CPU时间,无法执行。
53.编写了一个服务器端的程序实现客户端输入字符然后再控制台上显示,直到输入“END”为止,让你写出客户端的程序。

54.作用域public,private,protected,以及不写时的区别。
public是对所有用户开发,所有用户都可以直接进行调用。
private是私有的,除了class自己之外任何用户都不可以直接调用。
protected是受保护的,子孙和同一个package能调用。
不写时默认为 friendly 只有同一个package能调用。
55.ArrayList和Vector的区别。
1)同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。
2)数据增长:Vector默认增长为原来一倍,而ArrayList却是原来的一半。
56.char型变量中能不能存贮一个中文汉字?为什么?
能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以能放中文。
57.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
多线程有2种实现方法:继承Thread类与实现Runnable接口。
同步的实现方法有两种:分别是synchronized,wait与notify。
58.float f=3.4是否正确?
不正确,应该强制类型转换,如:float f = (float)3.4
59.介绍java种的Collection FrameWork。

60.String与StringBuffer的区别。
String长度不可变,StringBuffer的长度可变。如果对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。

编程题:
1.现在输入n个数字,以逗号分开;然后可选择升或者降序排列;按提交键就在另一页面显示。按什么排序结果就为什么。提供reset。

2.金额转换,阿拉伯数字的金额转换成中国传统的形式
如(¥1011)->(一千零一拾一元整)输出

3.会打印出什么?
package test;
public class FatherClass
{
public FatherClass()
{
System.out.println(“FatherClass Create”);
}
}

package test;
import test.FatherClass;
public class ChildClass extends FatherClass
{
public ChildClass()
{
System.out.println(“ChildClass Create”);
}
public static void main(String[] args)
{
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
答案:FatherClass Create
FatherClass Create
ChildClass Create
4.内部类的实现方式?

5.用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?

6.用Java实现一种排序,JAVA类实现序列化的方法(两种)?如在Collection框架中,实现比较要实现什么样的接口?

7.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

8.JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。

来自IT公司面试手册

下一篇:30 Java Interview Questions

上一篇:java interview questions and answers

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息: 面试题