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
注解标记了两个测试方法getRangeWithForLoop
和getRangeWithCopyOfRange
。@Setup
注解用于初始化测试数据,在这里我们创建了一个长度为100