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....
- 字符串创建的三种方式:
- String str1 =“hello”;
- String str2=new String(“hello”);
- 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
上一篇: 剑指Offer三天挑战赛32~45
下一篇: 小寒吃什么传统食物