Java 字符串
·
一、String 基本介绍
- 所属包:
java.lang.String,无需手动导包 - 本质:Java 中字符串是不可变的字符序列(底层 char 数组,JDK9+ 改为 byte 数组)
- 创建方式
// 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() // 去除首尾空格
五、字符串拼接
+拼接:简单场景使用,频繁拼接效率低(不断创建新对象)StringBuilder/StringBuffer(可变字符串,推荐循环拼接)
StringBuilder:线程不安全,效率高(单线程首选)StringBuffer:线程安全,效率低(多线程使用)
示例:
// 可变字符串用法
StringBuilder sb = new StringBuilder();
sb.append("a").append("b"); // 链式拼接
sb.reverse(); // 字符串反转
String res = sb.toString(); // 转回 String
六、常见面试考点
String s = new String("abc")创建几个对象?- 2个:常量池
"abc"+ 堆中String对象。
- 2个:常量池
- 为什么 String 设计为不可变?
- 安全、常量池复用、哈希值不变、线程安全。
"a"+"b"和变量+"a"区别- 常量相加:编译期优化,直接变成
"ab",走常量池。 - 变量相加:运行期创建新对象,不走常量池。
- 常量相加:编译期优化,直接变成
更多推荐



所有评论(0)