最近一直在使用字符串判断以及对象判断,但总是出现各种各样的问题,代码经常莫名奇妙的出现判断条件失误的情况。这次就好好的总结下这个equal()和==运算符号的差异。
总结的来说。==运算符是用来判断两个引用变量是否指向同一个对象。(毫无疑问)
equal是用来判断两个变量所引用的值是否相等。(这个定义其实不准确,下面会讲。)
1、==运算符
这个不用多说,判断两个引用变量是否指向同一个对象。
String str1="JACK";String str2="JACK";
String str3=new String("JACK");
String str4=new String("JACK");
System.out.println(str1==str2);//输出true
System.out.println(str1==str3);//输出false
System.out.println(str4==str3);//输出false
这里String str1="JACK";String str2="JACK"; 这两个变量指向的"JACK",是存放在常量池中的,JVM常量池保证相同的字符串直接量只有一个,不会产生多个副本。,并且在代码的编译期就已经确定好了,因此str1与str2都引用常量池中的同一个字符串对象。
而str3,str4指向的字符串对象,是保存在堆内存中的。
当使用new String("JACK"),这种方式时,JVM首先会使用常量池来保存管理”JACK“直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。也就是说new String(”JACK“)一共产生了两个字符串对象。
2、equal()方法
很多资料上说equals()方法是判断两个对象的值相等,这个说法并不准确。实际上,重写equals()方法就是提供自己的判断标准。
equals():是Object类提供的一个实例方法,因此所有的引用变量都可以调用该方法来判断是否与其他的变量相等。但这时使用这个方法判断两个对象相等的标准与使用==运算符没有区别,同样要求两个引用变量指向同一个对象才会返回true。所以这个
Object类提供的equals()方法
没有太大的实际意义,所以
需要重写。
但是
String类已经重写了Object类的equal()方法,String的equals方法判断两个字符串相等的标志是:只要两个字符串包含的字符序列相同,通过equal()比较将返回true,否则返回false。