sgr*_*lon 1 java arrays sonarqube
我的Java代码:
public class TestArray {
public static void main(String[] args) {
final String[] cols = { "a", "b", "c", "d" };
List<String> columns = new ArrayList<>(4);
// for (int i = 1; i < cols.length - 1; i++) {
// columns.add(cols[i]);
// }
System.arraycopy(cols, 0, columns, 0, cols.length - 1);
for (String c : columns) {
System.out.println(c);
}
}
}
Run Code Online (Sandbox Code Playgroud)
声纳说:数组不应该使用循环复制
当有内置函数为您执行复制操作时,使用循环复制数组或数组的子集只是浪费代码。而是使用Arrays.copyOf将整个数组复制到另一个数组,使用System.arraycopy仅将一个数组的子集复制到另一个数组,然后使用Arrays.asList将新列表的构造函数提供给数组。
请注意,Arrays.asList只是将Collections包装器放在原始数组周围,因此,如果需要一个非固定大小的List,则需要进一步的步骤。
因此,我尝试这样做:
System.arraycopy(cols, 1, columns, 0, cols.length -1);
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at com.company.TestArray.main(TestArray.java:16)
Run Code Online (Sandbox Code Playgroud)
我认为我的问题来自数组不是列表
您不能System.arraycopy用来将数据存储在非数组中。如文档中所述:
...如果满足以下任一条件,
ArrayStoreException则会引发an 并且目标不会被修改:
- 该
src参数引用的不是数组对象。- 该
dest参数引用的不是数组对象。- ...
如果cols是引用类型的数组,则只需使用Arrays.asList和subList:
columns.addAll(Arrays.asList(cols).subList(1, cols.length - 1));
Run Code Online (Sandbox Code Playgroud)