Java中 == 和 equalse()
Java中 == 和 equalse()
原文:https://blog.csdn.net/tonghui_tonghui/article/details/71189536
1. Java中数据类型有两种:基本数据类型和引用数据类型
基本数据类型的值存储在内存的栈中;引用数据类型存储的是对象的地址,该地址指向的内存空间存储的才是我们需要的内容,比如字符串,对象等存储在内存的堆中。
2. 关于==:
比较的是内存地址。当==比较的是基本数据类型变量时,判断它们是否来自同一个内存地址,由于基本类型变量值是存储在栈里面的,当两个变量有同一个值时,其实它们只用到了一个内存空间,所以比较的结果是true。
当==比较的是引用数据类型变量时,判断的也是内存地址,如果两个引用的地址信息相同,指向的就是同一个对象,得到的结果就是true。
例如:
例子1:
String s1 = "123";
String s2 = "123";
s1==s2 值为true
例子2:
String s1 = "123";
String s2 = new String("123");
s1==s2 的结果是false
例子1中:java中有字符串缓冲池的概念,通俗的说,就是程序在运行的时候会创建一个字符串缓冲池,里面放了字符串对象,在声明String变量的时候,程序首先会在这个String缓冲池中寻找相同的对象,如果有相同对象,就将已有的地址赋值给引用;如果没有就创建新的内存地址,因此缓冲池里原来有的字符串的那个变量和新申请的变量,其实指向的是同一个内存空间。因此例子1里面s1和s2用到的都是同一个内存空间的“123”。所以此时==的结果是true。
例子2中:由于s2用new 关键字重写申请了空间,没有用到缓冲池里的原有的变量,所以它们内存地址不相同,所以结果为false。
3.关于equalse()
equalse()方法是Object类的基本方法之一,在Object类中的equalse()方法是对两个对象的地址值进行比较的,但是当String、Math、Integer等封装类在使用equalse()方法是已经覆盖了Object类的equalse()方法,所以每个类都有自己的equalse()方法,是比较两个对象的内容是否一样。所以上面的例子如果换成是equalse()比较的话,结果都是true。