Java 面试汇总 01 - Java 基础
此面试合集,仅汇总 Java 核心知识点,不会涉及很基础的内容,旨在做减法,把书读薄,通过查漏补缺,巩固 Java 基础,以帮助大家提升面试表现。
1 - Java 语法基础
1.1 Java 的基本数据类型
数据类型 | 默认值 | 大小 |
---|---|---|
boolean | false | 不确定 |
char | '\u0000' | 2 字节 |
byte | 0 | 1 字节 |
short | 0 | 2 字节 |
int | 0 | 4 字节 |
long | 0L | 8 字节 |
float | 0.0f | 4 字节 |
double | 0.0 | 8 字节 |
1.2 比特和字节
- bit(比特),信息技术的最基本存储单位,简写为小写字母“b”。二进制中,1位就是1比特,值只能是0或1。
- Byte(字节)一个英文字符是一个字节,一个中文字符是两个字节。字节与比特的换算关系是:1 字节 = 8 比特。
Byte 之上的单位的换算关系(1024 是程序员的整数倍哈哈):
1.3 String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
1.4 Java 中有哪些包装类型
包装类型,又称包装器类型(Wrapper Types),是 Java 中的一种特殊类型,用于将基本数据类型(如 int、float、char 等)转换为对应的对象类型。Java 有如下包装类型:
Byte(对应 byte)
Short(对应 short)
Integer(对应 int)
Long(对应 long)
Float(对应 float)
Double(对应 double)
Character(对应 char)
Boolean(对应 boolean)
1.5 包装类型的缓存池
除 Float 和 Double 之外,其他六个包装器类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池,可在 JVM 启动时通过 -XX:AutoBoxCacheMax=xxx
参数来指定缓存池的大小, 默认的缓存大小如下:
类型 | 缓存池大小 |
---|---|
Byte | -128~127(2^7,即所有的 byte 值) |
Short | -128~127 |
Long | -128~127 |
Character | \u0000 - \u007F |
Boolean | true 和 false |
1.6 Java 的引用数据类型
除了基本数据类型以外的类型,都是引用类型。常见的有数组、class(也就是类),以及接口(指向实现接口的类的对象)。String 是很典型的引用数据类型。
1.7 基本数据类型 vs 引用数据类型
1)变量名指向具体的数值;
2)基本数据类型存储在栈上;
3)作为成员变量和静态变量时,均有默认值;
引用数据类型:
1)变量名指向的是存储对象的内存地址,在栈上;
2)内存地址指向的对象存储在堆上;
3)作为成员变量和静态变量时,均有默认值为 null。
2 - Java 数组
2.1 Java 中数组的常见声明方式
👇 数组的声明方式,点这里展开代码👇
// 创建并指定数组的大小,然后逐一赋值
int[] array1 = new int[10];
array1[0] = 1;
// 精简版创建方式
int[] array2 = {1, 2, 3};
// 创建并初始化数组
int[] array3 = new int[] {1, 2, 3};
2.2 优雅打印数组
-
Arrays.toString()
打印一维数组,其可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组。String [] arrays = {"Good","Study"}; System.out.println(Arrays.toString(arrays)); // 打印结果如下,[] 表明是一个数组, 英文逗号和空格用来分割元素 // [Good, Study]
-
Arrays.deepToString()
打印二维数组。String [] arrays = {{"Good", "Good", "Study"}, {"Day", "Day", "Up"}}; System.out.println(Arrays.toString(arrays)); // 打印结果如下 // [[Good,Good,Study],[Day,Day,Up]]
3 - Java 字符串
3.1 Java 中 final 修饰符的作用?
final 修饰的类叫最终类,该类不能被继承,比如 String 类就是此类,即字符串对象不能被修改;
final 修饰的方法不能被重写;
final 修饰的变量是常量,常量必须初始化(即用 = 为其赋值),初始化之后其值不能被修改。
3.2 String str = "i" 与 String str=new String("i") 的区别
不一样,因为内存的分配方式不一样:
- 对于
String str = "i"
,JVM 会将i
分配到常量池中 —— 只创建一个对象; - 对于
String str = new String("i")
,JVM 会i
分到常量池中,new 出来的字符串对象保存在堆内存中 —— 创建两个对象。
—— 建议:直接使用双引号的方式创建字符串,提高对象的创建和内存使用效率。
3.3 String、StringBuilder、StringBuffer的区别及使用场景
String 一旦定义就不可改变,可空赋值。操作少量数据时使用。
StringBuilder 可改变,线程不安全。操作单线程大量数据时使用。
StringBuffer 可改变,线程安全。操作多线程大量数据时使用。
3.4 字符串常量池在内存中的位置
-
Java 7 之前:字符串常量池位于堆内存的永久代(Permanent Generation)中,主要用来存储一些字符串常量(静态数据的一种)。
- Java Heap(堆内存)是 JVM 中存储对象实例和数组的内存区域。
- 永久代是 Java Heap 的一个子区域,用于存储类信息、方法信息、常量池信息等静态数据。
-
Java 7:将字符串常量池从永久代移动到了 Java 堆中。解决:永久代空间不足,导致
java.lang.OutOfMemoryError: PremGen Space
的错误,原因:永久代的大小有限,但应用程序中很难准确评估需要多少永久代空间,如果有大量的类、方法、常量等静态数据,就有可能导致永久代不足。 -
Java 8:永久代被取消,并由元空间(Metaspace)取代。元空间是一块本机内存区域,和 JVM 内存区域完全分开。优点:
- 元空间大小可以动态调整,因此不会导致 OutOfMemoryError 错误;
- 元空间使用本机内存,不使用 JVM 堆内存,可以避免堆内存的碎片化;
- 元空间中的垃圾收集与堆中的垃圾收集分离,可以避免应用在运行过程中由于类加载和卸载而频繁地触发 Full GC。
方法区是 Java 虚拟机规范中的一个概念,永久代是 HotSpot 虚拟机中对方法区的一个实现;
Java 8 的时候,移除了永久代,取而代之的是元空间,是方法区的另外一种实现,更灵活了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~