Java &引用;hashCode";及;toString";不应在数组实例上调用(SonarLint)
我正在通过SonarLint传递我的代码,我遇到了这个linter违规: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给出以下代码片段作为改进代码的
不应在数组实例上调用“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
不是从元素计算出来的。