zoukankan      html  css  js  c++  java
  • String常量池面试题一则

            String s1 = "a";
            String s2 = "b";
    
            String s3 = "ab";
            String s4 = "a"+"b";
            String s5 = s1 + s2;
    
            System.out.println(s3==s4);
            System.out.println(s4==s5);
            System.out.println(s5==s3);
    

    请问结果是什么
    首先"ab"为常量,所以会被加载到运行时常量池中。
    而"a"、"b"为常量加常量,结果也为常量"ab",JVM先看观察运行时常量池,发现已经有"ab",则引用它。
    所以s3和s4为同一的变量。

    s1和s2为字符串变量,s1+12底层为 new StringBuilder().append("a").append("b").toString()
    toString()底层为 new String("ab") 所以s5是new出来的对象,放在堆中而不是运行时常量池中
    所以s5和s4不是同一变量

    结果为true
    false
    false

    三个小口诀:
    1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
    2.只要其中一个是变量,结果就在堆中。(s1+s2)
    3.如果拼接的结果调用intern()方法,返回值就在常量池中

  • 相关阅读:
    《JavaScript语言精粹》学习心得
    Linq笔记
    关于缓存
    JS-替换全部全部字符串
    相同数据用分号分割
    单例模式
    es6- ArrayBuffer
    vue常用属性解释。
    装饰者模式
    中介者模式
  • 原文地址:https://www.cnblogs.com/iamwatershui/p/14465573.html
Copyright © 2011-2022 走看看