이것은 무엇입니까 : [Ljava.lang.Object ;?


110

toString함수 호출에서받은 객체를 호출 할 때 이것을 얻습니다 . 객체의 유형이이 문자열에 인코딩되어 있음을 알고 있지만 읽는 방법을 모르겠습니다.

이러한 유형의 인코딩을 무엇이라고합니까?

답변:


211

[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 객체가 인스턴스, 상기 서명 문자 '로되어있는 클래스의 이름 구성된 문자열 (@), 및 오브젝트의 해시 코드의 부호 없음 16 진 표현을 반환합니다. 즉,이 메서드는 다음 값과 같은 문자열을 반환합니다.

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

참고 :toString()위의 사양을 따르기 위해 임의의 객체에 의존 할 수는 없습니다. 왜냐하면 그들은@Override다른 것을 반환할 수 있고 일반적으로 그렇게 할 수 있기 때문입니다. 임의의 객체 유형을 검사하는보다 안정적인 방법은 객체getClass()(에서final상속 된 메서드)를 호출Object한 다음반환 된객체에 반영 하는 것Class입니다. 그러나 이상적으로는 API가 리플렉션이 필요하지 않도록 설계되어야합니다 ( Effective Java 2nd Edition, Item 53 : Prefer interfaces to reflection 참조 ).


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.equals및 이 있습니다 Arrays.deepEquals.

관련 질문

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.