likes
comments
collection
share

用 Java 实现 JVM|第九章:数组和字符串

作者站长头像
站长
· 阅读数 66

用 Java 实现 JVM

第九章:数组和字符串

作者:bobochang


引言

欢迎来到本系列博客的第九章!在前面的章节中,我们已经学习了 JVM 的各个组成部分,包括类加载、方法调用和返回等。今天,我们将深入探索 JVM 中数组和字符串的实现方式。

数组和字符串是 Java 语言中常用的数据结构,也在 JVM 中占据重要的位置。在本章中,我们将学习 JVM 如何表示和处理数组和字符串,并了解其在内存中的存储方式。

让我们开始吧!

数组的表示和访问

在 JVM 中,数组是一种可以容纳多个相同类型元素的数据结构。在 Java 中,数组的大小是固定的,一旦创建后就无法改变。

数组在内存中的表示方式如下:

  • 数组对象头:每个数组对象都包含一个对象头,用于存储数组的长度和其他与对象相关的信息。

  • 数组元素:数组中的每个元素都按照顺序存储在连续的内存空间中。

要访问数组中的元素,我们需要知道数组的地址和元素的索引。以下是一个示例,展示了如何声明、初始化和访问数组:

public class ArrayExample {
    public static void main(String[] args) {
        int[] numbers = new int[5];
        numbers[0] = 10;
        numbers[1] = 20;
        numbers[2] = 30;

        System.out.println("Element at index 0: " + numbers[0]);
        System.out.println("Element at index 1: " + numbers[1]);
        System.out.println("Element at index 2: " + numbers[2]);
    }
}

以上代码中,我们声明了一个 numbers 数组,其长度为 5。然后,我们给数组的前三个元素赋值,并使用索引访问数组中的元素。

当我们执行代码时,将会输出以下内容:

Element at index 0: 10
Element at index 1: 20
Element at index 2: 30

这表明我们成功地声明、初始化和访问了数组中的元素。

需要注意的是,数组的索引从 0 开始,因此第一个元素的索引是 0,第二个元素的索引是 1,依此类推。

字符串的表示和操作

在 JVM 中,字符串是不可变(immutable)的对象,即一旦创建后就不能更改其值。字符串在内存中的表示方式有两种:基于字符数组和基于字符串常量池。

1. 基于字符数组的字符串表示

当我们使用 new 关键字创建字符串对象时,JVM 会在堆上分配一块内存来存储字符串的字符数组和对象头。以下是一个示例:

String str = new String

("Hello, world!");

内存表示如下:

str (reference)
+---------+
|  地址   |
+---------+

String object (heap)
+---------+
|  长度   |
+---------+
| 字符数组 |
+---------+

2. 基于字符串常量池的字符串表示

字符串常量池是 JVM 中用于存储字符串常量的特殊区域。当我们使用字符串字面量创建字符串对象时,JVM 会首先检查字符串常量池中是否已存在相同值的字符串,如果存在则直接返回常量池中的引用,否则在常量池中创建新的字符串对象。

以下是一个示例:

String str = "Hello, world!";

内存表示如下:

str (reference)
+---------+
|  地址   |
+---------+

String object (string constant pool)
+---------+
|  地址   |
+---------+

字符串常量池的优势在于节省了内存空间,因为多个具有相同值的字符串可以共享同一个字符串对象。

字符串操作

由于字符串是不可变的,对字符串进行修改实际上是创建了一个新的字符串对象。在 Java 中,我们可以使用许多字符串操作方法来处理字符串,例如连接、截取、查找等。

以下是一些常用的字符串操作方法示例:

String str1 = "Hello";
String str2 = "World";

// 连接字符串
String result1 = str1.concat(str2);
System.out.println(result1);  // 输出: HelloWorld

// 获取子串
String result2 = str1.substring(1, 3);
System.out.println(result2);  // 输出: el

// 查找字符位置
int index = str1.indexOf('o');
System.out.println(index);  // 输出: 4

这些字符串操作方法都返回一个新的字符串对象,原始字符串对象不会被修改。

总结

本章中,我们深入学习了 JVM 中数组和字符串的实现方式。我们了解了数组在内存中的存储方式以及如何访问数组中的元素。同时,我们也了解了字符串在内存中的表示方式,包括基于字符数组和基于字符串常量池。我们还学习了一些常用的字符串操作方法。

数组和字符串是 Java 编程中常用的数据结构,对于理解 JVM 的工作原理至关重要。希望本章的内容能够帮助你更好地掌握数组和字符串在 JVM 中的实现和操作。如果你有任何疑问或建议,请在下方评论区与我交流。下次见!

转载自:https://juejin.cn/post/7249607108045045818
评论
请登录