`
bulargy
  • 浏览: 66528 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

equals和==的一些测试!

J# 
阅读更多
前几天去一公司笔试,题目都很基础,但是都很让人郁闷,总觉得会又不是十分透彻的感觉,特别是equals和==的一些题目,回来自己测试了一些,和大家分享!
首先是几个基本类型的用法:
package com.bulagy;

/** *//**
 * 
@author bulargy
 *
 
*/

public class EqualsDemo ...{

    
/** *//**
     * 
@param args
     
*/

    
public static void main(String[] args) ...{
        
boolean boo1 = true;
        
boolean boo2 = true;
        
boolean boo3 = false;
        
boolean boo4 ;
        
boolean boo5 = boo1;
        
//boolean boo5 = new boolean();//不合法的定义
        
        System.out.println(
"boo1==boo2 ? "+(boo1==boo2));
        System.out.println(
"boo1==boo3 ? "+(boo1==boo3));
        
//System.out.println("boo1==boo2 ? "+(boo1.equals(boo2)));//没有equals方法
        System.out.println("boo1==boo5 ? "+(boo1==boo5));
        
//System.out.println("boo3==boo4 ? "+(boo3==boo4));//boo4未初始化
        System.out.println();
        
        String s1 
= "abcd";
        String s2 
= new String("abcd");
        String s3 
= "abcd";
        String s4 
= new String("abcd");
        String s5 
= s1;
        String s6 
= s2;
        String s7;
        String s8 
= new String();
        String s9 
="";
        
        System.out.println(
"s1==s2 ? "+(s1==s2));
        System.out.println(
"s1.equals(s2) ? "+s1.equals(s2));
        System.out.println(
"s1==s3 ? "+(s1==s3));
        System.out.println(
"s1.equals(s3) ? "+s1.equals(s3));
        System.out.println(
"s2==s4 ? "+(s2==s4));
        System.out.println(
"s2.equals(s4) ? "+s2.equals(s4));
        System.out.println(
"s1==s5 ? "+(s1==s5));
        System.out.println(
"s1.equals(s5) ? "+s1.equals(s5));
        System.out.println(
"s2==s6 ? "+(s2==s6));
        System.out.println(
"s2.equals(s6) ? "+s2.equals(s6));
        
//System.out.println("s7==s8 ? "+(s7==s8));//s7未初始化
        
//System.out.println("s7.equals(s7) ? "+s7.equals(s8));//s7未初始化
        System.out.println("s8==s9 ? "+(s8==s9));
        System.out.println(
"s8.equals(s9) ? "+s8.equals(s9));
        System.out.println(
"s8= "+s8);
        System.out.println(
"s9= "+s9);
        System.out.println();
        
        
int i1 = 11;
        
int i2 = new Integer(11);
        
int i3 = 11;
        
int i4 = new Integer(11);
        
int i5 = i1;
        
int i6 = i2;
        
int i7;
        
int i8 = new Integer(0);
        
int i9 = 0;
        
        System.out.println(
"i1==i2 ? "+(i1==i2));
        
//System.out.println("i1.equals(i2) ? "+i1.equals(i2));//没有equals方法
        System.out.println("i1==i3 ? "+(i1==i3));
        
//System.out.println("i1.equals(i3) ? "+i1.equals(i3));//没有equals方法
        System.out.println("i2==i4 ? "+(i2==i4));
        
//System.out.println("i2.equals(i4) ? "+i2.equals(i4));//没有equals方法
        System.out.println("i1==i5 ? "+(i1==i5));
        
//System.out.println("i1.equals(i5) ? "+i1.equals(i5));//没有equals方法
        System.out.println("i2==i6 ? "+(i2==i6));
        
//System.out.println("i2.equals(i6) ? "+i2.equals(i6));//没有equals方法
        
//System.out.println("i7==i8 ? "+(i7==i8));//i7未初始化
        
//System.out.println("i7.equals(i7) ? "+i7.equals(i8));//没有equals方法
        System.out.println("i8==i9 ? "+(i8==i9));
        
//System.out.println("i8.equals(i9) ? "+i8.equals(i9));//没有equals方法
        System.out.println("i8= "+i8);
        System.out.println(
"i9= "+i9);
        System.out.println();
    }


}

运行结果:
boo1==boo2 ? true
boo1==boo3 ? false
boo1==boo5 ? true

s1==s2 ? false
s1.equals(s2) ? true
s1==s3 ? true
s1.equals(s3) ? true
s2==s4 ? false
s2.equals(s4) ? true
s1==s5 ? true
s1.equals(s5) ? true
s2==s6 ? true
s2.equals(s6) ? true
s8==s9 ? false
s8.equals(s9) ? true
s8=
s9=

i1==i2 ? true
i1==i3 ? true
i2==i4 ? true
i1==i5 ? true
i2==i6 ? true
i8==i9 ? true
i8= 0
i9= 0
 
小结:
1、任何对象使用之前都要初始化,仅仅声明是不够的;
2、只有String等对象形式数据才有equals方法,基本数据类型是没有的;

然后是一个数组的:

package com.bulagy;

import java.util.Arrays;

public class EqualsArrayDemo ...
    
public static void main(String[] args) ...
        
int[] arr1 = ...{12345}
        
int[] tmp1 = arr1; 
        
int[] tmp2 = arr1; 
 
        System.out.print(
"通过tmp1取出数组值:");
        
for(int i = 0; i < tmp1.length; i++
            System.out.print(tmp1[i] 
+ " "); 

        System.out.print(
" 通过tmp2取出数组值:"); 
        
for(int i = 0; i < tmp2.length; i++
            System.out.print(tmp2[i] 
+ " "); 
 
        tmp1[
2= 9
        System.out.print(
" 通过tmp1取出数组值:");
        
for(int i = 0; i < tmp1.length; i++
            System.out.print(tmp1[i] 
+ " "); 

        System.out.print(
" 通过tmp2取出数组值:"); 
        
for(int i = 0; i < tmp2.length; i++
            System.out.print(tmp2[i] 
+ " "); 
        System.out.println();   
        
        
int[] arr2 = ...{12345}
        
int[] arr3 = ...{567891011}
        
int[] tmp3 = arr2;
        
int[] arr4 = new int [] ...{12345}
        
        System.out.print(
"使用tmp3取出arr2中的元素:");
        
for(int i = 0; i < tmp3.length; i++
            System.out.print(tmp3[i] 
+ " "); 
 
        tmp3 
= arr3; 
        System.out.print(
" 使用tmp3取出arr3中的元素:");
        
for(int i = 0; i < tmp3.length; i++
            System.out.print(tmp3[i] 
+ " "); 
        System.out.println();
       
        System.out.println(
"arr1==arr2 ? "+(arr1==arr2));
        System.out.println(
"arr1.equals(arr2) ? "+arr1.equals(arr2));
        System.out.println(
"Arrays.equals(arr1,arr2) ? "+Arrays.equals(arr1,arr2));
        System.out.println(
"tmp1==tmp2 ? "+(tmp1==tmp2));
        System.out.println(
"tmp1.equals(tmp2) ? "+tmp1.equals(tmp2));
        System.out.println(
"Arrays.equals(tmp1,tmp2) ? "+Arrays.equals(tmp1,tmp2));
        System.out.println(
"arr2==arr4 ? "+(arr2==arr4));
        System.out.println(
"arr2.equals(arr4) ? "+arr2.equals(arr4));
        System.out.println(
"Arrays.equals(arr2,arr4) ? "+Arrays.equals(arr2,arr4));
        
    }
 
}


运行结果:
通过tmp1取出数组值:1 2 3 4 5
通过tmp2取出数组值:1 2 3 4 5

通过tmp1取出数组值:1 2 9 4 5
通过tmp2取出数组值:1 2 9 4 5
使用tmp3取出arr2中的元素:1 2 3 4 5
使用tmp3取出arr3中的元素:5 6 7 8 9 10 11
arr1==arr2 ? false
arr1.equals(arr2) ? false
Arrays.equals(arr1,arr2) ? false
tmp1==tmp2 ? true
tmp1.equals(tmp2) ? true
Arrays.equals(tmp1,tmp2) ? true
arr2==arr4 ? false
arr2.equals(arr4) ? false
Arrays.equals(arr2,arr4) ? true


小结:
1、=号仅仅是数据对象在内存中的引用而已;
2、equals和==都是比较是不是引用自同一个对象,不是比较值的;
3、比较值应该用Arrays.equals()方法,如果是多维数组要用Array.deepEquals()方法;

先就这个多,算是把 equals和==在心里有比较明确的认识了,本人很菜,如果有不对的地方请大家多指教,如果有补充的欢迎大家补充!共同学习,一起进步!




分享到:
评论
2 楼 bulargy 2008-04-06  
呵呵,兄台说的即是。
当时写的时候感觉还是很菜的。其实后来读过源码之后发现对象不同,起所用的equals()方法具体的实现也是不大一样的。所以还是要具体问题具体分析。
例如Object对象的equals()实际上就是:
public boolean equals(Object obj) {
    return (this == obj);
}


而String的equals()则做了很多额外的工作:
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = offset;
            int j = anotherString.offset;
            while (n-- != 0) {
            if (v1[i++] != v2[j++])
                return false;
            }
            return true;
        }
     }
     return false;
}
1 楼 senbao18 2008-04-06  
equals返回的是具体的在内存的hashMap表,APi里有定义的他的具体返回的类型,当然equals不是有空指针异常吗

相关推荐

    java equals和==的区别详解

    在测试程序中,`object1` 和 `object2` 是不同的实例,所以`object1.equals(object2)` 返回`false`,而`object1 == object2` 也返回`false`。 总之,理解和正确使用`equals()` 和 `==` 是Java编程中的基础,这有助...

    java代码-== equals测试

    在Java编程语言中,`==` 和 `equals()` 是两种常用的比较操作符,但它们的用法和含义有所不同。本文将深入探讨这两个概念,并通过实际的代码示例进行测试和解释。 首先,`==` 操作符用于基本类型(如 int、char、...

    winform 重写Equals源码

    此外,`Equals`和`GetHashCode`应满足以下契约: - 如果`a.Equals(b)`为`true`,那么`a.GetHashCode()`和`b.GetHashCode()`应该相同。 - 如果`a.Equals(b)`为`false`,那么`a.GetHashCode()`和`b.GetHashCode()`...

    equals方法的重写.docx

    1. **`equals`方法和`hashCode`方法应保持一致性**:如果两个对象根据`equals`方法是相等的,那么它们的`hashCode`也应该是相等的。这是因为某些集合框架(如`HashMap`)会使用`hashCode`来定位元素,而使用`equals`...

    方法重写equals和多态

    `TestPerson.java`可能包含了对`Person`类以及其子类的测试代码,验证`equals()`方法的正确性和多态性的应用。 总结,"方法重写equals"是为了比较对象的内容,而"多态"则是面向对象编程中的重要特性,允许我们以一...

    ==代替Object#equals() - 加速在容器类中搜索元素速度的可能性

    3. 传递性:对于任何非null的引用x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应返回true。 4. 一致性:对于任何非null的引用x和y,只要对象的字段不变,多次调用x.equals(y)应该...

    广工2015编译原理实验报告

    例如下面的测试代码展示了如何使用新增的保留字和运算符: ```plaintext PROGRAME01; VAR A, B, C; BEGIN READ(A); READ(B); IF A &lt;&gt; B THEN IF B &gt; 10 THEN WRITE('B is greater than 10'); ELSE WRITE('B ...

    C#中的Equals、RefrenceEquals和==的区别与联系

    最后,我们通过给出的测试代码可以进一步了解这些方法和运算符在实际代码中的应用。通过不同的方式调用这些方法和运算符,我们可以看到不同情况下的比较结果。例如,对于字符串对象,由于它们被优化为相同的实例,...

    Java中的equals()和hashCode()契约Ja

    - 测试`equals()`和`hashCode()`的正确性,可以使用JUnit的EqualsTester类或自定义测试用例。 总之,`equals()`和`hashCode()`是Java中不可或缺的方法,它们对于对象的比较和哈希表操作起着核心作用。理解并正确...

    lua单元测试框架测试用例实例

    Busted是一个流行的Lua单元测试框架,它提供了简洁的语法和丰富的功能,使得编写和运行测试用例变得简单易行。Busted的主要特点包括: 1. **断言库**:Busted提供了一套丰富的断言函数,如`assert.is_true`,`...

    Java中==符号与equals()的使用详解(测试两个变量是否相等)

    Java中==符号与equals()的使用详解是Java程序中的一个重要概念,它们都是用来测试两个变量是否相等的,但是它们的使用方法和应用场景是不同的。下面我们将详细介绍Java中==符号与equals()的使用详解。 一、使用==...

    关于Object中equals方法和hashCode方法判断的分析

    "关于Object中equals方法和hashCode方法判断的分析" 在 Java 中,Object 类提供了两个重要的方法:equals 方法和 hashCode 方法。这两个方法都是用于比较两个对象是否相等的,但它们的实现机理和作用域却有所不同。...

    中科大软院软件系统测试实验报告2--白盒测试

    经过详细的测试和分析,“人民币数字大写转换程序”整体上能够满足设计要求,但仍需进一步改进和完善,特别是在处理边缘案例和异常情况方面。 #### 附录 由于篇幅限制,这里未提供详细的测试用例及测试结果。如有...

    java 基础之(equals hashcode)

    在 `EqualsTest.java` 文件中,我们可以预期会找到一个测试类,该类可能包含对 `equals()` 和 `hashCode()` 方法的实现和测试。测试通常会使用 `assertEquals()` 来验证 `equals()` 和 `hashCode()` 方法的正确性,...

    一文教会你:如何使用 HttpRunner v4.0 开展性能测试!

    # API1 和 API2 的测试步骤 - name: transaction 1 end transaction: name: tran1 type: end ``` 值得注意的是,HttpRunner v4.0 在性能测试时会默认创建一个名为 `Action` 的事务,该事务包含了整个测试用例...

    关于等号的问题

    但是,.equals 方法的实现却存在一些问题和限制。本文将对 equals 方法的重要性、规范和实现进行详细的分析。 equals 方法的重要性毋须多言,只要你想比较两个对象是不是同一对象,你就应该实现 equals 方法,让...

    equals:用于测试的模糊相等对象,是Mock.Any的更严格版本

    Equals允许您在测试期间在python对象之间声明某些相等约束。 有时我们不想断言绝对相等,例如,我们需要确保两个列表具有相同的元素,但不关心顺序。 这是专门为和使用而设计的。 与Mock搭配使用: from mock ...

    2024秋招java开发、测试开发最全八股文

    综合上述内容,对于2024年秋季招聘的Java开发者和测试开发者,应具备扎实的Java基础知识,包括面向对象设计、异常处理、集合框架等,了解数据库管理和测试自动化,以及具备一定的实际项目经验,能够有效地解决问题并...

    南邮软件工程实验 Junit测试

    南邮软件工程实验 Junit测试 在软件工程领域中,单元测试是一个...本实验为软件工程领域中的单元测试提供了一个实践示例,展示了Junit的使用方法和单元测试的基本概念,并为后续的软件开发和测试提供了有价值的经验。

Global site tag (gtag.js) - Google Analytics