一、String 基本介绍

  1. 所属包java.lang.String无需手动导包
  2. 本质:Java 中字符串是不可变的字符序列(底层 char 数组,JDK9+ 改为 byte 数组)
  3. 创建方式
// 1. 直接赋值(推荐,入字符串常量池)
String s1 = "hello";

// 2. new 对象(在堆内存新建对象,不走常量池)
String s2 = new String("hello");

// 3. 字符数组构造
char[] ch = {'a','b','c'};
String s3 = new String(ch);

二、字符串不可变特性

  • 字符串一旦创建,内容不能修改。拼接、替换等操作都会生成新字符串
String str = "abc";
str += "123"; // 原"abc"不变,新建 "abc123"

三、常量池规则

  • 双引号直接创建的字符串,会存入字符串常量池,复用对象,节省内存。
  • == 比较地址equals() 比较内容
String a = "java";
String b = "java";
System.out.println(a == b);       // true(同一常量池对象)
System.out.println(a.equals(b));  // true

String c = new String("java");
System.out.println(a == c);       // false(堆中不同对象)

四、常用方法(高频)

1. 获取 & 长度

int length()                // 返回字符串长度
char charAt(int index)      // 获取指定索引字符
int indexOf(String str)     // 查找子串首次出现索引,找不到返回 -1
int lastIndexOf(String str) // 查找子串最后出现索引

2. 判断类

boolean equals(Object obj)        // 比较内容(区分大小写)
boolean equalsIgnoreCase(String)  // 忽略大小写比较
boolean contains(String str)     // 是否包含子串
boolean startsWith(String str)   // 是否以指定前缀开头
boolean endsWith(String str)     // 是否以指定后缀结尾
boolean isEmpty()                // 判断是否为空字符串 ""

3. 转换 & 分割

char[] toCharArray()         // 转字符数组
String toLowerCase()         // 转小写
String toUpperCase()         // 转大写
String[] split(String regex) // 按规则分割成字符串数组

4. 截取 & 替换

String substring(int begin)           // 从索引截取到末尾
String substring(int begin, int end) // 左闭右开区间 [begin,end)
String replace(CharSequence old, CharSequence new) // 替换所有字符/子串
String trim()                         // 去除首尾空格

五、字符串拼接

  1. + 拼接:简单场景使用,频繁拼接效率低(不断创建新对象)
  2. StringBuilder / StringBuffer(可变字符串,推荐循环拼接)
  • StringBuilder线程不安全,效率高(单线程首选)
  • StringBuffer线程安全,效率低(多线程使用)

示例:

// 可变字符串用法
StringBuilder sb = new StringBuilder();
sb.append("a").append("b"); // 链式拼接
sb.reverse(); // 字符串反转
String res = sb.toString(); // 转回 String

六、常见面试考点

  1. String s = new String("abc") 创建几个对象?
    • 2个:常量池 "abc" + 堆中 String 对象。
  2. 为什么 String 设计为不可变?
    • 安全、常量池复用、哈希值不变、线程安全。
  3. "a"+"b"变量+"a" 区别
    • 常量相加:编译期优化,直接变成 "ab",走常量池。
    • 变量相加:运行期创建新对象,不走常量池。

更多推荐