《java基础常见面试题》由会员分享,可在线阅读,更多相关《java基础常见面试题(33页珍藏版)》请在金锄头文库上搜索。
1、1. 谈谈你对面向对象的理解?【面试题】面向对象是一种程序设计思想,它从人类自然的思维方式出发,认为万物皆对象,世界是由各种具有自己的内部状态和运动规律的对象组成;因此,人们应当按照现实世界的这个本来面貌来理解世界,通过对象来描绘和反映世界,这样建立起来的系统才更加接近于现实世界。 对象是对现实事件的抽象,它有自己的类别,数据和行为,有唯一的存储空间;面向对象的精髓在于:通过封装,继承,多态等特性,实现高内聚低耦合的软件,从而最终提高软件的可重用性,可维护性和可扩展性。(1)封装:封装是指类型的封装,即把数据和行为包装起来形成类,并且使用访问权限修饰符隐藏具体实现,公开外部调用方法。封装它是模
2、块化的基础,封装时需要注意:谁拥有数据,谁就拥有操作数据的方法;比如,人要在黑板上画圆,这一操作涉到:人、黑板和圆三个类;因为画圆时用到的圆心和半径是圆的属性,所以,画圆的方法应该封装到圆这个类中,而不应该分配给人。(2)继承:继承是一种类别之间表述共性的关系模型:一个新的类可以从现有类中派生,从而自动拥有现有类的一些数据和行为;(3)多态:也就是“多种形态”,是指同一个方法,在继承关系的类别中有不同的实现版本,方法的调用会在运行时会根据对象的类型决定。因此多态也叫运行时绑定、动态绑定、或后期绑定。(4)抽象:是分析事物、提取共性的过程,这一过程无需考虑细节实现问题。面向对象有很多的开发原则,
3、比如面向接口编程、优先使用组合而不是继承、将抽象和实现分离等等,在设计模式中,我们能够看到很多他们的影子,因此,了解了设计模式,也就能很好地理解面向对象设计。2. Overload(重载)和 Override(重写/覆盖)的区别?重载可以改变返回值的类型吗?【面试题】(1)重写:重写的方法名称相同,参数列表也相同。重写是是多态性的表现,方法的调用会在运行时会根据对象的类型决定。(2)重载:重载的方法名称相同,但参数列表不相同。重载只是一种语言特性,与多态无关,与面向对象无关。重载包括:函数的重载和运算符重载(运算符可以操作不同类型的数据)-重载可以改变返回值类型,但不能仅仅通过返回类型的不同,
4、来实现一个重载方法。3. 谈谈 java 异常机制 ?【面试题】在 java 中,所有异常都从 Throwable 类派生而来,Throwable 表示的是所有能作为异常被虚拟机抛出的类。Throwable 分为 Error 和 Exception,而 Exception 又分为 RuntimeException 和一般的 Exception。(1)Error:它表示的是不可恢复的异常,我们一般无法直接处理,如内存溢出或虚拟机出错:(编译时和系统错误)StackOverflowErrorOutOfMemeryError而 Exception:表示的是可以恢复的异常,我们可以捕获并进行处理。(2
5、)运行时异常是指:继承自 RuntimeException 类的异常,它是在虚拟机中执行程序时发生的异常。又叫未检查的异常(unchecked exception ),我们可以不作捕获或抛出处理,它会由虚拟机接管。如:NullPointerException。出现运行时异常后,系统会把异常一直往上抛,直到遇到处理代码。如果没有遇到处理代码,则最终会到达 main()方法,由 main()抛出,这样应用程序也就退出了;如果异常是在一个子线程中抛出的,则最终会由线程的 run()抛出,导致线程的退出,但不会导致主线程退出。-ArithmeticExceptionNullPointerExcepti
6、onIndexOutOfBoundsExceptionStringIndexOutOfBoundsExceptionArrayIndexOutOfBoundsExceptionClassCastExceptionIlligalStateExceptionIlligalAugumentExceptionNumberFormatException(3)一般异常: 即继承自 Exception 类的非运行时异常,又叫检查的异常(Checked Exception),编译器要求必须捕获或声明抛出一般异常。-ClassNotFoundExceptionSqlExceptionIOExceptionFil
7、eNotFoundExceptionUnknowHostExceptionHttpExceptionEOfExceptionInteruptedIOExceptionInvocationTargetException4. Java 集合类相关4.1.Hashtable 和 HashMap 的区别?【重要】-两者都实现了 Map, Serializable,Cloneable 接口,都以健值对的方式来保存数据;(两者都允许键值为字符串空)HashMap 继承自 AbstractMap 抽象类;是非线程安全的;允许键值为 null;添加了 containsKey()和 containsValue(
8、)取代 Hashtable 中的 contains();Hashtable 继承自 Dictionary 抽象类;是线程安全的;不允许键值为 null;是 java 集合中的过时类(还有Stack/Vector/Enumeration),所以如无特殊原因应该使用 HashMap 代替 Hashtable。4.2.ArrayList、Vector、LinkedList 的区别?【重要】说说 ArrayList LinkedList 链表 栈.区别联系-三个类都实现了 List 接口,都是 java 集合类中的列表,可以保存重复对象;ArrayList 和 Vector 是基于数组结构实现的,可以
9、按序号快速取得数据,但插入或删除数据比较慢;LinkedList 是基于双向链表实现的,封装了队列和栈的操作,它插入或删除数据较快,而按序号查找数据时较慢;(遍历是不慢的)ArrayList 和 LinkedList 都是非线程安全的,在进行多线程访问时需要同步处理;而 Vector 是线程安全的。Vector 是 java 集合类中的过时类(还有 Stack/Hashtable/Enumeration),在设计和性能上都不如新的集合类ArrayList。所以如无特殊原因,应该使用 ArrayList 代替 Vector。(参见 java 编程思想)开发中应将 ArrayList 作为首选,当
10、因为需要经常插入或删除元素(而导致程序性能变差)时,才选择LinkedList。如果集合元素个数不变,则应使用数组;4.3.谈谈 Java 中的集合类? 【面试题】-java 中的集合类有三种:List Set Map,每一种集合类都有多个实现版本;集合类之间的区别主要表现在集合内部是由什么数据结构实现。如何选择使用集合类?-对 List 的选择:ArrayList:将 ArrayList 作为首选。LinkedList:当因为需要经常插入或删除元素(而导致程序性能变差)时,才选择 LinkedList。数组:如果集合元素个数不变,则应使用数组;对 Map 的选择:首选 HashMap;Lin
11、kedHashMap:如果需要保存集合中元素添加的先后次序,则使用 LinkedHashMap;TreeMap:当需要总是排好序的 Map 时,才选择 TreeMap;对 Set 的选择:TreeSet HashSet LinkedHashSet 都是 Set 的实现类,都表示不包含重复元素的集合类。HashSet:首选 HashSet,它的查询速度最快;LinkedHashSet:如果需要保存集合中元素添加的先后次序,则使用 LinkedHashSet;TreeSet:TreeSet 基于 TreeMap,生成一个总是处于排序状态的 Set;如无特殊原因,不应该使用 java1.0/1.1
12、中的集合类,比如:Vector/Stack/Hashtable/Enumeration/BitSet因为它们已经过时,在设计或性能上,都不如新的集合类好,它们仍然存在的主要原因是为了兼容以前的程序;所以开发中应该尽量使用新的集合类。4.4.Collection 和 Collections?【面试题 】Collection 是 java 集合类最上层的接口,由它又派生出了 List Set 接口(不包括 Map 哦),每个接口都有多个不同的实现版本。Collections 是为 java 集合类而提供的一个工具类,它提供了一系列的静态方法,以方便开发者对集合进行各种操作。4.5.List、Set
13、、 Map 是否继承 Collection 接口?List 和 Set 是,Map 不是;-ignore-Stack: 它不是用 Vector 来构建 Stack,而是继承 Vector,这种设计很奇怪,有问题。如果需要栈的行为应使用 LinkedList.Vector: 用 ArrayList 代替,从效率上看,获取、插入、删除、迭代元素都不如 ArrayList;Hashtable: 用 HashMap 代替Enumeration: 用 Iterator 代替4.6.HashMap 的原理?哈希集合类是采用散列表的方式来存储对象的,会根据每个对象的哈希值(也叫散列码)计算得到哈希表的下标,
14、然后再将对象存储到哈希表对应下标的槽位(也称为桶)中。这样做的根本目的就是为了提高查询效率:当需要查找对象时,先根据对象的哈希值计算出哈希表的下标,根据下标快速定位到存储对象的槽位,然后再遍历该槽位,很快就可以查找到对象;所以,equals()的对象哈希值必须相等,否则就无法定位到相应的槽位,就无法找出对象。而如果将对象存储在线性结构中,查找时则需要遍历所有的元素,当数据量较大时效率会非常低下。-ignore-(1)equals()方法具有以下一些特点:自反性,x.equals(x);为 true,前提是 X 不为空对称性,如果 x.equals(y)为 true,则 y.equals(x)也
15、为 true传递性,如果 x.equals(y)为 true,且 y.equals(z)为 true,则 x.equals(z)为 true一致性,x.equals(y)的第一次调用为 true,那么 x.equals(y)的第 2 次,3 次。n 次也为 true,前提是在这个比较过程中 x 与 y 的值没有被修改x.equals(null)为 false当 equals 方法被重写时,通常有必要重写 hashCode()方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。(2)对 hashCode()方法的要求:一个对象多次调用它的 hashCode(),生成的哈希码总是相等;如果通过 equals()比较两个对象相等,则它们的 hashCode()生成的哈希码也相等; 如果通过 equals()比较两个对象不相等,则它们的 hashCode()生成的哈希码可以相等也可以不相等,但通常应该让他不相等,因为这样可以提高哈希表的性能;