ホームページ  >  記事  >  Java  >  Javaのブール値とブール値の違いは何ですか

Javaのブール値とブール値の違いは何ですか

PHPz
PHPz転載
2023-05-05 19:40:043156ブラウズ

まえがき

誰かが質問しましたが、ブール型の値は true と false の 2 種類しかないのではありませんか?彼が定義したプロパティが null 値を持つのはなぜですか?

まず、boolean が Java の基本データ型であり、Boolean が Java のクラスであることを明確にする必要があります。ブール型は、「ゼロの割り当て」フェーズ中にプロパティに false を割り当てます。 Boolean は、「ゼロ値の割り当て」フェーズ中にオブジェクトに null を割り当てるクラスです。

静的属性の場合、クラスのロード時に割り当てられます。通常のクラス属性の場合、オブジェクトがインスタンス化されるときに値が割り当てられます。この 2 つの点は、「クラスロードの仕組み」と「オブジェクトの作成プロセス」を理解するのに役立ちます。

クラス読み込みメカニズム:

  • 読み込み: クラスの完全名に従ってクラスのバイナリ バイト ストリームを取得し、クラスをメモリに読み込み、表現を生成します。クラスの Class オブジェクトは、メソッド領域へのアクセス入口として機能します。 データ

  • 検証: クラス ファイル内のバイト ストリームが JVM 仕様に準拠しているかどうかを検証します

  • 準備:メソッド領域にクラスの静的プロパティ用のメモリを確保し、デフォルト値を初期化します(booleanのデフォルト値はfalse、Booleanのデフォルト値はnull)。

  • 分析: 定数プールの転送 のシンボル参照は直接参照に変換され、オブジェクト参照がポインタに変換されたものとして理解できます。

  • 初期化: 実際にクラス内のコード、静的属性の割り当て、静的ブロックの実行を開始します

オブジェクトのインスタンス化プロセス:

  • クラスがロード済み (親の委任)

  • オブジェクトにメモリを割り当てる Space (ポインタの衝突)

  • ゼロ値の初期化 (false/null)

  • オブジェクト ヘッダー (オブジェクトの生成年齢やその他の情報) を設定します

  • メソッドを実行します (属性の初期化、ステートメント ブロック、構築メソッド) )

つまり、Boolean はロードされただけで、まだインスタンス化されていません。インスタンス化される前にメモリが割り当てられていないため、null になります。

次にプロパティを見てみましょう。 Boolean のラップ方法を理解するには、Boolean の構築メソッドとその構築メソッドを参照してください。 boolean

// final boolean类型的属性,通过构造方法注入值
private final boolean value;

// 构造方法 Boolean a = true 实际上就是调用这个方法
public Boolean(boolean value) {
    this.value = value;
}

// 构造方法
public Boolean(String s) {
    this(parseBoolean(s));
}

その他の場合 属性とメソッドは自分で見るのが比較的簡単です。 Alibaba の開発マニュアルも非常によく書かれています

Javaのブール値とブール値の違いは何ですか簡単に言うと、boolean で定義された属性には値が必要です。Boolean オブジェクトの値が null の場合、NPE が発生します。開梱プロセス。

シナリオを想像してください: あなたのガールフレンドがあなたに尋ねます: あなたは私のことを愛していますか?しかし、はっきりと聞こえませんでした。あなたがブール型の場合は、「はっきりとは聞こえませんでした (null)」と答えます。ブール型の場合は、「もう好きではない」(false)

、と答えます。殴られるだろう。

補足: ブール値とブール値のパフォーマンスの調査

ブール値と true の場合

ソース コードの観点からは、どちらのパフォーマンスが優れているかは明らかではありません。 Big Boolean 2 つの静的オブジェクトも初期化されました

ソース コードのスクリーンショットは次のとおりです:

Javaのブール値とブール値の違いは何ですかテスト クラスを作成します: テスト メソッド (big Boolean 型 true を取得します)小さい値を取得する時間 (ブール型 true の時間を 100、1000、10000、100000 回渡して、どの時間が短いか多いかを確認します)

テスト コードは次のとおりです:

public class Test {	
	/**
	 * 方法一
	 * 
	 * @return
	 */
	public static Boolean A() {
		return Boolean.TRUE;
	}
	/**
	 * 方法二
	 * 
	 * @return
	 */
	public static boolean D() {
		return true;
	}
	public static String get() {
		long i = 0L;
		long j = 0L;
		for (int n = 0; n < 100000; n++) {
			long startTime = System.nanoTime();
			D();
			long endTime = System.nanoTime();
			long booleanTime = endTime - startTime;
			
			long start = System.nanoTime();
			A();
			long end = System.nanoTime();
			long booleanca = end - start;
			
			
			if (booleanca > booleanTime) {
				i = i + 1;
			} else {
				j = j + 1;
			}
		}
		return i+" "+j;
	}
	public static void main(String[] args) {
        System.out.println("---100000次的比较结果---->"+get());
	}
}

実行結果は以下の通りです。

以上がJavaのブール値とブール値の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。