首先先说一下null 和 “” 的区别:
String str1 = null;
String str2 = "";
str1还不是一个实例化的对象,而str2已经实例化了。空字符串("")已经分配了内存,而null没有分配内存。
""是一个空字符串(string),他在内存中是存在的,他可以使用Object对象中的方法("".equals()、"".toString()),null是一个
空对象,他在内存中是不存在的,他不能使用Object对象中的方法。
在比较的时候,必须是str1==null,str2.equals(""),否则就会报错。至于为什么是必须这样来比较,下面来介绍==和equals的不同点。
来说一下==和equals的区别:
==:
对于8种基本数据类型(byte、short、int、long、double、float、boolean、char),变量直接存储的是值的话,比较的就是值本身。
对于非基本数据类型(引用数据类型)的变量,例如:String str = new String("hello"); str 就是指向了一个对象,也可以把str
称为对象的引用,这时变量str中存储的是它指向对象在内存中的存储地址,并不是值本身,也就是说,不是直接存储的"hello"。
String str1 = new String("hello");
String str2 = new String("hello");
用== 比较str1和str2,得到的结果是false,因为他们指向的是不同的对象,也就是说他们的实际存储的内存地址不同。
equals:
equals方法是基类Object中的方法,所有继承Object的类都有此方法。在Object类中,equals方法是用来比较两个引用对象是否相等,即是否指向同一个对象。
String str1 = new String("hello");
String str2 = new String("hello");
在String类中,对equals方法进行了重写,用来比较指向的字符串对象所存储的值是否相等。诸如其他的类,重写了equals法,
就是比较存储对象的内容是否相等。
总结:
==,如果是对于基本数据类型的变量,直接比较的是存储的值是否相等;如果是对于引用数据类型,则比较的是存储的内存地址是否相等。
equals,是不能作用于基本数据类型的变量。如果这个类没有对equals方法重写,则比较的是变量指向对象存储的内存地址是否相等,如果对equals方法进行了重写,则比较的是指向对象的内容。