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ì?
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:
[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ặcvoid.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ớpObjecttrả 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 ).
toStringcho các mảngjava.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.equalsvà Arrays.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.