Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;hashCode";及;toString";不应在数组实例上调用(SonarLint)_Java_Arrays_Sonarlint - Fatal编程技术网

Java &引用;hashCode";及;toString";不应在数组实例上调用(SonarLint)

Java &引用;hashCode";及;toString";不应在数组实例上调用(SonarLint),java,arrays,sonarlint,Java,Arrays,Sonarlint,我正在通过SonarLint传递我的代码,我遇到了这个linter违规: 不应在数组实例上调用“hashCode”和“toString” 这是我的代码: byte[] lblobPic; lblobPic = r.get(PEOPLE.PPIC); if (lblobPic != null) { String argStr = lblobPic.toString(); peopleDto.setUrlPic(argStr); } SonarLint给出以下代码片段作为改进代码的

我正在通过SonarLint传递我的代码,我遇到了这个linter违规:
不应在数组实例上调用“hashCode”和“toString”

这是我的代码:

byte[] lblobPic;
lblobPic = r.get(PEOPLE.PPIC);
if (lblobPic != null) {
    String argStr = lblobPic.toString();
    peopleDto.setUrlPic(argStr);
}
SonarLint给出以下代码片段作为改进代码的提示:

public static void main( String[] args )  {
    String argStr = Arrays.toString(args);
    int argHash = Arrays.hashCode(args);    
}

我应该如何更改代码以满足要求?为什么?

实际答案

Sonarint建议您,与其对数组实例调用
toString()
,不如使用
Arrays
实用程序的方法

它建议您将代码更改为以下内容:

byte[] lblobPic;
lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Arrays.toString(lblobPic);
    peopleDto.setUrlPic(argStr);
}
答案背后的原因

a)人类可读性

考虑以下代码段:

String[] strings = { "foo", "bar", "bla", "boo" };

System.out.println(strings.toString());
// prints: [Ljava.lang.String;@7852e922 

System.out.println(Arrays.toString(strings));
// prints: [foo, bar, bla, boo]
Linter规则假设开发人员实际上想要数组的可读输出(考虑其元素),并建议您使用
Arrays.toString()
方法来实现这一点(如中所述)

类似地,
Arrays.hashCode()
在散列中考虑给定数组的元素(如中所述)

决定论 (根据@andi turner的建议)


Arrays
实用程序的方法在构造字符串/计算哈希时只考虑元素。当在同一序列中使用由相同字符串(或其他类型的值)组成的输入数组时,您将始终以相同的字符串/哈希结束
yourArray.toHashcode()
yourArray.toString()
不会给你这个答案。

实际答案

String argStr = lblobPic.toString();
Sonarint建议您,与其对数组实例调用
toString()
,不如使用
Arrays
实用程序的方法

它建议您将代码更改为以下内容:

byte[] lblobPic;
lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Arrays.toString(lblobPic);
    peopleDto.setUrlPic(argStr);
}
答案背后的原因

a)人类可读性

考虑以下代码段:

String[] strings = { "foo", "bar", "bla", "boo" };

System.out.println(strings.toString());
// prints: [Ljava.lang.String;@7852e922 

System.out.println(Arrays.toString(strings));
// prints: [foo, bar, bla, boo]
Linter规则假设开发人员实际上想要数组的可读输出(考虑其元素),并建议您使用
Arrays.toString()
方法来实现这一点(如中所述)

类似地,
Arrays.hashCode()
在散列中考虑给定数组的元素(如中所述)

决定论 (根据@andi turner的建议)

Arrays
实用程序的方法在构造字符串/计算哈希时只考虑元素。当在同一序列中使用由相同字符串(或其他类型的值)组成的输入数组时,您将始终以相同的字符串/哈希结束
yourArray.toHashcode()
yourArray.toString()
不提供该选项

String argStr = lblobPic.toString();
最好是

String argStr = Arrays.toString(lblobPic);
因为原始Object.toString会给出一个神秘的十六进制地址

但是,在java中,将字节存储为字符串是不可能的, 因为java对字符串和字符(两个字节,UTF-16)使用Unicode,所以总是进行转换(这些字节的假定文本编码)

有时,此类字节是Base64编码的:

byte[] lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Base64.getUrlEncoder().encode(lblobPic);
    peopleDto.setUrlPic(argStr);
}
最好在DTO中提供一个
byte[]
字段


如果进一步处理是一个问题;存在图像的嵌入

如何将(普通)Base64用于带有嵌入图像的HTML:

    String argStr = Base64.getEncoder().encode(lblobPic);
    String html = "<img src="data:image/jpeg;base64," + argStr + "\" alt=\"\">";
String argStr=Base64.getEncoder().encode(lblobPic);
字符串html=“”;
(此处假设为JPEG格式。)

最好是

String argStr = Arrays.toString(lblobPic);
因为原始Object.toString会给出一个神秘的十六进制地址

但是,在java中,将字节存储为字符串是不可能的, 因为java对字符串和字符(两个字节,UTF-16)使用Unicode,所以总是进行转换(这些字节的假定文本编码)

有时,此类字节是Base64编码的:

byte[] lblobPic = r.get(ALUNO.PFOTO);
if (lblobPic != null) {
    String argStr = Base64.getUrlEncoder().encode(lblobPic);
    peopleDto.setUrlPic(argStr);
}
最好在DTO中提供一个
byte[]
字段


如果进一步处理是一个问题;存在图像的嵌入

如何将(普通)Base64用于带有嵌入图像的HTML:

    String argStr = Base64.getEncoder().encode(lblobPic);
    String html = "<img src="data:image/jpeg;base64," + argStr + "\" alt=\"\">";
String argStr=Base64.getEncoder().encode(lblobPic);
字符串html=“”;

(此处假定为JPEG。)

您不能。。。你试了什么?很直截了当,为什么要将
args
字符串数组传递到不带参数的方法中?我认为这是一个不值得否决的好问题!总的来说:我认为这个问题与jooq无关。你不能。。。你试了什么?很直截了当,为什么要将
args
字符串数组传递到不带参数的方法中?我认为这是一个不值得否决的好问题!一般来说:我认为这个问题与jooq无关。因为它是一个
字节
数组,所以它们可能实际上需要一个
新字符串(lblobPic)
的变体。但是我不知道确切的用例,我认为另一件值得明确指出的事情是
String[]strings2={/*相同的元素*/}
将有一个不同的
toString()
hashCode()
7852e922
不是从元素计算出来的。因为它是一个
字节
数组,所以它们可能实际上需要一个
新字符串(lblobPic)
的变体。但是我不知道确切的用例,我认为另一件值得明确指出的事情是
String[]strings2={/*相同的元素*/}将有不同的
toString()
hashCode()
7852e922
不是从元素计算出来的。