1 Star 0 Fork 31

moyu3390 / Ebooks_1

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

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

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

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

Java 基础

题1:Java 中能否继承 String 类?

String类是final类所以不可以被继承。

题2:Java 中 short s1=1; s1+=1; 有错吗?

Java中short s1=1; s1+=1;是正确的。

“+=”是赋值运算符,不牵涉与其它类型的数字计算,也不会转成int类型的,因此不会报错。

注意的是表达式x += i不是表达式x = x + i的简写方式。

表达式x = x + i使用的是简单赋值操作符=,而表达式x += i使用的是复合赋值操作符,复合赋值表达式会自动地将所执行计算的结果转型为其左侧变量的类型。

题3:构造器 Constructor 是否可被重写(Override)?

造器不能被继承,因为每个类名都不相同,而构造器的名称与类名相同,所以构造器不能被继承,也不能被重写。

构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

题4:了解过字节码的编译过程吗?

大部分的程序代码从开始编译到最终转化成物理机的目标代码或虚拟机能执行的指令集之前,都会按照如下图所示的各个步骤进行:

字节码编译过程.jpg

其中绿色的模块可以选择性实现。

上图中间的那条分支是解释执行的过程(即一条字节码一条字节码地解释执行,如JavaScript), 而下面的那条分支就是传统编译原理中从源代码到目标机器代码的生成过程。

题5:如何理解 final 关键字?

1)类的final变量和普通变量有什么区别?

当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。

2)被final修饰的引用变量指向的对象内容可变吗?

引用变量被final修饰之后,虽然不能再指向其他对象,但是它指向的对象的内容是可变的

3)final参数的问题

在实际应用中,我们除了可以用final修饰成员变量、成员方法、类,还可以修饰参数、若某个参数被final修饰了,则代表了该参数是不可改变的。如果在方法中我们修改了该参数,则编译器会提示你:

The final local variable i cannot be assigned. It must be blank and not using a compound assignment。

java采用的是值传递,对于引用变量,传递的是引用的值,也就是说让实参和形参同时指向了同一个对象,因此让形参重新指向另一个对象对实参并没有任何影响。

题6:Java 常量命名规则是什么?

常量名:全部使用大写,最好使用下划线分割单词。

题7:Java 中 int a[] 和 int []a 有什么区别?

采用int a[]这种写法是为了沿袭C、C++的写法。

Java中为了说明所有东西都是对象常采用int[] a写法。

题8: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。

题9:Java 中 & 和 && 有什么区别?

&是位操作

&&是逻辑运算符

逻辑运算符具有短路特性,而&不具备短路特性。

来看一下代码执行结果:

public class Test{

    static String name;
 
    public static void main(String[] args){
        if(name!=null & name.equals("")){
            System.out.println("ok");
        }else{
            System.out.println("error");
        }
    }
}

执行结果:

Exception in thread "main" java.lang.NullPointerException
	at com.jingxuan.JingXuanApplication.main(JingXuanApplication.java:25)

上述代码执行时抛出空指针异常,若果&替换成&&,则输出日志是error。

题10:两个对象 hashCode() 相同,equals()判断一定为 true 吗?

两个对象hashCode()相同,使用equals()方法判断不一定为true。

两个对象hashCode()相同,只能说明哈希值相同,不代表这两个键值对相等。

String str1 = "通话";
String str2 = "重地";
// str1: 1179395 | str2: 1179395
System.out.println(String.format("str1: %d | str2: %d",str1.hashCode(),str2.hashCode()));
// false
System.out.println(str1.equals(str2));

题11:java-如何实现字符串中查找某字符出现的次数

题12:string-编码-utf-8-和-gbk-有什么区别?

题13:java-中-yyyy-和-yyyy-有什么区别

题14:​final-关键字的基本用法

题15:java-中变量命名有哪些规则

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

题17:java中抛出-throwable-结构有哪几种类型

题18:java-中-math.-round(-1.5)-等于多少

题19:java-事务都有哪些类型有什么区别

题20:为什么-string-类型是被-final-修饰的

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

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

题23:java-中-throw-和-throws-有什么区别

题24:写出一个正则表达式来判断一个字符串是否是一个数字

题25:java-中-float-f-=-3.5;-是否正确

大厂面试题

大厂面试题

大厂面试题

Java
1
https://gitee.com/moyu3390/ebooks_1.git
git@gitee.com:moyu3390/ebooks_1.git
moyu3390
ebooks_1
Ebooks_1
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891