今天练习文件操作的时候出了一个bug,检查了很久,最后发现两个相同内容的字符串s1和s2用"==“判定结果为false。
我上网查了一下”=="与euqals()的区别和用法,整理了一下这些资料:
“==” 的作用:
对基本类型:比较的就是值是否相同
对引用类型:比较的就是地址值是否相同
注:在Java中,数组和String字符串都不是基本数据类型,它们被当作类来处理,是引用数据类型。
1."==“与"equals()”
所有"对象变量"用"==“作比较时比的是两个对象在堆中的引用。
所有对象的equals方法继承自Object类的方法,而String重写了equals方法的比较算法,它比较的是字符串的内容,即在堆中的字符序列
2.字符串特点
字符串是一种比较特殊的对象,这里的特殊指的是在运行期间,它的赋值直接改变引用(当然,任何对象的赋值都是直接改变的引用,只不过字符串这种东西往往让人容易理解为它是在原来的基础上操作的,尤其是+=这类操作),而不是在原来所引用的内存块中做修改.
结论:
1.
String s1 = “hello”;
String s2 = “hello”;
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2); //true
第一个true是因为内容相同,第2个true是因为引用地址相同,java编译器用的类似于C语言中的"文字池机制”,即在源代码中所有的字符串常量声明全部放在一块内存区域,因此当一个字符串声明时赋值的是一个字符串常量,如果"文字池"中有这个字符串常量,编译器将直接把它的引用赋值给这个变量.因此在用"==“来比较s1和s2时也得到true.
2.
String s1 = “hello”;
String s2 = “hello”;
s1 = s1 + “a”;
s2 = s2 + “a”;
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2); //false
第3,4行的赋值操作在运行期间执行,两个变量的引用将会发生改变.因此这时用”=="相比时将会得到false;
(在运行期间所得到的字符串内容,将不会放到所谓的"文字池"之中,因为如果有相同内容的变量引用相同内容,这样作的话需要每次字符串改变时需要检查它的内容,再在文字池中查找看是否有相同内容的常量,太过浪费效率.)
("文字池机制"也许也是为什么字符串对象在作更改时,直接改变引用的一个原因,因为直接对引用的内存块作操作的话,另一个指向相同引用的字符串变量将也会发生改变,发生逻辑混淆)
总结:
1.如果是单纯的比较字符串内容的话:用equals()
2.如果确实是要比较两个变量的引用的话:用"=="
参考了网上的信息,如果有错误或者不严谨的地方还请包涵并提出。