String类之那些你不知道的知识点

  关于Java JDK中内置的一个类:java.lang.String我们需要了解的有以下几点:

  1. String表示字符串类型,属于引用数据类型,切记不属于基本数据类型;
  2. 在java中随便使用双引号 “” 括起来的都是String类型的对象。例如"abc"、“张三”、“HelloWorld”,这是三个String对象;
  3. java中规定,双引号括起来的字符串是不可变的,也就是说“abc”这个字符串自出生到死亡这个过程都是不可变的,不可能再变成“abcd”;
  4. 在JDK当中双引号括起来的字符串都是直接存储下 “方法区”“字符串常量池” 当中。
      对于SUN公司为什么要把字符串放置在一个常量池当中呢,主要还是因为在开发的过程当中,字符串的使用太频繁,为了执行效率,所以把字符串放到了方法区的字符串常量池当中。说到这里我不得不提出来的一个问题就是,这个方法区当中其实还有其它的常量区,这些常量区也是非常重要的,我们会在后面的博文当中碰到它们。

      从这个图我们可以看到,String类型的对象存放的并不是字符串这个本身的值,而是这个字符串对象的内存地址。
    请分析以下程序回答问题:
public class StringTest {
    
    

    public static void main(String[] args) {
    
    
       String s1 = new String("hello");
       String s2 = new String("hello");
    }

}

请问这个程序一共创建了几个对象呢?
一共创建了3个对象:
首先方法区字符串常量池中有一个对象,即“hello”,堆内存当中有两个String类型的对象,所以一共是3个对象。


  对于String类的一些常用的构造方法我在这里就不展开说明了,请查阅相关JDK文档。
接下来我们请思考这样的一个问题:
我们在实际的开发中,如果需要进行字符串的频繁拼接,会有什么问题呢???
  我们之前说过,因为java字符串是不可变的,那么每一次的拼接都会产生新字符串,而这些字符串又存放在方法区,这样就会占用大量的方法区内存,造成内存空间的浪费。比如对于下面的语句:

 String s = "123";
       s +=  "456";

就以上的两行代码,就会导致在方法区的字符串常量池当中创建了3个对象:即"123"、“456”、“123456”。
所以说,为了避免上面的问题,StringBuilder类StringBuffer类就应运而生了。对于这两个类的详解敬请关注我的后续博文哦。


以上内容均为个人学习的一点心得,其中的知识点若有错误请留言提醒,若有侵权内容提醒马上删除。

猜你喜欢

转载自blog.csdn.net/pf6668/article/details/108760427