当前位置: 首页 > 面试题库 >

这是什么:[Ljava.lang.Object ;?

公冶元青
2023-03-14
问题内容

当我调用toString从函数调用中收到的对象时,会得到此信息。我知道对象的类型编码在此字符串中,但是我不知道如何读取它。

这种编码称为什么类型?


问题答案:

[Ljava.lang.Object;是的名称Object[].class,java.lang.Class代表的数组的类Object

命名方案记录在Class.getName()

如果该类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如Java语言规范(§13.1)所指定。

如果此类对象表示原始类型或void,则返回的名称是与原始类型或对应的Java语言关键字void。

如果此类对象表示一类数组,则名称的内部形式由元素类型的名称组成,后跟一个或多个’[‘表示数组嵌套深度的字符。元素类型名称的编码如下:

Element Type        Encoding
boolean             Z
byte                B
char                C
double              D
float               F
int                 I
long                J
short               S 
class or interface  Lclassname;

你的是该列表中的最后一个。这里有些例子:

// xxxxx varies
System.out.println(new int[0][0][7]); // [[[I@xxxxx
System.out.println(new String[4][2]); // [[Ljava.lang.String;@xxxxx
System.out.println(new boolean[256]); // [Z@xxxxx

之所以以这种格式toString()返回数组上的方法,String是因为数组没有@Override继承自的方法Object,该方法指定如下:

toString用于类Object的方法返回一个字符串,该字符串由对象作为实例的类的名称,符号字符“ @”和对象的哈希码的无符号十六进制表示组成。换句话说,此方法返回的字符串等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

注意:你不能依赖toString()任何任意对象来遵循上述规范,因为它们可以(通常这样做)@Override返回其他内容。检查任意对象类型的更可靠方法是getClass()在其上调用(final从继承的方法Object),然后在返回的对象上进行反射Class。不过,理想情况下,API的设计应该使得不需要反射(请参阅 Effective Java 2nd Edition,第53项:首选反射接口)。

toString对数组更“有用”
java.util.Arrays提供toString原始数组和的重载Object[]。还deepToString可能需要将其用于嵌套数组。

这里有些例子:

int[] nums = { 1, 2, 3 };

System.out.println(nums);
// [I@xxxxx

System.out.println(Arrays.toString(nums));
// [1, 2, 3]

int[][] table = {
        { 1, },
        { 2, 3, },
        { 4, 5, 6, },
};

System.out.println(Arrays.toString(table));
// [[I@xxxxx, [I@yyyyy, [I@zzzzz]

System.out.println(Arrays.deepToString(table));
// [[1], [2, 3], [4, 5, 6]]

在许多其他与数组相关的实用程序方法中,还有Arrays.equalsArrays.deepEquals通过它们的元素执行数组相等性比较。



 类似资料:
  • 我几天前听说了Docker的事,想过去看看。 但事实上,我不知道这个“容器”的用途是什么? 什么是容器? 它能取代一个专门用于开发的虚拟机吗? 简单地说,在公司中使用Docker的目的是什么?主要的优势?

  • 问题内容: 我是Go的新手,在浏览其他一些线程时遇到了以下代码行: 含义是什么?它是否指定将在if条件中分配某些内容(因为err似乎正在发生这种情况)?我在Wiki上找不到这种语法的示例,并且我很好奇它的用途。 问题答案: 因为返回两个值,所以如果需要它们中的任何一个,都必须在某个地方接收这些值。该是一个占位符,基本的意思是“我不关心这个特殊的返回值。” 在这里,我们只关心检查错误,而无需对实际的

  • 因此,我想要一个代码,使我的HTML列表在冒号之前加粗。所以我搜索了一个我选择使用的代码。在堆栈溢出中看到一个代码:https://stackoverflow.com/a/46855744/15163136.我没有使用for循环,而是使用foreach循环。 但唯一的问题是我不理解和

  • 如果我运行deldeldel(“adel”),它会返回一个,但是,adel的长度是4,这意味着最后一个字符串索引是3,为什么str.substring(4,str.length()没有超出范围?

  • 问题内容: 这个头衔看起来并不那么疯狂。我承诺!! 在研究另一个问题时,我在Stack Overflow的样式表中注意到以下内容: 这是一种奇怪的条件样式吗?这是一个错误吗?假设这不是一个错误,那么它适用于所有IE版本吗?有没有一种方法可以指定给定规则仅适用于大于(例如7)的IE版本? 我以前从未遇到过-我一直在使用条件注释来表示IE特定的样式(以及其价值,我宁愿将所有IE特定样式完全分开)。 问

  • 问题内容: 我正在尝试让Javascript读取/写入PostgreSQL数据库。我在github上找到了这个项目。我能够获得以下示例代码以在节点中运行。 接下来,我试图使其在网页上运行,但是似乎什么也没有发生。我在Javascript控制台上进行了检查,它只显示“要求未定义”。 那么这是什么“要求”?为什么它在节点中有效但在网页中无效? 另外,在我让它在节点上工作之前,我必须做。那是什么意思 我