2016-07-04 3 views
14

:Java에서 (Integer) y와 새로운 Integer (y)의 차이점은 무엇입니까? 다음의 차이점은 무엇

Integer in = (Integer)y;

내가 Integer 종류와 그 반대로 int 형식을 변환 할

Integer in = new Integer(y);

.

간단히
public class CompareToDemo { 

    public static void main(String[] args) { 
    // Integer x=5; 
    int y=25; 

    System.out.println(y+" this is int variable"); 

    Integer in = (Integer)y; 

    //Integer in = new Integer(y); 

    if(in instanceof Integer){ 
     System.out.println(in +" this is Integer variable"); 
    } 
    } 
} 
+6

이 변환을 위해서는'Integer.valueOf()'를 사용해야합니다. javadoc로부터 "새로운 정수 인스턴스가 필요없는 경우, 일반적으로,이 메소드는 빈번하게 요구 된 값 「 – Jens

답변

9

당신이해야 할 모든 당신이 네 가지 옵션

Integer in = (Integer)y;   // 1 explicit cast 
    Integer in = y;     // 2 implicit cast (autoboxing) 
    Integer in = new Integer(y);  // 3 explicit constructor 
    Integer in = Integer.valueOf(y); // 4 static factory method 

여기서 가장 바람직한 방법은 2 (오토 박싱)는이 , Integer 객체에 int 원시적 변환하는 경우. 명시 적 생성자 (3)는 성능 저하가 적기 때문에 덜 바람직합니다.

또한 엄격하게 동일하지 않습니다. 고려 : 작은 정수가 (details here) 캐시 때문에

public static void main(String[] args) { 
    int x = 25; 
    Integer a = new Integer(x); 
    Integer b = new Integer(x); 
    System.out.println(a == b);  // false 
    Integer c = Integer.valueOf(x); 
    Integer d = Integer.valueOf(x); 
    System.out.println(c == d);  // true 
    Integer e = (Integer)x; 
    Integer f = (Integer)x; 
    System.out.println(e == f);  // true 
} 

이입니다.

9

말하기,

  • 라인 Integer in = (Integer)y; 불필요한 캐스트를 사용하여 여기에 그 일을 내 코드입니다.
  • Integer in = new Integer(y); 줄은 Integer 인스턴스를 만듭니다. 자세히

각각의 경우

첫째, 명시 적 캐스팅의 경우를 생각해 보자.

Integer i = (Integer)10; 

컴파일러 10int 프리미티브 타입과 그것을 컴파일하도록 Integer 그 래핑 할 수 있다는 사실 것을 이해한다. 그것은 javac의 다음과 같은 것 같다 :

Integer i = (Integer)Integer.valueOf(10); 

하지만 컴파일러는 필요 캐스팅을 할 정도로 똑똑하다, (Integer) 단지 생략한다 :

Integer i = Integer.valueOf(10); 

다음으로, 인스턴스 생성을 가진 경우가 있습니다.

Integer i = new Integer(10); 

모두 간단합니다. 어쨌든 Integer 클래스의 새 인스턴스가 만들어집니다. 그러나 설명서에 나와 있듯이 일반적으로 적절한 방법은 아닙니다.

이러한 생성자를 사용하는 경우는 거의 없습니다. 고정 팩터 리 valueOf()가 일반적으로 더 나은 선택입니다. 공간과 시간 성능이 상당히 향상 될 가능성이 있기 때문입니다.

일상적인 코드 작성 결론

, 우리는 일반적으로 autoboxing and unboxing를 사용합니다. 원시적 형과 대응하는 객체 래퍼 클래스 간의 자동 변환입니다 (Java 5에서 도입되었습니다). 따라서 Xxx.valueOf(xxx).xxxValue() 방법에 대해 많이 생각할 필요가 없습니다. 너무 편리 하죠?

Integer i = 10; // autoboxing 
int j = i; // unboxing 
+2

」를 캐쉬하는 것으로 써, 공간과 시간의 퍼포먼스가 현저하게 향상하기 때문에, Integer (int) 생성자보다 우선적으로 사용됩니다. 당신은 생각할 필요가 없습니다. " - 이의가있는 부분. VM이 당신을 위해 "더러운"작업을 처리한다고 주장하지는 않습니다. ** 그러나 ** 당신은 여전히 ​​무슨 일이 일어나고 있는지를 알아야합니다. 요 전날 Integer 풀링 메커니즘으로 인해 스레드 동기화가 엉망인 질문이있었습니다. – Fildor

+2

@Fildor : 풀링이 발생하는지 여부에 관계없이 'Integer' 인스턴스를 동기화 키로 사용하면 어쨌든 깨진 디자인입니다. – Holger

+2

@Holger 동의합니다. 그러나 그것이 내 요점이 아니 었습니다. 나는 단지 "당신이 생각할 필요가 없다"고 말하고 싶었습니다 **는 단순히 사실이 아닙니다 **. _ 물론 _ 당신은 훗날에 어떤 복싱/언 박싱이 진행되고 있음을 알아야합니다. 그렇지 않으면 조만간 문제가 발생할 것입니다. 동기화 문제가있는 예제는 많은 사람들이 생각할 수있는 것 중 하나였습니다. – Fildor

4

java의 모든 primitive type에는 해당 래퍼 클래스가 있습니다. 이러한 기본 유형과 해당 래퍼 클래스간에 변환 할 수 있습니다.이것은 복싱 및 언 박싱이라고합니다. 당신은

Integer in = (Integer)y; //this is unnecessary casting 

또는 당신은 주로 원시 타입과 래퍼 클래스 사이의 변환하고

Integer in = new Integer(y); //create a new instance of Integer class 

을 쓸 때. 그러나 Java에는 Auto Boxing and Unboxing이라는 기능이 있습니다. 여기서 java가 이러한 변환을 수행합니다. 쓰기 만하십시오

int iPrimi = 20; 
Integer iWrapper = iPrimi; //Autoboxing 
int iPrimi2 = iWrapper; //Auto unboxing 

자동 저장 및 압축 해제는 성능을 저하시킵니다. Primitives seems to be 2-3 times faster then it’s Integer equivalent. 그렇게 할 필요가 없다면 사용하지 마십시오.

+0

두 번째 예제 코드에서 오타가 있습니다. 정수기 -> 정수 – Vincent

+3

Ermahgerd! 인터 레이저! – CodeNewbie

+1

예를 들어, iPrimi2 = iWrapper를 의미합니까? –

관련 문제