java 자바 - 참조 유형으로 List 대 ArrayList 비교 하시겠습니까?





리스트 배열 (4)


첫 번째 양식을 사용하는 경우 List 인터페이스의 기능은 사용하려고하는 모든 것, 특히 구현에 의해 추가 된 것은 없습니다. 이는 사용 된 구현을 쉽게 변경할 수 있음을 의미합니다 (예 : 인스턴스화에서 ArrayList 대신 LinkedList 를 사용). ArrayList 에만 해당하는 특정 항목을 사용했을 수 있으므로 나머지 코드는 ArrayList 합니다.

Ok, Set , List , Map 은 인터페이스라는 것을 알고 있지만 두 번째 라인보다 코드의 첫 번째 라인이 더 좋은 점은 무엇입니까?

List myArr = new ArrayList();
ArrayList myArr = new ArrayList();



ArrayList 의 소스에서 볼 수 있듯이 구현 된 메서드의 대부분은 @override 로 주석 처리됩니다. List 인터페이스를 통해 정의 된 모든 요소가 있으므로 기본 기능 만 사용하면됩니다 (즉, 가장 많이 할 일 시간의 차이)는 실제적인 것이 아닙니다.

차이점은 언젠가 ArrayList 의 기능이 문제의 종류에 적합하지 않으며 다른 것을 필요로한다고 생각한다면 ( LinkedList 예). List 모든 것을 선언했지만 ArrayList 인스턴스화하면 인스턴스화를 new ArrayList() 로 변경하여 새로운 구현으로 쉽게 전환 할 수 있으며, 다른 경우에는 모든 변수 선언을 변경해야합니다.

List list = new ArrayList() 의 특정 구현에 대해 신경 쓰지 않는다고 선언 했으므로 List list = new ArrayList() 것이 더 OOP 스타일이며, 사용자가 제공 한 인터페이스에 의존하기 때문에 유형에 대한 정적 정보를 삭제하려고합니다. 그 구현으로부터 추상화 된 이러한 종류의 컬렉션.




프로그래밍 유형 ( 강건성 원칙 이라고도 함)에 대한 유용한 일반 원칙은 다음과 같습니다.

  • 당신이 받아들이는 것에 대해 자유 주의적이 되십시오.
  • 당신이 방출하는 것에 대해 보수적으로 행동하십시오.

List는 ArrayList, LinedList 또는 FrancosSpecialList와 같은 List 구현 일 수 있기 때문에 List는 ArrayList보다 더 자유 롭습니다. 따라서 나중에 구현을 변경하려는 경우 자유 주의적이며 모든 유형의 목록을 허용하는 것이 좋습니다.

ArrayList를 명시 적으로 형식 (두 번째 경우)으로 사용하는 주된 이유는 List 인터페이스를 통해 사용할 수없는 ArrayList에만 해당하는 메서드를 사용해야하는 경우입니다. 이 경우 generic리스트는 작동하지 않을 것이다. (추악하고 혼란스러운 캐스트를 많이하고 싶지 않다면) 명시 적으로 ArrayList를 직접 사용할 수도있다. 이것에는 독자에게 ArrayList의 특정 기능이 필요하다는 암시가 추가되었습니다.




C ++에서 자주 사용되는 부울 연산은 컴파일 된 프로그램에서 많은 분기를 생성합니다. 이러한 분기가 루프 내부에 있고 예측하기가 어렵다면 실행이 크게 느려질 수 있습니다. 부울 변수는 및 for 값 0을 갖는 8 비트 정수로 저장됩니다 .false1true

부울 변수는 입력으로 부울 변수가있는 모든 연산자가 입력이 다른 값을 가지면 확인합니다. 01, 부울을 출력으로 갖는 연산자는 0또는 이외의 다른 값을 생성 할 수 없습니다 1. 따라서 부울 변수를 사용하는 연산이 입력보다 덜 효율적입니다. 고려해보기 :

bool a, b, c, d;
c = a && b;
d = a || b;

일반적으로 다음과 같은 방법으로 컴파일러에서 구현됩니다.

bool a, b, c, d;
if (a != 0) {
    if (b != 0) {
        c = 1;
    }
    else {
        goto CFALSE;
    }
}
else {
    CFALSE:
    c = 0;
}
if (a == 0) {
    if (b == 0) {
        d = 0;
    }
    else {
        goto DTRUE;
    }
}
else {
    DTRUE:
    d = 1;
}

이 코드는 최적이 아닙니다. 잘못 예측할 경우 분기에 시간이 오래 걸릴 수 있습니다. 부울 연산은 피연산자가 0와 (와) 다른 값을 가지지 않는다는 것이 확실하다면 훨씬 효율적으로 만들 수 있습니다 1. 컴파일러가 이러한 가정을하지 않는 이유는 변수가 초기화되지 않았거나 알 수없는 출처에서 나온 경우 변수가 다른 값을 가질 수 있기 때문입니다. 위의 코드는 유효한 값으로 초기화 된 경우 ab부울 출력을 생성하는 연산자에서 나온 경우 최적화 될 수 있습니다 . 최적화 된 코드는 다음과 같습니다.

char a = 0, b = 1, c, d;
c = a & b;
d = a | b;

char대신 부울 연산자 ( 및 ) 대신 bool비트 연산자 ( &|) 를 사용할 수 있도록하기 위해 대신 사용됩니다 . 비트 연산자는 단 하나의 클록 사이클을 취하는 단일 명령어입니다. 는 OR 연산자 ( ) 경우에도 작동 및 이외의 값을 가지고 나 . AND 연산자 ( )와 EXCLUSIVE OR 연산자 ( 피연산자가 아닌 다른 값을 가질 경우) 일치 결과를 얻을 수있다 와 .&&|||ab01&^01

~NOT에 사용할 수 없습니다. 대신, 알려진 변수에 부울 NOT을 만들 0거나 1XOR 할 수 있습니다 1.

bool a, b;
b = !a;

다음과 같이 최적화 할 수 있습니다.

char a = 0, b;
b = a ^ 1;

a && b로 대체 할 수없는 a & b경우 b경우 평가하지 말아야 표현이다 a입니다 false( &&평가하지 않습니다 b, &것입니다). 마찬가지로 a || b대체 될 수없는 a | b경우 b경우 평가 안되는 표현 a이다 true.

비트 연산자를 사용하는 것이 피연산자가 변수 인 경우 피연산자가 비교 인 경우보다 유리합니다.

bool a; double x, y, z;
a = x > y && z < 5.0;

대부분의 경우에 최적입니다 ( &&표현식에서 많은 분기 오보를 생성 하지 않는다면 ).





java list arraylist interface