1 Star 0 Fork 31

阿明 / Ebooks

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

2022年最全Java基础面试题附答案解析大汇总

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

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

Java 基础

题1:Java 中 float f = 3.5; 是否正确?

不正确,会提示错误如下:

Type mismatch: cannot convert from double to float

float f=3.5;的值是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.5; 或者写成 float f =3.5f;(float f =3.5F;)。

题2:Java 中可以一次 catch 多个异常吗?

Java中可以一次catch多个异常,JDK1.7版本以后,可以通过以下代码实现:

try {
    //.....
} catch ( IllegalArgumentException
 | SecurityException
 | IllegalAccessException
 |NoSuchFieldException exc) {
    //.....	 
}

题3:Java 中 static 可以修饰局部变量吗?

Java中static关键字不可以修饰局部变量。

static是用于修饰成员变量和成员方法的,它随着类的加载而加载,随着类的消失而消失,存在于方法区的静态区,被其修饰的成员能被类的所有对象共享,即作用域为全局;而局部变量存在于栈,用完后就会释放。作用域为局部代码块。

题4:为什么有 int 类型还要设计 Integer 类型?

对象封装有很多好处,可以把属性也就是数据跟处理这些数据的方法结合在一起,比如Integer就有parseInt()等方法来专门处理int型相关的数据。

另一个非常重要的原因就是在Java中绝大部分方法或类都是用来处理类类型对象的,如ArrayList集合类就只能以类作为他的存储对象,而这时如果想把一个int型的数据存入list是不可能的,必须把它包装成类,也就是Integer才能被List所接受。所以Integer的存在是很必要的。

题5:JDK1.8 中 ConcurrentHashMap 不支持空键值吗?

首先明确一点HashMap是支持空键值对的,也就是null键和null值,而ConcurrentHashMap是不支持空键值对的。

查看一下JDK1.8源码,HashMap类部分源码,代码如下:

public V get(Object key) {
        Node<K,V> e;
        return (e = getNode(hash(key), key)) == null ? null : e.value;
}
static final int hash(Object key) {
	int h;
	return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

HashMap在调用put()方法存储数据时会调用hash()方法来计算key的hashcode值,可以从hash()方法上得出当key==null时返回值是0,这意思就是key值是null时,hash()方法返回值是0,不会再调用key.hashcode()方法。

ConcurrentHashMap类部分源码,代码如下:

public V put(K key, V value) {
	return putVal(key, value, false);
}
/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
	if (key == null || value == null) throw new NullPointerException();
	int hash = spread(key.hashCode());
	int binCount = 0;
	for (Node<K,V>[] tab = table;;) {
		Node<K,V> f; int n, i, fh;
		if (tab == null || (n = tab.length) == 0)
			tab = initTable();
		else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
			if (casTabAt(tab, i, null,
						 new Node<K,V>(hash, key, value, null)))
				break;                   // no lock when adding to empty bin
		}
		else if ((fh = f.hash) == MOVED)
			tab = helpTransfer(tab, f);
		else {
			V oldVal = null;
			synchronized (f) {
				if (tabAt(tab, i) == f) {
					if (fh >= 0) {
						binCount = 1;
						for (Node<K,V> e = f;; ++binCount) {
							K ek;
							if (e.hash == hash &&
								((ek = e.key) == key ||
								 (ek != null && key.equals(ek)))) {
								oldVal = e.val;
								if (!onlyIfAbsent)
									e.val = value;
								break;
							}
							Node<K,V> pred = e;
							if ((e = e.next) == null) {
								pred.next = new Node<K,V>(hash, key,
														  value, null);
								break;
							}
						}
					}
					else if (f instanceof TreeBin) {
						Node<K,V> p;
						binCount = 2;
						if ((p = ((TreeBin<K,V>)f).putTreeVal(hash, key,
													   value)) != null) {
							oldVal = p.val;
							if (!onlyIfAbsent)
								p.val = value;
						}
					}
				}
			}
			if (binCount != 0) {
				if (binCount >= TREEIFY_THRESHOLD)
					treeifyBin(tab, i);
				if (oldVal != null)
					return oldVal;
				break;
			}
		}
	}
	addCount(1L, binCount);
	return null;
}

ConcurrentHashmap在调用put()方法时调用了putVal()方法,而在该方法中判断key为null或value为null时抛出空指针异常NullPointerException。

ConcurrentHashmap是支持并发的,当通过get()方法获取对应的value值时,如果指定的键为null,则为NullPointerException,这主要是因为获取到的是null值,无法分辨是key没找到null还是有key值为null。

题6:Java 中 >、>>、>>> 三者有什么区别?

1、“>”表示大于,如:if(a>b)…结果是boolean类型。

2、“>>”在c++中,移位运算符有双目移位运算符:<<(左移)和>>(右移)。

移位运算符组成的表达式也属于算术表达式,其值为算术值。

左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。

右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。

在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。

通俗的讲就是指需要移动的数转换成2进制,右移几位就去掉右边的几位数,左移几位就在右边加几个0,比如14右移2位就是转成二进制变成1110,去掉右边的10,变成11,11转成十进制就是3;左移2位就是111000,转成十进制就是56。

实例

int i=15; i>>2;

执行的结果是3,移出的部分将被抛弃。

转为二进制,0000 1111(15)右移2位的结果是0000 0011(3),0001 1010(18)右移位的结果是0000 0011(3)。

3、“>>>”表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0。

实例

res = 20 >> 2;

20的二进制为0001 0100,右移2位后为0000 0101,则结果就为res =5。

res = -20 >> 2;

-20的二进制为1110 1011,右移2位,此时高位补0,即0011 1010,结果为res =- 5。

题7: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源文件是不关心的,它关心的只是由源文件生成的类文件

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

Camel标记法

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

Pascal标记法

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

匈牙利标记法

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

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

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

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

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

题9:抽象类能使用 final 修饰吗?

abstract类为抽象类,即该类只关心子类具有的功能,而不是功能的具体实现。

抽象类不能实例化,其作用是为了被其他类继承,因此final关键字不能修饰抽象类。

抽象类是被用于继承的,final修饰代表不可修改、不可继承的。

题10:Java 和 C++ 有什么区别?

Java和C++都是面向对象的语言,都支持封装、继承和多态。

Java不提供指针来直接访问内存,程序内存更加安全。

Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。

Java有自动内存管理机制,不需要程序员手动释放无用内存。

题11:naming-类-bind()-和rebind()-方法有什么区别

题12:hashcode()-中可以使用随机数字吗

题13:==-和-equals-两者有什么区别

题14:a.hashcode()-有什么用与-a.equals(b)-有什么关系

题15:java-方法命名规则是什么

题16:java-中的关键字都有哪些

题17:静态变量和实例变量有什么区别

题18:rmi-的绑定binding是什么含义

题19:-oop-中的-组合聚合和关联有什么区别

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

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

题22:java-中如何将字符串反转列举几种方式

题23:java-中-integer-a=-128-与-integer-b-=-128-相等吗

题24:为什么-hashmap-负载因子是-0.75

题25:java-中常见都有哪些-runtimeexception

大厂面试题

大厂面试题

大厂面试题

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

搜索帮助

53164aa7 5694891 3bd8fe86 5694891