Java中的String是一个字符序列,用于存储和操作文本。它是Java中最常用的类之一。
- 字符串中的每个字符都采用16位Unicode(UTF-16)编码存储。
- 字符串是不可变的,这意味着创建后其值无法更改。
示例
String str = "Hello";
str.concat(" World");
System.out.println(str);
输出
Hello
- 因为concat()会创建一个新字符串,而不是修改原字符串。
创建字符串的方式
1. 字符串字面量
示例:1
public class Demo {
public static void main(String[] args) {
String name = "Harini";
System.out.println(name);
}
}
输出
Harini
为什么这被称为字符串字面量?
String name = "Harini";
- "Harini" → 字符串字面量
- 它直接写在双引号内。
- Java将其存储在字符串常量池中。
示例:2
public class Test {
public static void main(String[] args) {
String a = "Java";
String b = "Java";
System.out.println(a == b);
}
}
输出:
true
- 因为a和b都指向字符串池中的同一个对象。
字符串池(String Pool)
- Java将字符串字面量存储在一个称为字符串常量池(String Constant Pool)的特殊内存区域中。
2. 使用 new 关键字
示例
public class Demo {
public static void main(String[] args) {
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1);
System.out.println(s2);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
输出
Java
Java
false
true
使用 new 创建字符串
String s1 = new String("Java");
- new 关键字创建一个新对象
- 对象创建在堆内存中
- 即使 "Java" 已经存在,Java 也会创建另一个新对象
同样适用于:
String s2 = new String("Java");
所以 s1 和 s2 是不同的对象。
为什么 s1 == s2 是 false?
System.out.println(s1 == s2);
输出:
false
因为:
- == 比较内存地址/引用
- s1和s2是内存中的不同对象
为什么 s1.equals(s2) 是 true?
System.out.println(s1.equals(s2));
输出:
true
因为:
- equals() 比较的是实际内容
- 两个字符串都包含 "Java"
内存表示
- 字符串 s1 = new String("Java");
- 字符串 s2 = new String("Java");
堆内存
s1 ---> "Java" (对象 1)
s2 ---> "Java" (对象 2)
创建了两个独立的对象。























