Java中数组(一维/二维)与字符串操作(String/StringBuilder/StringBuffer)详解
一、数组
数组是存储相同类型数据的容器,支持固定大小的数据集合。
1. 一维数组
1.1 声明与初始化
java
复制
// 声明
int[] arr1;          
int arr2[];          // 初始化
int[] arr3 = new int[5];         // 默认值为0
int[] arr4 = {1, 2, 3, 4, 5};    // 直接赋值 
1.2 访问与操作
java
复制
// 访问元素
int first = arr4[0];  // 1
int last = arr4[arr4.length - 1];  // 5// 遍历数组
for (int i = 0; i < arr4.length; i++) {System.out.print(arr4[i] + " ");  // 1 2 3 4 5
}// 数组复制
int[] copyArr = Arrays.copyOf(arr4, arr4.length); 
1.3 多维数组(二维数组)
java
复制
// 声明与初始化
int[][] matrix = new int[3][3];  // 3x3二维数组
int[][] jagged = {{1}, {2, 3}, {4, 5, 6}};  // 不规则二维数组// 遍历二维数组
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {System.out.print(matrix[i][j] + " ");}System.out.println();
}// 使用Arrays工具类
int[][] deepCopy = Arrays.copyOf(matrix, matrix.length);
System.out.println(Arrays.deepToString(jagged));  // [[1], [2, 3], [4, 5, 6]] 
2. 数组常见操作
| 操作 | 代码示例 | 说明 | 
|---|---|---|
| 数组排序 | Arrays.sort(arr4); | 对数组升序排序 | 
| 数组填充 | Arrays.fill(arr3, 10); | 将数组所有元素设为10 | 
| 数组复制 | System.arraycopy(src, 0, dest, 0, len); | 深拷贝数组 | 
| 数组转字符串 | Arrays.toString(arr4) | [1, 2, 3, 4, 5] | 
二、字符串操作
字符串是字符序列,Java提供了三种处理方式:String(不可变)、StringBuilder(可变,非线程安全)、StringBuffer(可变,线程安全)。
1. String类
1.1 不可变性
java
复制
String str = "Hello"; str += " World"; // 实际创建新对象,原"Hello"可能被回收 System.out.println(str); // Hello World
1.2 常用方法
java
复制
String s1 = "Java";
String s2 = "java";// 字符串比较
System.out.println(s1.equals(s2));       // false(区分大小写)
System.out.println(s1.equalsIgnoreCase(s2)); // true// 子串操作
System.out.println(s1.substring(0, 2));  // Ja// 拼接与替换
System.out.println(s1.concat(" Programming"));  // Java Programming
System.out.println(s1.replace('a', 'o'));       // Jovo 
1.3 字符串池(String Pool)
java
复制
String a = "Hello";
String b = "Hello";
System.out.println(a == b);  // true(指向同一对象)String c = new String("Hello");
System.out.println(a == c);  // false(堆内存中新对象) 
2. StringBuilder类
2.1 可变性
java
复制
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");  // 直接修改原对象
System.out.println(sb);  // Hello World 
2.2 性能优势
java
复制
// 使用String拼接(低效)
String str = "";
for (int i = 0; i < 1000; i++) {str += i;  // 每次生成新对象
}// 使用StringBuilder(高效)
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < 1000; i++) {sb2.append(i);  // 直接修改
} 
2.3 常用方法
java
复制
sb.reverse(); // 反转字符串 sb.insert(5, ","); // 在索引5插入逗号 sb.delete(0, 5); // 删除0到5的字符
3. StringBuffer类
3.1 线程安全
java
复制
// 多线程环境下安全操作
StringBuffer sbf = new StringBuffer();
Runnable task = () -> {for (int i = 0; i < 100; i++) {sbf.append(i);}
};Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(sbf.length());  // 200(无数据竞争) 
3.2 性能差异
- StringBuffer方法加锁,线程安全但性能较低。
- StringBuilder无锁,单线程下性能更高。
三、对比与总结
| 特性 | String | StringBuilder | StringBuffer | 
|---|---|---|---|
| 可变性 | 不可变 | 可变 | 可变 | 
| 线程安全 | 是(不可变天然安全) | 否 | 是 | 
| 性能 | 低效(频繁创建新对象) | 高效 | 中等(锁开销) | 
| 适用场景 | 字符串不修改 | 单线程频繁修改 | 多线程频繁修改 | 
四、综合示例
java
复制
public class StringDemo {public static void main(String[] args) {// String不可变性String s = "A";s += "B";System.out.println(s);  // AB// StringBuilder高效拼接StringBuilder sb = new StringBuilder();for (int i = 0; i < 5; i++) {sb.append(i);}System.out.println(sb);  // 01234// StringBuffer线程安全StringBuffer sbf = new StringBuffer();new Thread(() -> {for (int i = 0; i < 5; i++) {sbf.append(i);}}).start();new Thread(() -> {for (int i = 5; i < 10; i++) {sbf.append(i);}}).start();// 最终结果可能是0123456789(顺序不确定,但无数据错误)}
} 
关键点总结
- 数组:固定大小,适合存储有序数据,多维数组可嵌套。
- String:不可变,适合常量字符串,避免频繁修改。
- StringBuilder:单线程高效修改,推荐大多数场景。
- StringBuffer:多线程安全修改,性能略低但可靠。
