1. ホーム
  2. Java

Java基礎 - マッピングとQ/A

2022-02-21 14:13:11
  • Thinking in Java (Java Programming Ideas) Gitbook 中国語ドキュメンテーション https://java.quanke.name/
  • Thinking in Java (Java Programming Ideas) Github https://github.com/quanke/think-in-java
  • Thinking in Java (Java Programming Ideas) Gitbook2 https://www.gitbook.com/book/wizardforcel/thinking-in-java/details

知識体系

Q&A

Javaで価格を表すには、どのようなデータ型を使用すればよいですか?

メモリとパフォーマンスが特に問題でなければBigDecimalを使用し、そうでなければ定義済みの精度のdouble型を使用します。

バイトを文字列に変換するには?

Stringのコンストラクタにbyte[]引数を与えて、変換を行うことができます。注意すべき点は、正しいエンコーディングを使用することです。そうしないと、プラットフォームのデフォルトエンコーディングが使用され、元のエンコーディングと同じであるかどうかはわかりません。

エンコーディングを設定しない場合

String str="Hello";
// string to byte[]
byte[] strByte=str.getBytes();
// byte[] to string
String res=new String(strByte);
System.out.println(res);

エンコード方法を設定します。

String str="Hello";
byte[] strByte;
try {
    // string to byte[]
    strByte = str.getBytes("UTF-8");
    // byte[] to string
    String res = new String(strByte,"UTF-8");
    System.out.println(res);
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}

Javaでbyteをlongに変換するには?

StringのコンストラクタでバイトをStringに変換し、Long.parseLongを受信します。

byte 型の変数に int を強制的に入れることはできますか?値がbyte型の範囲より大きい場合、どうなりますか?

強制変換はできますが、Javaのint型は32ビット、byte型は8ビットなので、強制変換するとint型の上位24ビットが捨てられ、byte型は-128~127の範囲になります。

// The original code of 101001: 0000 0000 0000 0001 1000 1010 1000 1001
// Complement of 101001: 0000 0000 0000 0001 1000 1010 1000 1001
// Take the lower 8 bits: 1000 1001
// The highest bit is 1, which means it is negative and therefore needs to be converted to the original code.
// inverse code:1111 0110
// original code:1111 0111
// convert to decimal:-119
int a=101001;
byte b=(byte)a;
System.out.println(b);

Aを継承するBとBを継承するCの2つのクラスがありますが、BをCに変換することはできますか?C = (C) Bのように。

はい、変形してください。しかし、それは推奨されませんし、型変換の型例外が発生しやすいのです。

cloneメソッドを含むクラスはどれですか?CloneableなのかObjectなのか?

java.lang.Cloneableはマークアップインタフェースで、メソッドを含みません。cloneメソッドはオブジェクトクラスで定義されています。また、clone()メソッドはネイティブ・メソッドであり、cやc++などのネイティブ言語で実装されていることを意味します。

Javaでは++演算子はスレッドセーフですか?

はスレッドセーフな操作ではありません。変数の値を読み込んで加算し、再びメモリに格納するというように複数の命令を含むため、複数のスレッドで処理が交差する可能性があるからです。また、永続化条件(read-modify-write)も発生します。

状態の条件 : ステートフル条件とは、計算の正しさが複数のスレッドの交互実行のタイミングに依存する場合に発生する条件です。

あるプログラムが複数のスレッドで実行され、スレッドの実行順序の不一致により最終的な状態(結果)が異なる場合、そのコードは状態条件を持つと言います。

a = a + b と a += b の違いについて

+= は、暗黙のうちに加算操作の結果を保持する型に強制します。

byte, short, int のような2つの整数が加算される場合、加算操作を行う前にまずint型に上げられます。

byte a=127;
byte b=127;
b = a + b; // error: cannot convert from int to byte (because a+b operation will raise a, b to int type, so assigning int type to byte will compile with error)
b += a; // ok: 
System.out.println(b); // output -2, because a+b=254,strong conversion to byte takes the lower 8 bits.

long 型の変数に double 型の値を強制変換なしで代入することはできますか?

いいえ。long 型の変数に double 値を代入することは、強制的な型変換を行わない限り不可能です。

double 型は long 型より範囲が広いので、強制変換をする必要があります。

3*0.1 == 0.3は何を返すのでしょうか?真か偽か?

浮動小数点数の中には完全に正確でないものもあるため、falseとなります。

備考 2進数における10進数の測定精度の問題。なぜなら、コンピュータにおける浮動小数点数の表現には誤差がつきものだからです。だから一般に、2つの浮動小数点数が同じかどうかを比較することはない。その代わり、2つの浮動小数点数のほぼ絶対値が、非常に小さな正の数より小さいかどうかを比較します。その条件を満たした場合、2つの浮動小数点数は同じとみなされる。

関連情報 浮動小数点演算

intとInteger、どちらがより多くのメモリを消費するのでしょうか?

Integerオブジェクトはより多くのメモリを消費します。Integerはオブジェクトであり、オブジェクトのメタデータを保存する必要があるからです。

しかし、intはプリミティブなデータ型なので、より少ないスペースで済みます。

メタデータです。 中間データ、中継データ、データに関するデータとも呼ばれ、主にデータの特性(プロパティ)を記述した情報で、保存場所の指示、履歴データ、リソース検索、ファイルレコードなどの機能をサポートするために使用される。

なぜJavaのStringはimmutableなのですか?

原理的には

  • Stringはfinalと宣言されているので、継承はできません。
  • この配列は final と宣言されています。つまり、値の配列を初期化した後は、他の配列を参照することができないのです。また、Stringは値配列を変更する内部メソッドを持たないので、イミュータブルであることが保証されています。

設計上。

  • Java の設計者は、文字列は非常に頻繁に使用されると考えたため、文字列を immutable に設定することで、複数のクライアント間で同じ文字列を共有できるようにしました。

SwitchでStringは使えるか?

Java 7から、switchのケースで文字列を使用できるようになりましたが、これは単なる構文上の糖分です。内部的には、switchの中で文字列のハッシュ・コードを使用します。

Javaにおけるコンストラクタ・チェーンとは何ですか?

あるコンストラクタから別のコンストラクタを呼び出すと、それがJavaのコンストラクタ・チェイニングになります。これは、あるクラスのコンストラクタをオーバーロードした場合にのみ発生します。

public class C extends B{
    public C(){
        System.out.println("C") ;
    }
    public static void main(String[] args){
        C c=new C();
    }
}
class B extends A{
    public B(){
        System.out.println("B");
    }
}
class A{
    public A(){
        System.out.println("A");
    }
}
// When constructing an instance of a class, all the constructor methods of the parent class along the inheritance chain will be called. 
// When constructing an object of a subclass, the subclass constructor will first call its parent's constructor before completing its task. 
// If the parent class inherits from another class, then the parent constructor will call its own parent constructor before completing its task. 
// This process continues until the last constructor along this inheritance structure is called.
Run the results.
A
B
C

// When constructing an instance of a class, all the constructor methods of the parent class along the inheritance chain will be called. 
// When constructing an object of a subclass, the subclass constructor will first call its parent's constructor before completing its task. 
// If the parent class inherits from another class, then the parent constructor will call its own parent constructor before completing its task. 
// This process continues until the last constructor along this inheritance structure is called.
Run the results.
A
B
C

エニュメレーションクラス

JDK 1.5 では、enum の各値はコンストラクタを 1 回呼び出すだけで済みます。

イミュータブルオブジェクトとは何ですか?Javaで不変のオブジェクトを作成するにはどうすればよいですか?

イミュータブルオブジェクトとは、一度作成した状態を変更することができないオブジェクトのことです。StringやInteger、その他のラッパークラスなど、何らかの変更を加えると新しいオブジェクトが作成されます。

JavaでImmutableなクラスを書くには?

そのようなクラスを書くには、以下の原則に従う必要があります。

  • イミュータブルオブジェクトの状態は、作成後に変更することはできず、変更した場合は新しいオブジェクトを生成する必要があります。
  • immutableクラスのプロパティはすべてfinalでなければならない。
  • オブジェクトは正しく作成されなければならない。例えば、オブジェクトの作成中にオブジェクトの参照がリーク(漏えい)してはならない。
  • オブジェクトはfinalにして、サブクラスが親クラスのimmutableプロパティを変更しないように、親クラスの継承を制限する必要があります。
  • もしクラスがミュータブルなクラスオブジェクトを含んでいるならば、クライアントへのリターンはオブジェクトそのものではなく、そのオブジェクトのコピーを返す(第1条の特殊なケースである)。

ミュータブルなオブジェクトを含むイミュータブルなオブジェクトを作ることはできますか?

ミュータブルなオブジェクトを含むイミュータブルなオブジェクトを作ることはできます。ミュータブルなオブジェクトへの参照を共有しないように注意し、変更が必要な場合は元のオブジェクトのコピーを返せばいいだけです。

最も一般的な例は、日付オブジェクトへの参照を含むオブジェクトです。

不等間隔の2つのオブジェクトが同じハッシュコードを持つことは可能ですか?

可能です。

2つの不等間隔のオブジェクトが同じハッシュコード値を持つことがあり、そのためハッシュマップに衝突が発生します。

等しいハッシュコード値のルールは、2つのオブジェクトが等しければ同じハッシュコード値を持たなければならないというだけで、不等間隔のオブジェクトに関するルールはありません。

2つの同じオブジェクトが異なるハッシュコードになるのでしょうか?

いいえ、hahscodeによると、これは不可能です。

hashcode()で乱数を使うことはできますか?

いいえ、オブジェクトのハッシュコード値は同じでなければならないからです。

JavaにおけるComparatorとComparableの違いは何ですか?

Comparableインターフェースはオブジェクトの自然な順序を定義するために使用され、Comparatorは通常、ユーザーがカスタマイズした順序を定義するために使用されます。Comparableは常に1つですが、オブジェクトの順序を定義するために複数のComparatorが存在する場合があります。

Comparableは、あるインターフェースを実装するために比較する必要があるオブジェクトです。このように、オブジェクトは実装されたメソッドを呼び出して比較します。オブジェクトとの結合度が高い(オブジェクトの内部構造を変更する必要があり、破壊的である)。

コンパレータは、汎用比較ツールクラスのインターフェースに相当します。比較クラスをカスタマイズして実装し、内部にcompareメソッドをオーバーライドする必要があり、そのメソッドのパラメータが比較対象のオブジェクトとなる。オブジェクトはそのままデカップリングされます。

equalsメソッドをオーバーライドする際に、なぜhashCodeメソッドをオーバーライドする必要があるのですか?

なぜなら、hashcodeとequalsの両方のメソッドをオーバーライドする必要があるという必須の仕様があり、HashMapやHashSetなどの多くのコンテナ・クラスがhashcodeとequalsの規定に依存しているためである。

"a==b"と"a.equals(b)"はどう違うのですか?

a と b が両方ともオブジェクトの場合、a==b は 2 つのオブジェクトへの参照を比較し、a と b がヒープ内の同じオブジェクトを参照している場合にのみ true を返します。一方 a.equals(b) は論理比較なので、通常、比較の論理的整合性を確保するためにこのメソッドをオーバーライドする必要があります。たとえば、String クラスは equals() メソッドをオーバーライドして、同じ文字を含む 2 つの異なるオブジェクトを比較するために使用できるようにしています。

a.hashCode()は何をするのですか?a.equals(b)とどう関係するのですか?

hashcode()メソッドは、対応するオブジェクトの形状のハッシュ値です。Hashtable, HashMap, LinkedHashMap などのハッシュベースのコレクションクラスでよく使われます。

特にequals()メソッドと密接な関係がある。Java仕様では、equals()メソッドで等質性を判断する2つのオブジェクトは、同じハッシュコードでなければならないとされています。

  • ハッシュコードでできること

       ListとSet、Setが重複しないようにするには?equalsメソッドで繰り返し判定することで、データ量は少なく、許容範囲ですが、データ量はどうでしょうか?ハッシュコードを導入することで、実際にアドレスの役割を果たし、クエリのマッチング数を大幅に減らすことができる。

  • ハッシュコードは重要か?

       配列、リストコレクションは面倒です。そして、HashMap, HashSet, Hashtableについては、例外的に重要です。

  •  equals メソッドは、以下の原則に従います。

        対称性:x.equals(y)が真なら、y.equals(x)も真である。

        自己再帰性:x.equals(x)は真でなければならない。

        推移性:x.equals(y) true, y.equals(z) trueなら、x.equals(z)はtrueでなければならない。

        一貫性:x,yの内容が同じであれば、何度呼び出されても結果は同じである。

        その他:x.equals(null)は常に偽、x.equals(xと異なるデータ型)は常に偽となる。

final、finalize、finallyの違いは何ですか?

  • final: final は、変数、メソッド、およびクラスを修正することができる修飾子です。finalが変数を修飾する場合、その変数の値は初期化後に変更できないことを意味します。
  • finalize : finalize() メソッドは、ガベージコレクタがオブジェクトをメモリから消去する前に、必要なクリーンアップを行います。このメソッドは、ガベージコレクタがオブジェクトが参照されていないと判断したときにオブジェクトに対して呼び出されますが、finalizeがいつ呼び出されるかは保証されていません。
  • finally: finallyは、例外処理のためにtryやcatchと一緒に使われるキーワードです。tryブロック内で例外が発生したかどうかにかかわらず、finallyブロックは常に実行されます。

Javaにおけるコンパイル時定数とは何ですか?それを使うことのリスクは?

変数はコンパイラ定数と呼ばれるもので、この場合のpublicはオプションです。これらの変数は、実はコンパイル時に置き換えられるのです。これは、コンパイラがこれらの変数の値を知っていて、実行時に変更できないことを知っているからです。この方法の問題点として、内部ライブラリやサードパーティライブラリからコンパイル時定数publicを使用した場合、その値が後で誰かによって変更されても、新しいjarをデプロイしても、クライアントは古い値を使用したままということがあります。これを避けるには、依存関係jarファイルを更新したら必ずアプリケーションをリコンパイルするようにしてください。

静的内部クラスとトップレベルクラスの違いは何ですか?

公開されたトップレベルクラスは、ソースファイル名とクラス名が同じである必要がありますが、ネストされた静的クラスにはこの要件がありません。例えば、HashMap.Entry はネストされた静的クラスで、HashMap はトップレベルクラス、Entry はネストされた静的クラスというように、ネストされたクラスはトップレベルクラスの内部で、トップレベルクラスの名前を用いて参照する必要があります。

JavaにおけるSerializableとExternalizableの違いは何ですか?

Serializableインターフェースは、Javaクラスをネットワーク上で転送したり、その状態をディスク上に保存できるようにシリアライズするためのトークン化インターフェースで、JVMに組み込まれたデフォルトのシリアライズ方法であり、コストが高く、壊れやすく、安全ではありません。

Externalizableでは、シリアライズ処理全体の制御、特定のバイナリ形式の指定、セキュリティ機構の追加などが可能です。

JDK 1.7の新機能を3つ挙げてください。

JDK 1.7は、JDK 5やJDK 8ほど大きなリリースではありませんが、それでも多くの新機能が搭載されています。

  • try-with-resourceステートメントなど、ストリームやリソースを使用する際に手動で閉じる必要がなく、Javaが自動的に閉じてくれるようになりました。
  • Fork-Joinプールは、なぜかJava版Map-reduceを実装しています。
  • SwitchでString変数とテキストを許可する。
  • 菱形演算子(<>)は総称推論に使用され、変数宣言の右側に総称を断定する必要がなくなるため、より読みやすく簡潔なコードを書くことができるようになります。
  • 複数の例外を同じキャッチブロックでキャッチできるようにするなど、例外処理を改善しました。

JDK 1.8で導入された新機能を5つ挙げてください。

Java 8はJavaの歴史において画期的な新リリースですが、ここではJDK 8の主要機能を5つ紹介します。

  • オブジェクトのような匿名関数を渡すことができるラムダ式 最新のマルチコアCPUを活用したストリームAPIで、クリーンなコードを書くことができる。
  • Date and Time API、ついに安定したシンプルな日付と時刻のライブラリが利用できるようになりました。
  • Extended methods, now there can be static, default methods in the interface.
  • アノテーションの繰り返し、同じアノテーションを同じ型に複数回使用できるようになりました。

インターフェースとは何ですか?なぜ、具象クラスを直接使うのではなく、インターフェイスを使うのですか?

インターフェイスは、APIを定義するために使用されます。インターフェイスは、クラスが従うべきルールを定義します。同時に、クライアントがインターフェースのみを使用するため、抽象化を実現します。例えば、リストインターフェースでは、ランダムにアクセスできるArrayListや、挿入と削除が容易なLinkedListを使用することができます。

抽象性を確保する方法として、インターフェースではコモンメソッドを宣言できませんが、Java 8ではインターフェースでスタティックメソッドとデフォルトコモンメソッドを宣言することが可能です。

Javaにおける抽象クラスとインターフェースの違いは何ですか?

Javaにおける抽象クラスとインターフェースの違いはたくさんありますが、最も重要なことの1つは、Javaではクラスが継承できるのは1つのクラスだけですが、複数のインターフェースを実装できることです。

抽象クラスはファミリーのデフォルトの動作を定義することができ、一方、インターフェースは型をよりよく定義し、後でポリモーフィックメカニズムを実装するのを助けることができます。

Object にはどのような共通メソッドがありますか?

clone、equals、hashcode、wait、notify、notifyall、finalize、toString、getClassです。

11個のメソッドがあり、waitは2回オーバーライドされています。

イコールと==の違い

  • == は演算子、equals は Object クラスのメソッドです。
  • 比較するときの違い
  1. 基本データ型の変数を比較する場合: == は、値が等しいかどうかを比較するために使用します。
  2. 参照型を比較する場合: == と equals は共にスタック・メモリ上のアドレスが等しいかどうかを比較し、等しい場合は真、そうでない場合は偽となりますが、通常は equals を上書きしてオブジェクトの中身を比較します。

    String、StringBuffer、StringBuilderの相違点

    • 変数とスコープ。Stringオブジェクトは不変ですが、StringBufferとStringBuilderは変更可能な文字シーケンスです。Stringに対する各操作は、新しいStringオブジェクトを生成することと同じです。一方、StringBufferとStringBuilderに対する操作は、新しいオブジェクトを生成せずにオブジェクトそのものに対する操作となります。頻繁にオブジェクトを生成するとシステム性能に影響があるため、内容が頻繁に変わる文字列にはStringを使用しないようにしてください。
    • StringBufferとStringBuilderの違いは、StringBuilderは同期を保証しないことで、スレッドセーフが必要な場合はStringBuffer、同期が不要な場合はStringBuilderの方が効率的ということになる。StringBuilderの方が効率的です。

    switchは引数としてStringを取ることができますか? 

    Java 1.7ではサポートされていますが、実はこれはJavaの構文上の糖分で、byte, short, int, enum, boolean以外はswitchで使用可能ですが、浮動小数点は使用できません。

    インターフェースと抽象クラス

    • サブクラスは1つの抽象クラスしか継承できないが、複数のインターフェイスを実装できる
    • 抽象クラスはコンストラクタを持つことができるが、インターフェースは持たない
    • 抽象クラスは通常のメンバ変数を持つことができ、インターフェースは通常のメンバ変数を持ちません。
    • 抽象クラスとインターフェースは共に静的メンバ変数を持つことができ、抽象クラスはどのようなアクセスタイプでも静的メンバ変数を持つことができますが、インターフェースは public static final (デフォルト) のみとなります。
    • 抽象クラスは抽象メソッドを持てない、抽象クラスは通常のメソッドを持てる、インターフェースはすべて抽象メソッドである
    • 抽象クラスは静的メソッドを持つことができ、インターフェースは静的メソッドを持つことができない
    • 抽象クラスのメソッドはpublic、protectedにすることができ、インターフェースのメソッドはpublic abstractのみにすることができる

    抽象クラスと最終クラス

    抽象クラスは抽象メソッドを持つことができず、最終クラスは最終メソッドを持つことができません。

    finalクラスは継承できず、finalメソッドはオーバーロードできない(オーバーロードはできる)

    例外事項

    関連キーワード throw, throws, try... .catch, finally

    • throws はメソッドのシグネチャで使用され、スローされた例外は呼び出し側で処理されます。

    throw メソッドは、内部で throw により例外を発生させます。

    tryはラップされたステートメントブロックを検出するために使用され、例外がある場合、catch節はそれをキャッチし、catchブロックを実行する

    finallyについて

    finallyは例外の有無に関わらず処理される tryやcatchでreturnがあってもfinallyは実行される returnが返される前にfinallyが実行される return後の式の演算の後(この時点で)関数の戻り値が確定する finallyが実行される前に関数の戻り値が確定する。

    に注意してください。

    • tryやcatchで保存した戻り値とは異なる戻り値でプログラムが早期に終了してしまうため、finallyにはreturnを含めない方がよいでしょう。
    • 最終的に実行されないケースはいくつかあります:System.exitが呼ばれたとき、ウイルス、停電など、プログラムが早期に終了する場合。

    チェックした例外と実行時例外

    • チェックされた例外で、try.Check.Ifでキャッチする必要があります。.catch ステートメントブロックによって捕捉されるか、メソッドの署名でthrows節を使用して宣言される必要があります。チェックされた例外は、コンパイル時にキャッチしなければならず、Javaコンパイラがチェックし、Java仮想マシンがこのルールに従うことを確認するためにチェックされた例外という名前がついています。一般的なチェック例外 ClassNotFoundException、IOException、FileNotFoundException、EOFException
    • ランタイム例外(実行時例外)。ヌルポインター、0による除算...など、プログラマー自身がコードを解析して、キャッチして処理するかどうかを決める必要があるものです。一般的なランタイム例外 NullPointerExcption、ArithmeticException、ClassCassException、IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、NoSuchElementException
    • システムクラッシュ、仮想マシンエラー、ダイナミックリンク障害などの重大なエラーです。これらのエラーは、回復不可能またはキャッチすることが不可能であり、アプリケーションを破壊する原因となるため、エラーはキャッチする必要がありません。

    superは、親クラスのサブクラスに出現します。存在する方法は3つあります。

    • super.xxx (xxx は変数名またはオブジェクト名): 親クラスの xxx への変数または参照を取得することを意味します。
    • super.xxx(): xxx はメソッドで、親クラスのメソッドに直接アクセスして呼び出すことを意味します。
    • super(): 親クラスのコンストラクトを呼び出す

    注意:superは直接の親クラスしか参照できません。

    コンストラクタ・メソッドにおけるthis() & super()の違いについて

    • super() の呼び出しは、サブクラスのコンストラクタの最初の行に記述しないと、コンパイルできません。
    • super はサブクラスの親コンストラクトを呼び出し、これは同じクラスの他のコンストラクトを呼び出しますが、どちらも最初の行に記述する必要があります。
    • でコンストラクタを呼び出すことは可能ですが、2つのコンストラクタを呼び出すことはできません。
    • this と super を同じコンストラクタで使用するとコンパイルが失敗します。
    • this() と super() で参照されるオブジェクトは、静的環境では使用できません。
    • 組込み関数 this はこのオブジェクトへのポインタを指し、super はキーワードです。

    モディファイア一覧

    Javaでは、クラス、変数、メソッド、コンストラクターへのアクセスを保護するためにアクセス制御演算子を使用することができ、Javaは4種類のアクセス権をサポートしています。

    • デフォルト  (すなわち、デフォルト、何も書かない): 同じパッケージ内で可視、修飾語は使用しない。使用するオブジェクト:クラス、インターフェース、変数、メソッド。

    • プライベート  : 同一クラス内で可視化される。オブジェクトを使用:変数、メソッド。  注:クラス(外部クラス)を変更することはできません。

    • 公開  : すべてのクラスから見える。オブジェクトの使用:クラス、インターフェース、変数、メソッド

    • プロテクト  : 同じパッケージ内のクラスとすべてのサブクラスから見える。使用オブジェクト:変数、メソッド。  注意:クラス(外部クラス)を変更することはできません .

    <テーブル アクセスレベル アクセス制御の修飾子 同一 同一パッケージ サブクラス(別パッケージ) 異なるパッケージ(他のクラス) 公共 公開 許可する 許可する 許可する 許可する 保護された プロテクト 許可する 許可する

    許可する

    不可 デフォルト デフォルトのモディファイア 許可する 許可する 不可 不可 プライベート プライベート 許可する 不可 不可 不可

      注意:Protected-modified プロパティまたはメソッドは、異なるパッケージのサブクラスでアクセスすることが許可されています。ここでのアクセスは、親クラスのプロテクトされたプロパティまたはメソッドへの継承であり、親クラスのインスタンスを介して直接アクセスするのではないことに注意してください。

    内部クラスと静的内部クラスオブジェクトの構築

    シリアライズ

    static型やtransient型として宣言されたデータはシリアライズできません。また、デシリアライズにはパラメータなしのコンストラクタが必要です。

    正規表現

    コードの実行順序

    複数の静的メンバ変数で、Surpriseコードブロックを順番に実行する。

    1つのクラスで:静的コード -> メインメソッド -> コンストラクタ・ブロック -> コンストラクタ・メソッド

    コンストラクト・ブロックは、オブジェクトが生成されるたびに実行され、親クラスと子クラスの初期化を伴います。

    • a.親クラスの静的メンバ変数と静的コードブロックの初期化
    • b.サブクラス内の静的メンバ変数と静的コードブロックの初期化
    • c. 親クラスの通常のメンバ変数とコンストラクタのコードブロックを(順番に)初期化し、親クラスのコンストラクタメソッドを実行する(親クラスのコンストラクタメソッドでサブクラスのメソッドをオーバーライドしていることに注意)。
    • d. サブクラスの通常のメンバ変数とコンストラクタ・ブロックを初期化し(順番に)、サブクラスのコンストラクタ・メソッドを実行します。

    配列コピーメソッド

    • 1つずつコピーする場合
    • System.arraycopy() -> 最も効率的なネイティブメソッドです。
    • Arrays.copyOf() -> arraycopy の組込み呼び出し。
    • clone メソッド -> Object[] を返すので、強制的に型変換する必要がある。

    ポリモーフィズム

    Javaでは、親クラスの同名のメソッドを子クラスがオーバーライドするメソッドオーバーライドと、同名のメソッドの引数リストが異なるメソッドオーバーライドによってポリモーフィズムを実装しています。

    Javaドキュメント

    .javaファイルには複数のクラスを含めることができます。唯一の制限は、1つのファイルには1つのパブリッククラスしか存在できず、パブリッククラスはファイル名と同じでなければならないことです。

    そして、これらのクラスは、複数のファイルに書かれている場合と何ら変わりはありません。

    Java シフト演算子

    javaには3つのシフト演算子があります。

    • << :左シフト演算子、x << 1、xの2倍(オーバーフローなし)に相当し、下位ビットは0に補完される。
    • 符号付き右シフト、x >> 1。xを2で割ったものと等価で、正の高さは0で、負の高さは1で補われる。
    • 符号なし右シフト、符号ビット無視、空ビットはゼロで埋められる。

    フォームと実パラメータ

    • 形式パラメータは、ローカル変数とみなすことができます。
    • 形式パラメータは、ローカル変数のようにメソッドから出ることができず、メソッド内でのみ使用され、メソッドの外からは見えません。
    • 形式パラメータはfinal修飾子のみ使用可能で、それ以外の修飾子はコンパイラ・エラーの原因となります。ただし、この修飾子の使用にはいくつかの制限があり、メソッド内で引数を変更することはできません。しかし、一般的には、メソッドの正式なパラメータはfinalで変更する必要はありません。特別な場合のみ、つまり、メソッドの内部クラスです。メソッド内の内部クラスは、メソッドの引数やローカル変数を使用する場合、finalにする必要があります。

    • 形式参照の値は呼び出し側によって呼び出し時に変更されるが、実参照は形式参照の値を自身の値で変更する(ここではポインタや参照も含まれる)、つまり実際に渡されるのは実参照であることを意味する。

    なぜローカル変数は初期化する必要があるのか

    ローカル変数は、クラスメソッド内の変数で、初期化が必要なものです。ローカル変数は実行時にスタック上に確保され、大きく、ライフサイクルが短いため、VMが各ローカル変数を初期化するのは多くのオーバーヘッドとなりますが、デフォルト値に初期化せずに変数を使用するのは安全ではありません。速度と安全性の両方の理由から、解決策はVMが初期化しないことですが、ライターは常に使用前に変数に値を代入することを要求します。

    Java言語のロバスト性

    Javaは、プログラムのコンパイル時や実行時に起こりうる問題をチェックし、エラーの発生を排除しています。メモリ管理のための自動ガベージコレクションを提供し、プログラマが陥りやすいメモリ管理時のエラーを防止する。統合されたオブジェクト指向の例外処理機構により、Javaはコンパイル時に可能だが処理されない例外を明らかにし、プログラマがシステムクラッシュを防ぐために正しい選択をするのを助ける。さらに、Javaはコンパイル時に型宣言の多くの一般的なエラーを検出し、動的な実行時のミスマッチ問題を防止します。

    Java言語の特徴

    • Javaは、コンパイル時および実行時にプログラムにエラーがないかチェックすることを徹底している
    • Java仮想マシンは、クロスプラットフォーム・インターフェースを実装しています。
    • 型チェックは、開発初期に発生する多くのエラーをチェックするのに役立つ
    • Java独自のメモリ操作により、メモリエラーの可能性を低減します。
    • また、Javaは真の配列を実装し、データの上書きの可能性を回避している

    ラッパークラスのequals()メソッドは、データの変換を処理しません。型と値が同じでなければ、等しくなりません。

    サブクラスは親クラスから静的メソッドを継承することができます! しかし、それをオーバーライドすることはできません。静的メソッドはコンパイル時に決定されるため、ポリモーフィックにすることができず、実行時に束縛することができないのです。

    Javaの構文解析

    • Java7の文字列を使ったスイッチ - ハッシュコードメソッド
    • enum列挙のためのスイッチ
    • 擬似ジェネリック - プリミティブ型の一覧表示
    • 自動ボックス化とアンボックス化 - Integer.valueOfとInteger.intValue
    • foreach traversal - Iterator イテレータの実装
    • 条件付きコンパイル enum 列挙型クラス、内部クラス
    • 変数パラメータ - 配列
    • アサーション言語
    • try文でのリソースの定義とクローズ

    でのリファインメント......。