Javaの基礎知識を厳選して分析

黄舟
リリース: 2017-09-11 10:43:30
オリジナル
1027 人が閲覧しました

Java の基本に関する厳選された説明。何問正解できるか見てみましょう?

技術的な深みが不足しているのは、ほとんどのプログラマーにとって常態です。

整数比較

以下の興味深いコードを見てください。数値に敏感な友達は異常を見つけますか?


public static void main(String[] args) {
    Integer a = 128,b=128; 
    Integer c = 127,d=127;
    System.out.println(a==b); 
    System.out.println(c==d);
}
ログイン後にコピー

あなたの答えが偽、偽であれば、おそらくあなたは一定の基礎を持っていて、Integer がカプセル化されたクラスであることを知っているでしょう。もちろん、答えが正しいのであれば、それは一定の範囲の知識の範囲内ですが、基礎知識が十分ではありません。

それでは main メソッドを実行しましょう。正解は false または true です。この質問は、ここ数年で多くの面接で聞かれました。もちろん、私はプロジェクトを行うことができますが、それを確認する必要があるだけです。なぜ私が言う必要はないのでしょう。

実際、Integer オブジェクトに int 値を代入すると、Integer クラスの静的メソッド valueOf が呼び出されます。ソース コードがどのように実装されているかを見てみましょう。

IntegerCache メソッドには、明確なコメント、キャッシュ範囲、変更方法などが含まれています。


 /**
   * Cache to support the object identity semantics of autoboxing for values between
   * -128 and 127 (inclusive) as required by JLS.
   *
   * The cache is initialized on first usage. The size of the cache
   * may be controlled by the -XX:AutoBoxCacheMax=<size> option.
   * During VM initialization, java.lang.Integer.IntegerCache.high property
   * may be set and saved in the private system properties in the
   * sun.misc.VM class.
   */

  private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
      // high value may be configured by property
      int h = 127;
      String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
      if (integerCacheHighPropValue != null) {
        int i = parseInt(integerCacheHighPropValue);
        i = Math.max(i, 127);
        // Maximum array size is Integer.MAX_VALUE
        h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
      }
      high = h;

      cache = new Integer[(high - low) + 1];
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);
    }

    private IntegerCache() {}
  }
ログイン後にコピー


 public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
      return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
ログイン後にコピー

実際、コードの説明は非常に明確です。整数リテラルの値が -128 ~ 127 の場合、新しい Integer オブジェクトは作成されません。定数プール内の Integer オブジェクトであるため、上記の操作の結果は a==b=false および c==d=true になります。

文字列比較

次の質問は比較的簡単なはずです。


public static void main(String[] args) {
    String s1 = "abc"; 
    String s2 = "abc"; 
    String s3 = new String("abc"); 
    System.out.println(s1 == s2); 
    System.out.println(s1 == s3);
  }
ログイン後にコピー

皆さんには見覚えがあるでしょうか?ひと目で正解か嘘かわかる人もいるかもしれません。もちろん、正解できなくても落ち込まないで、なぜマオがそのような答えを出したのかを分析してみましょう。

== の構文によれば、まず、s1、s2、s3 は 3 つの異なるオブジェクトです。一般的に、出力は false になります。ただし、プログラムの実行結果は実際には true または false です。 false の 2 番目の出力は理解できますが、true の最初の出力は不可解です。

いくつかの基本的なタイプの変数とオブジェクト参照変数は関数のスタック メモリに割り当てられ、ヒープ メモリには新しいオブジェクトと配列が格納されることがわかっています。ただし、これとは別に、コンスタントプールと呼ばれるエリアがあります。

通常 String s1 = "abc"; と考えるのと同じように、このように宣言された文字列オブジェクトの値は定数プールに保存されます。 String s1 = "abc" のようなオブジェクトを作成すると、「abc」は定数プール (文字列プールとも呼ばれます) に保存されます。

参照文字列 s2 = "abc" を作成すると、Java の最下層はまず定数プールに "abc" が存在するかどうかを検索し、存在する場合は s2 にこの値をポイントさせ、存在する場合は再作成しません。が定数プールに存在しない場合は、作成してプールに追加します。だからこそ、答えには真と偽があるのです。

整数と整数の比較


public static void main(String[] args) {
    Integer a = new Integer(128); 
    int b = 128; 
    Integer c = new Integer(6); 
    Integer d = new Integer(6); 
    System.out.println(a == b); 
    System.out.println(c == d); 
  }
ログイン後にコピー

多くの友人が、本当か嘘か混乱していると思います?本当か嘘か、直接答えを発表しましょう。

c == d=false、あまり言うことはないと思いますが、-128-127 はキャッシュされていませんか?ただし、ここでの整数は新しく、キャッシュされていないため、結果は false になります。

a == b=true、ここでの b は int 型であることに注意してください。 int と Integer が == 比較されると、Integer 型は自動的にボックス化されません。つまり、Integer は int 型に変換されます。ここでの比較は int 型の値であるため、結果は true になります。

以上がJavaの基礎知識を厳選して分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート