1 Star 0 Fork 31

阿明 / Ebooks

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

常见Java基础面试题及答案汇总,2021年底最新版

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

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

Java 基础

题1:成员变量与局部变量有那些区别?

从语法形式上看: 成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public、private、static等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。

从变量在内存中的存储方式来看: 如果成员变量是使用static修饰的,那么这个成员变量是属于类的,如果没有使用static修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。

从变量在内存中的生存时间上看: 成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

成员变量如果没有被赋初值: 则会自动以类型的默认值而赋值,一种情况例外被final修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。

题2:JDK、JRE、JVM 之间有什么关系?

1、JDK

JDK(Java development Toolkit),JDK是整个Java的核心,包括了Java的运行环境(Java Runtime Environment),一堆的Java工具(Javac,java,jdb等)和Java基础的类库(即Java API 包括rt.jar).

Java API 是Java的应用程序的接口,里面有很多写好的Java class,包括一些重要的结构语言以及基本图形,网络和文件I/O等等。

2、JRE

JRE(Java Runtime Environment),Java运行环境。在Java平台下,所有的Java程序都需要在JRE下才能运行。只有JVM还不能进行class的执行,因为解释class的时候,JVM需调用解释所需要的类库lib。JRE里面有两个文件夹bin和lib,这里可以认为bin就是JVM,lib就是JVM所需要的类库,而JVM和lib合起来就称JRE。

JRE包括JVM和JAVA核心类库与支持文件。与JDK不同,它不包含开发工具-----编译器,调试器,和其他工具。

3、JVM

JVM:Java Virtual Machine(Java 虚拟机)JVM是JRE的一部分,它是虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件构架,入处理器,堆栈,寄存器等,还有相应的指令系统。

JVM是Java实现跨平台最核心的部分,所有的Java程序会首先被编译为class的类文件,JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。Java面对不同操作系统使用不同的虚拟机,一次实现了跨平台。JVM对上层的Java源文件是不关心的,它关心的只是由源文件生成的类文件

题3:Java 如何实现字符串中查找某字符出现的次数?

此方法只能用于统计单个字符出现的次数,不能统计一个字符串出现的次数。

实例代码

import java.util.Arrays;
import java.util.stream.Collectors;

public class Tests {
    public static void main(String[] args) {
        String a = "欢迎关注“Java精选”公众号,回复“面试资料”,领取免费资料!";
        String b = "“";
        System.out.println("“出现的次数为:" + strCount(a, b));
    }
    public static int strCount(String str, String findByStr) {
        String[] split = str.split("");
        return Arrays.asList(split).stream().filter(s -> s.equals(findByStr)).collect(Collectors.toList()).size();
    }
}

运行结果

“出现的次数为:2

题4:Java 中变量命名有哪些规则?

Camel标记法

首字母是小写的,接下来的单词都以大写字母开头。

Pascal标记法

首字母是大写的,接下来的单词都以大写字母开头。

匈牙利标记法

在以Pascal标记法的变量前附加小写序列说明该变量的类型。

基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则,并尽量保证名字的连贯性。

Java中一般使用匈牙利标记法,基本结构为scope_typeVariableName。

使用1-3字符前缀来表示数据类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其它字母小写,这样保证了对变量名能够进行正确的断句。

例如定义一个整形变量,用来记录文档数量:intDocCount,其中int表明数据类型,后面为表意的英文名,每个单词首字母大写。

题5:static 修饰变量、代码块时何时执行?执行几次?

在类加载的init阶段,类的类构造器中会收集所有的static块和字段并执行;static块只执行一次。

注意的是static语句块,不是在实例化的时候被执行的;在调用类中任何一个方法时,jvm进行类加载,static语句块是在类加载器加载该类的最后阶段进行初始化的。并且只会被初始化一次。

注:若一次性调用多个方法,则只会执行一次static代码块。

题6:简述逻辑操作(&,|,^)和条件操作(&&,||)有什么区别?

1、条件操作只能操作布尔型的,而逻辑操作不仅可以操作布尔型,而且可以操作数值型。

2、逻辑操作不会产生短路。

题7:static 关键字为何不能修饰局部变量?

static关键字修饰的变量或方法是属于类的,在编译时就已经确定了;而普通变量或方法是属于该由类生成的对象,需要在实例化后才能确定。

因此,若static关键字修饰了方法的局部变量,一方面方法需要在实例化之后才能确定,另一方面static修饰的变量需要在编译时确定,这就会导致矛盾。

题8:hashcode() 中可以使用随机数字吗?

hashcode()中不可以使用随机数字,这是因为对象的hashcode值必须是相同的。

题9:Java 中 DOM 和 SAX 解析器有什么不同?

DOM解析器将整个XML文档加载到内存来创建一棵DOM模型树,这样可以更快的查找节点和修改XML结构,而SAX解析器是一个基于事件的解析器,不会将整个XML文档加载到内存。

由于这个原因,DOM比SAX更快,也要求更多的内存,不适合于解析大XML文件。

题10:Java 中 Hash 冲突有哪些解决办法?

1、开放定址法

这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:

Hi=(H(key)+di)% m i=1,2,…,n

其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:

1)线性探测再散列

dii=1,2,3,…,m-1

这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。

2)二次探测再散列

di=12,-12,22,-22,…,k2,-k2 ( k<=m/2 )

这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。

3)伪随机探测再散列

di=伪随机数序列。

具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点。

例如,已知哈希表长度m=11,哈希函数为:H(key)= key % 11,则H(47)=3,H(26)=4,H(60)=5假设下一个关键字为69,则H(69)=3,与47冲突。

如果用线性探测再散列处理冲突,下一个哈希地址为H1=(3 + 1)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 + 2)% 11 = 5,还是冲突,继续找下一个哈希地址为H3=(3 + 3)% 11 = 6,此时不再冲突,将69填入5号单元。

如果用二次探测再散列处理冲突,下一个哈希地址为H1=(3 + 12)% 11 = 4,仍然冲突,再找下一个哈希地址为H2=(3 - 12)% 11 = 2,此时不再冲突,将69填入2号单元。

如果用伪随机探测再散列处理冲突,且伪随机数序列为:2,5,9,……,则下一个哈希地址为H1=(3 + 2)% 11 = 5,仍然冲突,再找下一个哈希地址为H2=(3 + 5)% 11 = 8,此时不再冲突,将69填入8号单元。

2、再哈希法

这种方法是同时构造多个不同的哈希函数:

Hi=RH1(key) i=1,2,…,k

当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

3、链地址法

这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。

4、建立公共溢出区

这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。

题11:java-中为什么要定义一个没有参数的构造方法

题12:java-中-web-inf-目录有什么作用

题13:java-中-new-一个对象的过程中发生了什么

题14:如何理解-final-关键字

题15:rmi-的-stub扮演了什么样的角色

题16:一个-.java-类文件中可以有多少个非内部类

题17:什么是非对称加密

题18:java-中-this-和-super-有哪些用法区别

题19:java-中最有效率方法算出-2-乘以-8-等于几

题20:string-和-stringbuffer-有什么区别

题21:java-中什么是隐式的类型转换

题22:java-中实现多态的机制是什么

题23:string-类的常用方法都有哪些

题24:为什么有-int-类型还要设计-integer-类型

题25:java-中-int-a[]-和-int-[]a-有什么区别

大厂面试题

大厂面试题

大厂面试题

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

搜索帮助

53164aa7 5694891 3bd8fe86 5694891