杰瑞科技汇

Java String是什么?数据类型还是对象?

Java String Java 编程语言中用来表示和操作文本(一串字符)的数据类型

Java String是什么?数据类型还是对象?-图1
(图片来源网络,侵删)

你可以把它想象成一个字符容器,专门用来存放文字信息,比如你的名字、一句话、一个地址等等。

下面我们从几个方面来深入理解它:


核心概念:String 是什么?

在 Java 中,String 是一个,而不是像 intdouble 那样的基本数据类型,这意味着 String 提供了非常丰富的方法来操作字符串内容。

两个重要特性:

a) 不可变性

Java String是什么?数据类型还是对象?-图2
(图片来源网络,侵删)

这是 String 最核心、最重要的一个特性。

  • 定义:一旦一个 String 对象被创建,它的内容(即它所包含的字符序列)就不能被改变

  • 如何实现:当你看起来像是在修改一个字符串时(比如调用 replace()substring()),JVM 实际上会创建一个新的 String 对象来存放修改后的内容,而原始的 String 对象保持不变。

  • 例子:

    Java String是什么?数据类型还是对象?-图3
    (图片来源网络,侵删)
    String original = "hello";
    String modified = original.replace('h', 'j'); // 看似在修改
    System.out.println("original: " + original); // 输出: original: hello
    System.out.println("modified: " + modified); // 输出: modified: jello

    在这个例子中,original 字符串本身并没有被修改,而是创建了一个新的字符串 modifiedoriginal 仍然指向 "hello"。

  • 优点

    • 线程安全不能被改变,所以在多线程环境下,多个线程可以同时访问一个 String 对象而不用担心它会被意外修改。
    • 安全:在处理文件路径、URL 等敏感信息时,不可变性可以防止内容被篡改。
    • 可以被共享和缓存:JVM 会有一个叫做“字符串常量池”的特殊内存区域,当你创建一个字符串字面量(如 String s = "abc";),JVM 会先检查池中是否已经存在 "abc",如果存在就直接引用,不存在则创建并存入池中,这大大节省了内存。

b) 字符串字面量

在 Java 代码中,用双引号 括起来的内容就是字符串字面量,Java 会自动为这些字面量创建 String 对象。

String str1 = "Hello World"; // str1 是一个字符串字面量
String str2 = "Java";        // str2 也是一个字符串字面量

如何创建和使用 String

创建字符串

有几种常见的方式:

  1. 使用字符串字面量(最常用)

    String str = "Hello";
  2. 使用 new 关键字(不推荐,除非有特殊需求) 这种方式会强制在堆内存中创建一个新的对象,即使内容相同,也不会使用字符串常量池中的对象。

    String str = new String("Hello");

常用操作和方法

String 类提供了大量非常方便的方法,这里列举一些最常用的:

方法 描述 示例
length() 返回字符串的长度(字符个数) "abc".length() 返回 3
charAt(int index) 返回指定索引位置的字符 "Hello".charAt(1) 返回 'e'
substring(int beginIndex) 截取从 beginIndex 开始到结尾的子字符串 "Hello".substring(1) 返回 "ello"
substring(int begin, int end) 截取从 beginIndexendIndex-1 的子字符串 "Hello".substring(1, 3) 返回 "el"
indexOf(String str) 查找子字符串第一次出现的位置,找不到返回 -1 "Hello".indexOf("l") 返回 2
contains(CharSequence s) 判断字符串是否包含指定的字符序列 "Hello".contains("ell") 返回 true
toUpperCase() / toLowerCase() 转换为大写 / 小写 "aBc".toUpperCase() 返回 "ABC"
trim() 去除字符串首尾的空白字符(空格、制表符等) " abc ".trim() 返回 "abc"
replace(char old, char new) 将所有 old 字符替换为 new 字符 "hello".replace('l', 'p') 返回 "heppo"
split(String regex) 根据给定的正则表达式分割字符串 "a,b,c".split(",") 返回数组 ["a", "b", "c"]
(连接符) 用于连接两个或多个字符串 "Hello" + " " + "World" 返回 "Hello World"

StringStringBuilderStringBuffer 的区别

由于 String 的不可变性,在需要频繁修改字符串内容的场景(比如循环拼接字符串),使用 String 会产生大量中间对象,导致性能问题,这时就需要 StringBuilderStringBuffer

特性 String StringBuilder StringBuffer
可变性 不可变 可变 可变
线程安全 安全 不安全 (非线程同步) 安全 (线程同步)
性能 频繁修改时性能差 性能最好 性能比 StringBuilder 稍差
使用场景 存储不变的文本,如常量、配置信息 单线程环境下进行大量字符串操作 多线程环境下进行大量字符串操作

简单选择建议:

  • 如果字符串内容不需要改变,就用 String
  • 如果在单线程中需要频繁修改字符串(如循环拼接),就用 StringBuilder
  • 如果在多线程环境中需要安全地修改字符串,就用 StringBuffer

Java String 是 Java 语言中处理文本的基础,记住它的两个核心要点:

  1. 它是一个类,提供了丰富的方法来操作文本。
  2. 它不可变,一旦创建内容就不能改变,这带来了安全、线程安全和内存优化的好处。

在日常开发中,你会频繁地使用 String 来存储、传递和处理各种文本信息,它是 Java 编程中最基本、最重要的工具之一。

分享:
扫描分享到社交APP
上一篇
下一篇