一、字符串的创建、比较
这两类创建方式是不一样的。
String s1 = “Hello”; s1指向常量池中的Hello即直接引用,否则先在常量池中创建Hello的内存空间,再引用
String s2 = new String(“Hello”);这时在s2的堆内存中new一个对象即一定需要分配Hello大小的内存空间
注意, 使用第一种创建方式至多创建一个String对象,但第二种方式至少创建一个对象
== //比较两个字符串的地址
equals //比较两个字符串的地址所指向的内容
在此我们可以看到两个字符串的引用的地址是一定不相同的,一个在常量池中,一个在堆内存中
在程序运行结束后,常量池中String对象的内容即Hello是没有回收的,但是使用new创建的对象(已分配内存)是需要通过虚拟机回收的。
大家应该可以猜一猜,没错,它的地址和地址所指向的内容都相同即使用 == 和 equals 返回值均为true,因为str1, str2 都引用常量池的同一内容,自然str1和str2所存放的地址相同。
二、类中的引用数据类型
类内部:
public class Person {
String name;
String city;
int age;
String sno;
// true or false
boolean gender;
void Speak() {
// 方法体
System.out.println(name + "'age is " + age);
}
}
主函数:
public class Exp5_1 {
public static void main(String[] args) {
// 创建一个对象 p(new操作)即在创建 p 就已经动态分配内存了
Person p = new Person();
p.name = "ZhangSan";
p.city = "Wuhan";
p.age = 10;
p.gender = true;
p.Speak();
}
}
此时的内存分布图如何呢?
大致内存分配图如上。