1.基础知识
(1)String x = "hello";
(2)String x = new String ("hello");
第1种方式的工作机制是,首先看内存中有没有存放值为"hello"的地址,如果有则将x指向这块内存地址;如果没有则在内存中重新开辟一块地址存放值"hello",并将x指向这块内存地址。
String x = "hello"; String y = "hello";
所以上面的x,y都指向同一块内存地址。
第2种方式的工作机制是,不管内存中有没有存放值为"hello"的地址,都会重新开辟一块地址来存放值"hello"。
String x = new String("hello"); String y = new String("hello");
所以上面的x,y分别指向不同的地址。
2.==的详解
==对于基本类型和引用类型的作用效果是不一样的:
- 基本类型(byte,char,boolean,short,int,float,long,double)比较的是值是否相等。
- 引用类型比较的是引用是否相同。
String x = "hello"; String y = "hello"; String z = new String("hello"); System.out.println(x==y); //结果是:true System.out.println(y==z); //结果是:false
3.equals的详解
equals是基类object中定义的方法,jdk中源代码如下:
所以equals的本质就是==,即判断两个引用是否相同。
public class Person { private String name; public Person(String name) { this.name=name; } public static void main(String[] args) { Person x=new Person("小明"); Person y=new Person("小明"); System.out.print(x.equals(y)); //结果:false } }
上面的代码很容易理解,虽然x,y对象的name值都是"小明",但是它们本来就是两个不同的对象,所以equals的值为false。
注意:!!!
在String类中,equals被重写了,功能变成了比较值是否相同,源代码如下:
String x = "hello"; String y = "hello"; String z = new String("hello"); String m = new String("hello"); System.out.println(x==y); //结果是:true System.out.println(y==z); //结果是:false System.out.println(y.equals(z));//结果是:true System.out.println(z.equals(m));//结果是:true
4.总结
==是比较引用是否相同。
equals本质就是==,但对于某些类(String)来说比较的是值。