shoufeng

瘦风的南墙

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 比特和字节

  1. bit(比特),信息技术的最基本存储单位,简写为小写字母“b”。二进制中,1位就是1比特,值只能是0或1。
  2. 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 优雅打印数组

  1. Arrays.toString() 打印一维数组,其可以将任意类型的数组转成字符串,包括基本类型数组和引用类型数组。

    String [] arrays = {"Good","Study"};
    System.out.println(Arrays.toString(arrays));
    // 打印结果如下,[] 表明是一个数组, 英文逗号和空格用来分割元素
    // [Good, Study]
    
  2. 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 字符串常量池在内存中的位置

参考 美团技术团队-深入解析String#intern

  1. Java 7 之前:字符串常量池位于堆内存的永久代(Permanent Generation)中,主要用来存储一些字符串常量(静态数据的一种)。

    • Java Heap(堆内存)是 JVM 中存储对象实例和数组的内存区域。
    • 永久代是 Java Heap 的一个子区域,用于存储类信息、方法信息、常量池信息等静态数据。
  2. Java 7:将字符串常量池从永久代移动到了 Java 堆中。解决:永久代空间不足,导致 java.lang.OutOfMemoryError: PremGen Space 的错误,原因:永久代的大小有限,但应用程序中很难准确评估需要多少永久代空间,如果有大量的类、方法、常量等静态数据,就有可能导致永久代不足。

  3. Java 8:永久代被取消,并由元空间(Metaspace)取代。元空间是一块本机内存区域,和 JVM 内存区域完全分开。优点:

    • 元空间大小可以动态调整,因此不会导致 OutOfMemoryError 错误;
    • 元空间使用本机内存,不使用 JVM 堆内存,可以避免堆内存的碎片化;
    • 元空间中的垃圾收集与堆中的垃圾收集分离,可以避免应用在运行过程中由于类加载和卸载而频繁地触发 Full GC。

方法区是 Java 虚拟机规范中的一个概念,永久代是 HotSpot 虚拟机中对方法区的一个实现;
Java 8 的时候,移除了永久代,取而代之的是元空间,是方法区的另外一种实现,更灵活了。

posted @   瘦风  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示