java----String类的深入理解

String类的描述

  • String是final类,这意味着这个类不能被继承,也不能有子类,其中的方法默认为final方法
  • String类是通过char数组来保存字符串
  • String类对字符串的操作都是对新字符串操作,也就是说,String对象一定被创建就不会改变,任何改变操作都不会改变原字符串,而是生成了新的对象

字符串常量池

  • 每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串不可变,所以常量池一定不存在两个相同的字符串
  • 静态常量池和运行时常量池
    • 静态常量池,即.class文件中的常量池,class文件中的常量池不仅仅包括字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大数空间
    • 运行时常量池,则是jvm虚拟机在完成类加载操作后、将class文件中的常量池载入内存中,并保存在方法区中,我们常说的常量池,就是指方法区的运行时常量池。
      在这里插入图片描述
      在这里插入图片描述
      虽说,字符串的比较,我们使用equals方法,但用==号就可以看出,a和b指向的同一个对象。而new以后就产生新的对象。如果使用equals比较三者,得出的结果,肯定都是true 。
      由于c是new出来的,所以产生了两个对象,一个是栈区中的c,另一个就是堆中的123,他们的引用关系是c->123->123(常量池中的),也就是说,尽管c是创建在堆中,但其value还是常量池中的123

当我们对字符串,进行拼接,替换等操作时,会创建一个新的对象来操作,之后旧的对象,就会被当作垃圾回收。

猜你喜欢

转载自blog.csdn.net/qq_40893056/article/details/82774818