`
xiao1zhao2
  • 浏览: 38983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java集合框架:HashSet<E>

阅读更多

目录

1.无序&&唯一
2.真的唯一么?
3.先入为主
4.Set的其他实现类

 

HashSet实现了Set接口,内部主要是通过HashMap实现的.

 

1.无序&&唯一
public class HashSetDemo1 {

	public static void main(String[] args) {
		HashSet<String> set = new HashSet<>();
		String[] str = new String[] { "collection", "list", "set", "itaretor", "map", "set" };
		Collections.addAll(set, str);
		System.out.println(set);
	}
}

运行结果:[set, itaretor, collection, list, map]

可以看到,set的打印顺序与数组str不同,且重复"set"只能存储一次,那么HashSet是如何判断两个对象是否是同一个对象的呢?

 

2.真的唯一么?

在HashMap内部对于是否是同一个对象是这样判断的:

(p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))));

与三个条件有关:1st.判断hash;2nd.判断==;3rd.调用equals(),即如果(1st && (2nd || 3rd))满足true,则视为对象.可见HashSet内元素的唯一并非真正意义上的唯一,而是取决于如何定义hashCode()和equals()方法.下面依次进行验证.

1)判断hashCode()

public class HashSetDemo2 {

	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<>();
		Person p1 = new Person("小明");
		Person p2 = new Person("小明");
		set.add(p1);
		set.add(p2);
		System.out.println(set.size());
	}
}

class Person {
	String name;

	public Person(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		int code = super.hashCode();
		System.out.println("hashCode被执行:" + code);
		return code;
	}
}

运行结果:
hashCode被执行:366712642
hashCode被执行:1829164700
2
由结果可知hashCode()方法被执行,由于hash值不同,p2可以添加到set中.注意:不要在添加元素之后尝试修改HashSet当中参与生成hash值的属性,否则hash值的改变会导致很多问题.

2)判断"=="

当hashCode相等时,会通过==判断两个对象是否是同一个对象,如果是同一个将不会再进行equals判断(短路||).

public class HashSetDemo2 {

	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<>();
		Person p1 = new Person("小明");
		set.add(p1);
		set.add(p1);
		System.out.println(set.size());
	}
}

class Person {
	String name;

	public Person(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		System.out.println("hashCode被执行");
		return 1;
	}

	@Override
	public boolean equals(Object o) {
		System.out.println("equals被执行");
		return true;
	}
}

运行结果:
hashCode被执行
hashCode被执行
1
注意,此段代码中的equals()未被调用.

3)调用equals判断

当两个对象hashCode相等但又不是同一个对象,将调用equals方法再次进行判断:如果true则视为同一个对象,否则视为两个对象(hash值冲突).

public class HashSetDemo2 {

	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<>();
		Person p1 = new Person("小明");
		Person p2 = new Person("小明");
		set.add(p1);
		set.add(p2);
		System.out.println(set.size());
	}
}

class Person {
	String name;

	public Person(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		System.out.println("hashCode被执行");
		return 1;
	}

	@Override
	public boolean equals(Object o) {
		System.out.println("equals被执行");
		return false;
	}
}

运行结果:
hashCode被执行
hashCode被执行
equals被执行
2
如果上面equals返回true,则打印出的set.size()为1.

 

3.先入为主

HashSet在添加元素时,如果认定了重复元素,HashSet将遵循先入为主的原则,直接舍弃新元素.例:

public class HashSetDemo3 {

	public static void main(String[] args) {
		HashSet<Person> set = new HashSet<>();
		Person p1 = new Person("小明");
		Person p2 = new Person("小红");
		set.add(p1);
		set.add(p2);
		System.out.println(set);
	}
}

class Person {
	String name;

	public Person(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		return 1;
	}

	@Override
	public boolean equals(Object o) {
		return true;
	}

	@Override
	public String toString() {
		return name;
	}
}

运行结果:[小明]

 

4.Set的其他实现类

1)TreeSet
内部通过二叉树结构存储数据,排序存储,可在构造时自定义Comparator按指定规则存储.

1
0
分享到:
评论

相关推荐

    求2个集合的交集

    HashSet(IEnumerable&lt;T&gt; collection,IEqualityComparer&lt;T&gt; comparer) 使用指定的比较器实例化数据,且将指定集合中的元素复制到集合中。 因为HashSet&lt;T&gt;是专门设计来做集合运算的,因此它提供的方法中有不少是和...

    Java测试题2答案

    DEF&lt;br&gt;A notify()&lt;br&gt;B wait()&lt;br&gt;C notifyAll()&lt;br&gt;D sleep()&lt;br&gt;E.yield()&lt;br&gt;F.synchronized(this)&lt;br&gt;7.构造BufferedInputStream的合适参数是哪个? AC&lt;br&gt;A BufferedInputStream&lt;br&gt;B BufferedOutputStream&lt;br&gt;...

    Java JDK实例宝典

    &lt;br&gt;第1章 Java基础 &lt;br&gt;1.1 转换基本数据类型 &lt;br&gt;1.2 Java的运算符 &lt;br&gt;1.3 控制程序的流程 &lt;br&gt;1.4 计算阶乘 &lt;br&gt;1.5 实现命令行程序 &lt;br&gt;第2章 Java面向对象程序设计 &lt;br&gt;2. 1 复数类 &lt;br&gt;2. 2 equals.chashCode...

    ibatis 开发指南(pdf)

    在&lt;br&gt;CLASSPATH 中新建log4j.properties 配置文件,内容如下:&lt;br&gt;log4j.rootLogger=DEBUG, stdout &lt;br&gt;log4j.appender.stdout=org.apache.log4j.ConsoleAppender &lt;br&gt;log4j.appender.stdout.layout=org.apache.log...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    达内企业面试题集

    达内企业面试题集,掌握好这些就很不容易。

    奇异性:用于高性能应用的极快的ioc容器

    奇点产品特点极高的性能,奇点是最快的依赖注入容器之一,即使不是最快的依赖... 馆藏支持: IEnumerable&lt;T&gt; IReadOnlyCollection&lt;T&gt; IReadOnlyList&lt;T&gt; T[] List&lt;T&gt; ICollection&lt;T&gt; IList&lt;T&gt; HashSet&lt;T&gt; ISet&lt;T&gt; 支持开

    JDK1.7 32位

    Set&lt;String&gt; set = new HashSet&lt;String&gt;(); set.add("item"); // 创建map接口对象 Map&lt;String, Integer&gt; map = new HashMap&lt;String, Integer&gt;(); map.put("item", 1); int val = map.get("item");12345678910111213...

    Java语言程序设计进阶篇编程题22.1

    public class Exercise22_1 { public static void main(String[] args) { HashSet&lt;String&gt; set1 = new HashSet&lt;String&gt;();

    borrow-complex-key-example:一个有效的Rust示例,说明如何实现复杂密钥的借用

    示例:实现复杂键的借用 该存储库包含一个有效的Rust示例,该示例说明了如何以素养的编程风格编写针对非... 如何使用BorrowedKey实例对HashSet&lt;OwnedKey&gt;或BTreeSet&lt;OwnedKey&gt;进行查找? 前往进行查找! 执照 CC0: :

    java语言中使用的类总结

    系统总结了 1.Date类 2.Calendar类 3.Math类与Biglnteger类 ...5.HashSet&lt;E&gt;泛型类 6.HashMap&lt;K,V&gt;泛型类 7.TreeSet&lt;E&gt;泛型类 8.TreeMap&lt;K,V&gt;泛型类 9.Stack&lt;E&gt;泛型类 等方面的含义用法和范例。。。

    通过实例学习Java集合框架HashSet

    主要介绍了通过实例学习Java集合框架HashSet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java集合框架详解

    Java集合框架详解非扫描,由网上博客整理而成。对hashmap和hashset进行了比较深入的讲解。

    SimpleHashSet:为您节省 25% 的内存

    dependency&gt; &lt; groupId&gt;in.srain.cube&lt;/ groupId&gt; &lt; artifactId&gt;simple-hashset&lt;/ artifactId&gt; &lt; type&gt;jar&lt;/ type&gt; &lt; version&gt;1.0.1&lt;/ version&gt;&lt;/ dependency&gt; 等级: compile 'in.srain.cube:simple-hashset:...

    Linq基础学习资料,通俗易懂

    3.9 HashSet&lt;T&gt; 9 4 System.Linq 10 4.1 System.Linq.Enumerable 10 4.2 System.Linq.Queryable 10 4.3 System.Linq.Lookup &lt;TKey,TElement&gt; 10 4.4 System.Linq.Expressions.Expression 10 5 接口 10 5.1 ...

    【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    ava基础 基础知识 面向对象基础 Java基本数据类型 string和包装类 final关键字特性 Java类和包 抽象类和接口 ...Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb

    Java集合框架源码剖析:HashSet 和 HashMap

     之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也是说HashSet里面有一个HashMap(适配器模式)。因此本文将重点分析HashMap。  HashMap实现了Map...

    ssh多条件查询

    Set&lt;FinancialProduct&gt; sets=new HashSet&lt;FinancialProduct&gt;(); StringBuffer hql=new StringBuffer(); hql.append("from FinancialProduct fp where 1=1"); if(f.getProductType()!=null){ hql.append(...

    java高手的文章合集

    java高手的文章合集&lt;br&gt;&lt;br&gt;由HashSet谈重用.pdf&lt;br&gt;教你建立简单JDBC程序.pdf&lt;br&gt;Collections Framework中的算法(之一)――综述.pdf&lt;br&gt;JDBC-ODBC使用Excel作数据源.pdf&lt;br&gt;&lt;br&gt;......................

Global site tag (gtag.js) - Google Analytics