看到一篇不错的java面试题的文章,自己整理一下,作为备用吧!
Java面试题
面向对象的特征有哪些方面?
封装
最常见的是把属性私有化封装在一个类里面,只能通过方法去访问
继承
子类继承父类,从而继承了父类的方法和属性
抽象
比如一个英雄类,抽象出了name,hp这些属性,使得开发过程中更加易于理解
多态
多态分操作符的多态和类的多态。 类的多态指父类引用指向子类对象,并且有继承,有重写。
String是最基本的数据类型吗?
String是类类型,不是基本类型。
基本类型有八种: 整型 (4种)字符型 (1种)浮点型 (2种)布尔型(1种)
int 和 Integer 有什么区别?
int 是基本类型32位长度的整数,而Integer 是类类型,是int的封装类
int和Integer之间可以通过自动装箱、自动拆箱互相转换
String 和StringBuffer的区别?
String是immutable的,其内容一旦创建好之后,就不可以发生改变。
StringBuffer 是可以变长的,内容也可以发生改变 改变的原理是StringBuffer内部采用了字符数组存放数据,在需要增加长度的时候,创建新的数组,并且把原来的数据复制到新的数组这样的办法来实现。
运行时异常与一般异常有何异同?
运行时异常 又叫做非可查异常,在编译过程中,不要求必须进行显示捕捉
一般异常又叫做可查异常,在编译过程中,必须进行处理,要么捕捉,要么通过throws 抛出去.是如何实现的。
说出ArrayList,Vector, LinkedList的存储性能和特性。
ArrayList和Vector
两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
ArrayList和LinkedList的区别
ArrayList 是数组结构,所以定位很快,但是插入和删除很慢 LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢
Collection 和 Collections的区别。
首先不要说成了一个是单数,一个是复数。。。
Collection是接口,是List和Set的父接口
Collections是工具类,提供了排序,混淆等等很多实用方法
&和&&的区别
& 有两个作用,分别是 位与 和 逻辑与,&& 就是逻辑与,作为逻辑与, & 和 && 分别表示长路与和短路与
长路与 两侧,都会被运算 短路与 只要第一个是false,第二个就不进行运算了
HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
区别1:
HashMap可以存放 null Hashtable不能存放null
区别2:
HashMap不是线程安全的类 Hashtable是线程安全的类
final, finally, finalize的区别
final
final修饰类,方法,基本类型变量,引用的时候分别有不同的意思 修饰类 表示该类不能被继承 修饰方法 表示该方法不能被重写 修饰基本类型变量 表示该变量只能被赋值一次 修饰引用 表示该引用只有一次指向对象的机会
finally
finally 是用于异常处理的场面,无论是否有异常抛出,都会执行
finalize
finalize是Object的方法,所有类都继承了该方法。 当一个对象满足垃圾回收的条件,并且被回收的时候,其finalize()方法就会被调用
Overload和Override的区别,即重载和重写的区别。 Overloaded的方法是否可以改变返回值的类型?
Overload是方法重载的意思,指的是在同一个类里面,方法名一样,但是参数不一样
Override是方法重写的意思,指的是子类继承了父类的某个方法后,重新又写了一遍
Overloaded的方法是否可以改变返回值的类型?
可以,重载其实本质上就是完全不同的方法,只是恰好取了相同的名字
Error和Exception有什么区别?
Error和Exception都实现了Throwable接口
Error指的是JVM层面的错误,比如内存不足OutOfMemoryError
Exception 指的是代码逻辑的异常,比如下标越界OutOfIndexException
abstract class和interface有什么区别?
abstract class 抽象类和interface接口的区别
使用方式:
抽象类只能够通过继承被使用 接口必须通过实现被使用
实现方法:
抽象类不仅可以提供抽象方法,也可以提供实现方法 接口只能提供抽象方法,不能提供实现方法。 但是在JAVA8版本开始,接口可以提供实现方法了,前提是要在方法前加一个default修饰符
heap和stack有什么区别
heap: 堆
stack: 栈 (在一些书籍里,会被翻译为堆栈,实际上指的就是单纯的这个栈)
存放的内容不一样:
heap: 是存放对象的 stack: 是存放基本类型(int, float, boolean 等等)、引用(对象地址)、方法调用
存取方式不一样:
heap: 是自动增加大小的,所以不需要指定大小,但是存取相对较慢 stack: 是固定大小的,并且是FILO 先入后出的顺序,并且存取速度比较快
GC是什么? 为什么要有GC?
GC是Garbage Collection的缩写,即垃圾回收 这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。 开发人员可以更加专注的进行业务功能的开发,而资源回收的工作交由更加专业的垃圾回收机制自动完成。
short s1 = 1; s1 = s1 + 1;有什么错?
1 short s1 = 1; //这一句没有错误,编译器会自动把1这个整数处理为short.
2 s1 = s1 + 1; //右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
1 Math.round 的意思是+0.5 取整数
2 所以 Math.round(11.5) 即 11.5+0.5 = 12
3 Math.round(-11.5) 即 -11.5+0.5 = -11
String s = new String("xyz");创建了几个String Object?
String s = new String("xyz");
首先构造方法 new String("xyz"); 中的"xyz" 这本身就是一个字符串对象 然后 new 关键字一定会创建一个对象 所以总共创建了两个String对象
Java有没有goto?
- 有,goto是关键字,但是是保留字,并不具备功能性
接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口是否可继承接口?
可以,比如List 就继承了接口Collection
抽象类是否可实现(implements)接口?
可以,比如 MouseAdapter鼠标监听适配器 是一个抽象类,并且实现了MouseListener接口
抽象类是否可继承实体类(concrete class)?
可以,所有抽象类,都继承了Object
List, Set, Map是否继承自Collection接口?
List 和 Set 继承了Collection接口
但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容
abstract的method是否可同时是static,是否可同时是synchronized?
abstract的method是否可同时是static,是否可同时是synchronized?
都不可以
数组有没有length()这个方法? String有没有length()这个方法?
数组获取长度的手段是 .length 属性
String获取长度的手段是 length()方法
集合获取长度的手段是 size()方法
文件获取长度的手段是 length()方法
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
以HashSet为例,判断重复的逻辑是:
首先看hashcode是否相同,如果不同,就是不重复的
如果hashcode一样,再比较equals,如果不同,就是不重复的,否则就是重复的。
构造器Constructor是否可被override?是否可以继承String类?
子类不能继承父类的构造方法,所以就不存在重写父类的构造方法。 注: super() 表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法
String是final修饰的,所以不能够被继承
switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?
switch 可以作用在 byte,short,int String,Enum(枚举) 上,但是不能作用在long上面
注:switch 作用在String上从JDK1.7开始支持,实质是编译时将字符串替换为了其对应的hash值
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try里的return 和 finally里的return 都会执行,但是当前方法只会采纳finally中return的值
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
因为hashCode()方法和equals()方法都可以通过自定义类重写,是可以做到equals相同,但是hashCode不同的
但是,在Object类的equals()方法中有这么一段话
1 * Note that it is generally necessary to override the {@code hashCode}
2 * method whenever this method is overridden, so as to maintain the
3 * general contract for the {@code hashCode} method, which states
4 * that equal objects must have equal hash codes.
- 翻译如下:
通常来讲,在重写这个方法的时候,也需要对hashCode方法进行重写,
以此来保证这两个方法的一致性——
当equals返回true的时候,这两个对象一定有相同的hashcode.
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
所以这个题的答案应该是否定的,但是得搞清楚里面的原委
垃圾回收的优点和原理。并考虑2种回收机制。
与C语言开发人员需要手动进行内存资源的释放不同,Java提供垃圾回收机制,自动进行GC,将开发人员从容易犯错的内存资源管理中解放出来。
原理:当某个一个对象,没有任何引用指向它的时候,那么它就满足垃圾回收的条件,在适当的时候,JVM虚拟机进行GC将其回收,释放空间,以供后续再利用。
两种常见的回收机制:
定时回收 每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢
当垃圾占到某个百分比的时候,进行回收 比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。
一般说来 JVM会采用两种机制结合的方式进行垃圾回收。
你所知道的集合类都有哪些?主要方法?
1 常见的集合
2 ArrayList,LinkedList,HashSet,HashMap,TreeSet 等等
3 常见方法:
4 size()
5 add()
6 remove()
7 等等
char型变量中能不能存贮一个中文汉字?为什么?
char是16位的,占两个字节 汉字通常使用GBK或者UNICODE编码,也是使用两个字节 所以可以存放汉字
解析XML文档有哪几种方式?
主要是两种,SAX和DOM:
SAX 就是逐行读取,直到找到目标数据为止
DOM 是先全文档加载,然后读取
关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
throws 用在方法声明上面,表示该方法有可能抛出某个异常
throw 抛出一个指定的异常
try catch 在try中有可能会抛出某个异常,一旦某个异常抛出后,就会在catch中进行捕捉,他俩一般说来都是成对出现的。
finally: 表示无论是否捕捉住异常,都会执行
一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
可以包括多个类,但是只能出现一个public修饰的类,但是可以出现多个非public修饰的类。
java中有几种类型的流?
Java中所有的流都是基于字节流,所以最基本的流是
输入输出字节流
InputStream OutputStream
在字节流的基础上,封装了字符流
Reader Writer
进一步,又封装了缓存流
BufferedReader PrintWriter
以及数据流
DataInputStream DataOutputStream
对象流
ObjectInputStream ObjectOutputStream
以及一些其他的奇奇怪怪的流 ~~~
java中会存在内存泄漏吗,请简单描述。
因为Java是自动进行垃圾回收管理的,所以不存在 C语言中同等概念的内存泄漏,但是存在Java特色的内存泄漏
当某些对象不被使用,但是又有非直接引用指向的时候,那么就不满足垃圾回收的条件,而形成内存泄漏。
比如代码中的例子,每个Object创建的时候,有一个引用o指向,接着就被放进了集合al中。 下一个Object创建的时候,上一个Object就没有引用指向了。
这些Object都没有引用指向,但是却放在ArrayList中,而这个Arraylist忘记了回收,那么里面的所有对象,都会一直存活下去,虽然不再被使用了。
1 package exercise;
2
3 import java.util.ArrayList;
4
5 public class MemoryLeak {
6 static ArrayList<Object> al = new ArrayList<Object>();
7
8 public static void main(String[] args) {
9
10 for (int i = 0; i < 100; i++) {
11 Object o = new Object();
12 al.add(o);
13 }
14
15 }
16 }
java中实现多态的机制是什么?
- 类的多态的条件:
父类(接口)引用指向子类对象
方法有重写
静态变量和实例变量的区别?
静态变量 直接通过类就可以访问,无需实例
实例变量 比如通过类的某个具体实例,才可以访问
什么是java序列化,如何实现java序列化?
序列化指的是把一个Java对象,通过某种介质进行传输,比如Socket输入输出流,或者保存在一个文件里
实现java序列化的手段是让该类实现接口 Serializable,这个接口是一个标识性接口,没有任何方法,仅仅用于表示该类可以序列化。
是否可以从一个static方法内部发出对非static方法的调用?
- 不行,因为非static方法需要一个具体的实例才可以调用,而调用 static方法的时候,不一定存在一个实例
在JAVA中,如何跳出当前的多重嵌套循环?
在外部循环的前一行,加上标签
在break的时候使用该标签
即能达到结束多重嵌套循环的效果
1 public class HelloWorld {
2 public static void main(String[] args) {
3 //打印单数
4 outloop: //outloop这个标示是可以自定义的比如outloop1,ol2,out5
5 for (int i = 0; i < 10; i++) {
6 for (int j = 0; j < 10; j++) {
7 System.out.println(i+":"+j);
8 if(0==j%2)
9 break outloop; //如果是双数,结束外部循环
10 }
11 }
12 }
13 }
参考源:http://how2j.cn/k/j2se-interview/j2se-interview-java/624.html