1.Set接口概述

       Set 不保存重复的元素(如何判断元素相同呢?)。如果你试图将相同对象的多个实例添加到Set中,那么它就会阻止这种重复现象。 Set中最常被使用的是测试归属性,你可以很容易地询问某个对象是否在某个Set中。 正因如此,查找就成为了Set中最重要的操作,因此你通常都会选择一个HashSet 的实现,它专门对快速查找进行了优化。

Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为)。Set 是基于对象的值来确定归属性的。

java.util Interface Set<E>

参数类型 E  : 由此集合维护的元素的类型
所有超类接口:Collection <E>, Iterable <E>
所有子类接口:NavigableSet <E>, SortedSet <E>

所有已知实现类: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet ,  HashSet , JobStateReasons ,LinkedHashSet,TreeSet


2.Set常用实现类

(1)HashSet

HashSet继承AbstractSet类,实现Set、Cloneable、Serializable接口。由哈希表支持(实际上是一个HashMap实例,基于

HashMap来实现的,底层采用HashMap来保存元素。),天生就是为了提高查找效率的。

                

构造方法

所有方法

(2)TreeSet

TreeSet 继承AbstractSet类,实现NavigableSet、Cloneable、Serializable接口。与HashSet是基于HashMap实现一样,TreeSet 同样是基于TreeMap 实现的。由于得到Tree 的支持,TreeSet 最大特点在于排序,它的作用是提供有序的Set集合。

参数类型
      E - 由此集合维护的元素的类型
All Implemented Interfaces(实现接口):
     Serializable ,Cloneable ,Iterable <E>,Collection <E>,NavigableSet <E>
    Set <E>  SortedSet <E>

构造方法

常用方法

(3)LinkedHashSet

      LinkedHashSet 综合了链表+哈希表,根据元素的hashCode值来决定元素的存储位置,它同时使用链表维护元素的次序。

当遍历该集合时候,LinkedHashSet 将会以元素的添加顺序访问集合的元素。

对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。

public class LinkedHashSet<E> extends

HashSet<E> implements Set<E>,Cloneable,Serializable

参数类型E ---由此集合维护的元素的类型
All Implemented Interfaces(实现接口):
Serializable , Cloneable , Iterable <E>, Collection <E>, Set <E>              

构造方法

方法(基本都是继承方法)

3.set演示

(1)HashSet

 public class HashSetDemo {

 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {

 		//1,创建一个Set容器对象。
 		Set set = new HashSet();//如果该成LinkedHashSet,可实现有序。

 		//2,添加元素。
 		set.add("abc");
 		set.add("nba");
 		set.add("heihei");
 		set.add("haha");
 		set.add("heihei");

 		//3,只能用迭代器取出。
 		for (Iterator it = set.iterator(); it.hasNext();) {
 			System.out.println(it.next());
 		}

 	}

 }
 

(2)TreeSet

 public class TreeSetDemo2 {

 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {

 		//初始化TreeSet集合明确一个比较器。
 		Set set = new TreeSet(new ComparatorByName());

 		set.add(new Student("xiaoqiang",20));
 		set.add(new Student("daniu",24));
 		set.add(new Student("xiaoming",22));
 		set.add(new Student("tudou",18));
 		set.add(new Student("daming",22));
 		set.add(new Student("dahuang",19));

 		for (Iterator it = set.iterator(); it.hasNext();) {
 			Student stu = (Student)it.next();
 			System.out.println(stu.getName()+"::"+stu.getAge());
 		}
 	}

 }
 /**/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  * 自定义一个比较器,用来对学生对象按照姓名进行排序。
  * @author Administrator
  *
  */
 public class ComparatorByName extends Object implements Comparator {

 	@Override
 	public int compare(Object o1, Object o2) {

 		Student s1 = (Student)o1;
 		Student s2 = (Student)o2;

 		int temp = s1.getName().compareTo(s2.getName());

 		return temp==0?s1.getAge()-s2.getAge():temp;
 	}

 }
 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 public class Student implements Comparable {

 	private String name;
 	private int age;

 	public Student() {
 		super();

 	}
 	public Student(String name, int age) {
 		super();
 		this.name = name;
 		this.age = age;
 	}

 	/**
 	 *  覆盖hashCode方法。根据对象自身的特点定义哈希值。
 	 */
 	public int hashCode(){
 		final int NUMBER = 37;
 		return name.hashCode() + age*NUMBER;
 	}

 	/**
 	 * 需要定义对象自身判断内容相同的依据。覆盖equals方法。
 	 *
 	 */
 	public boolean equals(Object obj){

 		if(this == obj){
 			return true;
 		}

 		if(!(obj instanceof Student)){
 			throw new ClassCastException("类型错误");
 		}

 		Student stu = (Student)obj;

 		return this.name.equals(stu.name)&& this.age == stu.age;
 	}

 	public String getName() {
 		return name;
 	}
 	public void setName(String name) {
 		this.name = name;
 	}
 	public int getAge() {
 		return age;
 	}
 	public void setAge(int age) {
 		this.age = age;
 	}
 	@Override
 	public String toString() {
 		return "Student [name=" + name + ", age=" + age + "]";
 	}
 	/**
 	 * 学生就具备了比较功能。该功能是自然排序使用的方法。
 	 * 自然排序就年龄的升序排序为主。
 	 */
 	@Override
 	public int compareTo(Object o) {

 		Student stu = (Student)o;
 //		System.out.println(this.name+":"+this.age+"........"+stu.name+":"+stu.age);
 		/*
 		if(this.age>stu.age)
 			return 1;
 		if(this.age<stu.age)
 			return -1;
 		return 0;
 		*/

 		/*
 		 * 既然是同姓名同年龄是同一个人,视为重复元素,要判断的要素有两个。
 		 * 既然是按照年龄进行排序。所以先判断年龄。在判断姓名。
 		 */
 		int temp = this.age - stu.age;

 		return temp==0?this.name.compareTo(stu.name):temp;

 	}

 }
 

2018-01-05

内容来自API1.8、Java编程思想、传智播客课程

Java容器---Set: HashSet & TreeSet & LinkedHashSet的更多相关文章

  1. Set集合[HashSet,TreeSet,LinkedHashSet],Map集合[HashMap,HashTable,TreeMap]

    ------------ Set ------------------- 有序: 根据添加元素顺序判定, 如果输出的结果和添加元素顺序是一样 无序: 根据添加元素顺序判定,如果输出的结果和添加元素的顺 ...

  2. Leetcode: LFU Cache && Summary of various Sets: HashSet, TreeSet, LinkedHashSet

    Design and implement a data structure for Least Frequently Used (LFU) cache. It should support the f ...

  3. Java集合之HashSet/TreeSet原理

    Set集合 1.HashSet  只去重复, 没有顺序  HashSet的add方法会调用hashCode和equals, 所以存储在HashSet中的对象需要重写这两个方法. 2.TreeSet   ...

  4. java容器---集合总结

    思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定 ...

  5. 复习java基础第三天(集合:Collection、Set、HashSet、LinkedHashSet、TreeSet)

    一.Collection常用的方法: Java 集合可分为 Set.List 和 Map 三种体系: Set:无序.不可重复的集合. List:有序,可重复的集合. Map:具有映射关系的集合. Co ...

  6. Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  7. Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别

    本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...

  8. Java中的集合HashSet、LinkedHashSet、TreeSet和EnumSet(二)

    Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合于Collection基本上完全一样,它没有提供任何额外的方法. Se ...

  9. Java自学-集合框架 HashSet、LinkedHashSet、TreeSet之间的区别

    HashSet. LinkedHashSet.TreeSet之间的区别 步骤 1 : HashSet LinkedHashSet TreeSet HashSet: 无序 LinkedHashSet: ...

随机推荐

  1. HEOI 2017 游记

    HEOI2017也算是落下帷幕了,那就写一篇 流水账 游记好了. DAY 0 又是熟悉的大学,又是熟悉的机房 YD宾馆的房间依旧破的不行. 晚上在房间颓颓颓....=.= DAY 1 上午去试机,唯一 ...

  2. C/C++:copy control (拷贝控制)

    前言:当定义一个类的时候,我们显示或者隐式地指定在此类型的对象拷贝,移动,赋值,销毁时做些什么,一个类通过定义五种特殊的成员函数来控制这些操作,包括拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值 ...

  3. laravel 获取所有表名

    $tables = DB::connection()->getDoctrineSchemaManager()->listTableNames(); 需要 doctrine/dbal 扩展, ...

  4. Docker应用四:搭建docker镜像仓库(包括自生成https证书、登陆认证)

    利用docker官网提供的registry镜像创建私有仓库 一.首先从docker官网拉取registry镜像: docker pull registry 二.然后运行该镜像: docker run ...

  5. Java基础-字符串(String)常用方法

    Java基础-字符串(String)常用方法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.java的API概念 Java的API(API:Application(应用) Pr ...

  6. 二分算法的应用——Codevs 1766 装果子

    #include<iostream> #include<cstdio> using namespace std; + ; typedef long long LL; LL a[ ...

  7. POJ No 3259 Wormholes Bellman-Ford 判断是否存在负图

    题目:http://poj.org/problem?id=3259 题意:主要就是构造图, 然后判断,是否存在负图,可以回到原点 /* 2 3 3 1 //N, M, W 1 2 2 1 3 4 2 ...

  8. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  9. Web Uploader

    Github上的例子没看太明白,在网上找了些资料自己写了个demo,基本上就是用create方法初始化,然后on一堆事件,上传的进度条用的是swf格式的动画,感觉不是很先进的样子.不过我暂时也没搞明白 ...

  10. JedisCluster实践

    1. Spring中运用JedisCluster http://blog.csdn.net/u010739551/article/details/52438101[spring集成 JedisClus ...