Javaベースタイプ高周波キャッシュequals,==区別

1423 ワード

最近Javaを学んで、これはJavaの面接の中で試験する1つの基礎知識です
Pythonは[-5256]間の小さな整数を一度呼び出すとキャッシュに格納され、再作成されないことを知っていました.これらの数値の小さい数字は使用頻度が高いため、再構築を繰り返し破棄するのは資源を浪費しています.Javaでもそうですが、範囲が少し違います
Javaの基礎データ型のパッケージクラスはInteger,Long,Double,Float,Boolean,Byte,Short,Characterである.
その高周波キャッシュ区間のキャッシュ範囲は、Double:キャッシュレスFloat:キャッシュレスCharacter:0~127 Boolean:静的finalを使用すると、静的値Byte:-128~127 Short:-128~127 Long:-128~127 Integer:-128~127
Integerは、キャッシュ範囲を変更できる唯一のパッケージクラスです.VM optionsにパラメータを追加:-XX:AutoBox CacheMax=555キャッシュ区間の最大値を555に変更します.
コードインスタンスを見てみましょう
Integer num1 = 99;
Integer num2 = 99;
Integer num3 = 128;
Integer num4 = 128;
System.out.println((num1 == num2) + ", " + (num3 == num4));

不思議ですね.答えはtrueです.falseの前にIntergerのキャッシュ範囲は-128~127と書いてあります.そのため128はこの範囲を超えています.num 3はnum 4に格納されているメモリアドレスとは異なるのでfalseと判断します.
もし私たちが==equalsに変えたら?System.out.println(num1.equals(num2) + ", "+ num3.equals(num4));
答えは:true,trueここで注意しなければならないのはequalsと==の違いです
equalsは,2つの変数が指すオブジェクトが同一であるか否かを判定する=2つの変数の「値」が同一であるか否かを判定する.
この例ではequalsが指向するオブジェクトを判断しても,この2つの表面上の数が同じであるか否かを理解できるが,==が2つの変数が格納するメモリアドレスが同じであるか否かを判断するため,結果が異なる.
最後に楽しまないで、文字列でもう一つ例を作ります.
String s1 = "apple";
String s2 = s1.toUpperCase();
String s3 = "APPLE";
System.out.println(s2 == s3);

結果はfalse
リファレンス
https://blog.csdn.net/u014602...△初心者がスタートします.交流を歓迎します.