2.Java 面试题整理(基础篇二)

41heap stack 有什么区别

答:栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。堆

是栈的一个组成元素。

补充网上:

heap是堆,stack是栈。

42Java 的接口和 C++的虚类的相同和不同处

答:由于 Java 不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现

有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当

一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都

public static,所有方法默认情况下是public.一个类可以实现多个接口。

 

补充网上:

C++虚类相当于java中的抽象类,与接口的不同处是:

<1>.一个子类只能继承一个抽象类(虚类),但能实现多个接口

<2>.一个抽象类可以有构造方法,接口没有构造方法

<3>.一个抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(有方法体),接口中的方法都是抽象方法,不能有方法体,只有方法声明

<4>.一个抽象类可以是public、private、protected、default,接口只有public

<5>.一个抽象类中的方法可以是public、private、protected、default,接口中的方法只能是public和default修饰,实际上都是public的abstract方法

相同之处是:

  都不能实例化。

 补充:

  接口是一类特殊的抽象类,是更抽象的抽象类,你可以这样理解。抽象类是一个不完整的类,接口只定义了一些功能。

 

43Java 中的异常处理机制的简单原理和应用

答:JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会将发生的错误表示为一个异常。违反语

义规则包括2种情况。

一种是 JAVA 类库内置的语义检查。例如数组下标越界,会引发

IndexOutOfBoundsException;访问 null 的对象时会引发 NullPointerException

另一种 情况就是JAVA 允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用 throw 关键字引发异常。所有的异常都是 java.lang.Thowable 的子类。

43、垃圾回收的优点和原理。并考虑2种回收机制

答:Java 语言中一个显著的特点就是引入了垃圾回收机制,使 c++程序员最头疼的内存管理的问题迎刃

而解,它使得 Java 程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java

的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。

44、你所知道的集合类都有哪些?主要方法?

答:最常用的集合类是 List MapList 的具体实现包括 ArrayList Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。

Map 提供了一个更通用的元素存储方法。 Map集合类用于存储元素对(称作""""),其中每个键

映射到一个值。

45、描述一下 JVM 加载 class 文件的原理机制?

答:JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader是一个重要的 Java

运行时系统组件。它负责在运行时查找和装入类文件的类。

46、排序都有哪几种方法?请列举

答: 排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)。

 

快速排序的伪代码。

//使用快速排序方法对 a[ 0 :n- 1 ]排序

a[ 0 :n- 1 ]中选择一个元素作为 middle,该元素为支点 。把余下的元素分割为两段 left right,使得 left 中的元素都小于等于支点,而 right 中的元素都大于等于支点 ,递归地使用快速排序方法对 left 进行排序 ,递归地使用快速排序方法对 right 进行排序 ,所得结果为 left + middle + right 。

 

补充:

参考https://www.jobui.com/mianshiti/it/java/7889/

重点关注冒泡排序、选择排序。

 

47JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在try

块中可以抛出异常吗? ??

答:Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在 Java

中,每个异常都是一个对象,它是 Throwable类或其它子类的实例。当一个方法出现异常后便抛出一个

异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。

Java的异常处理是通过5个关键词来实现的:trycatchthrowthrows finally。一般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch它,或最后(finally)由缺省处理器来处理。

try 来指定一块预防所有"异常"的程序。紧跟在 try 程序后面,应包含一个 catch 子句来指定你想要捕捉的"异常"的类型。

throw 语句用来明确地抛出一个"异常"

throws 用来标明一个成员函数可能抛出的各种"异常"

Finally 为确保一段代码不管发生什么"异常"都被执行一段代码。

可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数内部写另一个 try 语句保护其他代码。

每当遇到一个 try 语句,"异常"的框架就放到堆栈上面,直到所有的 try 语句都完成。如果下一级的 try

语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"try 语句。

48、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?

答:可以。必须只有一个类名与文件名相同。

49java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些

类? ??

答:字节流,字符流。字节流继承于 InputStream OutputStream,字符流继承于 InputStreamReader

OutputStreamWriter。在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。

补充网上:

 

 

50java 中会存在内存泄漏吗,请简单描述。

答:会。自己实现堆载的数据结构时有可能会出现内存泄露,可参看 effective java.

补充网上:

会有的,虽然java虚拟机中的垃圾回收机制可以自动进行内存空间的申请和释放,但还是有些不能显式地进行释放,必须手动释放,比如关闭打开的文件和数据库连接.最后可能导致内存的可用空间越来越少,最终崩溃。

51java 中实现多态的机制是什么?

答:方法的重写 Overriding 和重载 Overloading Java多态性的不同表现。重写 Overriding 是父类与子类之间多态性的一种表现,重载 Overloading 是一个类中多态性的一种表现。

52、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃

圾回收

答:对于 GC 来说,当程序员创建对象时,GC 就开始监控这个对象的地址、大小以及使用情况。通常

GC 采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当 GC 确定一些对象为"不可达"时,GC 就有责任回收这些内存空间。可以。程序员

可以手动执行 System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会执行。

53、静态变量和实例变量的区别?

答:static i = 10; //常量

class A a; a.i =10;//可变

54、什么是 java 序列化,如何实现 java 序列化?

答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的

对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时

所引发的问题。

序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法,implements

Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对象流)对象,接着,使用 ObjectOutputStream 对象的

writeObject(Object obj)方法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

55、是否可以从一个 static 方法内部发出对非 static 方法的调用?

答:不可以,如果其中包含对象的 method();不能保证对象初始化.

56、写 clone()方法时,通常都有一行代码,是什么?

答:Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。

57、在 JAVA 中,如何跳出当前的多重嵌套循环?

答:break; return 方法。

58ListMapSet 三个接口,存取元素时,各有什么特点?

答 :List 以特定次序来持有元素,可有重复元素。

Set 无法拥有重复元素,内部排序。

Map 保存 key-value值,value 可多值。

59、什么时候用 assert。 ??

答: 断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为

false,那么系统会报告一个 AssertionError。

它用于调试目的: assert(a > 0); // throws an AssertionError if a <= 0

断言可以有两种形式:

assert Expression1 ;

assert Expression1 : Expression2 ;

Expression1 应该总是产生一个布尔值。

Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。

断言在默认情况下是禁用的。

要在编译时启用断言,需要使用 source 1.4 标记:javac-source 1.4 Test.java

要在运行时启用断言,可使用 -enableassertions 或者 -ea标记。

要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。

要在系统类中启用断言,可使用 -esa 或者 -dsa 标记。

还可以在包的基础上启用或者禁用断言。可以在预计正常情况下不会到达的任何位置上放置断言。

断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值