三十二道java程序要经典面试题及答案

来源:互联网 发布:淘宝客活动怎么取消 编辑:程序博客网 时间:2024/05/17 17:16


第一,谈谈final, finally, finalize的区别。

答:1、final修饰符(关键字),如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract,又被声明为final。将变量或方法声明为final,可以保证它们在使用不被改变。其初始化可以在两个地方:一是其定义处,也就是说在final变量时直接给其赋值;二是在构造函数中。这两个地方只能选其一,要么在定义时直接给其赋值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重写(override)。

2、finally,在异常处理时提供finally块来执行任何清除操作。如果抛出一个异常,那么相匹配的catch子句就会执行,然后控制就会进入finally块(如果有的话)。

3、finalize,finalize是方法名。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的处理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。

第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

答:匿名内部类必须继承一个父类或者实现一个接口,所以匿名内部类可以继承其他类,也可以实现其他接口。

第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。

答:1、nested class (一般是C++的说法),nested class是合成型聚集关系的另一种表达方式,也就是说nested class也可以用Aggregation表达出来。但是nested class更加精确地表达了一种专用的、紧耦合的关系,尤其是代码生成时,nested class在Java中映射成inline class。比如,计算机专用开关电源类可以作为计算机类的nested class,但是,电池组类就不一定适合作为计算机的nested class,因为,电池组类表述的是一个过于通用的对象,可能还被包含于模型中的其他设备对象。class A nested in class B,则说明A是一个nested class,一般A是用来完成B中的某种重要功能的。

2、inner class(一般是Java的说法),Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。静态内部类(inner class)意味着:创建一个static内部类的对象,不需要一个外部类对象;不能从一个static内部类的一个对象访问一个外部类对象。

第四,&和&&的区别。

答:&和&&都可以用作逻辑的运算符,表示逻辑关系与(end),但运算两边都是true的时候,结果为true,如果运算结果的两边有一个结果是false,结果就为false。&&具有短路功能,既但第一个表达式为false的时候,就不会在计算第二个表达,返回的结果为false。&还可以作为位运算符,当&操作符两边不是boolean类型的时候,&表示按位与操作。

第五,HashMap和Hashtable的区别。

答:1、HashMap: Hash table based implementation of theMap interface. This implementation provides all of the optional map operations, and permitsnull values and thenull key. (The HashMap class is roughly equivalent toHashtable, except that it is unsynchronized and permits nulls.) This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

2、HashTable:This class implements a hashtable, which maps keys to values. Any non-null object can be used as a key or as a value. 

以上两点来自API中HashMap和Hashtable的第一段对它们的描述。更加详细的区别如下:

1、HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。(在HashMap的API中有说明)

2、HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3、HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4、HashTable使用Enumeration,HashMap使用Iterator。

5、HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。

6、哈希值的使用不同,HashTable直接使用对象的hashCode。

第六,Collection 和 Collections的区别。

答:1、Collection:The root interface in thecollection hierarchy. A collection represents a group of objects, known as itselements. Some collections allow duplicate elements and others do not. Some are ordered and others unordered. The JDK does not provide anydirect implementations of this interface: it provides implementations of more specific subinterfaces likeSet andList. This interface is typically used to pass collections around and manipulate them where maximum generality is desired.

2、This class consists exclusively of static methods that operate on or return collections. It contains polymorphic algorithms that operate on collections, "wrappers", which return a new collection backed by a specified collection, and a few other odds and ends. 

1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

第七,什么时候用assert.

答:assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出.一般来说,assertion用于保证程序最基本、关键的正确性.assertion检查通常在开发和测试时开启.为了提高性能,在软件发布后,assertion检查通常是关闭的.

第八,GC是什么? 为什么要有GC?

答:gc:Runs the garbage collector.Calling thegc method suggests that the Java Virtual Machine expend effort toward recycling unused objects in order to make the memory they currently occupy available for quick reuse. When control returns from the method call, the Java Virtual Machine has made a best effort to reclaim space from all discarded objects.

第九,String s = new String("xyz");创建了几个String Object?

答:这个问题很复杂,参见:http://rednaxelafx.iteye.com/blog/774673#comments

第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

答:Math.round(11.5) == 12;

Math.round(-11.5) == -11;

第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?

答:short s1 = 1;s1 = s1 + 1 ;  在计算s1 = s1 + 1时,后面的s1被转化为int类型,造成类型不匹配。short s1 = 1; s1 += 1;没有什么错。

第十二,sleep() 和 wait() 有什么区别?

答:sleep() :Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

wait():Causes the current thread to wait until another thread invokes thenotify() method or the notifyAll()method for this object. In other words, this method behaves exactly as if it simply performs the callwait(0).  The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notifymethod or thenotifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.  

第十三,Java有没有goto?

答:Java用带标签的continue和break语句能够完全代替goto的功能,所以Java中没有goto。

第十四,数组有没有length()这个方法? String有没有length()这个方法?

答:数组中没有length()方法,但是有length属性。String类有length()方法,返回字符串的长度。

第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?

答:方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常进行重载.

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

答:通过hashCode和equals来保证Set中的元素不重复。Java中的八种原生数据类型的比较用==,但比较的是对象的时候,==是比较两个对象的内存地址是否相同,equals()比较的是两个对象的值是否相同。

第十七,给我一个你最常见到的runtime exception.

第十八,error和exception有什么区别?

答:exception:1、可以是被控制的(checked)或不可以被控制的(unchecked);2、表示一个由程序员导致的错误;3、应该在应用程序级被处理。

error:1.总是不可控制的;2、经常用来表示系统错误或底层资源错误;3、如果可能的话应该在系统级被捕捉。

第十九,List, Set, Map是否继承自Collection接口?

答:Set和List直接继承自Collection接口,而Map不是继承自Collection接口。

第二十,abstract class和interface有什么区别?

答:1、abstract class在java中表示的是一种继承关系,一个类只能使用一次继承关系,但是一个类可以现实多个interface;2、在abstract class中可以用自己的数据成员,也可以有非abstract的成员方法,而在interface中只能有静态的、不可被修改的数据成员,所有的方法都是abstract的;3、abstract class和interface反映出的设计理念不同,abstract class表示的“is-a”的关系,而interface表示“like-a”的关系;4、实现抽象类和接口的类必须实现其中所有的方法,抽象类中可以有非抽象方法,但是接口中的方法不能有实现的方法;5、接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值;6、抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值;7、接口中的方法默认都是 public,abstract 类型的。

  第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

第二十二,接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?

答:接口可以继承接口,抽象类可以实现接口

第二十三,启动一个线程是用run()还是start()?

答:启动一个线程用start()。

第二十四,构造器Constructor是否可被override?

答:构造方法只能被继承,不能被重写。

第二十五,是否可以继承String类?

答:String类不可被继承,因为String类是一个final类。

第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

答:其它线程可以进入此对象的非同步的其它方法,不能进入其它的同步方法。

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

答:在程序抛出一个异常之后,进入相应的catch子句,

  第二十八,编程题: 用最有效率的方法算出2乘以8等於几?

第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hashcode,这句话对不对?

答:不对,当hashcode的值不同的,equals比较出来的值一定不同。

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

  第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

  第三十二,编程题: 写一个Singleton出来。