どのように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()
}
}
}
上記の例では、再びtrue
、true
を印刷するだろうが、のみので、我々は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
さらに読書:
ところで、使用することはありません 'String.iあなたがパフォーマンスを気にしているのなら、ntern' – voddan
@voddan私はあまりにも広範な声明かもしれないと思います。 – miensol