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

奇怪的HashSet 和变换后的TreeSet

阅读更多

HashSet ,作为Set集合的一个实现类,很多书中写到Set中不能存放重复的元素。事实上并非如此。看下面的一个简短的例子

import java.util.*;
class AddObject {
	int hashCode;

	public AddObject(int hashCode) {

		this.hashCode = hashCode;
	}

	public int hashCode() {
		return hashCode;
	}
}

public class TestHashSet {
	public static void main(String args[]) {
		// set在存储数据时需要遍历之前所存放的数据(hashCode与内存地址),用于与当前所要添加的元素进行对比。若得出结果相等,
		// 则不添加。比较的方法是:首先比较两个对象的hashCode,如果不相等,则直接添加;否则,再用equals()(比较地址)
		// 方法进行比较,如果结果返回为true,则不添加;否则,添加
		Set<AddObject> set = new HashSet<AddObject>();
		// 设置初始hashCode值
		AddObject ao = new AddObject(2);
		// 第一次添加
		set.add(ao);
		// 重新设置hashCode
		ao.hashCode = 3;
		// 再次添加
		set.add(ao);
		System.out.println(set.size());
		// 输出结果显然是2。但两次添加的对象显然是同一个对象,所以Set中不能存放重复的元素这一说法是不完善的

	}
}

 TreeSet:一个有序的Set(一般为升序)·,它是通过compareTo()这个函数来判断所添加的数据是否已经存在和排序

import java.util.*;

class A implements Comparable {
	public int compareTo(Object o) {
		// 返回值为0时,表示两个对象相等不可以添加;否则添加成功
		return 1;

	}

}

public class TestTreeSet {

	public static void main(String[] args) {

		TreeSet<A> ts = new TreeSet<A>();

		A a = new A();

		A b = new A();
		// 进行添加时,调用compareTo()方法进行比较。一来判断是否重复;二来,是为了排序
		ts.add(a);
		ts.add(b);

		System.out.println(ts.size());

	}

}

 

分享到:
评论
3 楼 zwnash 2014-10-14  
  
2 楼 crab1 2012-03-03  
xieyongwei 写道
第一个例子里面 ao的hascode变了,是否还可以认为是同一个对象?


当然是同一个对象。在例子里面,只是单纯的重写了hashCode()这个方法,而对象根本就没有改变,代码中只创建了一个对象,所以只是它的hashCode变了,而表征地址的identityHashCode()方法的返回值至始至终都没有发生变化。
1 楼 xieyongwei 2012-03-03  
第一个例子里面 ao的hascode变了,是否还可以认为是同一个对象?

相关推荐

    排序之HashSet和TreeSet的区别

    在Java编程语言中,集合框架是处理数据的重要组成部分,其中`HashSet`和`TreeSet`是两种常用的Set接口实现类。它们各自具有独特的特性和用途,理解它们的区别对于编写高效且正确的代码至关重要。 首先,`HashSet`是...

    HashSet和TreeSet_围墙之外

    HashSet和TreeSet是Java集合框架中的两种重要数据结构,它们都是Set接口的实现类,用于存储不重复的元素。在编程实践中,理解它们的区别和应用场景至关重要。 HashSet是基于HashMap实现的,它不保证元素的顺序,...

    HashSet和TreeSet.doc

    HashSet 和 TreeSet 是 Java 中两种常用的 Set 集合实现,它们都继承自 Set 接口,但实现方式和特性上存在显著差异。 首先,HashSet 是基于哈希表(HashMap 实例)来存储元素的,因此它提供了快速的插入、删除和...

    HashSet和TreeSet使用方法的区别解析

    HashSet和TreeSet使用方法的区别解析 HashSet和TreeSet都是Java集合框架中的Set接口实现,用于存储不重复的元素。但是,它们在使用方法和实现机理上有很大的区别。 首先,从使用方法上讲,HashSet和TreeSet都可以...

    HashSet,TreeSet和LinkedHashSet的区别1

    本文主要探讨了三种基于Set接口的实现类:HashSet、LinkedHashSet和TreeSet,它们各自有不同的特性和使用场景。 首先,HashSet是最基础的Set实现,它不保证元素的特定顺序,也不保证在多次操作后保持元素的顺序不变...

    详解Java中HashSet和TreeSet的区别

    Java HashSet 和 TreeSet 的区别详解 HashSet 和 TreeSet 是 Java 中两个常用的集合类,它们都实现了 Set 接口,但它们之间有很大的区别。本文将详细介绍 HashSet 和 TreeSet 的区别,帮助大家更好地理解和使用这些...

    treemap treeset hashset hashmap 简要介绍

    在Java编程语言中,集合框架提供了多种数据结构来存储和操作数据,其中`TreeMap`、`TreeSet`、`HashSet`以及`HashMap`是最常用的数据结构之一。这些集合类各自有着独特的特性和应用场景,下面将对它们进行详细介绍。...

    java 中HashMap、HashSet、TreeMap、TreeSet判断元素相同的几种方法比较

    在Java编程中,HashMap、HashSet、TreeMap和TreeSet是四种常见的集合类,它们各自有特定的用途和内部实现机制。这些数据结构用于存储和管理数据,其中HashMap和HashSet是基于哈希表实现的,而TreeMap和TreeSet则是...

    day18-集合-中(HashSet&TreeSet&比较器).zip

    在Java编程语言中,集合框架是处理对象组的重要工具,其中`HashSet`和`TreeSet`是两种常见的接口实现类,分别提供了不同的功能和性能特性。本教程将深入探讨这两个集合类以及它们与比较器(Comparator)的关系。 ...

    Java—Set集合详解(HashSet/LinkedHashSet/TreeSet/EnumSet)

    Set集合在Java编程中扮演着重要的角色,它是一种不允许元素重复的...在处理自定义对象时,确保正确地重写`equals()`和`hashCode()`方法至关重要,因为这是判断对象是否相等的标准,特别是在使用HashSet和TreeSet时。

    HashMap与HashTable和HashSet的区别

    ### HashMap与HashTable和HashSet的区别 #### 一、概述 在Java集合框架中,`HashMap`, `HashTable` 和 `HashSet` 是三个重要的数据结构,它们分别实现了`Map`接口和`Set`接口,提供了不同的功能来满足不同的编程...

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    比较遗憾的是,TreeSet 虽然实现起来也比较简单,但它有着和 HashSet 一样的问题,会自动排序 5:LinkedHashSet去重(有序) 从代码和执行结果可以看出,LinkedHashSet 是到目前为止,实现比较简单,且最终生成的新...

    java 集合框架(TreeSet练习)

    `TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且支持高效的查找、插入和删除操作。 首先,`TreeSet`的特性包括: 1. **有序性**:`TreeSet`中的元素会...

    HashSet的实现原理

    3. 带有初始容量和加载因子参数的构造函数:这种构造函数允许用户指定一个初始容量和加载因子来创建HashSet实例。这在存储大量元素时特别有用,因为它可以减少HashMap的扩容次数,从而提高性能。 4. 只带有一个初始...

    HashSet详解和使用示例_动力节点Java学院整理

    - **指定初始容量和加载因子的构造函数**:`HashSet(int initialCapacity, float loadFactor)` 设置初始容量和加载因子,用于控制HashMap何时进行扩容。 ### HashSet的主要API - `add(E object)`:将指定的元素添加...

    hashset类的使用

    在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而广泛应用。然而,需要注意的是,由于HashSet的无序性,元素插入顺序并不会被保留。如果需要一个有序集合,可以考虑使用LinkedHashSet...

    金陵科技学院软件工程学院大二上Java高级1203Set.docx

    本例中,我们探讨了两种实现`Set`接口的类:`HashSet`和`TreeSet`,以及如何使用它们的一些基本操作。 首先,我们看`HashSet`的使用。`HashSet`是一个不保证元素顺序的集合,它根据元素的`hashCode`值来存储和检索...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    1.HashSet和HashMap遍历.md

    自己写的例子,关于HashSet遍历和HashMap遍历的. 感谢大家参考

Global site tag (gtag.js) - Google Analytics