Java中取出一定范围的char[]

在Java中,char[]是一个用于存储字符序列的数据结构。有时候我们需要从一个char[]中取出一定范围的字符,比如提取子字符串或者截取部分字符。本文将介绍Java中取出一定范围的char[]的方法,并提供相应的代码示例。

方法一:使用for循环遍历

最简单的方法是使用for循环遍历char[],逐个取出所需范围的字符。代码示例如下:

public class CharArrayRange {
    public static char[] getRange(char[] arr, int start, int end) {
        char[] result = new char[end - start];
        for (int i = start; i < end; i++) {
            result[i - start] = arr[i];
        }
        return result;
    }

    public static void main(String[] args) {
        char[] arr = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
        char[] range = getRange(arr, 6, 11);
        System.out.println(range);  // 输出 "World"
    }
}

上述代码定义了一个getRange方法,接收一个char[]数组和起始位置start、结束位置end作为参数。在for循环中,通过遍历arr数组将所需范围的字符逐个存入新的char[]数组result中,最后返回result。

main方法中,我们定义了一个示例char[]数组arr,并调用getRange方法截取从位置6到位置11的字符,然后打印输出结果。

方法二:使用Arrays.copyOfRange方法

Java提供了一个方便的方法Arrays.copyOfRange,可以直接截取char[]的一定范围。代码示例如下:

import java.util.Arrays;

public class CharArrayRange {
    public static void main(String[] args) {
        char[] arr = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};
        char[] range = Arrays.copyOfRange(arr, 6, 11);
        System.out.println(range);  // 输出 "World"
    }
}

上述代码中,我们使用Arrays.copyOfRange方法将arr数组从位置6到位置11的字符截取出来并赋值给range。最后打印输出结果。

这种方法比第一种更简洁,适合一次性截取整个范围的情况。

性能比较

在实际应用中,我们可能会关注两种方法的性能。下面我们使用JMH测试框架来测试这两种方法的性能。

首先,我们需要添加Maven依赖:

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-core</artifactId>
    <version>1.33</version>
</dependency>

<dependency>
    <groupId>org.openjdk.jmh</groupId>
    <artifactId>jmh-generator-annprocess</artifactId>
    <version>1.33</version>
    <scope>provided</scope>
</dependency>

然后,我们编写一个性能测试类:

import org.openjdk.jmh.annotations.*;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 3)
@Measurement(iterations = 5)
@Fork(1)
@State(Scope.Benchmark)
public class CharArrayRangeBenchmark {

    private char[] arr;

    @Setup
    public void setup() {
        arr = new char[1000000];
        Arrays.fill(arr, 'a');
    }

    @Benchmark
    public char[] getRangeWithForLoop() {
        return getRange(arr, 100, 100000);
    }

    @Benchmark
    public char[] getRangeWithCopyOfRange() {
        return Arrays.copyOfRange(arr, 100, 100000);
    }

    private char[] getRange(char[] arr, int start, int end) {
        char[] result = new char[end - start];
        for (int i = start; i < end; i++) {
            result[i - start] = arr[i];
        }
        return result;
    }
}

上述代码中,我们使用@Benchmark注解标记了两个测试方法getRangeWithForLoopgetRangeWithCopyOfRange@Setup注解用于初始化测试数据,在这里我们创建了一个长度为100