导语
Java 面试题集2021版
Java基础部分五
- 47、String 和String Buffer的区别
- 48、StringBuffer和StringBuilder的区别
- 49、数组有没有length()这个方法?String有没有length()这个方法?
- 50、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
- 51、final 关键字有哪些应用
- 52、final、finally、finalize的区别
- 53、运行时异常(RuntimeException)与一般异常有何异同?
- 54、程序中try{}里面有一个return语句,那么紧跟在这个try语句后面的finally中的代码会不会执行,在什么时候被执行?
- 55、error与exception有什么异常
- 56、Java中的异常处理机制的简单原理和应用
- 57、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别代表什么意义?在try块中可以抛出异常么?
- 58、请写出最常见的运行时异常
- 59、介绍Collection框架的结构
- 60、Collection框架中实现比较要实现什么接口
- 61、ArrayList和Vector的区别
47、String 和String Buffer的区别
Java语言提供了两个类:String 和 String Buffer,它们可以存储和操作字符串内容,也就是说包多个字符的字符数据,String类表示内容不可改变的字符串。而StringBuffer 类表示内容可以被修改的字符串。当你知道字符数据要改变的时候就需要使用到StringBuffer。典型地,可以使用StringBuffer来动态构造字符数据。另外String实现了equals方法,new String(“xyz”).equals(new String(“xyz”)) 的结果为true,而StringBuffer 没有实现equals方法,所以说new StringBuffer(“xyz”).equals(new StringBuffer(“xyz”)) 的结果为false;
例如,把1到100所有的数字拼起来,组成一个串
StringBuffer sbf = new StringBuffer();
for(int i=0;i<100;i++){
sbf.append(i);
}
上面这段代码执行效率高,因为只创建了一个StringBuffer对象
String str = new String();
for(int i = 0;i<100;i++){
str = str + i;
}
上面这段代码执行效率低,因为它创建了101个对象。
当然100个数据并不能看出两者之间的区别,当数据量达到10000,就可以通过比较循环开始时间和结束时间来看出两者之间的执行效率了。
String重写了equals方法和hashCode方法,而StringBuffer没有重写equals方法和hashCode方法,所以将StringBuffer对象存储进Java集合类中的时候回出现问题。
48、StringBuffer和StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,StringBuilder是线程不安全的,但是运行效率高,如果一个字符串变量是在方法中定义,这种情况中只可能有一个线程访问它,不存在安全问题,则可以使用StringBuilder。如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好就是使用StringBuffer。
49、数组有没有length()这个方法?String有没有length()这个方法?
数组没有length()这个方法,但是有length的属性。String 有length()这个方法。
50、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的,例如
final StringBuffer a = new StringBuffer("imm");
指向如下的语句编译的时候回报错
a = new StringBuffer("")
但是执行下面这个语句则不会报错
a.append("broken!")
在有些情况下,可能想通过如下的这种方式来阻止方法内部修改传进来的对象参数:
public void menthod(final StringBuffer param){
}
实际上,通过这种方式是做不到的,在该方法内部还可以通过如下的方式来进行对象修改
param.append("a");
51、final 关键字有哪些应用
当在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可改变,而对对象变量来说是其引用不可再变。
对于这个变量的初始化可以在两个地方
- 一、在变量定义的时候,也就是说final变量定义时直接给其赋值
- 二、在构造函数中,在编程的时候如果出现final变量在定义的时候没有给赋值,那么编译器会提示,在构造函数中必须进行赋值操作。但是两种方式不能同时存在。
52、final、finally、finalize的区别
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可重写,类不可继承。内部类要访问局部变量,局部变量必须定义成final类型。
- finally 是异常处理语句结构的一部分,表示总是要执行。
- finalize 是Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以重写此方法提供垃圾收集时的其他资源的回收,例如关闭文件等操作。但是JVM不保证此方法总被调用。
53、运行时异常(RuntimeException)与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状况,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要是RuntimeException 类的子类都属于运行时异常,而不是RuntimeException类的子类的其他异常类都是一般异常或者叫做受检测异常。Java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须抛出未被捕获的运行时异常。
54、程序中try{}里面有一个return语句,那么紧跟在这个try语句后面的finally中的代码会不会执行,在什么时候被执行?
try-catch-finally 的执行顺序是先执行try块中的代码,如果发生异常则进入到catch块处理,但是无论是否发生异常都会进入finally块,所以finally块中的代码会在try中的return语句之前执行。
55、error与exception有什么异常
error 表示恢复不是不可能,但是非常困难的情况下的一种严重的问题。例如说内存溢出。不可能指望程序能处理这样的情况。exception 表示 一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况,可以使用异常处理机制处理。
56、Java中的异常处理机制的简单原理和应用
异常是指Java 程序运行时(非编译)所发生的非正常情况或错误,这个情况就可以被抽象成一个对象来表示,也就是Java中的面向对象的异常处理方式,把程序中的发生的每个异常都封装到一个对象中来进行表示,该对象中就包含了这种情况所有的信息。
Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable 下面有派生出了两个子类:Error和Exception ,Error表示程序本身无法克服和恢复的一种严重的问题,程序只有被Kill的份了。例如说内存溢出,死锁等。Exception 表示程序还可以克服和恢复的问题,其中又分为系统异常和普通异常,系统异常属于软件本身的缺陷导致的问题,也就是开发者考虑不周到导致的问题,软件使用者无法克服和恢复这种问题,但在这种问题下还可以让软件继续运行或者让软件死掉。例如常见的NPE异常,类型转换异常等等;普通异常是运行环境的变化或者异常所导致的为问题,是用户能够克服的异常,例如断网,断电,磁盘不够,发生这样的异常的话程序一般情况下不会kill。
Java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须通过trycatch 处理,或者通过throws申明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以编译器不强制使用try catch 处理或用throws声明,所以系统异常也称为unchecked 异常。
57、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别代表什么意义?在try块中可以抛出异常么?
Java的异常处理是通过5个关键字来实现:try、catch、throw、throws和finally。
- throws 声明方法可能抛出的异常
- throw 手动抛出异常
- try catch 是内部捕获异常并做自定义处理
- finally 是无论是否有异常都会被处理的语句,除非在finally前,存在System.exit()时除外
在try 块中可以抛出异常,但必须catch或者在方法声明抛出的异常类型(运行时异常除外)
58、请写出最常见的运行时异常
NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。等
59、介绍Collection框架的结构
可以简单的介绍一下他们的接口继承关系等内容
60、Collection框架中实现比较要实现什么接口
comparable/comparator
61、ArrayList和Vector的区别
这两个类都实现了List接口,他们都是有序集合,即存储在这两个集合中的元素的位置都是由顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是HashSet之类的集合的最大的不同,HashSet之类的集合不可以按照索引号去检索其中的元素,也不允许有重复的元素。
继续,ArrayList与Vector的区别主要包括如下的两个方面
-
1、同步性
Vector是线程安全的,也就是说它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间的线程不同步的,如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率相对较高,如果有多个线程访问同一个集合,那就最好使用Vector,因为不需要我们自己考虑如何处理线程安全问题。 -
2、数据增长
ArrayList与Vector 都有一个初始容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间的时候,不是指增加一个存储单元,而是增加了多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来的两倍,而ArrayList的增长策略都在文档中没有明确规定。ArrayList与Vector都可以设置初始的空间大小,Vector还可可以设置增长空间的大小,而ArrayList没有提供设置增长空间的方法。
总结 Vector 增长原来的一倍,而ArrayList增加原来的0.5倍。