问题描述
public static void main(String[] args){String[] a = new String[2];String[] b= new String[2];a[0]="aa";a[1]="bb";b[0]="aa";b[1]="bb";System.out.println(a[0]==b[0]);}为什么输出 的是true呢?a 和 b 各开辟了一段堆内存空间,按道理应该是false啊求真象 问题补充:兄弟,你说反了吧
解决方案
是你对“==”和“equals”的概念理解不清楚。1. “==”只比较两个值(即内容是不是相等),两个“aa”明显相等。返回true。2. “equals”比较,首先看是否重写了equals()方法,如果没重写,要返回true则两引用必须指向同一对象。String,Date重写了object的equals()方法,这时如果两引用所引用的对象是同一类对象(instanceof)且属性内容相等时(并不一定是同一对象),返回true,否则返回false。所以你这题:System.out.println(a[0].equals(b[0])); 还是返回true.
解决方案二:
a[0]==b[0],简单来说就是找到这两个变量所在的地址,然后再根据地址找到这两个变量的值,很显然这两个变量的值都是aa,返回肯定是为true了,我再补充一下Dxx23关于equals的解释,equals相同的,那他们的hashcode一定相等,equals不相同,却不能证明他们的hashcode不相等。
解决方案三:
a[0]==b[0],简单来说就是找到这两个变量所在的地址,然后再根据找到这两个变量的值,很显然这两个变量的值都是aa,返回肯定是为true了,我再补充一下Dxx23关于equals的解释,equals相同的,那他们的hashcode一定相等,equals不相同,却不能证明他们的hashcode不相等。
解决方案四:
简单说来就是常量池,你要详细解释传送门:http://www.iteye.com/topic/774673
解决方案五:
呵呵,那个当然是true,这个是因为String类型的,在内存中有个池,当两个字符串变量相同的时候指的是内存中相同的数据。