JavaRush /Java Blog /Random-KO /레벨 26. 레벨 주제에 대한 인터뷰 질문에 대한 답변입니다. 1부. 질문 1-5, 10.
zor07
레벨 31
Санкт-Петербург

레벨 26. 레벨 주제에 대한 인터뷰 질문에 대한 답변입니다. 1부. 질문 1-5, 10.

Random-KO 그룹에 게시되었습니다
레벨 26. 레벨 주제에 대한 인터뷰 질문에 대한 답변입니다.  1부. 질문 1-5, 10. - 1요약이 꽤 번거로워서 두 부분으로 나누었습니다. 두 번째 부분에는 칸카렌시 및 멀티스레딩에 관한 질문에 대한 답변이 포함되어 있습니다. 첫 번째 부분에는 나머지 부분이 포함되어 있습니다. 글쓰기가 상당히 어려웠습니다. 아직 잘 모르는 부분이 있으니 언제나 그렇듯 댓글, 덧글, 추가는 환영합니다)

1. Comparable 인터페이스를 사용하는 방법은 무엇입니까?

인터페이스는 클래스 객체의 순서를 구현하도록 설계된 Comparable하나의 메서드만 선언합니다 . compareTo(Object obj)순서가 있는 목록이나 객체의 배열을 정렬할 때 사용하면 편리합니다. 이 메소드는 호출된 객체를 다음과 비교합니다. obj. true 또는 false 를 반환 equals하는 메서드와 달리 다음을 반환합니다. compareTo
  • 값이 같으면 0이고, 그렇지 않으면 0입니다.
  • 호출 수신자가 매개변수보다 작은 경우 음수 값입니다.
  • 호출 수신자가 매개변수보다 큰 경우 양수입니다.
java.util.List주로 순서가 지정된 목록( )과 객체 배열을 정렬하는 데 유용합니다 . 목록/배열에 이 인터페이스를 구현하는 요소가 포함되어 있으면 java.util.Collections.sort(List)/Arrays.sort(Object[]). 자연 순서의 개념은 인터페이스와 연관되어 있습니다 Comparable. 왜냐하면 이 인터페이스를 구현하는 모든 클래스의 인스턴스에 대한 자연 순서를 설정하기 때문입니다. 즉, 순서 (x, y)는 조건의 충족에 해당합니다 x.compareTo(y) <= 0. 구현 규칙 Comparable또는 해당 메소드의 규칙 compareTo(Object)은 다음과 같습니다(x 및 y는 구현하는 클래스의 인스턴스입니다 Comparable).
  • x.compareTo(y)x가 각각 y 이전이나 이후에 있어야 하는 경우 -1 또는 1을 반환합니다. 메서드가 0을 반환하면 (x, y)와 (y, x) 차수는 동일합니다.
  • sign(a)가 각각 0보다 작고, 0과 같고, 0보다 큰 경우 -1,0,1을 반환하는 함수인 경우 동등성을 충족해야 합니다 sign(x.compareTo(y))==-sign(y.compareTo(x)). 이는 논리적입니다. x가 y 앞에 오면 y는 x 뒤에 와야 하고 그 반대의 경우도 마찬가지입니다.
  • 그렇다면 x.compareTo(y) > 0– 불평등 y.compareTo(z) > 0x.compareTo(z) > 0전이성 관계.
  • 이면 모든 z에 대해 입니다 x.compareTo(y) == 0.sign(x.compare(z)) == sign(y.compareTo(z))
  • 호출 시 x.compareTo(null)예외가 발생해야 합니다 NullPointerException. 이는 구현 논리와의 불일치입니다 ( false 를 반환한다는 점을 equals상기시켜 주세요 ).x.equals(null)
  • y의 유형을 x와 비교할 수 없는 경우 호출에서 x.compareTo(y)예외가 발생해야 합니다 ClassCastException.
  • (x.compareTo(y) == 0) == x.equals(y), 즉. 호출은 true 를 반환하는 x.compareTo(y)경우에만 0을 반환해야 합니다 . 이는 일관성의 규칙이며 고려해야 할 매우 중요합니다.x.equals(y)
출처:

2. 비교기 인터페이스를 사용하는 방법은 무엇입니까?

인터페이스는 Comparator두 가지 메소드 compare(Object obj1, Object obj2)와 를 선언합니다 equals(Object obj). 인터페이스를 사용할 때 Comparator객체 쌍을 비교하는 논리는 클래스/객체 내부에 숨겨져 있지 않고 별도의 클래스에서 구현됩니다. 방법은 compare(x,y)호출과 완전히 동일합니다 x.compareTo(y). compareTo(Object)모든 규칙은 인터페이스 메소드 구현 규칙과 정확히 동일한 방식으로 따라야 합니다 Comparable. Comparator정렬이 필요한 곳 ​​어디에서나 사용할 수 있습니다. 이 경우 먼저 필요한 유연성, 즉 여러 정렬 규칙을 구현하는 기능이 나타납니다. 둘째, 정렬되는 개체가 Comparable. 구현하는 경우 Comparator우선순위를 갖습니다. 인터페이스는 역설적이게 Comparator도 메소드를 정의하기도 합니다 . equals(Object)이 메서드는 인터페이스 인스턴스 자체를 비교하고 비교되는 개체가 동일한 정렬 순서를 제공하는 경우 Comparator에만 true를 반환해야 합니다. 그러나 원래 구현을 Object.equals(Object)그대로 두는 것이 항상 안전합니다 . 출처:

3. Collections 클래스에는 어떤 메소드가 있습니까?

public static <T> boolean addAll(Collection<? super T> c, T... elements) elements이 메서드는 컬렉션에 배열 요소를 추가합니다 Collection<? super T> c. 요소는 개별적으로 지정하거나 배열로 지정할 수 있습니다. 요소가 개별적으로 지정되는 경우 이 방법은 모든 요소를 ​​기존 컬렉션에 편리하게 추가하는 기능을 제공합니다. Collections.addAll(flavors, "Peaches 'n Plutonium", "Rocky Racoon"); public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 두 방법 모두 이진 검색 알고리즘을 사용하여 매개 변수에 전달된 개체에 대한 매개 변수에 전달된 목록을 검색합니다. 목록에 해당 요소가 있는 경우 해당 요소의 인덱스를 반환하고, 그렇지 않은 경우 목록에서 보다 큰 첫 번째 요소의 인덱스를 반환하고 key모든 요소가 보다 작으면 을 key반환합니다 list.size(). 이러한 방법을 사용하기 전에 목록을 정렬해야 합니다. 첫 번째 경우에는 목록 요소의 "자연스러운" 순서에 따라 오름차순으로 정렬됩니다( 를 사용할 때와 동일 Collections.sort(list)). 두 번째 경우, 목록은 전달된 비교기에 의해 제공되는 순서에 따라 오름차순으로 정렬되어야 합니다( Collections.sort(list, c)[여기서 "with"는 설명된 메서드의 매개 변수에 대한 비교기임]을 사용할 때와 동일한 순서) public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) 서문: 제네릭 메커니즘 언어에서는 컴파일 타임 유형 검사를 제공합니다. 일반적으로 이것으로 충분하지만 그렇지 않은 경우도 있습니다. 예를 들어, 우리는 컬렉션을 우리에게 알려지지 않은 어딘가의 라이브러리 코드로 전송하고 이 "타사 라이브러리"의 코드가 컬렉션에 잘못된 유형의 요소를 삽입하지 않기를 정말로 원합니다. 이것이 가능한 문제 1번입니다. 가능한 문제 2번은 다음과 같습니다. ClassCastException 우리 프로그램이 잘못된 유형의 요소가 컬렉션에 삽입되었음을 알리는 메시지를 제공한다고 가정해 보겠습니다 . 안타깝게도 이 예외는 잘못된 요소가 삽입된 후 언제든지 발생할 수 있으며 일반적으로 문제의 원인에 대한 정보를 거의 또는 전혀 제공하지 않습니다. 방법을 사용하면 checkedCollection문제 1번과 2번에서 벗어날 수 있습니다. 이 메서드는 런타임 시 확인할 수 있는 컬렉션을 생성합니다. 이 방법을 사용하여 두 번째 문제를 해결합니다. 예를 들어, 이것이 있는데 문제가 발생합니다 ClassCastException.
Collection<String> c = new HashSet<String>();
위의 코드는 일시적으로 다음으로 대체될 수 있습니다.
Collection<String> c = Collections.checkedCollection(
         new HashSet<String>(), String.class);
프로그램을 다시 실행하면 컬렉션에 잘못된 유형의 요소를 삽입하는 코드 줄이 지역화됩니다. 내 생각에는 관련 메서드: public static <E> List<E> checkedList(List<E> list,Class<E> type) public static <K,V> Map<K,V> checkedMap(Map<K,V> m, Class<K> keyType,Class<V> valueType) public static <E> Set<E> checkedSet(Set<E> s,Class<E> type) public static <K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K,V> m,Class<K> keyType,Class<V> valueType) public static <E> SortedSet<E> checkedSortedSet(SortedSet<E> s,Class<E> type) public static <T> void copy(List<? super T> dest,List<? extends T> src) 이 메서드는 src 요소를 dest에 복사합니다. 복사된 요소의 인덱스는 동일합니다. public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll) public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) public static <T> T min(Collection<? extends T> coll,Comparator<? super T> comp) public static <T> T max(Collection<? extends T> coll,Comparator<? super T> comp) 메소드는 "자연 순서"(비교 가능 인터페이스) 또는 전달된 비교기의 순서에 따라 컬렉션의 최소/최대 요소를 반환합니다. 컬렉션에 동일한 요소가 없으면 true를 public static boolean disjoint(Collection<?> c1,Collection<?> c2) 반환합니다 . – 각각 빈 리스트, 맵, 세트를 반환합니다. – 주어진 요소로 목록을 채웁니다. – 컬렉션에서 특정 요소의 발생 횟수를 반환합니다. – 지정된 n개의 요소 목록을 반환합니다 . – 지정된 모든 요소를 ​​새 요소로 바꿉니다. – 목록을 "반전"합니다. – 지정된 요소 수만큼 목록을 주기적으로 이동합니다. – 목록 요소를 섞습니다. – 하나의 요소로 구성된 세트, 목록 및 디스플레이 맵을 생성합니다. – 목록을 자연스러운 순서로 정렬하고 그에 따라 사용합니다. – 지정된 위치에서 목록 요소를 교환합니다. 출처: <T> List <T> emptyList(), <K,V> Map <K,V> emptyMap(), <T> Set <T> emptySet() <T> void fill(List<? super T> list, T obj) int frequency(Collection<?> c, Object o) <T> List <T> nCopies(int n, T o) <T> boolean replaceAll(List<T> list, T oldVal, T newVal) void reverse(List<?> list) void rotate(List<?> list, int distance) void shuffle(List<?> list) <T> Set <T> singleton(T o), singletonList(T o), singletonMap(K key, V value) <T extends Comparable<? super T>> void sort(List<T> list), <T> void sort(List<T> list, Comparator<? super T> c) Comparator void swap(List<?> list, int i, int j)

4. Arrays 클래스에는 어떤 메소드가 있습니까?

Arrays 클래스의 전체 메소드 목록은 설명서 에서 볼 수 있습니다 . 이 요약에서는 그 중 몇 가지만 인용하겠습니다. [문서에서 메소드를 번역했는데 불행히도 대부분의 번역이 손실되었습니다. 안타깝고 같은 일에 시간을 낭비하고 싶지 않아서 내가 검색한 내용을 붙여넣겠습니다]는 public static <T> List<T> asList(T... a) 배열을 기반으로 목록을 생성합니다. 배열은 목록의 내부 표현에 사용됩니다. 이렇게 하면 목록과 원본 배열 사이의 연결이 유지됩니다. 배열의 변경 사항이 목록에 반영됩니다.
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

a[0] = "aaa";
System.out.println(list); // [aaa, bar, baz]
목록의 변경 사항은 배열에 반영됩니다.
String[] a = { "foo", "bar", "baz"};
List<String> list = Arrays.asList(a);
System.out.println(list); // [foo, bar, baz]

list.set(0, "bbb");
System.out.println(Arrays.toString(a)); // [bbb, bar, baz]
배열에 객체가 포함되어 있으면 분명히 배열과 목록이 모두 동일한 인스턴스를 참조합니다.
Object[] a = { new Object(), new Object(), new Object()};
List<Object> list = Arrays.asList(a);
System.out.println(a[0] == list.get(0)); // true
int binarySearch(параметры)– 기본 및 객체 유형 배열의 값에 대한 이진 검색을 구성하기 위한 오버로드된 방법입니다. 첫 번째 일치 위치를 반환합니다. void fill(параметры)– 다양한 유형과 기본 요소의 값으로 배열을 채우는 오버로드된 방법; void sort(parameters) – Comparator 인터페이스를 사용하거나 이를 사용하지 않고 배열 또는 그 일부를 정렬하기 위한 오버로드된 메서드입니다. static <T> T[] copyOf(T[] original, int newLength)– 특정 길이의 배열을 채우고, 필요한 경우 요소를 버리거나 null로 채웁니다. static <T> T[] copyOfRange(T[] original, int from, int to)– 배열의 지정된 영역을 새 배열로 복사합니다. <T> List<T> asList(T… a)– 배열 요소를 List<T> 유형의 객체에 복사하는 메서드입니다. 원천:

5. Collections.sort()를 호출할 때 사용되는 정렬 이름은 무엇입니까?

문서에서 : 구현은 Tim Peters의 Python 목록 정렬(TimSort)을 적용한 것입니다. 이 구현은 목록을 배열로 덤프하고 배열을 정렬한 다음 목록을 반복하고 해당 배열 요소에서 각 목록 요소를 다시 로드합니다. 이렇게 하면 연결된 목록을 직접 정렬하려고 할 때 발생할 수 있는 n*n log(n) 복잡성을 피할 수 있습니다. 위키에서 발췌 : Timsort는 삽입 정렬과 병합 정렬을 결합한 하이브리드 정렬 알고리즘으로, 2002년 Tim Peters가 게시했습니다. Timsort는 현재 Python, OpenJDK 7의 표준 정렬 알고리즘이며 Android JDK 1.5에서 구현됩니다. 알고리즘의 주요 아이디어는 실제 세계에서 정렬 가능한 데이터 배열에 순서가 지정된 하위 배열이 포함되는 경우가 많다는 것입니다. 이러한 데이터에서 Timsort는 많은 정렬 알고리즘보다 훨씬 빠릅니다.

10. 반복자란 무엇입니까?

Java 언어의 JDK 1.2 릴리스에 도입된 인터페이스를 사용하면 java.util.Iterator컨테이너 클래스의 반복이 가능합니다. 각 Iterator는 메소드를 구현 next()하고 hasNext()선택적으로 remove(). 반복자는 해당 컨테이너 클래스, 일반적으로 iterator(). 이 메서드는 next()반복기를 다음 값으로 진행하고 지정된 값을 반복기에 반환합니다. 처음 생성될 때 반복자는 첫 번째 요소 앞의 특수 값을 가리키므로 첫 번째 요소는 를 처음 호출한 후에만 검색할 수 있습니다 next(). 컨테이너의 모든 요소가 반복되는 순간을 결정하기 위해 테스트 방법이 사용됩니다 hasNext(). 다음 예에서는 반복자의 간단한 사용을 보여줍니다.
Iterator iter = list.iterator();
//Iterator<MyType> iter = list.iterator(); в J2SE 5.0
while (iter.hasNext())
    System.out.println(iter.next());
이를 지원하는 유형 컬렉션의 경우 반복자 메서드는 remove()컨테이너에서 마지막 '방문' 요소를 제거합니다. 반복 중 거의 모든 유형의 컨테이너 수정은 안전하지 않습니다. 또한 for는 유사한 API와 함께 java.util.List존재 java.util.ListIterator하지만 순방향 및 역방향 반복을 허용하여 목록의 현재 인덱스에 대한 정의를 제공하고 해당 위치에 따라 요소로 이동합니다. 원천: 2 부
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION