Java 用户提供的阵列直接存储

Java 用户提供的阵列直接存储,java,arrays,sonarqube,Java,Arrays,Sonarqube,我已经提到: 我的代码是 public IndexBlockAdapter(String[] itemStr) { if(itemStr == null) { this.itemStr = new String[0]; } else { this.itemStr = Arrays.copyOf(itemStr, itemStr.length); } } 但声纳仍然拿起它,并抱怨“阵列直接存储”,尽管制作了一个副本。我很困惑 感谢您

我已经提到:

我的代码是

public IndexBlockAdapter(String[] itemStr) {
    if(itemStr == null) { 
        this.itemStr = new String[0]; 
    } else { 
        this.itemStr = Arrays.copyOf(itemStr, itemStr.length); 
    }
}
但声纳仍然拿起它,并抱怨“阵列直接存储”,尽管制作了一个副本。我很困惑

感谢您的帮助

Arrays.copyOf does a shallow copy. 
它只是复制引用,而不是实际值。 以下代码将打印所有证明事实的
true

String [] str1 = {"1","2","3"};

    String [] str2 = Arrays.copyOf(str1, str1.length);
    for (int i=0;i<str1.length;i++) {
        System.out.println(str1[i] == str2[i]);

    }
String[]str1={“1”、“2”、“3”};
字符串[]str2=Arrays.copyOf(str1,str1.length);
对于(int i=0;i
它只是复制引用,而不是实际值。
以下代码将打印所有证明事实的
true

String [] str1 = {"1","2","3"};

    String [] str2 = Arrays.copyOf(str1, str1.length);
    for (int i=0;i<str1.length;i++) {
        System.out.println(str1[i] == str2[i]);

    }
String[]str1={“1”、“2”、“3”};
字符串[]str2=Arrays.copyOf(str1,str1.length);
对于(int i=0;i
它只是复制引用,而不是实际值。
以下代码将打印所有证明事实的
true

String [] str1 = {"1","2","3"};

    String [] str2 = Arrays.copyOf(str1, str1.length);
    for (int i=0;i<str1.length;i++) {
        System.out.println(str1[i] == str2[i]);

    }
String[]str1={“1”、“2”、“3”};
字符串[]str2=Arrays.copyOf(str1,str1.length);
对于(int i=0;i
它只是复制引用,而不是实际值。
以下代码将打印所有证明事实的
true

String [] str1 = {"1","2","3"};

    String [] str2 = Arrays.copyOf(str1, str1.length);
    for (int i=0;i<str1.length;i++) {
        System.out.println(str1[i] == str2[i]);

    }
String[]str1={“1”、“2”、“3”};
字符串[]str2=Arrays.copyOf(str1,str1.length);

对于(inti=0;i这应该适合你

 public IndexBlockAdapter(String[] newItemStr) {
 if(newItemStr == null) { 
    this.itemStr = new String[0]; 
 } else { 
    this.itemStr = Arrays.copyOf(newItemStr, newItemStr.length); 
 }
}

这应该对你有用

 public IndexBlockAdapter(String[] newItemStr) {
 if(newItemStr == null) { 
    this.itemStr = new String[0]; 
 } else { 
    this.itemStr = Arrays.copyOf(newItemStr, newItemStr.length); 
 }
}

这应该对你有用

 public IndexBlockAdapter(String[] newItemStr) {
 if(newItemStr == null) { 
    this.itemStr = new String[0]; 
 } else { 
    this.itemStr = Arrays.copyOf(newItemStr, newItemStr.length); 
 }
}

这应该对你有用

 public IndexBlockAdapter(String[] newItemStr) {
 if(newItemStr == null) { 
    this.itemStr = new String[0]; 
 } else { 
    this.itemStr = Arrays.copyOf(newItemStr, newItemStr.length); 
 }
}

虽然这可能是复制机制被抱怨的原因,但浅层复制仍然足够。请记住:字符串是不可变的。谢谢!我认为使用
System.arrayCopy()
Object.clone()
还可以进行深度复制,这更简单。@Hirak最后,我发现真正的原因是参数的名称不能与实例变量相同。当我将参数名称更改为
itemArr
时,警告消失了。虽然这可能是复制机制被抱怨的原因,但我发现了一个浅复制这就足够了。请记住:字符串是不可变的。谢谢!我认为使用
System.arrayCopy()
Object.clone()
还可以进行深度复制,这更简单。@Hirak最后,我发现真正的原因是参数的名称不能与实例变量相同。当我将参数名称更改为
itemArr
时,警告消失了。虽然这可能是复制机制被抱怨的原因,但我发现了一个浅复制这就足够了。请记住:字符串是不可变的。谢谢!我认为使用
System.arrayCopy()
Object.clone()
还可以进行深度复制,这更简单。@Hirak最后,我发现真正的原因是参数的名称不能与实例变量相同。当我将参数名称更改为
itemArr
时,警告消失了。虽然这可能是复制机制被抱怨的原因,但我发现了一个浅复制这就足够了。请记住:字符串是不可变的。谢谢!我认为使用
System.arrayCopy()
Object.clone()
还可以进行深度复制,这更简单。@最后,我发现真正的原因是参数的名称不能与实例变量相同。当我将参数名称更改为
itemArr
时,警告消失了。