Java--创建String以及其内存使用情况

2022-07-25,,,,

  • 字符串创建的三种方式:
  1. String str1 =“hello”;
  2. String str2=new String(“hello”);
  3. char[] value = {‘h’,‘e’,‘l’,‘l’,‘o’};
    String str3=new String(value);
           三种创建方式在内存中开辟的空间是不一样的,每次new一个对象,就会在内存中开辟一个空间;第一种方式是在堆上的字符串常量池放入"hello" ,str1引用该地址;而第二种构造String的方式,在底层是与第三种实现的方法是相同的,创建value[ ] 数组,然后指向‘hello’内容。 需要记得字符串常量不可更改,因为value数组是用final修饰的。
           通常 == 比较的是对象的地址是否一致,但是对于指向的内存的比较则用 ‘equals()’ 函数实现。内容比较,equals先比较是否引用同一个对象,是的话返回True,不是的话将字符串转换为数组,遍历数组然后比较数组内容是否相等。

       显然,str1,str2,str3,若用 '=='来判断的话,答案都是false 。值得注意的是如下代码:
        String str1=“hello”;
        String str2=new String(“hello”).intern();
        System.out.println(str1==str2); //ture
在str2做出上面的改变时,str2对象会直接指向字符串常量池的“hello”,此时str1==str2

  • 字符与字符串的转换

     //字符转字符串
     char[] chars = string.toCharArray();
     //字符串转字符
     1、new String(chars)
     2、String.copeValueOf(chars)
     3、String.ValueOf(chars)
    
  • 字符串常量池

       String类的设计使用了共享设计模式,在JVM底层实际上会自动维护一个对象池(字符串常量池)。如果现在采用了直接赋值的模式进行String类的对象实例化操作,那么该实例化对象(字符串内容)将自动保存到这个对象池之中。如果下次继续使用直接赋值的模式声明String类对象,此时对象池之中如若有指定内容,将直接进行引用,如若没有,则开辟新的字符串对象而后将其保存在对象池之中以供下次使用。

本文地址:https://blog.csdn.net/weixin_45621846/article/details/112839128

《Java--创建String以及其内存使用情况.doc》

下载本文的Word格式文档,以方便收藏与打印。