1 Star 0 Fork 31

np / Ebooks

forked from Java精选 / Ebooks 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
100+ 道 Java 经典面试题(面试率高).md 9.18 KB
一键复制 编辑 原始数据 按行查看 历史

100+ 道 Java 经典面试题(面试率高)

全部面试题答案,更新日期:12月30日,直接下载吧!

下载链接:高清500+份面试题资料及电子书,累计 10000+ 页大厂面试题 PDF

Java 基础

题1:Java中抛出 Throwable 结构有哪几种类型?

Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常(RuntimeException),错误(Error)。

1、运行时异常

定义:RuntimeException及其子类都被称为运行时异常。

特点:

Java编译器不会检查它。也就是说,当程序中可能出现这类异常时,倘若既"没有通过throws声明抛出它",也"没有用try-catch语句捕获它",还是会编译通过。例如,除数为零时产生的ArithmeticException异常,数组越界时产生的IndexOutOfBoundsException异常,fail-fast机制产生的ConcurrentModificationException异常(java.util包下面的所有的集合类都是快速失败的,“快速失败”也就是fail-fast,它是Java集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。记住是有可能,而不是一定。

例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生fail-fast机制,这个错叫并发修改异常。Fail-safe,java.util.concurrent包下面的所有的类都是安全失败的,在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出ConcurrentModificationException异常。如果未遍历的数组上的内容发生了变化,则有可能反映到迭代过程中。这就是ConcurrentHashMap迭代器弱一致的表现。ConcurrentHashMap的弱一致性主要是为了提升效率,是一致性与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁,这就与Hashtable和同步的HashMap一样了。)等,都属于运行时异常。

常见的五种运行时异常:

ClassCastException(类转换异常)

IndexOutOfBoundsException(数组越界)

NullPointerException(空指针异常)

ArrayStoreException(数据存储异常,操作数组是类型不一致)

BufferOverflowException

2、被检查异常

定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。

特点 : Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。

当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。 如:

IOException

FileNotFoundException

SQLException

被检查的异常适用于那些不是因程序引起的错误情况,比如:读取文件时文件不存在引发的FileNotFoundException。然而,不被检查的异常通常都是由于糟糕的编程引起的,比如:在对象引用时没有确保对象非空而引起的NullPointerException。

3、错误

定义 : Error类及其子类。

特点 : 和运行时异常一样,编译器也不会对错误进行检查。

当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。OutOfMemoryError、ThreadDeath。

Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等。

题2:Java 中引用数据类型有哪些?它们与基本数据类型有什么区别?

引用数据类型分3种:类、接口、数组。

简单来说,只要不是基本数据类型。都是引用数据类型。 那它们有什么不同呢?

1、从概念方面来说

1)基本数据类型:变量名指向具体的数值

2)引用数据类型:变量名不是指向具体的数值,而是指向存数据的内存地址,也及时hash值。

2、从内存的构建方面来说(内存中有堆内存和栈内存两者)

1)基本数据类型:被创建时,在栈内存中会被划分出一定的内存。并将数值存储在该内存中。

2)引用数据类型:被创建时,首先会在栈内存中分配一块空间,然后在堆内存中也会分配一块具体的空间用来存储数据的具体信息,即hash值,然后由栈中引用指向堆中的对象地址。

题3:RMI 的 stub扮演了什么样的角色?

远程对象的stub扮演了远程对象的代表或者代理的角色。调用者在本地stub上调用方法,它负责在远程对象上执行方法。当stub的方法被调用的时候,会经历以下几个步骤:

1)初始化到包含了远程对象的JVM的连接。

2)序列化参数到远程的JVM。

3)等待方法调用和执行的结果。

4)反序列化返回的值或者是方法没有执行成功情况下的异常。

5)把值返回给调用者。

题4:Java 中 使得 RMI 程序正确运行有哪些步骤?

为了让RMI程序能正确运行必须要包含以下几个步骤:

编译所有的源文件。

使用rmic生成stub。

启动rmiregistry。

启动RMI服务器。

运行客户端程序。

题5:Naming 类 bind() 和rebind() 方法有什么区别?

bind()方法负责把指定名称绑定给远程对象。

rebind()方法负责把指定名称重新绑定到一个新的远程对象。如果该名称已经绑定过了,先前的绑定会被替换掉。

题6:RMI 的绑定(Binding)是什么含义?

绑定是为了查询找远程对象而给远程对象关联或者是注册以后会用到的名称的过程。

远程对象可以使用Naming类的bind()或者rebind()方法跟名称相关联。

题7:java.rmi.Naming 类扮演了什么样的角色?

java.rmi.Naming类用来存储和获取在远程对象注册表里面的远程对象的引用。

Naming类的每一个方法接收一个URL格式的String对象作为它的参数。

题8:RMI中的远程接口(Remote Interface)扮演了什么样的角色?

远程接口用来标识哪些方法是可以被非本地虚拟机调用的接口。

远程对象必须要直接或者是间接实现远程接口。

实现了远程接口的类应该声明被实现的远程接口,给每一个远程对象定义构造函数,给所有远程接口的方法提供实现。

题9:RMI体系结构分哪几层?

RMI体系结构分以下几层:

存根和骨架层(Stub and Skeleton layer): 这一层对程序员是透明的,它主要负责拦截客户端发出的方法调用请求,然后把请求重定向给远程的RMI服务。

远程引用层(Remote Reference Layer): RMI体系结构的第二层用来解析客户端对服务端远程对象的引用。这一层解析并管理客户端对服务端远程对象的引用。连接是点到点的。

传输层(Transport layer): 这一层负责连接参与服务的两个JVM。这一层是建立在网络上机器间的TCP/IP连接之上的。它提供了基本的连接服务,还有一些防火墙穿透策略。

题10:RMI体系结构的基本原则是什么?

RMI体系结构是基于一个非常重要的行为定义和行为实现相分离的原则。

RMI允许定义行为的代码和实现行为的代码相分离,并且运行在不同的JVM上。

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/huangdx.net/ebooks.git
git@gitee.com:huangdx.net/ebooks.git
huangdx.net
ebooks
Ebooks
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891