2016-07-21 12 views
4
あるのに、なぜ、参照等価性チェックのリターンが真ん

このコード考えてみましょう:参照が異なる

fun main(args : Array<String>) { 
    println("Async" == MetricCategory.Async.toString()) 
    println("Async" === MetricCategory.Async.toString()) 
} 

trueのために印刷されたのはなぜ私が

true 
false 

を期待していた間、それは

true 
true 

を出力両方の参照が異なるので2番目のチェック

答えて

4

参照の平等は、変数名が同じか、同じ方法でアクセスされるということではなく、メモリ内の場所が同じであるということです。文字列は不変であるため、コンパイラはあらかじめメモリを予約しておくことができ、同じ値を参照することはすべて同じ場所を指します。

読み書きの参照が異なる場合に読み込み専用の参照を共有するのが安全であるため、変更が不可能であることが重要です。変更可能なデータ構造間の参照を不適切に共有すると、ある参照セットの変更が他の参照に反映され、奇妙で不正確な動作につながります。ただし、データが変更できなくなった場合は、すべてが同じデータを指すようにすることで、できるだけ多くのメモリを節約できます。

3

どのようにMetricCategory.Async.toString()が実装されているかによって、操作の結果は任意である可能性があります。

class MetricCategory { 
    object Async { 
     override fun toString(): String { 
      return "Async" 
     } 
    } 
} 

この実装は、trueでプリントアウトtrueをもたらすであろう次の例を考えてみましょう。 ===オペレータを文書としてreferential equalityを比較:

は同じオブジェクトを場合にのみ真とB点と評価。

しかし、なぜ2つの定数文字列式が同じオブジェクトですか?これは、JVM(および他のランタイム)の機能によって引き起こされるがstring interningと呼ばれるコンピュータサイエンスの

、文字列インターンは不変でなければならない各異なる文字列値、のいずれか一方のみ コピーを格納する方法です。内部文字列 では、文字列処理タスクの処理時間が長くなります。 は、文字列が に作成または保留されている時間が長くなりますが、スペース効率が向上します。別個の値は、文字列インターン プールに格納されます。

String interning does not happen automatically in JVMただし、手動でトリガーすることができます。

class MetricCategory { 
    object Async { 
     override fun toString(): String { 
      val result = "a".toUpperCase() + "SYNC".toLowerCase() 
      return result.intern() 
     } 
    } 
} 

上記の例では、再びtruetrueを印刷するだろうが、のみので、我々はString.internと呼ばれてきました。

は例の下に考えてみましょう:

println("Async" == "Async") // true, obviously 
println("Async" === "Async") // true, string interning for literals 
println("Async" == java.lang.String("Async").toString())// true, obviously 
println("Async" === java.lang.String("Async").toString()) // false, new instance on the right 
println("Async" === java.lang.String("Async").toString().intern()) // true, right changed to shared instance 

さらに読書:

+0

ところで、使用することはありません 'String.iあなたがパフォーマンスを気にしているのなら、ntern' – voddan

+1

@voddan私はあまりにも広範な声明かもしれないと思います。 – miensol

関連する問題