String两种实例化的区别及拓展
String实例化的两种常用的方式
方式一:字面量赋值的方式
方式二:通过构造器辅助的方式
方式一:字面量赋值的方式
字面量赋值方式的代码
class Demo{
public static void main(String[] args){
String s1 = "java";
String s2 = "java";
System.out.println(s1==s2);//输出结果为true
}
}
解析:通过字面量赋值的方式产生的字符串是放在方法区的字符串常量池当中的,常量池中不会存放具有相同字符序列的字符 串,所以每次创建字面量时都会去常量池中寻找此字面量是否已经存在,若存在则String类的对象直接指向该地址,若不 存在,则创建新的内存空间,存储该字面量
内存解析:
方式二:通过构造器赋值的方式
class Demo {
public static void main(String[] args){
String s3 = new String("java");
String s4 = new String("java");
System.out.println(s3==s4);//false
}
}
通过new构造器方式创建的String的实例,存储在堆空间中,但是对象的字符串类型的内容仍然存储在方法区的常量池中
内存解析:
拓展:
class Person{
public String name;
public Person(String name){
this.name = name;
}
public static void main(String[] args){
Person p1 = new Person("Jerry");
Person p2 = new Person("Jerry");
Person p3 = new Person("Tom");
System.out.println(p1==p2); //false
System.out.println(p1.name==p2.name);//true
System.out.println(p1.name==p3.name);//false
}
}
内存解析:
野鸭丁真: 讲的不错😋
逢春11: 到位
YK菌: 厉害👍🏻 👍🏻👍🏻👍🏻
啥也不会学前端: 第一个例子是false,楼下应该是打错代码了
codeDog_SH 回复 qq_42795202: 想访问外层数组的地址,那就直接输出arr,代表数组在内存空间的开始地址