`
zhangcong170
  • 浏览: 69864 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java的equeals方法和==方法的比较

    博客分类:
  • j2se
阅读更多

      我们知道,在java中,equals()方法和==方法是有比较大的区别的,equals()方法执行的是值的比较,而==方法执行的是地址的比较,也就是对象的引用的比较。现在我们来看一段代码

   

Integer a=new Integer(1);
Integer b=new Integer(1);
System.out.println("测试equals方法 "+a.equals(b));
System.out.println("测试==方法 "+(a==b));
System.out.println("******************");
String a1="a";
String a2="a";
System.out.println("测试equeals方法 "+a1.equals(a2));
System.out.println("测试==方法  "+(a1==a2));

 输出结果如下:

测试equals方法 true
测试==方法 false
******************
测试equeals方法 true
测试==方法  true

      对于Integer对象,由于a和b是两个不同的Integer对象,但是它们的值是相同的,所以执行equals方法为true,而执行==方法明显为false,两个对象不同,当然它们在内存中的地址就不相同了。

      但是,当我们以这种方式去看String时,就开始困惑了,其实这就是String对象和普通的java对象不同之所在。当执行String a1="a";String a2="a";时,a1和a2是指向共同的内存的!他们指向相同的地址,所以无论是equals方法还是==方法,二者的结果均为true。但是,如果我们修改其中的一个String对象,会不会对另一个对象的值有影响呢?请看如下代码:

      

a1="a1";
System.out.println(a1);
System.out.println(a2);

 输出结果如下:

 

a1=a1
a2=a

      a1与a2的值又不同了!这真是奇怪了,在执行a1="a1"之前,a1与a2明明指向相同的内存地址,为什么当a1改变时却对a2没有任何的影响呢?

      原来,当执行a1="a1";时,系统会在内存中重新划分一块区域存放“a1”这个字符串,并将Sting变量a1指向这个地址,也就是说,a1指向的地址发生了改变!这就是String与一般类型的区别,当Stiring的值发生改变时,它会重新分配内存区域。所以a1和a2的值不相同,改变它们的任何一个,都不会对另外一个产生影响。

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics