当前位置: 首页 > 知识库问答 >
问题:

不应在数组实例上调用“hashCode”和“toString”(Sonarint)

吕琪
2023-03-14

我正在通过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);    
}

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

共有2个答案

东门楚
2023-03-14
String argStr = lblobPic.toString();

最好是

String argStr = Arrays.toString(lblobPic);

作为原始对象。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可用于具有嵌入式图像的超文本标记语言:

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

(此处假设为JPEG。)

沙小白
2023-03-14

实际答案

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规则假设,开发人员实际上想要数组的可读输出(考虑其元素),并建议您使用rrays.toString()方法(如留档中概述的)。

类似地,数组。hashCode()在哈希中考虑给定数组的元素(如文档中所述)。

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

在构造字符串/计算哈希时,Arrays实用程序的方法只考虑元素。当在同一序列中使用由相同字符串(或其他类型的值)组成的输入数组时,最终总是得到相同的字符串/哈希<代码>数组。toHashcode()或yourArray。toString()并没有给出这样的信息。

 类似资料:
  • 问题内容: 因此,我有一个带有一堆需要实现的方法的接口,这些方法的名称无关紧要。 实现此接口的对象通常放入集合中,并且具有我希望它们使用的特殊toString()格式。 因此,我认为将hashCode(),equals()和toString()放入接口将很方便,以确保我记得重写这些默认方法。但是,当我将这些方法添加到接口中时,即使没有明确实现这三个方法,IDE / Compiler也不会抱怨,即使

  • 问题内容: 这很奇怪。一位同事询问了java中myArray.hashCode()的实现。我以为我知道,但是后来我进行了一些测试。检查下面的代码。我注意到的奇怪想法是,当我编写第一个系统时,结果是不同的。请注意,这几乎就像报告内存地址并修改类一样,将地址或其他内容移动了。只是想我会分享。 问题答案: 该方法继承自,这意味着哈希码取决于引用。要基于数组的内容获取哈希码,请使用。 请注意,尽管它是一个

  • 我的问题是,如果我使用StringBuffer(或StringBuilder),如果我在实例上多次调用String方法。StringBuffer 是每次都返回 String 的新实例,还是从 String pool 返回 String?(假设我在两次调用之间没有对StringBuffer进行任何更改)

  • 要在实例上调用方法,您必须获取实例的引用并调用该方法。该示例说明了如何获取引用和调用方法,检查 API 以获取可用方法的列表。 // 3 ways of doing the same thing $('#jstree').jstree(true) .select_node('mn1'); $('#jstree') .jstree('select_node', 'mn2'); $.

  • 我试图使用Java以编程方式从XSD文件生成JAXB类。我使用以下代码片段来实现这一点: 生成的类只包含字段的方法。但是,我还希望包括、和方法。如何在生成代码时做到这一点?

  • 3. 数组应用实例:直方图 继续上面的例子。我们统计一列0~9的随机数,打印每个数字出现的次数,像这样的统计结果称为直方图(Histogram)。有时候我们并不只是想打印,更想把统计结果保存下来以便做后续处理。我们可以把程序改成这样: int main(void) { int howmanyones = howmany(1); int howmanytwos = howmany(2); ..