1.String
先上代码
//先讲一下==和equals()的区别
==:基本数据类型比较的是值是否相同,引用数据类型比较的是地址。
equals();比较的是内容是否相同。
为什么会输出上面的结果呢、String s="张三" 的方式,在堆内存中存在一个常量池(Java为了避免产生大量的String对象,设计了一个字符串常量池。)在执行String x = "张三";这句代码时,会先在常量池中检索是否存在,如果不存在,就创建一个,然后将地址值赋值给变量。如果存在则直接将地址值赋值给变量。所以System.out.println(x == y); // true而System.out.println(x == z); 当遇到new时,会在堆内存中创建新的String对象,然后在字符串常量池中检索构造方法中的字符串是否存在,如果存在则将常量池中的字符串地址赋值给构造方法,如果没有则创建一个。因此,x和y为false。
内存图
归根结底,new 的时候是在堆内存中创建新的对象。而=" sfdf"是在字符串常量池中。