JAVA 企业面试题
面试题集
面试题集共分为以下十部分:
一、 Core Java: 1 — 95 题 1 — 24 页
基础及语法: 1 — 61 题 1 — 13 页
异常: 62 — 69 题 13 — 15 页
集合: 70 — 80 题 15 — 18 页
线程: 81 — 90 题 18 — 21 页
IO & Socket: 91 — 95 题 21 — 24 页
二、 OOAD & UML: 96 — 101 题 24 — 25 页
三、 XML: 102 — 105 题 26 — 29 页
四、 SQL: 106 — 109 题 29 — 31 页
五、 JDBC & Hibernate: 110 — 121 题 31 — 35 页
六、 Web: 122 — 161 题 35 — 44 页
八、数据结构 & 算法 & 计算机基础: 180 — 187 题 48 — 51
页
一、CoreJava 部分:(共 95 题:基础 91 道,中等难度 4 道)
基础及语法部分:(共 61 题:基础 60 道、中等难度 1 道)
1、面向对象的特征有哪些方面? 【基础】
答:面向对象的特征主要有以下几个方面:
1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面, 以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问 题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方
面,一是过程抽象,二是数据抽象。
2)继承:继承是一种联结类的层次模型,并且允许和鼓励类的重 用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有 的类中派生 ,这个过程称为类继承。 新类继承了原始类的特性 ,新类 称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或
增加新的方法使之更适合特殊的需要。
3)封装:封装是把过程和数据包围起来,对数据的访问只能通过 已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被 描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口
访问其他对象。
4)多态性:多态性是指允许不同类的对象对同一消息作出响应。 多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、
行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
2、作用域 public,private,protected,以及不写时的区别?【基础】
答:区别如下:
作用域当前类同包子孙类其他
public √ √ √ √
protected √ √ √ ×
default √ √ × ×
private √ × × ×
不写时默认为 default。
3、 String 是最基本的数据类型吗? 【基础】
答:不是。
4、float 型 float f=3.4 是否正确? 【基础】
答:不正确;精度不准确,应该用强制类型转换 ,如下所示:float
f=(float)3.4 。
5、语句 float f=1.3;编译能否通过?【基础】
答:不能;应该用强制类型转换 ,如下所示:float f=(float)1.3;。
6、 short s1 = 1; s1 = s1 + 1;有什么错?
short s1 = 1; s1 += 1;有什么错? 【基础】
答:short s1 = 1; s1 = s1 + 1;s1+1 运算结果是 int 型,需要强
制转换类型;
short s1 = 1; s1 += 1;可以正确编译,自动类型提升。
7、Java 有没有 goto? 【基础】
答:goto 是 java 中的保留字,现在没有在 java 中使用。
8、 int 和 Integer 有什么区别? 【基础】
答:Java 提供两种不同的类型:引用类型和原始类型(或内置类
型);
int 是java 的原始数据类型,Integer 是java 为 int 提供的封装类。
Java 为每个原始类型提供了封装类:
原始类型: boolean,char,byte,short,int,long,float,double
封 装 类 型 :Boolean ,Character ,Byte ,Short ,Integer ,
Long ,Float ,Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。 引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度 问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型 用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省
值为 null ,而原始类型实例变量的缺省值与它们的类型有关。
9、 &和&&的区别?【基础】
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻
辑与(and)。
10、简述逻辑操作(&,|,^)与条件操作(&&,||)的区别?【基础】
答:区别主要有两点:a.条件操作只能操作布尔型的,而逻辑操作
不仅可以操作布尔型,而且可以操作数值型
b.逻辑操作不会产生短路。
11、 heap 和 stack 有什么区别?【基础】
答:栈是一种线形集合,其添加和删除元素的操作应在同一段完
成,栈按照后进先出的方式进行处理;堆是栈的一个组成元素。
12、 Math.round(11.5) 等于多少? Math.round(-11.5)等于多少?
【基础】
答:Math.round(11.5)==12 Math.round(-11.5)==-11 round
方法返回与参数最接近的长整数,参数加
1/2 后求其 floor。//floor 取上限
13、 swtich 是否能作用在 byte 上,是否能作用在 long 上,是否
能作用在 String 上? 【基础】
答:switch(expr1)中,expr1 是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。
long,string 都不能作用于 swtich。
14、编程题: 用最有效率的方法算出 2 乘以 8 等於几? 【基础】
答: 2 << 3。
15、有没有 length()这个方法? String 有没有 length()这个方法?
【基础】
答:数组没有 length()这个方法,有 length 的属性。 String 有
length()这个方法。
16、在 JAVA 中,如何跳出当前的多重嵌套循环?【基础】
答:在最外层循环前加 label 标识,然后用 break:label 方法即可跳
出多重循环。
ok:
for(int i=0;i<10;i++){
for (int v=0 ;v<10;v++){
System.out.println("v==="+v);
if(v==6){
break ok;
}
}
}
17、构造器 Constructor 是否可被 override? 【基础】
答:构造器 Constructor 不能被继承,因此不能重写 Overriding ,
但可以被重载 Overloading。
18、两个对象值相同(x.equals(y) == true),但却可有不同的
hash code,这句话对不对? 【基础】
答:不对,有相同的 hash code。
19、是否可以继承 String 类? 【基础】
答:String 类是 final 类,故不可以继承。
20、以下二条语句返回值为 true 的有:
A:“beijing”==“beijing”;
B : “beijing”.equalsIgnoreCase ( new String
(“beijing”));【基础】
答:A 和 B 。
21、当一个对象被当作参数传递到一个方法后,此方法可改变这 个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是
引用传递? 【基础】
答:是值传递。 Java 编程语言只有值传递参数。当一个对象实例 作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对 象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变
的。
22、我们在 web 应用开发过程中经常遇到输出某种编码的字符,
如 iso8859-1 等,如何输出一个某种编码的字符串?【基础】
答:public String translate(String str){
String tempStr = "";
try{
tempStr = new String(str.getBytes("ISO-8859-1"), "GBK");
tempStr = tempStr.trim();
}catch (Exception e){
System.err.println(e.getMessage());
}
return tempStr;
}
23、 String 和 StringBuffer 的区别? 【基础】
答:JAVA 平台提供了两个类:String 和 StringBuffer,它们可以 储存和操作字符串,即包含多个字符的字符数据。这个 String 类提供 了数值不可改变的字符串。而这个 StringBuffer 类提供的字符串进行 修改。当你知道字符数据要改变的时候你就可以使用 StringBuffer。
典型地,你可以使用 StringBuffers 来动态构造字符数据。
24、 String, StringBuffer StringBuilder 的区别。【基础】
答:String 的长度是不可变的;
StringBuffer 的长度是可变的,如果你对字符串中的内容经常进 行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需
要 String,那么使用 StringBuffer 的 toString()方法;线程安全;
StringBuilder 是从 JDK 5 开始,为 StringBuffer 该类补充了一个 单个线程使用的等价类;通常应该优先使用 StringBuilder 类,因为它
支持所有相同的操作,但由于它不执行同步,所以速度更快。
25、 Overload 和 Override 的区别。 Overloaded 的方法是否可
以改变返回值的类型? 【基础】
答:方法的重写 Overriding 和重载 Overloading 是 Java 多态性 的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现, 重载 Overloading 是一个类中多态性的一种表现。如果在子类中定义 某方法与其父类有相同的名称和参数 ,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对 它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多 个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称 为方法的重载(Overloading)。 Overloaded 的方法是可以改变返回值
的类型。
26、定义类 A 和类 B 如下:【基础】
class A {
int a=1;
double d=2.0;
void show(){
System.out.println("Class A: a="+a +"\td="+d);
}
}
class B extends A{
float a=3.0f;
String d="Java program.";
void show(){
super.show( );
System.out.println("Class B: a="+a +"\td="+d);
}
}
(1) 若在应用程序的 main 方法中有以下语句:
A a=new A();
a.show();
则输出的结果如何?
(2) 若在应用程序的 main 方法中定义类 B 的对象 b:
A b=new B();
b.show();
则输出的结果如何?
答:输出结果为:
1)Class A: a=1 d=2.0 ;
2)Class A: a=1 d=2.0
Class B: a=3.0 d=Java program。
27、描述一下 JVM 加载 class 文件的原理机制? 【基础】
答:JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的 Java 运行时系统组件。它负责在运行时查
找和装入类文件的类。
28、 char 型变量中能不能存贮一个中文汉字?为什么? 【基础】
答:能够定义成为一个中文的,因为 java 中以 unicode 编码, 一
个 char 占 16 个 byte,所以放一个中文是没问题的。
29、 abstract class 和 interface 有什么区别? 【基础】
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方 法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。 然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类 的一个实例。不能有抽象构造函数或抽象静态方法。 Abstract 类的子
类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。
取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实 现这些方法。接口(interface)是抽象类的变体。新型多继承性可通 过实现这样的接口而获得。接口中的所有方法都是抽象的,所有成员 变量都是 public static final 的。 一个类可以实现多个接口,当类实现 特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后, 它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽 象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生 效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符
可以用来决定某对象的类是否实现了接口。
30、 Static Nested Class 和 Inner Class 的不同?【基础】
答:Static Nested Class 是被声明为静态(static)的内部类,它 可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实
例化后才能实例化。
31、java 中会存在内存泄漏吗 ,请简单描述。【基础】
答:会;存在无用但可达的对象,这些对象不能被 GC 回收 ,导致
耗费内存资源。
//例子,全局性的集合与类的 static 变量
会。java 导致内存泄露的原因很明确:长生命周期的对象持有短 生命周期对象的引用就很可能发生内存泄露 ,尽管短生命周期对象已 经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回
收,这就是 java 中内存泄露的发生场景。
1.集合类,集合类仅仅有添加元素的方法,而没有相应的删除机 制 ,导致内存被占用。这一点其实也不明确,这个集合类如果仅仅是 局部变量,根本不会造成内存泄露,在方法栈退出后就没有引用了会 被 jvm 正常回收。而如果这个集合类是全局性的变量(比如类中的静 态属性,全局性的 map 等即有静态引用或 final 一直指向它),那么 没有相应的删除机制 ,很可能导致集合所占用的内存只增不减 ,因此
提供这样的删除机制或者定期清除策略非常必要。
2.单例模式。不正确使用单例模式是引起内存泄露的一个常见问
题 ,单例对象在被初始化后将在 JVM(java 虚拟机)的整个生命周期
中存在(以静态变量的方式),如果单例对象持有外部对象的引用, 那么这个外部对象将不能被 jvm 正常回收,导致内存泄露,考虑下面
的例子:
class A{
public A(){
B.getInstance().setA(this);
}
....
}
//B 类采用单例模式
class B{
private A a;
private static B instance=new B();
public B(){}
public static B getInstance(){
return instance;
}
public void setA(A a){
this.a=a;
}
//getter...
}
显然 B 采用 singleton 模式,他持有一个 A 对象的引用,而这个 A 类的对象将不能被回收。想象下如果 A 是个比较大的对象或者集合
类型会发生什么情况。
上面所讲的这些也启发我们如何去查找内存泄露问题,在代码复 审的时候关注长生命周期对象:全局性的集合、单例模式的使用、类 的 static 变量等等。在 Java 的实现过程中,也要考虑其对象释放,最 好的方法是在不使用某对象时,显式地将此对象赋空。最好遵循谁创
建谁释放的原则。
32 、 abstract 的 method 是否可同时是 static,是否可同时是
native,是否可同时是 synchronized? 【基础】答:都不能。
abstract 的 method 不可以是 static 的,因为抽象的方法是要被
子类实现的,而 static 与子类扯不上关系
native 方法表示该方法要用另外一种依赖平台的编程语言实现 synchronized(加锁)在具体的类方法里面,抽象方法代表不了它
33、静态变量和实例变量的区别?【基础】
答:静态变量也称为类变量,归全类共有,它不依赖于某个对象, 可通过类名直接访问;而实例变量必须依存于某一实例,只能通过对
象才能访问到它。
34、是否可以从一个 static 方法内部发出对非 static 方法的调用?
【基础】
答:不可以,如果其中包含对象的 method(),不能保证对象初始
化。
//可以,对象可以初始化,也可以调用
35、写 clone()方法时,通常都有一行代码,是什么?【基础】
答:Clone 有缺省行为:super.clone(),他负责产生正确大小的
空间 ,并逐位复制。
要说明的有两点:一是拷贝对象返回的是一个新对象,而不是一
个引用。
二是拷贝对象与用 new 操作符返回的新对象的区别就是这个拷贝
已经包含了一些原来对象的信息,而不是对象的初始信息。
36、 GC 是什么? 为什么要有 GC? 【基础】
答:GC 是垃圾收集的意思(Garbage Collection),内存处理是 编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序 或系统的不稳定甚至崩溃 ,Java 提供的 GC 功能可以自动监测对象是 否超过作用域从而达到自动回收内存的目的,Java 语言没有提供释放 已分配内存的显示操作方法。 Java 程序员不用担心内存管理,因为垃 圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之
一:System.gc() 或 Runtime.getRuntime().gc() 。
37、垃圾回收的优点和原理。并考虑 2 种回收机制。【基础】
答:Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理的问题迎刃而解,它使得 Java 程序员在 编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制, Java 中的对象不再有“作用域”的概念,只有对象的引用才有“作用 域”。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内 存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知 的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚 和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进 行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃
圾回收。
38、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内
存吗?有什么办法主动通知虚拟机进行垃圾回收? 【基础】
答:对于 GC 来说 ,当程序员创建对象时,GC 就开始监控这个对 象的地址、大小以及使用情况。通常,GC 采用有向图的方式记录和管 理堆(heap)中的所有对象。通过这种方式确定哪些对象是 "可达的 " , 哪些对象是"不可达的"。 当 GC 确定一些对象为"不可达"时,GC 就有 责任回收这些内存空间。可以。程序员可以手动执行 System.gc(),通
知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。
39、String s=new String(“xyz”);创建了几个 String Object?
【基础】
答:两个对象,一个是存在于堆空间中的对象"xyz",另外一个是存
在于串池中的对象"xyz"。
40、接口是否可继承接口? 抽象类是否可实现(implements)接口?
抽象类是否可继承实体类(concrete class)? 【基础】
答:接口可以继承接口。抽象类可以实现(implements)接口 ,抽
象类可继承实体类 ,但前提是实体类必须有明确的构造函数。
注释:c++的虚类相当于 java 中的抽象类
42、一个“.java”源文件中是否可以包含多个类(不是内部类)?
有什么限制? 【基础】
答:可以;必须只有一个类名与文件名相同。
43、说出一些常用的类,包,接口,请各举 5 个。【基础】
答 :常 用 的 类 :BufferedReader BufferedWriter FileReader
FileWirter
String Integer;
常 用 的 包 :
ng
java.awt java.io java.util java.sql;
常用的接口:Remote List Map Document NodeList
44、Anonymous Inner Class (匿名内部类) 是否可以 extends(继
承)其它类?是否可以 implements(实现)interface(接口)? 【基础】
答:可以继承其他类或实现其他接口,在 swing 编程中常用此方
式。
45、内部类可以引用他包含类的成员吗?有没有什么限制?【基
础】
答:一个内部类对象可以访问创建它的外部类对象的内容。
46、java 中实现多态的机制是什么?【基础】
答:方法的覆盖 Overriding 和重载 Overloading 是 java 多态性 的不同表现;覆盖 Overriding 是父类与子类之间多态性的一种表现,
重载 Overloading 是一个类中多态性的一种表现。
47、在java 中一个类被声明为 final 类型,表示了什么意思?【基
础】
答:表示该类不能被继承,是顶级类。
48、下面哪些类可以被继承? 【基础】
1 )
ng.Thread (T)
2 )
ng.Number (T)
3 )
ng.Double (F)
4 )
ng.Math (F)
5 )
ng.Void (F)
6 )
ng.Class (F)
7 )
ng.ClassLoader (T) //类加载器
答:1、 2、 7 可以被继承。
49、指出下面程序的运行结果: 【基础】
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Hello{
public static void main(String[] ars){
A ab = new B(); //执行到此处,结果: 1a2b
ab = new B(); //执行到此处,结果: 1a2b2b
}
}
答:输出结果为 1a2b2b;类的 static 代码段,可以看作是类首次 加载(虚拟机加载)执行的代码,而对于类加载,首先要执行其基类的构造,
再执行其本身的构造。
50、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出
什么? 【基础】
父类:
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
知识点补充:
四大内部类:成员内部类,方法内部类,静态内部类,匿名内部
类
51、内部类的实现方式? 【基础】
答:示例代码如下:
package test;
public class OuterClass {
private class InterClass {
public InterClass() {
System.out.println("InterClass Create");
}
}
public OuterClass() {
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args) {
OuterClass oc = new OuterClass();
}
}
输出结果为:
InterClass Create
OuterClass Create
52、关于内部类:【基础】
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3 ,Which
two inner class declarations are valid?(Choose two.)
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
答:答案为 C、 E;说明如下:重难点:
1)静态内部类可以有静态成员,而非静态内部类则不能有静态成
员;故 A、 B 错;
2)静态内部类的非静态成员可以访问外部类的静态变量,而不可
访问外部类的非静态变量;故 D 错;
3)非静态内部类的非静态成员可以访问外部类的非静态变量;故
C 正确。
53、数据类型之间的转换:
1)如何将数值型字符转换为数字?
2)如何将数字转换为字符?
3)如何取小数点前两位并四舍五入? 【基础】
答:1)调用数值类型相应包装类中的方法 parse***(String) 或
valueOf(String) 即可返回相应基本类型或包装类型数值;
2)将数字与空字符串相加即可获得其所对应的字符串;另外对于基
本类型数字还可调用 String 类中的 valueOf(…)方法返回相应字符串,而
对于包装类型数字则可调用其 toString()方法获得相应字符串;
3) 可 用 该 数 字 构 造 一 java.math.BigDecimal 对 象 , 再 利 用 其 round()方法进行四舍五入到保留小数点后两位,再将其转换为字符串
截取最后两位。
ava 四舍五入
package Test;
import java.math.BigDecimal; //引入这个包
public class Test {
public static void main(String[] args) {
double i = 3.856;
// 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(3.856)=" + (int)
Math.floor(i)); // 四舍五入取整
System.out.println("四舍五入取整:(3.856)="
+ new BigDecimal(i).setScale(0,
BigDecimal.ROUND_HALF_UP));
// 四舍五入保留两位小数
System.out.println("四舍五入取整:(3.856)="
+ new BigDecimal(i).setScale(2,
BigDecimal.ROUND_HALF_UP));
// 凑整,取上限
System.out.println(" 凑 整 :Math.ceil(3.856)=" + (int)
Math.ceil(i));
// 舍掉小数取整
System.out.println("舍掉小数取整:Math.floor(-3.856)=" + (int)
Math.floor(-i)); // 四舍五入取整
System.out.println("四舍五入取整:(-3.856)="
+ new BigDecimal(-i).setScale(0,
BigDecimal.ROUND_HALF_UP));
// 四舍五入保留两位小数
System.out.println("四舍五入取整:(-3.856)="
+ new BigDecimal(-i).setScale(2,
BigDecimal.ROUND_HALF_UP));
// 凑整,取上限
System.out.println("凑整(-3.856)=" + (int) Math.ceil(-i));
}
}
//打印的结果
舍掉小数取整:Math.floor(3.856)=3
四舍五入取整:(3.856)=4
四舍五入取整:(3.856)=3.86
凑整:Math.ceil(3.856)=4
舍掉小数取整:Math.floor(-3.856)=-4
四舍五入取整:(-3.856)=-4
四舍五入取整:(-3.856)=-3.86
凑整(-3.856)=-3
54、字符串操作:如何实现字符串的反转及替换?【基础】
答:可用字符串构造一 StringBuffer 对象,然后调用 StringBuffer 中的 reverse 方法即可实现字符串的反转,调用 replace 方法即可实现
字符串的替换。
55、编码转换:怎样将 GB2312 编码的字符串转换为 ISO-8859-
1 编码的字符串?【基础】
答:示例代码如下:
String s1 = "你好";
String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1");
56、写一个函数,要求输入一个字符串和一个字符长度,对该字
符串进行分隔。【基础】
答:函数代码如下:
public String[] split(String str, int chars){
int n = (str.length()+ chars - 1)/chars;
String ret[] = new String[n];
for(int i=0; i<="" p="">
if(i < n-1){
ret[i] = str.substring(i*chars , (i+1)*chars);
}else{
ret[i] = str.substring(i*chars);
}
}
return ret;
}
57、写一个函数,2 个参数,1 个字符串,1 个字节数,返回截取 的字符串,要求字符串中的中文不能出现乱码:如(“我 ABC”,4) 应该截为“我 AB”,输入(“我 ABC 汉 DEF”,6)应该输出为“我
ABC”而不是“我 ABC+汉的半个”。【基础】
答:代码如下:
public String subString(String str, int subBytes) {
int bytes = 0; // 用来存储字符串的总字节数
for (int i = 0; i < str.length(); i++) {
if (bytes == subBytes) {
return str.substring(0, i);
}
char c = str.charAt(i);
if (c < 256) {
bytes += 1; // 英文字符的字节数看作 1
} else {
bytes += 2; // 中文字符的字节数看作 2
if(bytes - subBytes == 1){
return str.substring(0, i);
}
}
}
return str;
}
58、日期和时间:
1)如何取得年月日、小时分秒?
2)如何取得从 1970 年到现在的毫秒数?
3)如何取得某个日期是当月的最后一天?
4)如何格式化日期?【基础】
答:1)创建 java.util.Calendar 实例(Calendar.getInstance()),调
用其 get() 方法传入不同的参数即可获得参数所对应的值,如:
calendar.get(Calendar.YEAR);//获得年
2)以下方法均可获得该毫秒数:
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
3)示例代码如下:
Calendar time = Calendar.getInstance();
time.set(Calendar.DAY_OF_MONTH,
time.getActualMaximum(Calendar.DAY_OF_MONTH));
4)利用 java.text.DataFormat 类中的 format()方法可将日期格式
化。
59、Java 编程,打印昨天的当前时刻。【基础】
答:public class YesterdayCurrent{
public static void main(String[] args){
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
}
}
60、java 和 javasciprt 的区别。【基础】
答:JavaScript 与 Java 是两个公司开发的不同的两个产品。 Java
是 SUN 公司推出的新一代面向对象的程序设计语言,特别适合于 Internet 应用程序开发;而 JavaScript 是 Netscape 公司的产品,其 目的是为了扩展 Netscape Navigator 功能,而开发的一种可以嵌入 Web 页面中的基于对象和事件驱动的解释性语言, 它的前身是 Live Script;而 Java 的前身是 Oak 语言。下面对两种语言间的异同作如下
比较:
1)基于对象和面向对象:
Java 是一种真正的面向对象的语言,即使是开发简单的程序,必
须设计对象;
JavaScript 是种脚本语言,它可以用来制作与网络无关的,与用 户交互作用的复杂软件。它是一种基于对象(Object Based)和事件 驱动(Event Driver)的编程语言。因而它本身提供了非常丰富的内部
对象供设计人员使用;
2)解释和编译:
Java 的源代码在执行之前,必须经过编译;
JavaScript 是一种解释性编程语言,其源代码不需经过编译,由
浏览器解释执行;
3)强类型变量和类型弱变量:
Java 采用强类型变量检查,即所有变量在编译之前必须作声明;
JavaScript 中变量声明 ,采用其弱类型。即变量在使用前不需作
声明,而是解释器在运行时检查其数据类型;
4)代码格式不一样。
61、什么时候用 assert?【中等难度】 //没需要
答:assertion(断言)在软件开发中是一种常用的调试方式 ,很多 开发语言中都支持这种机制。 一般来说 ,assertion 用于保证程序最基 本、关键的正确性。 assertion 检查通常在开发和测试时开启。为了提 高性能,在软件发布后 ,assertion 检查通常是关闭的。在实现中,断 言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为
true;如果表达式计算为 false ,那么系统会报告一个 Assertionerror。
断言用于调试目的:
assert(a > 0); // throws an Assertionerror if a <= 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 : Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式;这个值用于生成
显示更多调试信息的 String 消息。
断言在默认情况下是禁用的,要在编译时启用断言,需使用
source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions
标记。
要在系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在 包的基础上启用或者禁用断言。可以在预计正常情况下不会到达的任 何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过, 断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断 言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可 以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何
方式改变程序的状态。
异常部分: (共 8 题:基础 8 道)
62、Java 中的异常处理机制的简单原理和应用?【基础】
答:当 JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会 将发生的错误表示为一个异常。 违反语义规则包括 2 种情况。 一种是 JAVA 类 库 内 置 的 语 义 检 查 。 例 如 数 组 下 标 越 界 , 会 引 发 IndexOutOfBoundsException; 访 问 null 的 对 象 时 会 引 发 NullPointerException。另一种情况就是 JAVA 允许程序员扩展这种语 义检查,程序员可以创建自己的异常,并自由选择在何时用 throw 关
键字引发异常。 所有的异常都是
ng.Thowable 的子类。
63、 error 和 exception 有什么区别? 【基础】
答:error 表示系统级的错误和程序不必处理的异常,是恢复不是 不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指
望程序能处理这样的情况;
exception 表示需要捕捉或者需要程序进行处理的异常,是一种 设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生
的情况。
64、try {}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会不会被执行,什么时候被执行,在 return 前还是后?
【基础】
答:会执行,在 return 前执行。
//此结果为 22 2 在 return 前就执行了,在执行 finally 前把结果
放在不同于 x 的局部变量中,执行 finally 后,取出结果
static int test()
{
intx = 1;
try
{
x++;
return x;
}
finally
{
x++;
System.out.println(22);
}
}
65 、 JAVA 语 言 如 何 进 行 异 常 处 理 , 关 键 字 :
throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛
出异常吗?【基础】
答:Java 通过面向对象的方法进行异常处理,把各种不同的异常 进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象, 它是 Throwable 类或其它子类的实例。当一个方法出现异常后便抛出 一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以 捕获到这个异常并进行处理。 Java 的异常处理是通过 5 个关键词来实 现的:try、 catch、throw、throws 和 finally。一般情况下是用 try 来 执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这 时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺
省处理器来处理;
try 用来指定一块预防所有“异常”的程序;
catch 子句紧跟在 try 块后面,用来指定你想要捕捉的“异常”的
类型;
throw 语句用来明确地抛出一个“异常”;
throws 用来标明一个成员函数可能抛出的各种“异常”;
Finally 为确保一段代码不管发生什么“异常”都被执行一段代码;
可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数
内部写另一个 try 语句保护其他代码。每当遇到一个 try 语句,“异常”
的框架就放到堆栈上面,直到所有的 try 语句都完成。如果下一级的
try 语句没有对某种“异常”进行处理,堆栈就会展开 ,直到遇到有处
理这种“异常”的 try 语句。
66、运行时异常与一般异常有何异同?【基础】
答:异常表示程序运行过程中可能出现的非正常状态 ,运行时异 常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。 java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并
不要求必
须声明抛出未被捕获的运行时异常。
67、给我一个你最常见到的 runtime exception?【基础】
答 : ArithmeticException, ArrayStoreException,
BufferOverflowException, BufferUnderflowException,
CannotRedoException, |
CannotUndoException, |
ClassCastException, |
CMMException, |
ConcurrentModificationException, |
DOMException, |
EmptyStackException, |
IllegalArgumentException, |
IllegalMonitorStateException, |
IllegalPathStateException, |
IllegalStateException, |
ImagingOpException, |
IndexOutOfBoundsException, |
MissingResourceException, |
NegativeArraySizeException, |
NoSuchElementException, |
NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException,
UnsupportedOperationException
68、final, finally, finalize 的区别? 【基础】
答:final:修饰符(关键字);如果一个类被声明为 final,意味 着它不能再派生出新的子类,不能作为父类被继承,因此一个类不能 既被声明为 abstract 的,又被声明为 final 的;将变量或方法声明为 final,可以保证它们在使用中不被改变;被声明为 final 的变量必须在 声明时给定初值,而在以后的引用中只能读取,不可修改;被声明为
final 的方法也同样只能使用,不能重载。
finally:再异常处理时提供 finally 块来执行任何清除操作;如果
抛出一个异常,那么相匹配的
catch 子句就会执行,然后控制就会进入 finally 块(如果有的
话)。
finalize:方法名;Java 技术允许使用 finalize() 方法在垃圾收集
器将对象从内存中清除出去之前
做必要的清理工作。 这个方法是由垃圾收集器在确定这个对象没 有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有 的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其
他
清理工作。 finalize() 方法是在垃圾收集器删除对象之前对这个对
象调用的。
69、类 Example A 继承 Exception,类 ExampleB 继承 Example
A;【基础】
有如下代码片断:
try{
throw new ExampleB(“b”);
}catch(ExampleA e ){
System.out.printfln(“ExampleA”);
}catch(Exception e ){
System.out.printfln(“Exception”);
}
输出的内容应该是:
A: ExampleA B:Exception C:b D:无
答:输出为 A。
集合部分:(共 11 题:基础 11 道)
70、介绍 JAVA 中的 Collection FrameWork(及如何写自己的数
据结构)【基础】
答:Collection FrameWork 如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│└Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection 是最基本的集合接口, 一个 Collection 代表一组
Object,即 Collection 的元素(Elements);Map 提供 key 到 value
的映射。
71、 List,Set,Map 是否继承自 Collection 接口?【基础】
答:List,Set 是;Map 不是。
72、你所知道的集合类都有哪些?主要方法?【基础】
答:最常用的集合类是 List 和 Map 。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和 操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情 形。 Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储
元素对(称作“键”和“值”),其中每个键映射到一个值。
73、说出 ArrayList,Vector, LinkedList 的存储性能和特性?【基
础】
答:ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素 数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号 索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引 数据快而插入数据慢 ,Vector 由于使用了 synchronized 方法(线程 安全),通常性能上较 ArrayList 差 ,而 LinkedList 使用双向链表实现 存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只
需要记录本项的前后项即可,所以插入速度较快。
74、 Collection 和 Collections 的区别?【基础】
答:Collection 是 java.util 下的接口,它是各种集合的父接口,
继承于它的接口主要有 Set 和 List;Collections 是个 java.util 下的类,
是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、
排序、 线程安全化等操作。
75、 HashMap 和 Hashtable 的区别? 【基础】
答:二者都实现了 Map 接口,是将惟一键映射到特定的值上;主 要区别在于: 1)HashMap 没有排序,允许一个 null 键和多个 null 值,
而 Hashtable 不允许;
2)HashMap 把 Hashtable 的 contains 方 法 去 掉 了 ,改 成
containsvalue 和 containsKey,因为 contains 方法容易让人引起误解;
3)Hashtable 继承自 Dictionary 类,HashMap 是 Java1.2 引进
的 Map 接口的实现;
4)Hashtable 的方法是 Synchronize 的,而 HashMap 不是,在 多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而
HashMap 就必须为之提供外同步。
Hashtable 和 HashMap 采用的 hash/rehash 算法大致一样,所
以性能不会有很大的差异。
76、Arraylist 与 Vector 区别?【基础】
答:就 ArrayList 与 Vector 主要从二方面来说:
1)同步性:Vector 是线程安全的(同步),而 ArrayList 是线程
序不安全的;
2)数据增长:当需要增长时,Vector 默认增长一倍,而 ArrayList
却是一半。
77、 List、 Map、 Set 三个接口,存取元素时,各有什么特点?
【基础】
答:List 以特定次序来持有元素,可有重复元素。 Set 无法拥有重
复元素,内部排序。 Map 保存 key-value 值,value 可多值。
78、 Set 里的元素是不能重复的,那么用什么方法来区分重复与
否呢? 是用==还是 equals()? 它们有何区别? 【基础】
答:Set 里的元素是不能重复的,用 equals ()方法来区分重复与
否。覆盖 equals()方法用来判断对象的内
容是否相同,而” ==”判断地址是否相等,用来决定引用值是否指
向同一对象。
79、用程序给出随便大小的 10 个数,序号为 1-10 ,按从小到大
顺序输出 ,并输出相应的序号。【基础】
答:代码如下:
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class RandomSort {
public static void printRandomBySort() {
Random random = new Random(); // 创建随机数生成器
List list = new ArrayList();
// 生成 10 个随机数,并放在集合 list 中
for (int i = 0; i < 10; i++) {
list.add(random.nextInt(1000));
}
Collections.sort(list); // 对集合中的元素进行排序
Iterator it = list.iterator();
int count = 0;
while (it.hasNext()) { // 顺序输出排序后集合中的元素
System.out.println(++count + ": " + it.next());
}
}
public static void main(String[] args) {
printRandomBySort();
}
}
80、用 JAVA 实现一种排序, JAVA 类实现序列化的方法?在
COLLECTION 框架中,实现比较要实现什么样的接口?【基础】
答:用插入法进行排序代码如下:
package test;
import java.util.*;
class InsertSort {
ArrayList al;
public InsertSort(int num,int mod) {
al = new ArrayList(num);
Random rand = new Random();
System.out.println("The ArrayList Sort Before:");
for (int i=0;i<="" ;i++="" bdsfid="639" p="">
al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
System.out.println("al["+i+"]="+al.get(i));
}
}
public void SortIt(){
tempInt;
int MaxSize=1;
for(int i=1;i
p="">
tempInt = (Integer)al.remove(i);
if(tempInt.intValue() >=
((Integer)al.get(MaxSize-1)).intValue()){
al.add(MaxSize,tempInt);
MaxSize++;
System.out.println(al.toString());
}else{
for (intj=0;j<="" ;j++="" bdsfid="657" p="">
if (((Integer)al.get(j)).intValue()
>=tempInt.intValue()){
al.add(j,tempInt);
MaxSize++;
System.out.println(al.toString());
break;
}
}
}
}
System.out.println("The ArrayList Sort After:");
for(int i=0;i
p="">
System.out.println("al["+i+"]="+al.get(i));
}
}
public static void main(String[] args){
InsertSort is = new InsertSort(10,100);
is.SortIt();
}
}
JAVA 类实现序例化的方法是实现 java.io.Serializable 接口;
Collection 框 架 中 实 现 比 较 要 实 现 Comparable 接 口 和
Comparator 接口。
线程部分:(共 10 题:基础 7 道,中等难度 3 道)
81、 sleep() 和 wait() 有什么区别? 【基础】
答:sleep 是线程类(Thread)的方法,导致此线程暂停执行指 定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会 自动恢复。调用 sleep 不会释放对象锁。 wait 是 Object 类的方法,对
此对象调用