欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 08:12:20
字符串创建的三种方式:String str1 =“hello”;String str2=new String(“hello”);char[] value = {‘h’,‘e’,‘l’,‘l’,‘o’};String str3=new String(value);三种创建方式在内存中开辟的空间是不一样的,每次new一个对象,就会在内存中开辟一个空间;第一种方式是在堆上的字符串常量池放入"hello" ,str1....
  • 字符串创建的三种方式:
  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,不是的话将字符串转换为数组,遍历数组然后比较数组内容是否相等。

Java--创建String以及其内存使用情况
       显然,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

相关标签: 字符串