この記事では、Java の Iterable と Iterator について詳しく説明します。必要な方は参考にしていただければ幸いです。
Java では、次の方法で List コレクションを走査できます。
List<Integer> list = new ArrayList<>(); list.add(5); list.add(23); list.add(42); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ","); } Iterator it = list.iterator(); while (it.hasNext()) { System.out.print(it.next() + ","); } for (Integer i : list) { System.out.print(i + ","); }
1 つ目は通常の for ループ、2 つ目はイテレータの走査、3 つ目は for each ループです。後の 2 つのメソッドには、Java の反復子オブジェクトと反復可能オブジェクトが含まれます。次に、これら 2 つのオブジェクトの違いと、カスタム クラスでの for each ループの実装方法を見てみましょう。
Iterator と Iterable
iterator は Java のイテレータ オブジェクトであり、List などのコレクションを反復処理できる基礎的な依存関係です。 iterable インターフェイスはイテレータを返すメソッドを定義します。これはイテレータをカプセル化することと同じです。同時に、iterable インターフェイスを実装するクラスは各ループをサポートできます。
Iterator の内部詳細
jdk の Iterator インターフェイスの主なメソッドは次のとおりです。
public interface Iterator<E> { boolean hasNext(); E next(); }
Iterator は、上記の 2 つのメソッドを通じてコレクションへの反復アクセスのメソッドを定義します。 、および特定の実装メソッド さまざまな実装クラスに応じて、特定のコレクション クラスは反復を実装するための Iterator インターフェイスのメソッドを実装します。
List には Iterator インターフェイスが実装されていませんが、Iterable インターフェイスが実装されていることがわかります。 Iterable インターフェイスのソース コードをさらに観察すると、Iterable インターフェイスが Iterator オブジェクトのみを返すことがわかります。
public interface Iterable<T> { Iterator<T> iterator(); }
したがって、次のメソッドを使用して List を反復できます (iterator() メソッドを呼び出すことによって)
Iterator it = list.iterator(); while (it.hasNext()) { System.out.print(it.next() + ","); }
同時に、Iterable インターフェイスを実装する場合は、次のメソッドも使用できます。 for each ループ。
for each原則
実際、for each ループは Iterator イテレータにも依存しますが、Java によって提供される構文糖である Java コンパイラは、トラバーサルのためにそれを Iterator イテレータに変換します。各ループについて次のコードを逆コンパイルします。
for (Integer i : list) { System.out.println(i); }
逆コンパイル後:
Integer i; for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){ i = (Integer)iterator.next(); }
Java の for each 拡張ループがイテレータを通じて実装されていることがわかります。
Iterable と Iterator の関係についての詳細な説明
質問があります。なぜ hasNext() メソッドと next() メソッドを Iterable インターフェイスや他のクラスに直接配置しないのですか。それらを直接実装できますか?
その理由は、一部のコレクション クラスには複数のトラバーサル メソッドがあるため、Iterable を実装するクラスは、ListItr
や LinkedList
などの複数の Iterator 内部クラスを実装できるためです。 DescendingIterator
2 つの内部クラスは、それぞれ双方向トラバーサルと逆順トラバーサルを実装します。異なる Iterator
を返すことで異なるトラバーサル メソッドを実装すると、より柔軟になります。 2 つのインターフェイスをマージすると、異なる Iterator
実装クラスを返すことができなくなります。 ListItr 関連のソース コードは次のとおりです。
public ListIterator<E> listIterator(int index) { checkPositionIndex(index); return new ListItr(index); } private class ListItr implements ListIterator<E> { ... ListItr(int index) { // assert isPositionIndex(index); next = (index == size) ? null : node(index); nextIndex = index; } public boolean hasNext() { return nextIndex < size; } ...
上記のように、list.listIterator()
メソッド (list.iterator()##) を呼び出すことでイテレータを返すことができます。 # は単なるデフォルト実装です )
DescendingIteratorソース コードは次のとおりです:
public Iterator<E> descendingIterator() { return new DescendingIterator(); } private class DescendingIterator implements Iterator<E> { private final ListItr itr = new ListItr(size()); public boolean hasNext() { return itr.hasPrevious(); } public E next() { return itr.previous(); } public void remove() { itr.remove(); } }このイテレータは
list.descendingIterator()# を通じて使用することもできます。 ##。 独自のイテレータを実装する
これでカスタム クラス ArrayMap ができました。これをそれぞれ次のように走査すると、次のようになります。
ArrayMap<String, Integer> am = new ArrayMap<>(); am.put("hello", 5); am.put("syrups", 10); for (String s: am) { System.out.println(s); }
hashNext と next を実装していないため、抽象メソッドであるため、トラバースすることはできません。
カスタマイズされたイテレータ クラス
最初にイテレータ クラスをカスタマイズして hashNext メソッドと next メソッドを実装し、それを ArrayMap の内部クラスとして使用します。関連するコードは次のとおりです。 # #次で指定した走査ルールが ArrayMap のキー値に基づいて走査されることがわかります。上記のイテレータ クラスを使用すると、イテレータ メソッドを使用して外部からトラバースできます。トラバース コードは次のとおりです。
public class KeyIterator implements Iterator<K> { private int ptr; public KeyIterator() { ptr = 0; } @Override public boolean hasNext() { return (ptr != size); } @Override public K next() { K returnItem = keys[ptr]; ptr += 1; return returnItem; } }
上に示すように、反復アクセス用の KeyIterator オブジェクトを作成します (外部クラスによって、内部クラスオブジェクト)。
各ループのサポート
反復可能なインターフェイスが実装されていないため、現在は各ループのアクセスをサポートできません。まず ArrayMap に Iterable インターフェイスを実装します。
ArrayMap<String, Integer> am = new ArrayMap<>(); am.put("hello", 5); am.put("syrups", 10); ArrayMap.KeyIterator ami = am.new KeyIterator(); while (ami.hasNext()) { System.out.println(ami.next()); }
その後、再起動します。 iterator() メソッドを記述し、独自のイテレータ オブジェクト (iterator) を返します。
public class ArrayMap<K, V> implements Iterable<K> { private K[] keys; private V[] values; int size; public ArrayMap() { keys = (K[]) new Object[100]; values = (V[]) new Object[100]; size = 0; } .... }
カスタム KeyIterator クラスは Iterator インターフェイスを実装する必要があることに注意してください。実装しないと、 iterator() メソッドで返される型は一致しません。
以上がJava の Iterable と Iterator の詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

javaispopularforsoss-platformdesktopapplicationsduetoits "writeonce、runaynay" philosophy.1)itusesbytecodatiTatrunnanyjvm-adipplatform.2)ライブラリリケンディンガンドジャヴァフククレアティック - ルルクリス

Javaでプラットフォーム固有のコードを作成する理由には、特定のオペレーティングシステム機能へのアクセス、特定のハードウェアとの対話、パフォーマンスの最適化が含まれます。 1)JNAまたはJNIを使用して、Windowsレジストリにアクセスします。 2)JNIを介してLinux固有のハードウェアドライバーと対話します。 3)金属を使用して、JNIを介してMacOSのゲームパフォーマンスを最適化します。それにもかかわらず、プラットフォーム固有のコードを書くことは、コードの移植性に影響を与え、複雑さを高め、パフォーマンスのオーバーヘッドとセキュリティのリスクをもたらす可能性があります。

Javaは、クラウドネイティブアプリケーション、マルチプラットフォームの展開、および言語間の相互運用性を通じて、プラットフォームの独立性をさらに強化します。 1)クラウドネイティブアプリケーションは、GraalvmとQuarkusを使用してスタートアップ速度を向上させます。 2)Javaは、埋め込みデバイス、モバイルデバイス、量子コンピューターに拡張されます。 3)Graalvmを通じて、JavaはPythonやJavaScriptなどの言語とシームレスに統合して、言語間の相互運用性を高めます。

Javaの強力なタイプ化されたシステムは、タイプの安全性、統一タイプの変換、多型を通じてプラットフォームの独立性を保証します。 1)タイプの安全性は、コンパイル時間でタイプチェックを実行して、ランタイムエラーを回避します。 2)統一された型変換ルールは、すべてのプラットフォームで一貫しています。 3)多型とインターフェイスメカニズムにより、コードはさまざまなプラットフォームで一貫して動作します。

JNIはJavaのプラットフォームの独立を破壊します。 1)JNIは特定のプラットフォームにローカルライブラリを必要とします。2)ローカルコードをターゲットプラットフォームにコンパイルおよびリンクする必要があります。3)異なるバージョンのオペレーティングシステムまたはJVMは、異なるローカルライブラリバージョンを必要とする場合があります。

新しいテクノロジーは、両方の脅威をもたらし、Javaのプラットフォームの独立性を高めます。 1)Dockerなどのクラウドコンピューティングとコンテナ化テクノロジーは、Javaのプラットフォームの独立性を強化しますが、さまざまなクラウド環境に適応するために最適化する必要があります。 2)WebAssemblyは、Graalvmを介してJavaコードをコンパイルし、プラットフォームの独立性を拡張しますが、パフォーマンスのために他の言語と競合する必要があります。

JVMの実装が異なると、プラットフォームの独立性が得られますが、パフォーマンスはわずかに異なります。 1。OracleHotspotとOpenJDKJVMは、プラットフォームの独立性で同様に機能しますが、OpenJDKは追加の構成が必要になる場合があります。 2。IBMJ9JVMは、特定のオペレーティングシステムで最適化を実行します。 3. Graalvmは複数の言語をサポートし、追加の構成が必要です。 4。AzulzingJVMには、特定のプラットフォーム調整が必要です。

プラットフォームの独立性により、開発コストが削減され、複数のオペレーティングシステムで同じコードセットを実行することで開発時間を短縮します。具体的には、次のように表示されます。1。開発時間を短縮すると、1セットのコードのみが必要です。 2。メンテナンスコストを削減し、テストプロセスを統合します。 3.展開プロセスを簡素化するための迅速な反復とチームコラボレーション。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









