跳转至

数组与字符串

📖 章节简介

本章将介绍Java的数组和字符串操作,包括数组的基本操作、String类的常用方法和StringBuilder的使用。

数组与字符串操作示意

上图对比了数组操作与字符串处理的常见能力边界,便于形成统一认知。

📊 数组

1. 数组基础

Java
// 数组基础
public class ArrayBasics {
    public static void main(String[] args) {
        // 声明和初始化数组
        int[] numbers1 = new int[5];  // 声明长度为5的数组
        numbers1[0] = 10;
        numbers1[1] = 20;
        numbers1[2] = 30;
        numbers1[3] = 40;
        numbers1[4] = 50;

        // 声明并初始化
        int[] numbers2 = {1, 2, 3, 4, 5};

        // 使用循环初始化
        int[] numbers3 = new int[5];
        for (int i = 0; i < numbers3.length; i++) {
            numbers3[i] = i * 10;
        }

        // 遍历数组
        System.out.println("遍历数组:");
        for (int i = 0; i < numbers2.length; i++) {
            System.out.print(numbers2[i] + " ");
        }

        // 增强for循环
        System.out.println("\n\n增强for循环:");
        for (int num : numbers2) {
            System.out.print(num + " ");
        }

        // 数组长度
        System.out.println("\n\n数组长度: " + numbers2.length);
    }
}

2. 数组操作

Java
// 数组操作
import java.util.Arrays;
import java.util.List;

public class ArrayOperations {
    public static void main(String[] args) {
        int[] numbers = {5, 2, 8, 1, 9, 3};

        // 数组排序
        Arrays.sort(numbers);
        System.out.println("排序后: " + Arrays.toString(numbers));

        // 数组复制
        int[] copy = Arrays.copyOf(numbers, numbers.length);
        System.out.println("复制数组: " + Arrays.toString(copy));

        // 数组填充
        int[] filled = new int[5];
        Arrays.fill(filled, 10);
        System.out.println("填充数组: " + Arrays.toString(filled));

        // 数组比较
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {1, 2, 3};
        System.out.println("数组相等: " + Arrays.equals(arr1, arr2));

        // 数组查找
        int index = Arrays.binarySearch(numbers, 5);
        System.out.println("查找5的位置: " + index);

        // 数组转List
        Integer[] nums = {1, 2, 3, 4, 5};
        List<Integer> list = Arrays.asList(nums);
        System.out.println("转List: " + list);
    }
}

3. 多维数组

Java
// 多维数组
public class MultiDimensionalArray {
    public static void main(String[] args) {
        // 二维数组
        int[][] matrix = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        // 遍历二维数组
        System.out.println("二维数组:");
        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();
        }

        // 不规则二维数组
        int[][] jagged = {
            {1, 2},
            {3, 4, 5},
            {6, 7, 8, 9}
        };

        System.out.println("\n不规则二维数组:");
        for (int i = 0; i < jagged.length; i++) {
            for (int j = 0; j < jagged[i].length; j++) {
                System.out.print(jagged[i][j] + " ");
            }
            System.out.println();
        }
    }
}

🔤 字符串

1. String基础

Java
// String基础
public class StringBasics {
    public static void main(String[] args) {
        // 创建字符串
        String str1 = "Hello";
        String str2 = new String("World");
        String str3 = "Hello";  // 字符串常量池

        // 字符串比较
        System.out.println("str1 == str3: " + (str1 == str3));  // true(同一对象)
        System.out.println("str1.equals(str2): " + str1.equals(str2));  // false(内容不同)

        // 字符串长度
        System.out.println("\nstr1长度: " + str1.length());

        // 字符串连接
        String str4 = str1 + " " + str2;
        System.out.println("连接后: " + str4);

        // 字符串格式化
        String name = "张三";
        int age = 25;
        String formatted = String.format("姓名: %s, 年龄: %d", name, age);
        System.out.println("格式化: " + formatted);
    }
}

2. String常用方法

Java
// String常用方法
public class StringMethods {
    public static void main(String[] args) {
        String str = "Hello World";

        // 大小写转换
        System.out.println("大写: " + str.toUpperCase());
        System.out.println("小写: " + str.toLowerCase());

        // 去除空格
        String strWithSpaces = "  Hello  World  ";
        System.out.println("\n去除空格: " + strWithSpaces.trim());

        // 字符串查找
        System.out.println("\n包含'World': " + str.contains("World"));
        System.out.println("查找'World'位置: " + str.indexOf("World"));
        System.out.println("以'Hello'开头: " + str.startsWith("Hello"));
        System.out.println("以'World'结尾: " + str.endsWith("World"));

        // 字符串截取
        System.out.println("\n截取0-5: " + str.substring(0, 5));
        System.out.println("从6开始: " + str.substring(6));

        // 字符串替换
        System.out.println("\n替换'World'为'Java': " + str.replace("World", "Java"));
        System.out.println("替换所有'l'为'L': " + str.replace("l", "L"));

        // 字符串分割
        String str2 = "apple,banana,orange";
        String[] fruits = str2.split(",");
        System.out.println("\n分割结果: " + java.util.Arrays.toString(fruits));

        // 字符串比较
        String str3 = "hello";
        System.out.println("\n忽略大小写比较: " + str.equalsIgnoreCase(str3));
        System.out.println("比较结果: " + str.compareTo(str3));
    }
}

3. StringBuilder

Java
// StringBuilder
public class StringBuilderExample {
    public static void main(String[] args) {
        // 创建StringBuilder
        StringBuilder sb = new StringBuilder();

        // 追加字符串
        sb.append("Hello");
        sb.append(" ");
        sb.append("World");
        System.out.println("追加: " + sb.toString());

        // 插入字符串
        sb.insert(5, "Beautiful ");
        System.out.println("插入: " + sb.toString());

        // 删除字符串
        sb.delete(5, 15);
        System.out.println("删除: " + sb.toString());

        // 替换字符串
        sb.replace(6, 11, "Java");
        System.out.println("替换: " + sb.toString());

        // 反转字符串
        sb.reverse();
        System.out.println("反转: " + sb.toString());

        // 性能比较
        long startTime = System.currentTimeMillis();
        String str = "";
        for (int i = 0; i < 10000; i++) {
            str += "a";
        }
        long endTime = System.currentTimeMillis();
        System.out.println("\nString连接耗时: " + (endTime - startTime) + "ms");

        startTime = System.currentTimeMillis();
        StringBuilder sb2 = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            sb2.append("a");
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder连接耗时: " + (endTime - startTime) + "ms");
    }
}

💡 最佳实践

1. 数组使用

Java
// 数组使用最佳实践
public class ArrayBestPractices {
    public static void main(String[] args) {
        // ✅ 使用增强for循环遍历数组
        int[] numbers = {1, 2, 3, 4, 5};
        for (int num : numbers) {
            System.out.println(num);
        }

        // ❌ 避免数组越界
        try {
            int value = numbers[10];  // 越界
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("数组越界");
        }

        // ✅ 使用Arrays工具类
        Arrays.sort(numbers);
        System.out.println("排序后: " + Arrays.toString(numbers));
    }
}

2. 字符串使用

Java
// 字符串使用最佳实践
public class StringBestPractices {
    public static void main(String[] args) {
        // ✅ 使用equals比较字符串内容
        String str1 = "Hello";
        String str2 = new String("Hello");
        System.out.println("使用equals: " + str1.equals(str2));

        // ❌ 不要用==比较字符串内容
        System.out.println("使用==: " + (str1 == str2));  // false

        // ✅ 频繁修改使用StringBuilder
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 1000; i++) {
            sb.append("a");
        }

        // ❌ 不要用String频繁连接
        String str = "";
        for (int i = 0; i < 1000; i++) {
            str += "a";  // 性能差
        }
    }
}

📝 练习题

基础题

  1. 如何声明和初始化数组?
  2. String有哪些常用方法?
  3. StringBuilder和String有什么区别?

进阶题

  1. 实现数组排序算法。
  2. 处理字符串中的空格和特殊字符。
  3. 使用StringBuilder提高字符串操作性能。

实践题

  1. 实现一个简单的文本处理工具。
  2. 创建一个数组工具类。
  3. 实现字符串加密和解密功能。

📚 推荐阅读

🔗 下一章

面向对象编程 - 学习Java的面向对象编程。