Tôi nhận được điều này khi tôi gọi toString
mộ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 toString
mộ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 @Override
là phương thức được kế thừa từ Object
đó, được chỉ định như sau:
Các
toString
phươ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)@Override
nó để 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ộtfinal
phươ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 ).
toString
cho các mảngjava.util.Arrays
cung cấp toString
quá 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.equals
và Arrays.deepEquals
thự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.