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:多线程安全修改,性能略低但可靠。