面试宝典之常见的Java基础面试题

B1、【初级】Java的基本数据类型有哪些?

自从Java发布以来,基本数据类型就是Java语言的一部分,分别是byte, short, int, long, char, float, double, boolean。

理解内容:
  • 5个数值类型(short、int、long、float、double),1个布尔类型(boolean),1个字节类型(byte),1个字符类型(char)

B2、【初级】Java的引用数据类型有哪些?

  • 接口(interface)
  • 类(class)
  • 数组类型([])
  • 枚举
  • 注解类型
  • String类型
  • 封装类
理解内容:
  • 接口、类、数组、枚举

B3、【初级】包装类有什么作用?

boolean ---> Boolean

char ---> Character

byte---> Byte

short---> Short

long---> Long

int ---> Integer

float---> Float

double---> Double

包装类主要以下作用:

(1)类型转换时,如果不能强制转换,则需要使用包装类的相关方法来实现类型转换。

(2)在有些情况下,能够被处理的数据类型只能是引用类型,如Java集合中不能存放基本类型数据,如果要存放数字,应该通过包装类将基本类型数据包装起来,从而间接处理基本类型数据。

(3)每个包装类都包含一组实用方法,其中很多是静态的。这些方法为处理某种基本类型数据提供了丰富的手段。比如Integer类的静态方法parseInt(String s)能将字符串转换为整数,静态方法toBinaryString(int i)返回包含整数i的二进制形式字符串。

(4)包装类默认值为null,一些不需要默认值的场景。

B4、【初级】什么叫装箱拆箱?

包装类和基本数据类型之间的转换。

装箱:把基本数据类型转换成包装类。

拆箱:把包装类转换成基本数据类型。

B5、【初级】面向对象编程有哪些特点?

  • 封装

    解释:是指隐藏对象的属性和实现的细节,仅对外提供公共访问方式。

    目的:

    (1)隐藏实现细节,代码安全。

    (2)简化代码,增强了代码的复用性。

    (3)减少耦合,分工明确。

  • 继承

    解释:子类继承父类的特征和行为。

    目的:实现代码的复用。

  • 多态

    解释:同一个行为的多个不同表现形式。

    目的:使程序更灵活,扩展性更强。(以不变应万变,usb接口)

    必要条件:

    (1)继承或实现接口

    (2)父类引用指向子类

    (3)重写

B6、【初级】== 和 equals 的区别是什么?

(1)==是一个比较运算符,基本数据类型比较的是值,引用数据类型比较的是地址值。(比较地址值即是指是否为同一个对象的引用)

(2)equals()是一个方法,只能比较引用数据类型。重写前比较的是地址值,重写后比一般是比较对象的属性。

B7、【初级】说说你对HashCode的理解:

(1)hashCode() 的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

(2)hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode() 函数。

(3)通过对象的内部地址(也就是物理地址)转换(计算)成一个整数,然后该整数通过hash函数的算法就得到了hashcode。

B8、【初级】你都是用过哪些java的容器(集合)?

  • list:ArrayList、LinkedList、Vector
  • set:HashSet、TreeSet
  • map:HashMap、TreeMap、HashTable、ConcurentHashMap

B9、【中级】请说一下ArrayList的扩容机制

(1)ArrayList的底层结构是一个数组。默认长度是10。

(2)当数组被存储占满时触发扩容,新数组长度为原长度的1.5倍。

(3)当数组扩容时,会创建一个原数组长度1.5倍的新数组,然后再把数据从原数组中拷贝到新数组中。

B9、【中级】请说一下HashMap的扩容机制

(1)底层数据存储结构是数组+链表+红黑树

(2)数组的默认长度为16

(3)负载因子为0.75,也就是说当使用容量达到总长度的四分之三时,触发扩容,新的数组长度为原数组长度的2倍。

(4)当key发生hash碰撞时,产生链表。当链表的长度大于8并且数组长度大于64时,产生红黑树。

(5)容量小于64,链表长度大于等于8也会触发一次扩容。

B10、【中级】你都用过哪些设计模式?

(1)单例模式

(2)工厂模式

(3)代理模式:动态代理和静态代理。其中动态代理包括JDK代理和CGLIB代理

B11、【中级】单例模式有哪些实现方式?

  • 饿汉式

    (1)在程序启动时创建对象

    (2)优点:线程安全的

    (3)缺点:影响启动速度。如果这个对象从来被使用过,会导致占用多一点内存

  • 懒汉式

    (1)在使用对象的时候才创建对象

    (2)优点:不会占用更多内存

    (3)缺点:不是线程安全的,因此一般会在创建对象时加锁

B12、【中级】hashcode和equals有啥关系?

(1)判断两个对象是否为同一个对象时,优先判断hashcode是否相同。

(2)如果hashcode相同,会再次调用equals来判断是否为同一个对象。

(3)一般重载equals时,需要先重载hashcode,否则在判断对象的值是否相同时,可能不会被调用。

(4)hashcode的作用是加快查找和比较对象。

B13、【初级】JDK1.8有哪些新特?

(1)接口中的默认方法

(2)函数式接口

(3)Lambda表达式

(4)Stream API

B14、【初级】Stream和Collect有啥区别?

(1)集合(Collect)主要侧重的是数据和存储。

(2)流(Stream)主要侧重的是计算。

B15、【初级】创建对象有哪几种方法?

(1)通过new关键字创建对象:调用了构造函数

(2)通过class类的newInstance()方法:调用了构造函数

复制代码
EmpObj empObj = EmpObj.class.newInstance();

(3)使用构造器类的newInstance()方法:调用了构造函数

复制代码
Constructor<EmpObj> constructor = EmpObj.class.getConstructor();
EmpObj emp = constructor.newInstance();
System.out.println(emp);

(4)使用clone()的方法:没有调用构造函数

(5)通过反序列化方法:没有调用构造函数

理解内容:
  • new关键字
  • 反射
  • clone
  • 反序列化

B16、【初级】字节流和字符流区别?

(1)字节流,是读取/写入一个字节(byte)。

(2)字符流,是读取/写入一个字符(char),可以直接接受字符串,它内部将字符串转换成字节。

(3)所有文件的存储都是以字节为单位,所以字节流适用于任何文件。

(4)字符流只能操作纯文本文件。

B17、【初级】什么是面向对象?谈谈你对面向编程的理解。

面向对象实际上是针对面向过程而提出来的概念。面向过程是一切是函数,面向对象是一切皆对象。

面向对象思想简单概括起来就是三个:封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

(1)封装:保留有限的外部接口(interface),隐藏具体实施细节。

(2)继承:顾名思义,继承就是儿子对父亲的继承,子类不但可以有父类,他也可以有自己的子类。

(3)多态:继承、方法重写、父类引用子类对象

复制代码
    父类类型 对象 = new 子类类型();
    对象.方法名();

B18、【中级】子类可以继承父类的所有方法吗?

子类也并不是完全继承父类的所有方法。

(1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;

(2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;

(3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。

B19、【初级】JDK、JRE、JVM他们之间有什么区别?

(1)JVM,全称Java Virtual Machine(Java虚拟机),是一种用于计算设备的规范,它是一个虚构出来的计算机,引入JVM后,Java语言在不同平台上运行时不需要重新编译。JVM是Java跨平台的核心。

(2)JRE,全称Java Runtime Environment,是指Java的运行环境,是可以在其上运行、测试和传输应用程序的Java平台。

(3)JDK,全称Java Development Kit,是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的Java应用程序。JDK是整个Java开发的核心。

(4)三者关系如下:

JDK = JRE + 开发工具集(例如Javac编译工具等)

JRE = JVM + Java SE标准类库

B20、【中级】String、StringBuffer与StringBuilder之间有什么区别?

String StringBuffer StringBuilder
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 可变类,速度更快
不可变 可变 可变
线程安全 线程安全 线程不安全
多线程操作字符串 单线程操作字符串
  • 处理内容变换时的速度对比:
    StringBuilder 》 StringBuffer 》 String

理解内容:

  • String不可变,所以线程安全,速度最慢
  • StringBuffer可变,线程安全,比较慢。
  • StringBuilder可变,线程不安全,所以最快
相关推荐
失去妙妙屋的米奇34 分钟前
matplotlib数据展示
开发语言·图像处理·python·计算机视觉·matplotlib
_一条咸鱼_1 小时前
AI 大模型的 MCP 原理
人工智能·深度学习·面试
搞不懂语言的程序员1 小时前
备忘录模式深度解析与实战案例
数据库·python·备忘录模式
_一条咸鱼_1 小时前
AI 大模型 Function Calling 原理
人工智能·深度学习·面试
angushine2 小时前
Gateway获取下游最终响应码
java·开发语言·gateway
爱的叹息2 小时前
关于 JDK 中的 jce.jar 的详解,以及与之功能类似的主流加解密工具的详细对比分析
java·python·jar
小陈同学呦2 小时前
聊聊双列瀑布流
前端·javascript·面试
Lhuu(重开版2 小时前
2025第十六届蓝桥杯PythonB组部分题解
python
一一Null2 小时前
Token安全存储的几种方式
android·java·安全·android studio
AUGENSTERN_dc2 小时前
RaabitMQ 快速入门
java·后端·rabbitmq