zoukankan      html  css  js  c++  java
  • Java集合框架之Set接口浅析

    Java集合框架之Set接口浅析

    一、java.util.Set接口综述:

      这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文

    1.1Set接口简介

    • java.util.set是Java集合框架体系中的重要成员
    • Set接口的意义是,含有相等的元素。相等由集合内元素的equals方法决定。Set继承自Collection接口,可是事实上其所含的方法和Collection接口一样。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。
    • Set的特点,主要由其内部的Map决定的,Set就类似于Map的一个马甲
    • Set主要有2个实现方式,一个是TreeSet,另一个是HashSet
    • Set是对数学上集的抽象,Set中不包含重复的元素.如何界定是否是重复元素?Set最多可含一个null元素;对于任意的非null元素e1和e2,都满足e1.equals(e2)==false.
    • Object.hashcode()的约定:
      • 在程序的一次执行中,无论何时在同一个java对象上重复调用hashcode(),都必须一致地返回同一个整数值,并不像Object.equals()那样提供Object是否被修改了的信息,但这个整数值不必在同一个应用程序的多次运行之间保持一致.
      • 如果两个Object通过equals()判断是相等的,那么,在这两个Object上调用hashcode()必返回相同的值.
      • 如果两个Object通过equals()判断是不相等的,那么,并不要求这两个Object.hashcode()返回不同的整数值.
    • 对象的相等性
      • 引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。
      • 如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object  hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true

    1.2Set体系结构:

      从类图能够看出,AbstractSet接口继承于AbstractCollection。它是Set的抽象实现,可是其除了添加了equals和hashcode方法,其它方法均继承而来(removeall方法外)。

    二、Set方法摘要:

    方法摘要
     boolean add(E e)
              如果 set 中尚未存在指定的元素,则添加此元素(可选操作)。
     boolean addAll(Collection<? extends E> c)
              如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
     void clear()
              移除此 set 中的所有元素(可选操作)。
     boolean contains(Object o)
              如果 set 包含指定的元素,则返回 true
     boolean containsAll(Collection<?> c)
              如果此 set 包含指定 collection 的所有元素,则返回 true
     boolean equals(Object o)
              比较指定对象与此 set 的相等性。
     int hashCode()
              返回 set 的哈希码值。
     boolean isEmpty()
              如果 set 不包含元素,则返回 true
     Iterator<E> iterator()
              返回在此 set 中的元素上进行迭代的迭代器。
     boolean remove(Object o)
              如果 set 中存在指定的元素,则将其移除(可选操作)。
     boolean removeAll(Collection<?> c)
              移除 set 中那些包含在指定 collection 中的元素(可选操作)。
     boolean retainAll(Collection<?> c)
              仅保留 set 中那些包含在指定 collection 中的元素(可选操作)。
     int size()
              返回 set 中的元素数(其容量)。
     Object[] toArray()
              返回一个包含 set 中所有元素的数组。
    <T> T[]
    toArray(T[] a)
              返回一个包含此 set 中所有元素的数组;返回数组的运行时类型是指定数组的类型。

     三、Set和List的区别:

    • Set 接口实例存储的是无序的,不重复的数据。List 接口实例存储的是有序的,可以重复的元素。

    • Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有HashSet,TreeSet>

    • List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变 <实现类有ArrayList,LinkedList,Vector>

    参考:

      https://www.cnblogs.com/zfyouxi/p/5184247.html

      http://blog.csdn.net/qq_33642117/article/details/52040345

      http://www.runoob.com/java/java-collections.html

  • 相关阅读:
    Java中参数传递时值传递的机制分析
    掰碎了讲中文编码
    掰碎了讲换行符和回车符
    创建父子控制器
    分页(进行封装处理)
    五:面向对象的三大特性:封装、继承、多态
    iOS9弹框的最新两种方式(解决控制器以外的类无法弹出的问题)
    各类报错汇集
    NBA季后赛结果预测
    十:类的本质及isa指针和元类的简单介绍
  • 原文地址:https://www.cnblogs.com/albertrui/p/8335410.html
Copyright © 2011-2022 走看看