您的位置:首页 > 其它

String构造方法与内存分析

2018-02-20 21:59 155 查看

String构造方法与内存分析

源代码

public class StringTest {

public static void main(String[] args) {

//第一种构造方法
String str="Hello World!";
String str0="Hello World!";
String str1="Hello "+"World!";

//判断String变量内存地址是否一致,采用"=="运算符,判断内容是否一致,采用equals()
//hashCode()
System.out.println(str.hashCode()+":----->"+(str==str1));   //内存地址一样,指向相同
System.out.println(str0.hashCode()+":----->"+(str==str0));

//第二种构造方法
//空字符串""和空对象null不一样
//使用new关键字将会在堆中新建一个String对象
String str2=new String();
String str3=new String("Hello World!");
System.out.println(str3.hashCode()+"---->"+(str==str3));  //str3指向堆中的内容

//将堆中的对象初始化到方法区的常量池中
String str4=str3.intern();  //str4将指向常量池中的相同的已有的内容,而不会重新创建对象
System.out.println(str4.hashCode()+"---->"+(str==str4));

String[] strArray={"string","test"};
System.out.println(strArray.toString()+"    "+strArray);
}

//NullPointerException:空指针异常
//调用相关方法时,要注意String对象不是一个空对象
public static boolean isEquals(String str){
String str1="Hello";
return str1.equals(str);    //准确

//return str.equals(str1);
//有风险:str可能为空字符串,将报NullPointerException异常
}

}


运行结果为:

-969099747:----->true
-969099747:----->true
-969099747---->false
-969099747---->true
[Ljava.lang.String;@15db9742    [Ljava.lang.String;@15db9742


分析:

第一种构造方法:

String对象会直接加载在栈里,字符串内容变为常量存在于方法区的常量池里,并且所有内容相同的String均会指向同一个内存地址,因为为其赋初值时会先在方法区寻找是否有这个常量,如果有则指向这个常量,而不会新建常量,如果没有则在常量池里再新建一个常量。例子中的str,str0都指向常量池中同一个常量,因此使用”==”运算符时输出结果为true。

str1被创建时会新建两个常量”Hello “和”World!”,再连接在一起,然后取常量池里寻找一个相同内容,如果有,则指向已有的内容地址,之前的两个临时常量会被作为垃圾自动回收。

第二种构造方法:

使用new关键字来创建String将会在堆里面新建一个String对象,不同于方法区的常量池。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: