[java] (문자열) 또는 .toString ()?

Object o매개 변수 가있는 메소드가 있습니다.

이 방법에서는 Stringnull이 아닌 “o” 가 있음을 정확히 알고 있습니다 . 확인하거나 다른 작업을 수행 할 필요가 없습니다. 나는 그것을 String물건 과 똑같이 취급해야 합니다.

그냥 궁금한 것-더 싼 것이 무엇입니까-그것을 캐스팅 String하거나 사용 Object.toString()합니까? 아니면 시간-/ cpu- / mem- 가격으로 동일합니까?

업데이트 :이 메서드는 Object인터페이스의 구현이므로 수락 합니다. 매개 변수 유형을 변경할 수있는 방법이 없습니다.

그리고 그것은 전혀 될 수 없습니다 null. 나는 null이나 비어 있는지 확인할 필요가 없다고 말하고 싶었습니다. 제 경우에는 항상 비어 있지 않은 문자열이 있습니다.



답변

String으로 캐스팅 하는 것은 외부 함수 호출이 필요하지 않고 내부 유형 검사 만 필요하기 때문에 저렴 합니다.


답변

나는 캐스트를 사용합니다. 그것은 그것이 문자열이라는 당신의 “지식”을 검증합니다. 어떤 이유로 든 버그로 끝나고 누군가 문자열이 아닌 다른 것을 전달한다면 결함이있는 데이터로 계속 실행하는 것보다 예외를 던지는 것이 더 나을 것이라고 생각합니다.


답변

어리석은 성능 musings 에 따르면 : x.toString () 대 (String) x

결국 결과는 놀랍도록 분명합니다. Object.toString ()을 호출하는 것보다 Object를 String으로 캐스팅하는 것이 적어도 두 배 빠릅니다.


답변

Object o가 String이라는 것을 알고 있다면 그냥 String으로 캐스트하고 그렇게 강제한다고 말하고 싶습니다. 확실하게 String이라는 것을 알고있는 객체에서 toString ()을 호출하면 혼란을 더할 수 있습니다.

Object o가 String이 아닌 다른 것일 수 있다면 toString ()을 호출해야합니다.


답변

이 작업이 1 초에 수천 번만 수행된다면 성능에 크게 신경 쓰지 않을 것입니다. 눈에 띄는 차이는 없습니다.

그러나 나는 입력을 “알고있는”것에 대해 걱정할 것입니다. 당신은를 받아들이는 메소드를 가지고 있고 Object그것을 그렇게 취급해야합니다. 즉 , 인터페이스를 준수하는 것 외에는 매개 변수에 대해 아무것도 몰라Object합니다.toString() 메소드 . 이 경우 아무 것도 가정하는 대신 그 방법을 사용하는 것이 좋습니다.

OTOH 입력이있는 경우, 항상 하나 String또는 null단지 받아들이는 방법 변경 String들, 그리고 명시 적으로 확인 null(… 비 프리미티브를 처리 할 때마다 당신이 어쨌든해야하는)의


답변

참조 유형이 Object이고 모든 Object에 toString ()이있는 경우 object.toString ()을 호출하면됩니다. String.toString ()은 이것을 반환합니다.

  • toString ()은 입력 할 코드가 적습니다.
  • toString ()은 바이트 코드가 적습니다.
  • 캐스팅은 비용이 많이 드는 작업 대 다형성 호출입니다.
  • 캐스트가 실패 할 수 있습니다.
  • null이 아닌 경우 object.toString ()을 호출하는 String.valueOf (object)를 사용하십시오.


답변

“o”에있는 것이 문자열이면 별다른 차이가 없습니다 (캐스트가 더 빠를 가능성이 있지만 VM / 라이브러리 구현 항목입니다).

“o”가 문자열이 아닐 수도 있지만 문자열이어야한다면 캐스트는 원하는 것입니다 (하지만 메서드가 객체 대신 문자열을 사용하도록해야합니다).

“o”가 모든 유형이 될 수 있다면 toString을 사용해야하지만 먼저 null을 확인해야합니다.

void foo(final Object o)
{
    final String str;

    // without this you would get a class cast exception
    // be wary of using instanceof though - it is usually the wrong thing to do
    if(o instanceof String)
    {
        str = (String)o;
    }
}

또는

void foo(final Object o)
{
    final String str;

    // if you are 100% sure that o is not null then you can get rid of the else
    if(o != null)
    {
        str = o.toString();
    }
}

차라리 마지막 코드를 다음과 같이 코딩하고 싶습니다.

void foo(final Object o)
{
    final String str;

    if(o == null)
    {
        throw new IllegalArgumentException("o cannot be null");
    }

    str = o.toString();
}