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