JavaRush /Java Blog /Random-KO /커피 브레이크 #176. Array와 ArrayList의 유사점과 차이점 효과적인 equals() 메소...

커피 브레이크 #176. Array와 ArrayList의 유사점과 차이점 효과적인 equals() 메소드를 작성하는 방법

Random-KO 그룹에 게시되었습니다

Array와 ArrayList의 유사점과 차이점

출처: Medium 이 글은 Array와 ArrayList의 개념과 차이점을 이해하는데 중점을 두고 있습니다. 커피 브레이크 #176.  Array와 ArrayList의 유사점과 차이점  효율적인 equals() 메소드를 작성하는 방법 - 1

자바 어레이

배열은 동일한 유형의 값을 순서대로 저장할 수 있는 데이터 구조 입니다 . 예를 들어 문자, 숫자 등의 배열을 만들 수 있습니다. 이는 모든 기본 유형과 심지어 String 과 같은 객체에도 적용됩니다 . 배열이 생성되면 크기를 변경할 수 없습니다. 다음은 배열 참조 변수를 선언하고 배열을 할당하는 일반적인 예입니다.
dataType[] arrayName = new dataType[numElements];
배열 크기보다 더 많은 것을 추가하려고 하면 ArrayIndexOutOfBoundsException 이 발생합니다 .

배열 선언

배열을 선언하려면 데이터 유형 뒤에 [ ] 문자를 사용하십시오. 이는 변수가 배열에 대한 참조임을 나타냅니다. 배열 참조 변수는 다양한 크기의 배열을 참조할 수 있습니다. new 키워드는 지정된 수의 요소가 포함된 배열을 저장할 메모리 공간을 만듭니다. 새로 할당된 배열을 참조하기 위해 배열 참조 변수가 할당됩니다. 다음 예에서는 배열 참조 변수 gameScores 를 선언하고 , 4개의 정수 배열을 할당하고, 할당된 배열을 참조하도록 gameScores를 할당합니다.
int[] gameScores = new int[4];
new 키워드를 사용하여 배열 참조를 초기화하면 배열 요소가 자동으로 기본값으로 초기화됩니다. 정수 및 부동 소수점 데이터 유형 요소의 기본값은 0이고 부울 요소의 기본값은 false 입니다 . 또한 배열을 즉시 할당하지 않고 배열 참조 변수를 선언한 다음 할당된 배열로 변수를 할당할 수도 있습니다.
int[] gameScores;

gameScores = new int[4];

기본값이 아닌 값으로 배열 초기화

쉼표로 구분된 중괄호 {} 에 초기 값을 지정하여 기본값이 아닌 값으로 배열 요소를 초기화할 수 있습니다 .
int [] myArray = { 5 , 7 , 11 };
위의 예는 값이 5, 7, 11인 세 개의 정수 요소로 구성된 배열을 생성합니다. 이 배열 초기화 에서는 배열의 크기가 자동으로 배열의 요소 수에 따라 설정되므로 new 키워드 를 사용할 필요가 없습니다. 중괄호. 대규모 배열의 경우 먼저 배열을 정의한 다음 루프를 사용하여 배열 요소를 할당하여 초기화를 수행할 수 있습니다. 배열 요소는 0부터 시작하는 인덱스를 사용하여 액세스할 수 있습니다.
Int[ ] intArray = new int [ ] {2};
intArray [0] = 1;
intArray [1] = 2;

배열목록

ArrayList는 크기 조정 가능한 참조 유형 요소의 순서가 지정된 목록입니다 . 또한 Java Collection Framework에 속하는 java.util 패키지 의 클래스이기도 합니다 . ArrayList는 동적 배열을 제공하고 자동으로 크기 조정을 처리합니다. ArrayList에 요소를 추가하면 메모리 크기가 자동으로 늘어납니다. import java.util.ArrayList를 사용하여 ArrayList를 사용할 수 있습니다 . . 다음 명령문을 사용하여 ArrayList 인스턴스를 생성할 수도 있습니다 .
ArrayList<Type> arrayList = new ArrayList<Type>();
ArrayList는 필요한 요소를 수용하기 위해 크기가 커질 수 있습니다. ArrayList는 int 와 같은 기본 유형을 지원하지 않고 Integer 와 같은 참조 유형을 지원합니다 . 초보자들 사이에서 흔히 저지르는 실수는 ArrayList<int> myVals 에서처럼 int 와 같은 기본 유형의 ArrayList를 선언하는 것입니다 . 이로 인해 "예기치 않은 유형, 발견됨: int, 필수: 참조"라는 컴파일 오류가 발생합니다. 예: 문자열을 저장할 cars 라는 ArrayList 개체를 만들어 보겠습니다 .
import java.util.ArrayList;

ArrayList<String> cars = new ArrayList<String>();
ArrayList 에 요소를 추가하려면 add() 메서드를 사용합니다 . ArrayList 의 요소에 액세스하려면 get () 메소드가 사용됩니다 .
cars.add("Tesla");
cars.add("BMW");
cars.add("Kia");
cars.get(0);
내장 배열과 Java의 ArrayList 의 차이점은 첫 번째 경우 배열의 크기를 변경할 수 없다는 것입니다(배열에 요소를 추가하거나 배열에서 요소를 제거하려면 새 배열을 만들어야 합니다). ). 반면 ArrayList 에서는 요소를 언제든지 추가하고 제거할 수 있습니다.

Array와 ArrayList의 유사점

  • ArrayArrayList 는 요소를 저장하는 데 사용됩니다.
  • ArrayArrayList는 null 값을 저장할 수 있습니다.
  • 두 프로세스 모두 일정한 시간에 발생합니다.
  • 중복된 값이 있을 수 있습니다.
  • ArrayArrayList는 순서가 지정된 요소의 존재를 보장하지 않습니다.

Array와 ArrayList의 주요 차이점

배열( Array )과 ArrayList 의 주요 차이점 은 배열의 정적 특성과 ArrayList의 동적 특성입니다 . 일단 생성되면 배열의 크기를 변경할 수 없지만 ArrayList는 필요에 따라 크기를 변경할 수 있습니다. 또 다른 중요한 차이점은 배열이 Java에서 제공하는 기본 기능이라는 것입니다. 반면 ArrayList는 Java의 컬렉션 프레임워크의 일부입니다. 인덱스를 지정할 수 있는 대괄호를 사용하여 배열 요소에 액세스할 수 있습니다. ArrayList의 요소에 액세스 하고 이를 변경하는 일련의 메소드가 있습니다 . 비록 서로 다르지만, 두 가지 모두 다른 측면에서는 비교할 수 있습니다. Java의 이러한 데이터 구조는 모두 인덱스를 기반으로 하며 객체를 저장할 수 있습니다. 또한 null 값과 중복을 허용합니다. 객체의 크기를 미리 알고 있다면 배열을 사용하는 것이 좋습니다. 하지만 크기가 확실하지 않은 경우 대신 ArrayList를 사용해야 합니다 .

효과적인 equals() 메소드를 작성하는 방법

출처: 중간 이 게시물은 Java 코드 작업 시 equals() 메서드 사용을 더 잘 이해하는 데 도움이 될 것입니다 . 구현 없이 기본 equals() 메소드 에 대해 이야기한다면 여러 면에서 == 연산과 유사합니다 . 즉, 이 방법은 객체를 비교합니다. 예를 들어, equals()는 두 문자열을 비교하여 문자열이 같으면 true를 반환하고 , 같지 않으면 false를 반환합니다. == 연산자 는 Java에서 객체를 비교할 때 권장되지 않습니다. 그 이유는 객체를 비교할 때 ==는 참조가 동일한 객체를 가리키는 경우 에만 true를 반환 하기 때문입니다. 문제를 피하는 가장 쉬운 방법은 equals 메소드 를 재정의하지 않는 것입니다 . 이 경우 클래스의 각 인스턴스는 자신과만 동일합니다. 클래스 에 객체의 단순 ID와 다른 논리적 동등 개념 이 있고 슈퍼클래스가 아직 동등성을 재정의하지 않은 경우에만 같음을 재정의하면 됩니다 . 따라서 equals() 메서드를 사용할 때 객체 참조가 논리적으로 동일한 지 , 동일한 객체를 참조하는지 여부를 확인해야 합니다 .

같음 메서드의 속성

각 같음 메소드는 동등 관계를 구현합니다 . 여기에는 다음과 같은 속성이 있습니다.
  • 재귀 : null이 아닌 참조 값 x 의 경우 x.equals (x) 는 true 를 반환해야 합니다.

  • 대칭 : null이 아닌 참조 값x y 의 경우 x.equals(y)는 y.equals(x)가 true를 반환하는 경우에만 true를 반환해야 합니다.

  • 전이적 : null이 아닌 참조 값 x , y , z 에 대해 x.equals(y)가 true를 반환하고 y.equals(z)가 true를 반환하면 x.equals(z) 도 true를 반환해야 합니다.

  • 일관성 : null이 아닌 참조 값 x y 의 경우 x.equals(y)에 대한 여러 호출은일관되게 true 를 반환하거나 일관되게 false를 반환.

  • Null이 아님 : Null이 아닌 참조 값 x 의 경우 x.equals (null) 는 false 를 반환해야 합니다.

각 속성을 자세히 살펴보겠습니다.

반사성:

객체는 자신과 동일해야 합니다. 이를 확인하려면 클래스의 인스턴스를 컬렉션에 추가하세요. 포함 메소드는 방금 추가한 인스턴스가 컬렉션에 포함되어 있지 않음을 나타낼 수 있습니다.

대칭:

두 개체(다른 클래스에 속할 수 있음)는 서로 동일해야 합니다.

후속:

신뢰할 수 없거나 일시적인 리소스에 의존하는 equals 메서드를 작성하지 마세요 .

0이 아닌:

equals 에 전달된 객체가 null인 경우 항상 true 를 반환 합니다 .

요약해보자:

품질 동일 방법 에 대한 레시피는 다음과 같습니다 .
  1. == 연산자를 사용하여 인수가 이 객체에 대한 참조인지 테스트합니다.

  2. 인수의 유형이 올바른지 확인하려면 instanceof 연산자를 사용하십시오 .

  3. 인수를 올바른 유형으로 캐스팅하세요.

  4. 클래스의 각 "중요한" 필드에 대해 해당 인수 필드가 해당 객체의 해당 필드와 일치하는지 확인합니다.

    • 유형이 float 또는 double 이 아닌 기본 필드의 경우 비교를 위해 == 연산자를 사용합니다 .
    • 객체 참조 필드의 경우: equals 메소드를 재귀적으로 호출합니다 . 부동 소수점 필드의 경우 정적 메소드 Float.compare(float, float)를 사용하십시오. 이중 필드의 경우 Double.compare(double, double) 을 사용하십시오 .
    • 배열 필드의 경우: 각 요소에 다음 지침을 적용합니다. 배열 필드의 모든 요소가 중요한 경우 Arrays.equals() 메서드 중 하나를 사용합니다 .
    • 일부 개체 참조 필드에는 null 값이 포함될 수 있습니다 . NullPointerException이 발생하지 않도록 하려면 정적 메서드 Objects.equals(Object, Object) 를 사용하여 해당 필드가 같은지 확인하세요 .
  5. Equals 메소드 작성을 마쳤으면 스스로에게 세 가지 질문을 던져보세요. 대칭인가요? 전이적인가요? 그는 일관성이 있나요?

그리고 equals를 재정의할 때는 항상 hashCode를 재정의해야 한다는 점을 기억하세요 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION