Scalaの記号の説明

シンボル

このクラスは、同じ文字列の一意のオブジェクトを取得するための簡単な方法を提供します。シンボルが抑留されているので、参照の等価を使用して比較することができます。

記号は文字列は同一の符号可変アドレスで返される値と同じである場合、文字列を比較する簡単な方法として使用することができます。内部シンボルは、文字列プールを維持します。

object SymbolDemo {
  def main(args: Array[String]): Unit = {
    val s = 'nihao
    val n = 'nihao
    // return true
    println(s == n)
  }
}

Javaへの比較

2つの方法で作成されたJava Stringインスタンスに
一つの変数割当を指示する;
2、新しいキーで文字列オブジェクトを作成し、(以下:モード1とモード2)

モード1

我々は、すべての(たびに新しいメモリを開放するので、インナーループステッチ文字列のために、「+」演算子を使用することはお勧めしません)「モード1」たびに新しい変数を作成することを知っています。しかし、実際には、JavaがStringクラスは、文字列プールを維持以内に、「モード1」によるたびに文字列プールあれば、何の同じ文字列を持たない文字列プールをチェックし、最初の文字列のインスタンスを作成し、操作用に最適化されています文字列に存在しない可変アドレスに割り当てられた文字列を参照しながら、文字列プールに文字列は、(ここで、新しいメモリを開く)、文字列がある文字列プール場合、元の直接の新しい変数に割り当てられたアドレスへの参照があります。

あなたが「STR1」を作成すると、文字列プールには、「こんにちは筋力」、今回の文字列プールに「こんにちは筋力」、および「STR1」に割り当てられたメモリアドレスではありません。あなたが「STR2」を作成すると、文字列プールはすでに「STR2」に直接元のメモリアドレスの割り当てに、「こんにちは筋力を」存在し、それが「STR1 == str2の」真を返します。

モード2

「モード1」の論理でインターン()プロシージャを呼び出すときたびに新しいオブジェクトが作成されます。そこに「こんにちは筋力」文字列プールリターン・メモリ・アドレスは、直接的であるか、文字列プールに彼ら意志「こんにちは筋力」、およびメモリアドレスを返すと。

public class Demo {

  public static void main(String[] args) { String str1 = "Hello Str"; String str2 = "Hello Str"; String str3 = new String("Hello Str"); // return true System.out.println(str1 == str2); // return false System.out.println(str1 == str3); // return true System.out.println(str1 == str3.intern()); } } 

から参照してください: 

https://yq.aliyun.com/articles/668857
https://www.scala-lang.org/api/2.12.1/scala/Symbol.html
https://stackoverflow.com/questions/3554362/purpose-の-scalasシンボル

おすすめ

転載: www.cnblogs.com/barrywxx/p/11441348.html