`
兩ting
  • 浏览: 78756 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Set判断重复,==和equals比较详解

阅读更多
set里的元素是不复能重复的,用iterator()方法来区分重与否。

equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。

==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true



equals 方法是 java.lang.Object 类的方法。
有两种用法说明:

一. 对于字符串变量来说,

使用“==”和“equals()”方法比较字符串时,其比较方法不同。

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同。

比如:

String s1,s2,s3 = "abc", s4 ="abc" ;

s1 = new String("abc");

s2 = new String("abc");

那么:

s1==s2 是 false //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,

故不相等。


s1.equals(s2) 是 true //两个变量的所包含的内容是abc,故相等。



注意(1):

如果: StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");

结果: s1.equals(s2) //是false

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,

而Object类中的equals方法是用来比较“地址”的,所以等于false.

注意(2):

对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符

串常量所生成的变量,其中所存放的内存地址是相等的,

所以s3==s4是true(即使没有s3=s4这样一个赋值语句)


二. 对于非字符串变量来说,

      "=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。

比如:

class A

{

A obj1 = new A();

A obj2 = new A();

}

那么:obj1==obj2是false

obj1.equals(obj2)是false

但是如加上这样一句:obj1=obj2;

那么 obj1==obj2 是true

obj1.equals(obj2) 是true

总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较

其指向的对象是否相同的。

== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。





关于equals与==的区别从以下几个方面来说:

(1) 如果是基本类型比较,那么只能用==来比较,不能用equals

比如:
public class TestEquals {
public static void main(String[] args)
{
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}

(2) 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
public class TestEquals {
public static void main(String[] args)
{ Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。

(3) 注意:对于String(字符串)、StringBuffer(线程安全的可变字符序列)、StringBuilder(可变字符序列)这三个类作进一步的说明。
(a)首先,介绍String的用法,请看下面的实例:
public class TestEquals {
public static void main(String[] args) {
String s1 = "123";
String s2 = "123";
String s3 = "abc";
String s4 = new String("123");
String s5 = new String("123");
String s6 = new String("abc");

System.out.println(s1 == s2);//(1)true
System.out.println(s1.equals(s2));//(2)true
System.out.println(s1 == s3);//(3)flase
System.out.println(s1.equals(s3));//(4)flase

System.out.println(s4 == s5);//(5)flase
System.out.println(s4.equals(s5));//(6)true
System.out.println(s4 == s6);//(7)flase
System.out.println(s4.equals(s6));//(8)flase

System.out.println(s1 == s4);//(9)false
System.out.println(s1.equals(s4));//(10)true
}
}

答案解释:s1与s2分别指向由字符串常量”123” 创建的对象,在常量池中,只有一个对象,内容为123,有两个引用s1和s2指向这个对象,故这两个引用变量所指向的地址是相同的,因而(1)处的运行结果为true,又因为s1.equals(s2)是比较s1和s2所指向的对象的内容是否相等,而我们知道这两个对象的内容都是字符串常量”123”,故标记(2)处的运行结果是true。
用同样的方法分析,s1和s3所指向的对象不一样,内容也不一样,故标记(3)和(4)处运行结果是false。
再看看s4和s5,这两个引用变量所指向的对象的内容都是一样的(内容都是123),但是这两个对象是用new操作符创建处类的,是在内存中分配两块空间给这两个对象的,因而这两个对象的内存地址不一样,故事两个不同的对象,标记(5)处的s4 == s5 运行结果为false,但是内容一样,故标记(6)处的s4.equals(s5)运行结果为true。同理,s4和s6所指向的对象地址不同,内容也不相同。故标记(7)(8)处运行结果为false。
s1和s4分别指向两个不同的对象(之所以这样称呼,是因为这两个对象在内存中的地址不相同,故而对象不相同),故标记为(9)处的s1 == s4运行结果为false。



总结:

(1)对字符变量来说:

“==”比较两个变量本身的值,即两个对象在内存中的首地址。

“equals()”比较字符串中所包含的内容是否相同

      (  StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,而Object类中的equals方法是用来比较“地址”的;

       String类中定义重新定义了equals这个方法,比较的是“值”不是“地址”。)

(2)对非字符变量来说:

  "=="和"equals"方法的作用是相同的,都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
分享到:
评论

相关推荐

    set接口经常用的hashCode和equals方法详解

    ### set接口中hashCode和equals方法详解 #### 一、引言 在Java编程语言中,`Set`接口作为集合框架的重要组成部分,在实现无重复元素的数据结构方面扮演着关键角色。为了确保元素的唯一性,`Set`接口依赖于对象的`...

    java中hashcode()和equals()和==的详解

    有许多人学了很长时间的Java,但一直不明白hashCode方法的作用以及equals()和==的区别,我来解释一下吧。首先,想要明白hashCode的作用,你必须要先知道Java中的集合。总的来说,Java中的集合(Collection)有两类,...

    hashcode和equals的分析

    ### hashCode和equals方法详解 #### 一、hashCode方法解析 在深入探讨`hashCode`方法之前,我们需要了解Java集合框架的基本概念。Java集合框架主要包括两大类集合:`List`和`Set`。 - **List**:这是一个有序集合...

    java中set接口使用方法详解

    当向HashSet中添加元素时,元素的`hashCode()`和`equals()`方法会被调用来判断是否已经存在相同元素。如果两个对象的`hashCode()`相等并且`equals()`返回true,那么它们被视为同一个对象,HashSet将不会存储重复的...

    Java软件开发实战 Java基础与案例开发详解 11-3 Set接口实现类 共19页.pdf

    ### Java软件开发实战:Java基础与案例开发详解 #### 11-3 Set接口实现类 在Java集合框架中,`Set`接口是`Collection`接口的子接口,它不允许包含重复元素。本文将详细介绍`Set`接口及其三种主要实现类:`HashSet`...

    List Set Map以及子类的比较 .docx

    如果有,就再调用 equals 方法,和 Hash 代码相同的元素比较,元素是否相同。 在选择集合类时,需要考虑集合的特点和性能。ArrayList 适合大量查询的场合,LinkedList 适合大量增删改的场合。HashSet 适合快速查询...

    Java集合Collection、List、Set、Map使用详解

    ### Java集合Collection、List、Set、Map使用详解 #### 集合框架概述 ##### 容器简介 在Java编程中,容器(Container)的概念至关重要。容器是用来存储和管理对象的一种方式,它允许程序员高效地处理大量数据。...

    Map、Set、Iterator迭代详解

    为了实现这个特性,`Set`中的每个元素都必须重写`equals()`和`hashCode()`方法。 #### 2. Set接口的实现类 `Set`接口有几个重要的实现类,包括: - **HashSet**: 基于哈希表实现的`Set`,不保证元素的顺序。 - **...

    set-collections-map

    ### Java中的Set与Map集合详解 #### 一、Set系列集合概述 Set接口是`java.util.Collection`框架的一部分,它代表一个不允许重复元素的集合。Set接口的主要特点是它不包含重复元素,即Set中不能有两个相同的对象。...

    HashSet去重

    为了确保`HashSet`正确地识别重复元素,用户自定义的类必须重写`equals`和`hashCode`方法,以保证逻辑一致性。此外,`HashSet`不仅在去重方面表现出色,还在性能上具有明显优势,特别是在处理大数据量的情况下。

    java集合——Java中的equals和hashCode方法详解

    在Java编程语言中,`equals()` 和 `...总的来说,`equals()` 和 `hashCode()` 方法在Java集合框架中扮演着核心角色,它们共同确保了对象的比较和查找效率。理解和正确使用这两个方法是编写高效、健壮的Java代码的关键。

    Java集合排序及java集合类详解(Collection、List、Map、Set

    为了确保`HashMap`的正确性,键对象需要正确覆写`hashCode()`和`equals()`方法。 ### 1.5 Set `Set`是不允许重复元素的`Collection`,通常用于需要唯一性保证的场景。 #### 1.5.1 概述 `HashSet`是最常用的`Set`...

    Java应用:两种Java容器类List和Set分析

    ### Java应用:两种Java容器类List和Set分析 #### 一、概述 在Java编程语言中,集合框架(Collections Framework)是处理数据的核心组件之一,它提供了存储和操作对象的各种方式。本文将深入探讨Java中的两种重要...

    Java集合类详解总结

    `Set`集合通过`equals()`方法和`hashCode()`方法确保元素的唯一性,因此向`Set`中添加元素时,元素类必须正确实现这两个方法。 #### Map的键值对映射 `Map`通过键(Key)来定位值(Value),键是唯一的。`HashMap`...

    Java 容器类源码详解 Set

    Set 表示由无重复对象组成的集合,在一个 Set 中,不能有两个引用指向同一个对象,或两个指向 null 的引用。如果对象 a 和 b 的引用满足条件 a.equals(b),那么这两个对象也不能同时出现在集合中。 Set 的具体实现...

    探索Java中的equals()和hashCode()方法_动力节点Java学院整理

    Java中的equals()和hashCode()方法详解 Java中的equals()和hashCode()方法是两个重要的方法,它们都是从Object类中继承过来的。equals()方法用于比较两个对象的值是否相等,而hashCode()方法用于计算对象的哈希码。...

    Java集合排序及java集合类详解(Collection、List、Map、Set).pdf

    这个框架包括了多种类型的接口和实现类,如Collection、List、Set和Map,它们各自有不同的特性和用途。 1. **集合框架概述** - **容器简介**:集合框架是一种数据结构,用于存储和管理对象。它可以视为一个容器,...

    对Java中Set的深入研究.pdf

    Java中的Set接口是基于集合概念实现的,它不包含重复元素。Set接口继承自Collection接口,并提供了多种实现类,如HashSet、LinkedHashSet、TreeSet和CopyOnWriteArraySet等。这些实现类各自有不同的特性和使用场景。...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否相等,而 hashCode() 方法用于生成对象的哈希码,以便在散列集合中...

Global site tag (gtag.js) - Google Analytics