• 关于常量池


    常量池:

    常量池分为静态常量池和运行时常量池。

    所谓静态常量池是*.class文件中的常量池,*.class文件中的常量池不止包含字符串还包含属性和类的信息,这种常量池主要用于存放两类常量:字面量和符号引用量,字面量相当于JAVA语言层面常量的概念,如文本字符串,声明为final的常量,符号引用则属于编译原理方面的概念。

    运行时常量池指的是JVM再装载完类后,将class文件中的常量池加载到内存中,并保存在方法区,我们经常说的常量池就保存在方法区中的运行时常量池。

    运行时常量池相比于class文件中的常量池多一个动态性的优点,JAVA不要求常量只有在编译期才能产生,并不是说常量只有预置在class文件中才可以进入运行时常量池,在运行时也可以进入。这一特性被利用较多的就是String.intern(),这个方法就是寻找常量池中是否有equal相等的值,如果有则返回引用,如果没有那么就添加自己的值进入常量池。

    常量池的好处

    常量池实现了数据的共享,避免了重复数据的创建和销毁,进而提高了程序的性能。

    节省空间:多个内容相同的字符串只占用一个内存

    节省时间:==比equals速度快,两个引用量比较的时候可以直接比较引用量,效率更高。

    public class TestString {
        public static void main(String[] args) {
            String s1="hel";
            String s2="lo";
            String s3=s1+s2;
            String s4="hello";
            System.out.println(s4==s3);//false
            System.out.println(s4==(s1+s2));//false
        }
        
    }

    在拼接s3的时候由于s1、s2是两个变量,所以不可预料,并不能在编译期确定,在运行期确定后在堆中的地址仍然不能确定,所以不可能与s4相等。

  • 相关阅读:
    用于json的 .ashx 小细节
    (转)写让别人能读懂的代码
    Mvc 中ViewBag Model 查找不到解决
    Windows 2008 R2 配置 DNS 实现二级域名
    Windows Server 2008 DNS服务器安装与配置
    【iOS】swift init构造器
    【iOS】OC-UTC日期字符串格式化
    android使用sharesdk的小感
    【iOS】Swift GCD-下
    【iOS】Swift GCD-上
  • 原文地址:https://www.cnblogs.com/tutuhome/p/10679921.html
Copyright © 2020-2023  润新知