疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java培训:equals跟==有什么区别


 

  “equals”和“==”这两个概念对于刚入门的java学员来说很容易弄混了,广州java培训的老师将为大家仔细解释一下这两个概念---“值传递”和“引用传递”。

  简单来说,值传递就是当你创建了一个对象的时候,操作系统在内存中给你这个对象重新分配了一个地址,而引用传递就是不重新分配内存空间,而是当你新声明的对象指向已经存在的对象。这里还要强调一下“new”,这是实例化对象的标识,也就是在内存中重新分配空间的标识。

  我们通常用的时候,例如比较字符串,“equals”比较的是这两个字符串的值是不是一样,而“==”则比较的是这两个字符串的引用地址是否一样。例如下面的代码示例:

  字符串中“equals”和“==”对比示例代码 1. /**

  2. * 字符串中“equals”和“==”对比示例

  3. * @author 赵广超

  4. */

  5. public class equalsTest {

  6. public static void main(String[] args) {

  7.

  8. String aaa =new String("abc");

  9. String bbb =new String("abc");

  10. String ccc ="abc";

  11. String ddd=aaa;

  12.

  13. if(aaa == bbb){

  14. System.out.println("aaa == bbb");

  15. }else{

  16. System.out.println("aaa != bbb");

  17. }

  18. if(aaa.equals(bbb)){

  19. System.out.println("aaa equals bbb ");

  20. }else{

  21. System.out.println("aaa not equals bbb ");

  22. }

  23. if(aaa == ccc){

  24. System.out.println("aaa == ccc");

  25. }else{

  26. System.out.println("aaa != ccc");

  27. }

  28. if(aaa.equals(ccc)){

  29. System.out.println("aaa equals ccc ");

  30. }else{

  31. System.out.println("aaa not equals ccc ");

  32. }

  33. if(bbb == ccc){

  34. System.out.println("bbb == ccc");

  35. }else{

  36. System.out.println("bbb != ccc");

  37. }

  38. if(bbb.equals(ccc)){

  39. System.out.println("bbb equals ccc ");

  40. }else{

  41. System.out.println("bbb not equals ccc ");

  42. }

  43. if(aaa == ddd){

  44. System.out.println("aaa == ddd");

  45. }else{

  46. System.out.println("aaa != ddd");

  47. }

  48. if(aaa.equals(ddd)){

  49. System.out.println("aaa equals ddd ");

  50. }else{

  51. System.out.println("aaa not equals ddd ");

  52. }

  53. if(bbb == ddd){

  54. System.out.println("bbb == ddd");

  55. }else{

  56. System.out.println("bbb != ddd");

  57. }

  58. if(bbb.equals(ddd)){

  59. System.out.println("bbb equals ddd ");

  60. }else{

  61. System.out.println("bbb not equals ddd ");

  62. }

  63. if(ccc == ddd){

  64. System.out.println("ccc == ddd");

  65. }else{

  66. System.out.println("ccc != ddd");

  67. }

  68. if(ccc.equals(ddd)){

  69. System.out.println("ccc equals ddd ");

  70. }else{

  71. System.out.println("ccc not equals ddd ");

  72. }

  73. }

  74. }

  结果如下:

  aaa != bbb

  aaa equals bbb

  aaa != ccc

  aaa equals ccc

  bbb != ccc

  bbb equals ccc

  aaa == ddd

  aaa equals ddd

  bbb != ddd

  bbb equals ddd

  ccc != ddd

  ccc equals ddd

  对上面的结果我们可以做如下解释:

  String aaa =new String("abc");

  String bbb =new String("abc");

  String ccc ="abc";

  String ddd=aaa;

  左边的代码在内存中分配的结果如右边所示:故有控制台的打印信息即“equals“比较的是两个值是不是一样,而”==“比较的是内存地址是不是相同。

  可是,实际的并不总是这样的。String类中的Equals这个方法重写了超类Object(Object类被所有的其他类继承)中的equals方法。而Object超类中有如下代码:

  Object超类中的equals()方法代码 1. public boolean equals(Object obj) {

  2. return (this == obj);

  3. }

  就是说,超类中的equals和==是一码子事,比较的都是内存地址。

  在String类中,重写的equals方法代码如下:

  String类中的equals()方法代码 1. public boolean equals(Object anObject) {

  2. if (this == anObject) {

  3. return true;

  4. }

  5. if (anObject instanceof String) {

  6. String anotherString = (String)anObject;

  7. int n = count;

  8. if (n == anotherString.count) {

  9. char v1[] = value;

  10. char v2[] = anotherString.value;

  11. int i = offset;

  12. int j = anotherString.offset;

  13. while (n-- != 0) {

  14. if (v1[i++] != v2[j++])

  15. return false;

  16. }

  17. return true;

  18. }

  19. }

  20. return false;

  21. }

  因此我们在不同的类之中使用equals的时候会有不同的效果,我们我们在写程序的时候要注意好equals和==的区别。疯狂软件学院提醒您,如果你想学习java的话可以到我们的官方网站下载java视频或者到我们java培训机构培训java