最全JAVA初级岗面试知识点——基础篇,kafka常见的面试问题

最后

码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到

又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考

以下是部分内容截图
架构面试专题及架构学习笔记导图.png

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

| 41、HashMap 为什么需要扩容 |

| 42、 如何遍历 Map 集合 |

| 43、 ArrayList 与 LinkedList 区别 |

| 44、ArrayList 与 LinkedList 区别 |

| 45、如何使用的 List 集合来保证线程安全 |

| 46、IO 和 NIO 的区别 |

| 47、在 Java 中要想实现多线程代码有三种手段 |

| 48、Thread 类中的 start() 和 run() 方法有什么区别 |

| 49、Java 中 notify 和 notifyAll 有什么区别 |

| 50、Java 多线程中调用 wait() 和 sleep()方法有什么不同 |

| 51、什么是线程安全 |

| 52、Java中的 volatile 变量是什么 |

| 53、线程的状态 |

| 54、实现线程同步有三种方式 |

| 55、Java中的锁有几种方式 |

| 56、Lock的几个实现类 |

| 57、线程间通信的几种实现方式 |

| 58、synchronized 和 Lock 的区别和应用场景 |

| 59、为什么要用线程池 |

| 60、如何创建线程池 |

| 61、java中的异常体系 |

| 62、throw 和 throws 的区别 |

| 63、说出 5 个常见的异常 |

1、java是一种什么语言,jdk,jre,jvm三者的区别?

java是一种完全面向对象的编程语言,具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,它吸收了c++的优点,去掉了c++中多继承,指针等让人难于理解的概念。java语言采用Unicode编码标准。

JDK(Java Development Kit)是针对 Java 开发员的产品,是整个 Java 的核心,包括了 Java 运行环境 JRE、Java 工具和 Java 基础类库。

Java Runtime Environment(JRE)是运行 JAVA 程序所必须的环境的集合,包含 JVM 标准实现及 Java 核心类库。

JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,是整个 java 实现跨平台的最核心的部分,能够运行以 Java 语言写作的软件程序。

jvm,jre和jdk三者的关系

2、java 1.5之后的三大版本?

java SE java标准版

java EE java企业版

java ME java微型版

3、java跨平台及其原理?

所谓的跨平台就是java源码经过一次编译以后,可以在不同的操作系统上运行

原理:经过编译的 .class 文件运行在java虚拟机上,并非直接运行在操作系统上,只要安装满足不同操作系统的jvm即可。

4、java 语言的特点?

1、面向对象。java 是面向对象语言,即满足面向对象的基本特征(封装,继承,多态)。封装是将 属性,方法等放在一个类中,体现了java语言的安全性,继承是子类继承了父类后便有了父类的特性,多态则是父类的引用指向子类的地址,执行不同的操作,继承和多态体现了java语言的灵活性,易扩展性。

2、跨平台。jvm实现java语言的跨平台。

3、支持网络编程。

4、支持多线程。

5、健壮性。java语言的强类型机制,异常处理机制,GC垃圾自动收集机制。

5、什么是字节码,字节码的好处?

字节码:java 经过 javac 命令产生的 .class 文件就是字节码。

字节码的好处:1、在一定程度上解决了解释性语言效率低下的问题。2、不针对特定的机器,保留了解释性语言的可移植性。

6、java 和 c++ 的区别?

java和c++都是面向对象语言。因此都有面向对象的基本特性封装,继承,多态。它们的区别如下:

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

2、java中是单继承,c++中支持多继承。

3、java中有内存管理机制,无需程序员手动释放内存。

7、java的三大特性?

封装: 把方法、变量封装在类中,提高代码的安全性

继承: java中为单继承,提高代码的重用性

多态: 多态就是同一个类或者接口,使用不同的实例因而执行不同的操作,提高代码的灵活性

8、java中的基本数据类型和引用数据类型及其区别?

  • 8种基本数据类型

| | 说明 | 所占内存大小(字节) | 取值范围 | 默认值 |

| — | — | — | — | — |

| byte | java中最小的数据类型 | 1 | − 2 7 {-2^7} −27~ 2 7 {2^7} 27-1 | 0 |

| short | 短整型 | 2 | − 2 15 {-2^{15}} −215~ 2 15 {2^{15}} 215-1 | 0 |

| int | 整型 | 4 | − 2 31 {-2^{31}} −231~ 2 31 {2^{31}} 231-1 | 0 |

| long | 长整型 | 8 | − 2 63 {-2^{63}} −263~ 2 63 {2^{63}} 263-1 | 0L |

| float | 单精度 | 4 | -3.40E+38 ~ +3.40E+38 | 0 |

| double | 双精度 | 2 | -1.79E+308 ~ +1.79E+308 | 0 |

| char | 字符型 | 2 | 0~65535 | null |

| boolean | 布尔型 | 1 | true,false | false |

  • 引用数据类型

类,接口类型,数组类型,枚举类型,注解类型

  • 基本数据类型与引用数据类型的区别

基本数据类型在被创建时,会在栈上分配空间,直接将之存储在栈中。而引用数据类型在被创建时,首先会在栈上分配空间,将其引用存在栈空间中,然后在堆中开辟内存,值存放在堆内存中,栈中的引用指向堆中的地址。

9、switch(expr),expr支持哪些数据类型?

在java5以前,expr支持 byte,short,int,char 四种数据类型,在java5以后,又多了枚举enum类型,java7又增加了string类型,到目前并比支持long类型。

10、int 和 Integer 有什么区别,怎么理解自动拆箱,自动装箱?

int 是基本数据类型,默认值是0

integer是引用类型,是int 的包装类,默认值是 null

自动拆箱:将包装类型自动转化为对应的基本数据类型。

自动装箱:将基本类型自动转化为对应的引用类型。

11、计算2^3效率最高的方法是?

计算2^3效率最高的方法是:2<<(3-1)

12、Math.round(temp) ?

四舍五入的原理是在原来的参数上加0.5,然后进行向下取整。

13、float f=3.4;是否正确?

不正确。3.4是双精度类型,赋值给float需要强制类型转换,float f=(float)3.4,可以写成 float f=3.4F。

14、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?

short s1 = 1; s1 = s1 + 1 不正确。因为 1是int类型,因此 s1+1 也是int类型,在执行 s1=s1+1 时,需要将int类型的s1+1赋值给short类型的s1,大转小可能会有精度损失,无法显示转化。

short s1 = 1; s1 += 1 正确。因为 s1+=1 相当于s1=(short)(s1+1),存在隐含的强制类型转换。

15、java中的注释?

定义:注释是用来解释说明程序的文字。分为:

单行注释:// 注释的文字

多行注释:/* 注释的文字 _/

文档注释:/_* 注释的文字 **/

16、java中的访问修饰符?

java中的访问修饰符有:public,private,protected,以及不写(默认)。

在这里插入图片描述

17、重写与重载的区别?

重写: 至少发生在两个类中,并且类与类具有继承或者实现关系,表示子类中的方法具有与父类方法中完全相同的方法名称,返回值,参数。子类中的方法覆盖父类的方法,体现了多态性。

重载: 发生在同一个类中,多个方法名称相同,参数类型,个数和顺序不同的方法发生重载现象,与返回值无关。

18、运算符 &和&&的区别?

&:无论左边true还是false,右边也会进行判断。

&&:如果左边为false,有边就不会进行判断,因此&&比&效率高。

注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

19、Java 有没有 goto?

goto 是 Java 中的保留字,在目前版本的 Java 中没有使用。

20、this关键字的用法?

1.普通的直接引用,this相当于是指向当前对象本身。

2.形参与成员名字重名,用this来区分:

public Person(String name, int age) {

this.name = name;

this.age = age;

}

3.调用本类的构造函数:

class Person{

private String name;

private int age;

public Person() {

}

public Person(String name) {

this.name = name;

}

public Person(String name, int age) {

this(name);

this.age = age;

}

}

21、super关键字的用法?

1.普通的直接引用。

2.调用父类中与子类重名的方法。

2.调用父类的构造函数。

22、java 的final 关键字?

在java中,final关键字可以修饰类,变量和方法。被final修饰后以下特点:

final修饰类:final修饰的类不能被继承。

final修饰变量:final修饰的变量是常量,不能改变。

final修饰方法:final修饰的方法不能被重写。

23、break ,continue ,return 的区别及作用?

break:跳出当前循环

continue:结束本次循环,进行下次循环

return:返回

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

在外面的循环语句前定义一个标号

ok:

for(int i=0;i<10;i++){

for(int j=0;j<10;j++){

system.out.println(“i=”+i+“,j=”+j);

if(j==5)break ok;

}

}

25、hashCode 与 equals?

如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。

两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。

26、抽象类和接口的区别是什么?

接口中的方法都是抽象的,抽象类中可以有抽象方法,也可以有非抽象方法。

在jdk1.8以后接口中也可以有用defaule关键字修饰的普通方法

27、什么是接口?

接口是一种规范,java中的接口:interface

28、静态变量与非静态变量的区别

| | 静态变量 | 非静态变量 |

| — | — | — |

| 调用方式 | 静态变量只能通过 “ 类名.变量名 ” 调用 | 非静态变量通过实例化对象名调用 |

| 共享方式 | 静态变量是全局变量,被类的所有实例化对象共享 | 非静态变量是局部变量,不共享 |

| 相互访问方式 | 静态变量无法访问非静态变量 | 非静态变量可以访问静态变量 |

29、值传递和引用传递的区别是什么?

值传递: 在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中。

引用传递: 引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

30、什么是反射?

JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

31、String 类中常用的方法?

| 方法 | 说明 |

| — | — |

| split() | 把字符串分割成字符串数组 |

| indexOf() | 从指定字符提取索引位置 |

| append() | 追加字符或字符串 |

| trim() | 去掉字符串两端的空格 |

| replace() | 替换 |

| hashCode() | 返回字符串的哈希值 |

| subString() | 截取字符串 |

| equals() | 比较字符串是否相等 |

| length() | 获取字符串长度 |

| concat() | 将指定字符串连接到此字符串的结尾 |

32、String 中的==和 equals 的区别?

"=="比较的是两个字符串的内存地址。 "equals"比较的是两个字符串的实际值

33、Java 中的 String,StringBuilder,StringBuffer 三者的区别?

String: 字符串常量,底层用 final 关键字修饰,底层实际在维护 char 类型的字符数组,当每次对String进行改变时,都需要生成一个新的String对象,然后将指针指向一个新的对象。

//底层用 final 关键字修饰,底层实际在维护 char 类型的字符数组

public final class String implements java.io.Serializable, Comparable, CharSequence {

/** The value is used for character storage. */

private final char value[];

}

StringBuilder: 字符串变量,线程安全,用于多线程操作

StringBuffer : 字符串变量,非线程安全,用于单线程操作

34、Java中final、finally和finalize的区别?

final: 修饰符,java 中的关键字。可用于修饰类,变量,方法,有最终的意思。

| 修饰的对象 | 说明 |

| — | — |

| final 修饰类 | 表明该类不能被其他类所继承,但要注意:final类中所有的成员方法都会隐式的定义为final方法。 |

| final 修饰变量 | final成员变量表示常量,只能被赋值一次,赋值后其值不再改变 |

| final 修饰方法 | final 修饰的方法不能被重写 |

finally: finally 是在异常里经常用到的, 就是 try 和 cach 里的代码执行完以后,必须要执行的方法,我们经常在 finally 里写一些关闭资源的方法,比如说关闭数据库连接,或者关闭 IO 流.

finalize: finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作

35、Java里可不可以有多继承?

java中不允许多继承,比如类A不能同时继承类B和类C,若要有次类需求,考虑用接口。

36、HashMap 和 Hashtable 的区别?

HashMap 和 Hashtable是Map接口的实现类,它们大体有一下几个区别:

  1. 继承的父类不同。HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。
  1. 线程安全性不同。Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。Hashtable 是现成安全的,HashMap是非线程安全的。
  1. key和value是否允许null值。Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

37、Map 集合有哪些实现类,分别具有什么特征?

| 实现类 | 特征 |

| — | — |

| HashMap | 线程不安全的键值对集合,允许 null 值,key 和 value 都可以 |

| HashTable | 线程安全的键值对集合,不允许 null 值,key 和 value 都不可以 |

| TreeMap | 能够把它保存的记录根据键排序,默认是按升序排序 |

38、解决 hashmap 线程不安全问题?

  1. Collections.synchronizedMap() 方法
  1. java.util.concurrent.ConcurrentHashMap 类

39、Hashmap 的底层实现原理?

在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,当桶中元素较多时,通过key值查找的效率较低。

而JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8),时,将链表转换为红黑树,这样大大减少了查找时间。

当我们创建 hashmap 时 会先创建一个数组,当我们用 put 方法存数据时,先根据 key 的 hashcode 值计算出 hash 值,然后用这个哈希值确定在数组中的位置,再把 value 值放进去,如果这个位置本来没放 东西,就会直接放进去,如果之前就有,就会生成一个链表,把新放入的值放在头部,当用 get 方法取值时,会先根据 key 的 hashcode 值计算出 hash 值,确定位置,再根据 equals 方法从该位置上的链表中取出该 value 值。

40、hash 碰撞怎么产生,怎么解决?

对象Hash的前提是实现equals()和hashCode()两个方法,那么HashCode()的作用就是保证对象返回唯一hash值,但当两个对象计算值一样时,这就发生了碰撞冲突。如下将介绍如何处理冲突,当然其前提是一致性hash。

解决hash碰撞有以下几种方法:

  • 开放地址法

开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1) 其中,m为哈希表的表长。di 是产生冲突的时候的增量序列。如果di值可能为1,2,3,…m-1,称线性探测再散列。如果di取1,则每次冲突之后,向后移动1个位置.如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,…k_k,-k_k(k<=m/2),称二次探测再散列。如果di取值可能为伪随机数列。称伪随机探测再散列。

  • 再哈希法

当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。比如上面第一次按照姓首字母进行哈希,如果产生冲突可以按照姓字母首字母第二位进行哈希,再冲突,第三位,直到不冲突为止。

  • 链地址法(拉链法)

将所有关键字为同义词的记录存储在同一线性链表中。如下:

在这里插入图片描述

41、HashMap 为什么需要扩容?

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

xt_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNjI1Nzc4,size_16,color_FFFFFF,t_70)

41、HashMap 为什么需要扩容?

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

[外链图片转存中…(img-5hNJGvbb-1715566477872)]

[外链图片转存中…(img-WmbTKsfX-1715566477873)]

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值