![OCPJP](https://habrastorage.org/getpro/habr/post_images/4fb/6d1/f2f/4fb6d1f2f7e1c638f2ddd69b5726099c.jpg)
尊敬されているハラジテラミとJavaプログラマーへのご挨拶!
この記事では、コード番号1Z0-804のOracle Java SE7 Professional試験の準備について説明します。 Habréについてはこれについて多くの投稿がすでに書かれています(たとえばhere 、 here 、 here 、 here 、 here 、 here 、 here 、 here ))、繰り返さないようにし、最も頻繁に遭遇したこと、私の意見では重要なニュアンスについてメモを追加します視線が見落とされるか、示された記事や一般にアクセス可能な文献で十分にカバーされていません(資料が完全であると主張していないことにすぐに気付きます。ここでは、試験から難しい質問を特定し、複雑なことを簡潔に述べようとしました) また、どの資料をより良く準備すべきかについての考えも共有します。 初めて試験に合格できなかったので、自分用にさまざまなメモを保存し始めました。そこで、複雑で覚えにくいと思われるものをすべて書き留めました。 今、私はあなたと共有することにしました。 エラー、欠陥、または間違いに突然気付いた場合は、事前に理解を示すようお願いします。コメントを記入してください。
一般的な情報
私はモスクワで受験しました。費用は150ドルで、2.5時間続きます。2つの書類があります。 90問、65%の合格点、つまり 約30の質問に間違って答えることができます(質問ごとに同じ数のポイントが与えられるかどうかはわかりません)。 必要に応じて、2週間後にのみ再摂取してください。 ピアソンVUE Webサイトでの試験の登録、テストセンター、日付、カードによる支払いも選択されています(以前はセンターで現金で支払いましたが、より高価であることが判明しました)。 今回は、メトロオクチャブリスカヤのACET(教育とテストのためのアメリカセンター)に行きました。 配達時には、すべてが深刻です-ポケットを開けて、持ち物を持ち歩くことを禁止するまで(電話は理解できますが、たとえば水です-量が多すぎます)。 退社することは許可されていますが、「受領時に」、試験は停止しません。 結果は約30分でメール(または受信したすべての試験と証明書が表示されるOracle Certviewのアカウント)に送信されます。 紙の証明書は、平均で1.5〜2か月以内に到着します(モスクワ地域)。
準備の推奨事項
もちろん、プログラミング、プログラミング、プログラミングをもう一度! そして冗談は部分的にしかありません。 最近Javaを学び始め、実践的な経験がほとんどなかったため、最初は主に本やさまざまなテストの準備を試みましたが、すぐに頭から飛び出し、すべてがうまくいき、主なものが忘れられないように練習が必要でした。 準備のために、次の材料を使用しました。
- Java SE 6プログラマー模擬試験 (Bert Bates、Kathy Sierra、2011年)。 実際、テストと推奨事項のコレクション。 確かに、バージョン6によれば少し古いですが、そうでない場合、それらのテストと説明は実際の質問にかなり近いです。 唯一の欠点は、NIO.2、JDBC、および同時実行性(ExecutorおよびFork-Join Frameworkを含む)のトピックが欠落していることです。 回答にエラーは見つかりませんでした。
- エンスウェアテスト 。 1回の試験で約10ドルかかり、対応するプログラムがダウンロードされます。 試験のすべてのトピックをカバーしていますが、試験で出くわした理論的な質問のいくつかはそこにありません。 エラーがときどき発生するため、表示された回答がわからない場合は、必ず確認してください。 一般に、このテストは次のような肯定的な印象を残しました。 「トリック」の性質上、多くの質問は試験問題に似ていました。トピックごとに分類されており、質問自体は非常に多くなっています(約300以上)。
- Oracleの公式チュートリアルは、Java Programmer Language Certification Programmer Level II Examの準備です 。 これは私が最初に偶然見つけたinなもので、すべてが完全にここにあるはずだと確信して...そして、テストは失敗しました。 しかし、実際には、試験で使用されるトピックやクラスの目次として、さらには予約としても使用できます。 第一に、試験と比較した場合の情報の完全性と例の完全性と複雑性は、多くの要望を残しています。 第二に、いくつかのトピック(たとえば、JDBC、NIO2)は、ここでは不必要な詳細に肥大化していますが、これは試験では見られませんでした。 第三に、パターンの理論がありません(そして、Oracleはこのトピックを非常に愛していることが判明しました-完全に理解してください)。 さて、クラスとフローの設計の理論のいくつかの側面のように、ささいなことによって、私はここでは見ませんでした(あなたが知っておくべきことについて-私は以下に書きます)。
- Android用のさまざまなテストアプリケーション。 私の意見では、最も有用で便利なのはSCJPv1とSCJP Champ(古いとはいえ)です。
- そしてもちろん、私が最も気に入っているさまざまなJavaの文献では、電子Java 7-The Complete Reference(Herbert Schildt) 、 Java Philosophy(Bruce Eckel) 、公式ドキュメント、およびGoogleを使用しました。
- 原則として、インターネットにはまだすべての種類のテストがあり、 高価ではなく、非常に一般的で無料ですが、客観性の保証がないため、中間点を選択して停止することが決定されました。
主なトピック
クラス設計、コンストラクタ、アクセス
- 試験のトリックが頻繁に見つかる重要なトピックの1つ。 クラス変数とメソッドへのアクセスレベル、オーバーロードとオーバーライド、コンストラクター内のすべての種類のコンストラクターなど。
- クラスのさまざまな部分の初期化順序を明確に知る必要があります。 継承の場合。 例:
class SuperTest { static { System.out.print("1"); } { System.out.print("3"); } public SuperTest() { System.out.print("4"); } } public class Test extends SuperTest { static { System.out.print("2"); } { System.out.print("5"); } public Test() { System.out.print("6"); } public static void main(String[] args) { new Test(); } }
このフラグメントは123456を出力します。 静的初期化ブロックと動的初期化ブロックを交換しても、何も変わりません。 同じタイプのブロックが複数ある場合、それらは順番に実行されます。 - 引数なしのコンストラクター(またはデフォルトのコンストラクター)を使用したさまざまな「ゲーム」があり、明示的に指定されていない場合はJavaによって自動的に作成されます。 引数を持つコンストラクターが空のクラスで作成された場合、デフォルトのコンストラクターは作成されないことを覚えておく必要がありますコンパイルエラー。
- protected修飾子の重要な機能を覚えておく必要があります(同じパッケージから相続人へのアクセスを許可します)。 相続人が別のパッケージにいる場合、彼はスーパークラスのオブジェクト(base_class.var)への参照を介して保護メンバーにアクセスできませんが、継承チェーン(super.var)または同じクラスのオブジェクトへのリンクを介してスーパークラスの保護フィールドにアクセスできます(extended_class.var、this.var)。
- 多くの場合、インターフェイスを実装するときはpublic修飾子を、メソッドをオーバーライドするときは間違ったタイプの例外を、またはアクセス権がないことを忘れがちです。
- 静的コンテキストから、以下を含む非静的コンテキストにアクセスできません。 これとsuperの呼び出しは禁止されています。
- 同じ名前の変数またはメソッドが存在するいくつかの質問がありました。 最も単純なケースは、相続人の変数のシャドウイング、およびソースと再定義されたメソッドでのソースクラスと相続人の変数の使用です。 また、クラスが同じメソッドと変数を使用して2つの異なるインターフェイスを実装する質問もあります。 そして、ネストされたクラスで同じ名前を持つ同様の例。 「リビングコード」ですべてを確認し、さまざまなthis.var、super.var、((ClassName)obj).var、同じ名前のメソッドへのさまざまな例外などと混合してください。
例外
- 例外の基本的な階層を覚えておくことは非常に重要です。 下の図では、いわゆる 未処理の例外(処理を必要としない)、黄色-チェック済み(処理が必要)。 実際、この写真は、「少しずつ」知っておく必要がある最低限の必要性を示しています。 難しい質問は非常に一般的です。
- スローされる例外がcatchブロックで処理されず(またはcatchブロックが欠落している)、finallyブロックがある場合、finallyブロックが実行され、例外がスローされます。
- メソッド()throws SomeCheckedException {...}の構築は、メソッドが内部でSomeCheckedException(チェックされた型)をスローすることを義務付けません。 ただし、同時に、このメソッドの呼び出しは処理が必要であると認識されます(try ... catchまたはthrows)。 Exceptionクラスの例:mechod()throws Exceptionは、メソッド内で例外をスローすることを強制しません(メソッドが空の場合も含む)が、mechod()への外部呼び出しには例外処理も必要です。
- try {...} catch(ExceptionClass e){...}内で、ExceptionClass例外を「スロー」する必要がありますが、タイプチェック済みの場合のみです。 そうしないと、コンパイルエラーが発生します。「例外は、対応するtryステートメントの本文にスローされることはありません」。
- catchブロック内の例外クラスは、縦棒(または「or」)で列挙され、継承階層の同じブランチ上にあるべきではありません。 たとえば、catch(ClassNotFoundException | IOException e)を記述できますが、catch(IOException | FileNotFoundException e)はコンパイルされません。
メソッドとパラメーター
- 参照/値によるパラメーターの受け渡し。 Javaでは、パラメータは値によってプロシージャに渡されることに注意してください(つまり、プロシージャ内のパラメータ値を変更しても外部から渡される変数には影響しません)が、注意が必要です。 単純型(int、float、...)の場合、これは事実です。 オブジェクト(配列を含む)の場合、リンクが転送されます。つまり、オブジェクトの変更は呼び出し元のプロシージャで表示されます。 しかし、単純型(Int、Float、...)とStringのラッパーの場合、内部状態を変更するためのAPIがないため、それらをパラメーターとして渡すことは単純型に似ています。
- メソッドをオーバーライドする場合、結果のタイプを基本メソッドの結果のサブクラス(スーパークラス内)として指定できますが、その逆はできません!
- メソッドをオーバーライドする場合、次のことを行います。
a)「より狭い」例外(サブクラス)を引き起こす可能性があります。
b)より広い例外(スーパークラス)を引き起こすことはできません。
c)例外をまったく発生させない場合があります。
コレクション
知っておくべき主なこと:構文、クラスとコレクションインターフェイスの階層、要素の操作、検索/並べ替え、equals()およびhashCode()メソッドの作業。 試験で出会った主なコレクションは、インターフェイスSet、Map、List、Deque、SortedMap、クラスArrayList、CopyOnWriteArrayList、ArrayDeque、TreeMap、TreeSet、HashMap、HashSetです。 Javaは、equals()およびhashCode()メソッドを使用して、コレクション内のアイテムを検索します。 新しいクラスの場合、デフォルトでは、equals()メソッドはオブジェクト(つまり、Objectから継承するため、オブジェクトへのポインター)を比較します。したがって、コレクションで独自の要素クラスを使用する場合は、このメソッドをオーバーライドしてJava以前に挿入された要素を見つけることができました。 hashCode()メソッドは、Javaが要素を持つ必要なバケットを見つけるために必要です(ハッシュコレクション用)。 したがって、メソッドが定義されておらず、バケットが見つからない場合、要素は見つかりません。 コレクションを作成するためのあらゆる種類の構文オプションを知っておくこともお勧めします。
// : List<> m = new ArrayList(); // error! List<> m = new ArrayList<String>(); // error! List<?> m = new ArrayList<?>(); // error! List<String> m = new ArrayList<?>(); // error! // : HashMap m = new LinkedHashMap<>(); HashMap<String, String> m = new LinkedHashMap(); HashMap<String, String> m = new LinkedHashMap<>(); HashMap<String, ?> m = new LinkedHashMap(); HashMap<?, ?> m = new LinkedHashMap<String, String>();
コレクションの機能について詳しく説明します。 階層を覚えやすくするために、対応する視覚的な図を見つけ、各クラスの詳細について簡単に要約しました。
![](https://habrastorage.org/getpro/habr/post_images/eb3/256/855/eb32568558623166245b8547086cef06.jpg)
![](https://habrastorage.org/getpro/habr/post_images/2f9/b3b/296/2f9b3b296c3381f54e1665176b18d4a2.png)
- セット -インターフェース。 すべての実装はオブジェクトのセットを格納します。 重複は禁止されていますが、重複を追加する場合、例外は発生しません(重複が挿入されると、add()メソッドはfalseを返します)。 実装:
- HashSet-順序付けられていないセット。 ヌル挿入を許可します。 マルチスレッドのサポートはありません。
- TreeSet -HashSetを合理化します。 マルチスレッドのサポートはありません。
- マップ -インターフェース、実装は<key、value>ペアを保存します。 すべての実装で重複が禁止されています:
- HashMap-ハッシュテーブルの形式で要素のストレージを実装します。 重複を新しい値で上書きします。 put()メソッドは、キーキーがない場合はnullを返し、既にキーがある場合は前の値を返します)。 キーが重複している場合、キーと値にnullを許可します-例外を発生させることなく、新しい値に置き換えます。 マルチスレッドのサポートはありません。 バイパス順序は保証されません。
- Hashtable-キーと値にnullは禁止されています(この場合、両方の場合にNullPointerExceptionが発生します)。 スレッドセーフ。 残りの作業はHashMapに似ています。
- TreeMapはHashMapの類似物であり、順序付けられているだけです。 追加すると、キーによって要素が自動的に並べ替えられます(つまり、要素のバイパスは並べ替えられます)。 赤と黒の木の原則に基づいて配置。
- リスト -インターフェース、実装はオブジェクトのリストを保存します。 重複とnullを許可します。 実装:
- ArrayList-動的配列。 マルチスレッドのサポートはありません。
- ベクトル -動的配列。 スレッドセーフ。
- LinkedList-二重にリンクされたリスト。 マルチスレッドのサポートはありません。 また、Dequeインターフェイスも実装します。
- キュー -このインターフェイスの実装は、オブジェクトを格納するためのキュー(FIFO)の原則に基づいています。 ヌルは許可されます。 add()メソッドは、キューの最後に配置します。
- Deque-実装は、キュー(FIFO)とスタック(LIFO)の機能を組み合わせます。 add()メソッドはQueueのadd()メソッドに似ており、キューの最後に配置されます。 push()メソッドとaddFirst()メソッドは同等であり、アイテムをキューの先頭(スタックの先頭)に配置します。
コレクションの比較に関する追加情報は、次の場所にあります。
- Javaの就職面接。 コレクション(Habrahabr)
- コアJavaコレクションのパフォーマンス。 .Netアナログとの比較
- 初心者向けの完全なJavaコレクションチュートリアル
- Java Collection Framework-パート1
- Java Collection Framework-パート2
コレクションの検索と並べ替え。 比較可能なインターフェイスとコンパレータインターフェイス
- これは「人気のある」トピックの1つでもあり、試験には検索/並べ替えに関する5つの質問がありました。
- Arrays.binarySearchとCollections.binarySearchのメソッドがどのように機能するかを正確に学習し、例として確認してください。 私の意見では、ドキュメントは少し書かれています。 返されるもの、例外が引き起こすもの、生の型での動作など。
- Collections.sortおよびArrays.sortメソッドについても同様です。
- 比較可能なインターフェース-オブジェクトインスタンスを比較できる/する必要があるクラスに使用されます。 文字列だけでなく、Char、Integerなどの単純型のすべての「ラッパー」は、すでにこのインターフェイスを実装しています。 使用法:
- コレクションアイテムの場合、 public int compareTo(T obj)メソッドを実装する必要があります。
- コレクションを作成するときに、新しい要素クラスを指定します
TreeSet <ElementNewClass> myColl = new TreeSet <ElementNewClass>);
- Comparatorインターフェース-オブジェクトが比較されるクラスの外部に実装されます。 比較可能との主な違い:
1)複数のタイプ(クラス)の独立したソートを作成できます。
2)比較が実装されていない別のクラスのオブジェクトをソートする必要がある場合に使用されます。
- メインインターフェイスメソッド: public int compare(T obj1、T obj2);
- 使用法-コレクションを作成するときに、コンパレーターの実装を指定します。
新しいTreeSet <String>(myComparator);
- 使用例:
Collections.sort(List <T> arg1、Comparator <?Super T> arg2);
Arrays.sort(T [] arg1、Comparator <?Super T> arg2);
- Collectionsクラスのメソッドsort()、reverse()、binarySearch()は、Setでは機能しません(例外はスローされません)
内部クラス
- 外部クラスはトップレベルのクラスです。 ファイルはOutside.classという名前でコンパイルされます。 許可されたアクセス修飾子: [デフォルト]、パブリック
- ネストされたクラス。 それらは、静的なネストされたクラス(静的)と内部クラス(残りすべて)に分けられます。
- 静的なネストされたクラス (またはインターフェイス)-上位クラスのコンテキストで定義された静的。 外部クラスの静的メンバーにアクセスできます。 内部クラスと外部クラスのインスタンスは独立して作成できます(作成構文: OuterClass.StaticNestedClass obj = new OuterClass.StaticNestedClass(); )。 ファイルは、Outside $ Inside.classという名前でコンパイルされます。 許可されたアクセス修飾子:ALL。
- メンバークラス -静的ではなく、上位クラスのコンテキストで定義されます。 インスタンスは、外部クラスのインスタンスを作成した後にのみ作成できます。 ファイルは、Outside $ Inside.classという名前でコンパイルされます。 許可されたアクセス修飾子:ALL。
- ローカルクラス -コードブロック内で定義され、このブロック内でのみ表示されます。 外部クラスの最終変数とメソッドの最終パラメーターにのみアクセスでき、ファイルはOutside $ 1 $ Inside.classという名前でコンパイルされます。 許可されるアクセス修飾子:[デフォルト]のみ。
- 匿名クラス -ローカルクラスの類似物、匿名のみ。 ファイルは次の名前でコンパイルされます:Outside $ 1.class
また、覚えておく必要があります。
- 非静的内部クラスに静的メソッドを含めることはできません。
- 非静的内部クラスは静的変数を持つことができます(ただし、finalのみです)。
- 静的にネストされたクラスには、静的変数と非静的変数を含めることができます。
文字列、正規表現を操作する
- Stringオブジェクトは不変であり、StringBuilderは可変であり、StringBufferも可変であり、スレッドセーフであることに注意してください。
- StringBuilderとStringBufferは、文字列と「+」を介してのみ連結でき、相互および他の単純型とは連結できません(単純型と連結できるStringとは異なります)。
- 正規表現を注意深く学習します。多くの場合、トリックがあります。 たとえば、パターンaの文字列リテラルでは、バックスラッシュが1つだけ指定され( "\ s")、コンパイルエラーが発生します。
- たとえば、 「abcd bla-bla-bla abcd」という行の場合、 「a。* Cd」という表現は行全体に対応します。
- また、Matcherクラスのメソッド(findおよびgroup)は、最後に見つかったグループの位置から次の一致の検索を開始することを忘れないでください。したがって、 「ababa」と「aba」の表現は1つのみ一致します。
- String.split()、String.replaceAll()、およびScanner.useDelimeter()メソッドは、正規表現で機能します。
- 文字列のフォーマットの基本を覚えておいてください:System.out.printf( "Hello java%03d!"、7); printfパラメーターの順序に関して1つのトリッキーな問題がありました。それを把握することをお勧めします。System.out.printf( "1:%3 $ s 2:%2 $ s 3:%s"、1,2,3);
ストリーム
非常に注意する必要がある別の「お気に入り」トピック。
- 主なものについて簡単に説明します。 synchronized method(){...} -他のスレッドのオブジェクトインスタンスの現在および他のすべての同期メソッドをブロックします(2番目の部分は簡単に忘れられます)。 メソッドが静的として宣言されている場合、クラスのすべての同期メソッドはブロックされます。
- 同様に: syncronized(obj){...} -ブロック:
1)このobjオブジェクトで同期された内部ブロックへの他のスレッドのすべての呼び出し。
2) 他のすべてのブロックは、同じobjオブジェクトと同期されます 。
- Runnableインターフェースの実装には、 private void run(){...} 、 public int run(){...} 、またはpublic void run(Runnable r){...}などの誤った形式があります。
- インターフェイスメソッドと抽象クラスにsynchrnozedを指定することはできませんが、enumメソッドには指定できます。
- ストリームが終了すると、再び開始することはできません。 Thread.start()は、IllegalThreadStateExceptionを発生させます。
- RunnableとCallableの違いを覚えておいてください(後者は値を返し、例外をスローする可能性があります)。
- あなたは理論(定義)を知る必要があります:
1)デッドロック-「デッド」ブロッキング、ここでは、質問がないことを望みます。
2)stravation-スレッドが別のスレッドで長時間ビジーであるという事実のために、リソースに長時間アクセスできない場合(「貪欲」または優先度が高い)。
3)ライブロック-相互に交換または待機しているスレッドがビジー状態で効果的に作業を継続できない場合に発生します。 つまり 廊下にいる2人が同期して左右に足を伸ばすことができないため、類推により、彼らは定期的に互いのリソースを非常に短い時間で解放します。
4)競合状態-マルチスレッドシステムの設計エラー。実行の結果はスレッドの順序に依存します(つまり、予測不能です)。
可変引数のタイプとメソッド
- 拡張は、単純なJava型をより広い型に自動的に拡張するものです(たとえば、byte-> int)。 または、より一般的なクラスの拡張(たとえば、Byte-> Object)。
- ボクシングは、対応するオブジェクト型のプリミティブJava型の自動「ラップ」です。たとえば、long-> Longです。 したがって、Longはlongのラッパー型と呼ばれます。
- ボックス化解除 -逆の操作:ロング->ロング
次のコンパイラルールが存在します。
- あるラッパータイプから別のラッパータイプに拡張することはできません(たとえば、Byte-> Int)(IS-Aは失敗します)。
- 拡大は禁止され、その後ボクシング(intがLongになることはできません);
- ただし、ボクシングは許可され、その後拡張(int-> Integer-> Object);
- 可変引数メソッドは、拡大およびボクシングと組み合わせることができます。
- この場合、コンパイラの優先度は次のようになります(優先度の降順):widening、boxing、var-args。
- 個別に、ボクシングとvar-argsを使用してメソッドをオーバーロードすることもできます。
Innovations 7バージョン
- 分岐結合フレームワーク。 それを使用してコードを構築するための最低限の基本原則を知る必要があります。 RecursiveTask / RecursiveActionインターフェースにはいくつかの質問があり( ドキュメントの Fibonacciシリーズの例に類似しています )、タスクを2つに分割する方法に関する1つの理論的な質問がありました。
- NIO2。 ここでは、次のことをよく知る必要があります。
-PathMatcherファイルを検索するためのマスク(「glob:*。Jpg」)およびファイルツリーを走査する原理(Files.walkFileTree)。
-クラスPath(特にgetName、subpath、relativeizeメソッド);
-クラスファイル(メソッドのコピー、移動+ StandardCopyOption、newBufferedReader、newBufferedWriter、setAttribute、getAttribute);
-クラスWatchService。 - AutoCloseableインターフェースのすべてのニュアンスと「try-with-resource」での使用を理解してください(try()括弧内で宣言されたオブジェクトがリリースされたときにいつ、どこで例外が発生し、どのように分離するかを知るだけで十分だと思います)その他の考えられる例外)。
雑多
- Expression x instanceof Y -xとYが異なるクラス階層に属する場合、コンパイルされません。
- しかし、 x instanceof SomeInterfaceはコンパイルされます。 一般に、試験では、クラスとインターフェースの「is-a」に違いはありません。 Like-aはis-aと同等です。
- それでも、instanceofは一般化では機能しません。
- 定義を覚えておいてください:
カップリング -つながり。 これは、各プログラムモジュールが他のモジュールを使用する度合いです。
凝集性 -接続性。 これは、1つのモジュールのパーツ間の内部関係の度合いです。 または、クラスの直接のタスクに焦点を当てる尺度として定義することもできます。
- 何らかの理由で、デザインパターンのトピックに関して多くの質問があります(それらについての異常な点を教えていただけますか?)。 正直なところ、ここにはまだいくつかのギャップがあります。 わかりやすい資料はどこにも見当たりません(ウィキペディアはどこか不自由です)。 ここでは、多かれ少なかれDAOについて書かれています。 そして一般的に、優れたプログラマーは自分のプロジェクトに特に適したパターンを考え出し、どこでもそのような「推奨事項」に従うべきではないと思います。 要するに、試験でのシングルトン、DAO、および工場は少し知っておくとよいでしょう。
- javacコマンドラインユーティリティ(-cp、-d、-source)、 java (-ea、-da、-cp)およびjarユーティリティの主な引数を覚えておく必要があります。
- 試験で発生しなかったもの:
- ガベージコレクションに関する質問。 上記のすべてのテストで、彼は非常に「愛されていました」。
- あらゆる種類のエグゼキューターを使用するコードはありませんでした。 理論上の疑問は1つだけでした。
- スレッドプール まったくありません。
- RowSetのサブクラスを使用するコード。 理論のみ。
トピックに出会わなかったとしても、それが質問に含まれていないという意味ではないことは明らかです。 しかし、多分誰かがすでに容量の多い準備を簡素化するでしょう。 オラクルは、こうした投稿が人生を楽しくしないように、一連の質問を定期的に更新しているのではないかと思います。 新鮮なうちに先に進みます:)
おわりに
もちろん、私が書いていないもの(リスト、ファイルの操作、JDBC、Localizarion、ResourceBundleなど)はたくさんありました。 これらのトピックについては、自分で解決することを提案します。 私の意見では、それらは特定の困難を表すものではありません。 そしてもちろん、試験に参加している皆さんに幸運を!