字符串常量池

45 篇文章 0 订阅

1.创建对象的思考

下面两种创建字符串的方式一样吗?

public static void main(String[] args) {
        //两者一样吗
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s1 == s2);
        System.out.println(s3 == s4);
        System.out.println(s1 == s3);
    }

在Java程序中,类似于1,2,3,3.14,“hello"等字面类型的常量经常被频繁的使用,为了使程序更加的节省空间,运行速度更快,Java为8中基本数据类型和String类提供了常量池。

池是一种常见的,重要的提高效率的方式,当我们需要里面的资源时,我们不必重新创建,直接从池中取得相应的资源。

为了节省储存空间以及程序的运行效率,Java中引入了:

  1. Class文件常量池:每个.Java源文件编译后会生成.Class文件,文件中会保存当前类中的字面常量以及符号信息。

  1. 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池

  1. 字符常量池

2.字符常量池(StirngTable)

字符常量池在JVM中是StringTable类,实际上是一个固定大小的HashTable,在不同的JDK版本下字符串常量池的位置以及默认的大小是不同的。

3.再谈String对象创建

不同的JDK版本对字符串常量池的处理方式是不同的,我们以Java8 HotSpot上分析

1.直接使用字符串常量赋值

2.通过new创建String类对象

结论:只要是new的对象,都是唯一的。

通过上面的例子,我们发现通过常量字符串创建对象更加的高效。

3.intern方法

intern()是手动将创建的String对象添加到常量池中

//手动将字符串添加到常量池中
    public static void main(String[] args) {
        char[] ch = new char[]{'a', 'b', 'c'};
        String s1 = new String(ch);//这不会将字符串放到常量池里面
        s1.intern();//我们能手动将字符串放到常量池里面
        String s2 = "abc";
        System.out.println(s1 == s2);//此时我们发现它们引用的是同一个对象

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值