String类的intern

本文介绍了Java中字符串常量池的概念及其实现原理。详细分析了字符串对象创建过程,特别是通过new关键字创建字符串对象时的行为。同时,还探讨了如何使用intern方法来优化字符串的使用,提高内存效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串常量区

对于一个字符串的字面值为”hello”,如果说你要多次使用,如果对于这一个字符串字面值创建对象,那么很浪费内存,为此,java设计了字符串常量池,你就可以重用这一个字符串对象。

例子

看几个字符串比较的例子:

          String a = "abc";//存放在字符串常量区
      System.out.println(a=="abc");//true

String a = ” “,这种方式创建的字符串,会首先到字符串常量区看看有没有这个字符串,没有则创建一个字符串对象放到字符串常量区。后面那个直接申明的” ” ,也会到常量区看看,有的话,就都指向该字符串常量对象,所以结果为true。

          String w = new String("hello");
      System.out.println(w=="hello");//false

我们都知道new方式创建的对象都是在堆上的。那它创建的过程是什么样?

  1. 在常量池中查找是否有“hello”对象

    有则返回对应的对象
    
    没有则创建对应的实例对象
    
  2. 在堆中 new 一个 String(“abc”) 对象,这个堆中对象指向的是字符串常量区对象的地址

  3. 将堆中对象地址赋值给w,创建一个引用

这里w指向堆的引用覆盖了指向字符常量区的引用,所以一个是堆对象,一个是字符串常量区对象,地址肯定不同。

但是,我们如何通过w区引用字符串常量区的那个对象呢?就引出下面intern方法。

intern

该方法是,如果调用的字符串在常量区中存在,那么直接返回常量区的对象,如果没有,则把该对象添加到常量区,并返回引用,为什么要这样,保证对象的重用。

  System.out.println(w.intern()=="hello");//true,这里的两个都是常量区的字符串对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值