java集合类-Set接口

Set集合

Set集合中的对象不按特定的方式排序,只是简单的把对象放入集合中,但是不能包含重复对象。

Set集合由Set接口和Set接口的实现类组成,Set接口继承与于Collection接口

Set接口的实现类

Set接口常用的实现类有HashSet类和TreeSet类

  • HashSet类实现Set接口,底层实现是哈希表(HashMap)实现的,它不保证Set的迭代顺序,线程不安全,存取速度快
    • LinkedHashSet父类是HashSet,存取有序,元素不能重复
  • TreeSet类不仅实现了Set接口,还实现了SortedSet接口,因此,TreeSet类实现的Set集合在遍历结合时按照自然顺序递增排序,也可以按照指定比较器递增排序

HashSet

哈希表里存放的是哈希值,HashSet存储元素是按照哈希值来存的所以取数据也是按照哈希值取得。

HashSet底层实际上是个HashMap

AbstractCollection->AbstractSet->HashSet

   public HashSet() {

        map = new HashMap<>();

    }

  

哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相同的。hash值实际上是key调用hashCode方法,再通过"hash function"转换成的值

HashSet常用方法和底层实现

    // 添加元素,调用的map的put方法

    public boolean add(E e) {

        return map.put(e, PRESENT)==null;

    }

    // 删除元素,调用map的remove方法

    public boolean remove(Object o) {

        return map.remove(o)==PRESENT;

    }

    // 判断元素是否存在

    public boolean contains(Object o) {

        return map.containsKey(o);

    }

    // 判断set是否为空 

    public boolean isEmpty() {

        return map.isEmpty();

    }

  

TreeSet

TreeSet的底层实现是TreeMap,TreeSet会自动排序,里面的元素都是有序的,根据存储元素实现的Comparable接口,重写compareTo方法来进行排序。当TreeSet的泛型对象不是java的基本类型的包装类时,对象需要重写Comparable#compareTo()方法

AbstractCollection->AbstractSet->TreeSet

    TreeSet treeSet = new TreeSet();

    treeSet.add(10);

    treeSet.add(50);

    treeSet.add(30);

    System.out.println("tree set: "+treeSet);

    // 输出 【10,30,50】

  

如果保存是自定义的类,只要实现Comparable接口就能排序

 class Person implements Comparable {

        String name;

        int age;

        public Person(String name, int age) {

            this.name = name;

            this.age = age;

        }

        @Override

        public int compareTo(Object o) {

            return this.age - ((Person) o).age;

        }

    }

    TreeSet treeSet = new TreeSet();

    treeSet.add(new Person("张三", 12));

    treeSet.add(new Person("李四", 45));

    treeSet.add(new Person("王五", 32));

    Object p = treeSet.last();

    System.out.println("tree set last: " + ((Person) p).name);

    // 得到的最后一个元素是年龄最大的

  

  1. 如果将compareTo()返回值写死为0,元素值每次比较,都认为是相同的元素,这时就不再向TreeSet中插入除第一个外的新元素。所以TreeSet中就只存在插入的第一个元素。
  2. 如果将compareTo()返回值写死为1,元素值每次比较,都认为新插入的元素比上一个元素大,于是二叉树存储时,会存在根的右侧,读取时就是正序排列的。
  3. 如果将compareTo()返回值写死为-1,元素值每次比较,都认为新插入的元素比上一个元素小,于是二叉树存储时,会存在根的左侧,读取时就是倒序序排列的。

TreeSet的常用方法

//返回set中第一个元素

    public E first() {

        return m.firstKey();

    }

    //返回set中最后一个元素

    public E last() {

        return m.lastKey();

    }

    //返回小于指定元素的最大的那个元素

    public E lower(E e) {

        return m.lowerKey(e);

    }

    //返回大于指定元素最小的那个元素

    public E higher(E e) {

        return m.higherKey(e);

   }

总结

HashSet与TreeSet的区别

1、HashSet与TreeSet接口的一点不同,HashSet 保存的数据是无序的,TreeSet保存的数据是有序的,所以如果要想保存的数据有序应该使用TreeSet子类。

2、利用TreeSet保存自定义类对象的时候,自定义所在的类一定要实现Comparable接口,如果没有实现这个接口那么就无法区分大小关系,而且在TreeSet中如果要进行排序,那么就要将所有的字段都进行比较,就是说在TreeSet中是依靠comparato()方法返回的是不是0来判断是不是重复元素的。

3、如果是HashSet子类,那么其判断重复数据的方式不是依靠的comparable接口而是Object类之中的两个方法:(1)取得对象的哈希码 hashCode();(2)对象比较:equals(); 这俩个方法均不需要自己编写,在eclipse里面可以使用右键source 选择自动生成。就像生成Getter 和Setter 方法一样。

最后:

TreeSet 依靠的是Comparable 来区分重复数据;

HashSet 依靠的是hashCode()、equals()来区分重复数据

Set 里面不允许保存重复数据。

原文地址:https://www.cnblogs.com/dreamyu/p/12019097.html

时间: 2024-10-18 20:43:08

java集合类-Set接口的相关文章

Java集合类根接口:Collection 和 Map

前言 在前文中我们了解了几种常见的数据结构,这些数据结构有着各自的应用场景,并且被广泛的应用于编程语言中,其中,Java中的集合类就是基于这些数据结构为基础. Java的集合类是一些非常实用的工具类,主要用于存储和装载数据 (包括对象),因此,Java的集合类也被成为容器.在Java中,所有的集合类都位于java.util包下,这些集合类主要是基于两个根接口派生而来,它们就是 Collection和 Map. Collection接口 Collection派生出三个子接口,Set代表不可重复的无

Java集合类源码解析:AbstractMap

目录 引言 源码解析 抽象函数entrySet() 两个集合视图 操作方法 两个子类 参考: 引言 今天学习一个Java集合的一个抽象类 AbstractMap ,AbstractMap 是Map接口的 实现类之一,也是HashMap.TreeMap.ConcurrentHashMap 等的父类,它提供了Map 接口中方法的基本实现(关于Map接口有疑惑的同学可参考 Java集合类根接口:Collection 和 Map) 源码解析 因为 AbstractMap 类是实现Map接口的抽象类,所以

【总结】Java常用集合接口与集合类

目录 常见集合接口概述 Collection<E> Map<K,V> Collection接口 Map接口 补充内容 ? 常见集合接口概述 Java中包含许多集合接口.其中比较常见的主要是Collection接口和Map接口: 1.1 Collection<E> 由单元素组成的集合.其比较常见的直接子接口是List.Set和Queue接口. ? ? ? ? 表1.1 Collection<e>接口常用方法 编号 方法原型 解释 备注 1 boolean?ad

Java集合类: Set、List、Map、Queue使用

目录 1. Java集合类基本概念 2. Java集合类架构层次关系 3. Java集合类的应用场景代码 1. Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量.一旦在数组初始化时指定了这个数组长度,这个数组长度就是不可变的,如果我们需要保存一个可以动态增长的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了. 集合类主要负责保存.盛装其他数据,因此集合类也被称为容

Java集合类详解(转)

Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMap Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).JavaSDK不提供直接继承自Collection的类,javaSDK提供的类都是继承自Collection的"子接口"如List和Set. 所

Java 集合类详解

1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等. 发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.它的一个

40个Java集合类面试题和答案(转载)

Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点.这里,我列出了一些关于Java集合的重要问题和答案. 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实

摘抄转载前辈们的Java集合类总结

JAVA 集合类介绍和使用    类关系示意图  Iterable(接口)      │      └--Collection (接口)          ├-List(接口)          │ ├-LinkedList  不同步  (构造同步:List list = Collections.synchronizedList(new LinkedList(...));)          │ ├-ArrayList   不同步           │ └-Vector      同步    

针对Java集合类的小总结

Java集合类包位于java.util下,有很多常用的数据结构:数组.链表.队列.栈.哈希表等等.了解不同的集合类的特性在开发过程中是比较重要的,感谢@兰亭风雨的专栏分析,这里我也根据自己的理解做轻度的总结,不再进行分析,因为上面的博客分析已经相当优秀. List接口实现,一般常用的为ArrayList和LinkedList,还有不太常用的Vector,Stack.比如JDK文档声明 Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非Sta