zoukankan      html  css  js  c++  java
  • Scala Symbol解释

    Symbol

    This class provides a simple way to get unique objects for equal strings. Since symbols are interned, they can be compared using reference equality.

    symbols可以作为一种快速比较字符串的方式,如果字符串的值相同,则返回的symbol变量具有相同的引用地址。Symbol内部维护了一个字符串池。

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

    Compare to Java

    在Java中创建String实例有两种方式:
    1、直接给一个变量赋值;
    2、用new关键创建String对象;(下文记作:方式1 和 方式2)

    方式1

    我们都知道 “方式1” 每次都会创建一个新变量(所以for循环内拼接字符串不建议用 “+” 操作符,因为每次都会开辟一个新的内存)。但Java其实对该操作做了优化,在String类内部维护了一个字符串池,每次通过 “方式1” 创建String实例时,首先检查字符串池中有没有相同的字符串,如果字符串池中不存在该字符串,则将字符串放入字符串池中(此处开辟新内存),同时将字符串的引用地址赋值给变量;如果字符串池中存在该字符串,则直接将原有引用地址赋值给新变量。

    当创建 “str1” 时,字符串池中没有 “Hello Str”,此时将 “Hello Str” 放入字符串池中,并将内存地址赋值给 “str1”。当创建 “str2”时,字符串池中已经存在 “Hello Str”,直接将原有内存地址赋值给 “str2”,所以 “str1 == str2” 返回 true 。

    方式2

    每次都会创建一个新的对象,当调用 intern() 时逻辑过程跟 “方式1” 相同。当字符串池中存在 “Hello Str”时直接返回内存地址,否则将 “Hello Str” 放入字符串池中,并返回内存地址。

    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());
      }
    
    }
    

    Refer from: 

    https://yq.aliyun.com/articles/668857
    https://www.scala-lang.org/api/2.12.1/scala/Symbol.html
    https://stackoverflow.com/questions/3554362/purpose-of-scalas-symbol

  • 相关阅读:
    Jenkins自动化测试环境搭建
    在windows上运行python程序
    DOS命令笔记
    批处理基础语法
    一键清理c盘垃圾文件--bat文件
    Centos7中打包docker离线包
    python之正则表达式使用
    LoadRunner11使用代理录制脚本
    快速查看日志脚本
    实现两种登录方式一键切换的脚本及相关知识点
  • 原文地址:https://www.cnblogs.com/barrywxx/p/11441348.html
Copyright © 2011-2022 走看看