Đây là gì: [Ljava.lang.Object ;?


110

Tôi nhận được điều này khi tôi gọi toStringmột đối tượng mà tôi đã nhận được từ một lệnh gọi hàm. Tôi biết loại đối tượng được mã hóa trong chuỗi này, nhưng tôi không biết cách đọc nó.

Loại mã hóa này được gọi là gì?

Câu trả lời:


211

[Ljava.lang.Object;là tên cho Object[].class, java.lang.Classđại diện cho lớp của mảng Object.

Lược đồ đặt tên được ghi lại trong Class.getName():

Nếu đối tượng lớp này đại diện cho kiểu tham chiếu không phải là kiểu mảng thì tên nhị phân của lớp được trả về, như được chỉ định bởi Đặc tả ngôn ngữ Java ( §13.1 ).

Nếu đối tượng lớp này đại diện cho kiểu nguyên thủy hoặc void, thì tên được trả về là từ khóa ngôn ngữ Java tương ứng với kiểu nguyên thủy hoặc void.

Nếu đối tượng lớp này đại diện cho một lớp mảng, thì dạng bên trong của tên bao gồm tên của kiểu phần tử đứng trước một hoặc nhiều '['ký tự đại diện cho độ sâu của mảng lồng nhau. Mã hóa tên loại phần tử như sau:

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

Của bạn là người cuối cùng trong danh sách đó. Dưới đây là một số ví dụ:

// 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

Lý do tại sao toString()phương thức trên mảng trả về Stringở định dạng này là vì mảng không phải @Overridelà phương thức được kế thừa từ Objectđó, được chỉ định như sau:

Các toStringphương pháp để lớpObject trả về một chuỗi gồm tên của lớp trong đó đối tượng là một thể hiện, nhân vật ở-dấu `@', và các đại diện thập lục phân unsigned của mã băm của đối tượng. Nói cách khác, phương thức này trả về một chuỗi bằng giá trị của:

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

Lưu ý : bạn không thể dựa vàotoString()bất kỳ đối tượng tùy ý nào để tuân theo thông số kỹ thuật ở trên, vì chúng có thể (và thường làm)@Overridenó để trả về một thứ khác. Cách đáng tin cậy hơn để kiểm tra kiểu của một đối tượng tùy ý là gọigetClass()lên nó (mộtfinalphương thức được kế thừa từ đóObject) và sau đó phản ánhClass đối tượng đượctrả về. Tuy nhiên, lý tưởng nhất là API nên được thiết kế sao cho không cần phản chiếu (xem Phiên bản Java thứ 2 hiệu quả, Mục 53: Ưu tiên giao diện phản chiếu ).


Trên "hữu ích" hơn toStringcho các mảng

java.util.Arrayscung cấp toStringquá tải cho các mảng nguyên thủy và Object[]. Ngoài ra deepToString, bạn có thể muốn sử dụng cho các mảng lồng nhau.

Dưới đây là một số ví dụ:

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]]

Ngoài ra còn có Arrays.equalsArrays.deepEqualsthực hiện so sánh bình đẳng mảng bởi các phần tử của chúng, trong số nhiều phương thức tiện ích liên quan đến mảng khác.

Câu hỏi liên quan

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.