JavaRush /Java Blog /Random-JA /レベル 26。レベルのトピックに関するインタビューの質問への回答。第 1 部。質問 1 ~ 5、10。
zor07
レベル 31
Санкт-Петербург

レベル 26。レベルのトピックに関するインタビューの質問への回答。第 1 部。質問 1 ~ 5、10。

Random-JA グループに公開済み
レベル 26。レベルのトピックに関するインタビューの質問への回答。 パート 1. 質問 1 ~ 5、10. - 1要約が非常に煩雑になったので、2つのパートに分けました。2 番目の部分には、カンカレンシーとマルチスレッドに関する質問への回答が含まれています。最初の部分には残りが含まれます。書くのはかなり大変でした。まだよく理解できていないので、いつものようにコメント、指摘、追加を歓迎します)

1. Comparable インターフェイスの使用方法は?

このインターフェイスは、クラス オブジェクトの順序付けを実装するために設計されたComparableメソッドを 1 つだけ宣言します。compareTo(Object obj)オブジェクトの順序付きリストまたは配列を並べ替えるときに使用すると便利です。このメソッドは、呼び出されたオブジェクトを次のものと比較します。 オブジェクト trueまたは false equalsを返すメソッドとは対照的に、以下を返します。 compareTo
  • 値が等しい場合は 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)が a に対してそれぞれ、0 未満、0 に等しい、0 より大きい -1、0、1 を返す関数の場合、等式が満たされる必要がありますsign(x.compareTo(y))==-sign(y.compareTo(x))。これは論理的です。x が y の前にある場合、y は x の後に来る必要があり、その逆も同様です。
  • Ifx.compareTo(y) > 0y.compareTo(z) > 0、 then x.compareTo(z) > 0– 不等式の推移性の関係。
  • If x.compareTo(y) == 0、 then sign(x.compare(z)) == sign(y.compareTo(z))、任意の z に対して。
  • 呼び出しではx.compareTo(null)例外をスローする必要がありますNullPointerException。これは実装ロジックとの不一致ですequals(念のため言っておきますが、falsex.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 インターフェイスの使用方法は?

このインターフェイスは Comparator2 つのメソッド compare(Object obj1, Object obj2)と を宣言します equals(Object obj)。インターフェイス を使用する場合 Comparator、オブジェクトのペアを比較するロジックはクラス/オブジェクト内に隠されず、別のクラスに実装されます。メソッドは compare(x,y)call とまったく同じです x.compareTo(y)compareTo(Object)すべてのルールは、インターフェイスメソッドを実装するためのルールとまったく同じ方法で従う必要があります ComparableComparator並べ替えが必要な場所ならどこでも使用できます。この場合、まず、必要な柔軟性、つまり複数の並べ替えルールを実装できる機能が現れます。次に、並べ替えられるオブジェクトが を実装していない可能性があります Comparable。実装する場合は Comparatorそれが優先されます。逆説的に見えるかもしれませんが、インターフェイスは Comparatorメソッド も定義します。 equals(Object)このメソッドはインターフェイス インスタンス自体を比較し、比較されるオブジェクトが同じ並べ替え順序を提供する場合にのみ true Comparatorを返します。ただし、元の実装をそのままに しておくことが常に安全です 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))。2 番目のケースでは、リストは渡されたコンパレーターによって提供される順序で昇順にソートする必要があります ( Collections.sort(list, c)[ここで「with」は説明されたメソッドのパラメーターからのコンパレーターです] を使用する場合と同じ順序です)。 public static <E> Collection<E> checkedCollection(Collection<E> c, Class<E> type) 前文: ジェネリックスのメカニズムこの言語では、コンパイル時の型チェックが提供されます。通常はこれで十分ですが、そうでない場合もあります。たとえば、コレクションを未知の場所にあるライブラリ コードに転送しますが、この「サードパーティ ライブラリ」のコードが間違ったタイプの要素をコレクションに挿入しないようにしたいと考えています。これは考えられる問題その 1 です。考えられる問題その 2 は次のとおりです。プログラムから、 ClassCastException 間違った型の要素がコレクションに挿入されたことを通知するメッセージが表示されたとします。残念ながら、この例外は、不正な要素が挿入された後にいつでもスローされる可能性があり、通常、問題の原因に関する情報はほとんど、またはまったく得られません。 Method メソッドを使用すると、 checkedCollection問題 1 と 2 を回避できます。このメソッドは、実行時に検証可能なコレクションを作成します。この方法を使用して問題 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) メソッドは、コレクション内の最小/最大要素を「自然順序」(Comparable インターフェイス)、または渡されたコンパレータの順序で返します。 コレクションに同一の要素がない場合は true public static boolean disjoint(Collection<?> c1,Collection<?> c2) を返します。– 空のリスト、マップ、セットをそれぞれ返します。 – 指定された要素でリストを埋めます。 – コレクション内の特定の要素の出現数を返します。 – 指定されたn個の要素のリストを返します。 – 指定されたすべての要素を新しい要素に置き換えます。 – リストを「反転」します。 – 指定された要素数だけリストを循環的にシフトします。 – リスト要素をシャッフルします。 – 1 つの要素からなるセット、リスト、および表示マップを作成します。 – リストを自然な順序で並べ替え、それに応じて使用します。 – 指定された位置でリスト要素を交換します。 出典: <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) の複雑さが回避されます 。 wiki より: Timsort は、Tim Peters によって 2002 年に公開された、挿入ソートとマージ ソートを組み合わせたハイブリッド ソート アルゴリズムです。Timsort は現在、Python、OpenJDK 7 の標準ソート アルゴリズムであり、Android JDK 1.5 に実装されています。このアルゴリズムの主な考え方は、現実世界では、ソート可能なデータ配列には順序付けられたサブ配列が含まれることが多いということです。このようなデータでは、Timsort は多くの並べ替えアルゴリズムよりも大幅に高速です。

10. イテレータとは何ですか?

Java 言語の JDK 1.2 リリースで導入されたインターフェイスでは、 java.util.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());
これをサポートする型コレクションの場合、iterator メソッドは remove()最後に「訪問した」要素をコンテナーから削除します。反復中のその他のほとんどすべてのタイプのコンテナー変更は安全ではありません。さらに、 forは同様の API を java.util.List備えています java.util.ListIteratorが、前方および後方の反復が可能で、リスト内の現在のインデックスの定義を提供し、その位置によって要素に移動します。 ソース: パート2
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION