`

java - Collection(对象容器) - Set

    博客分类:
  • java
 
阅读更多

Set集合接口
     1. 唯一性:不允许包含相同的元素。如果试图把两个相同元素加入同一个集合中,add方法返回false。

     2. 无序性:set容器中的对象是无序的,无序是指迭代iterator出来的对象和添加的顺序无关。此特点和list形成鲜明的对比。
     3. 唯一性的判断方式:Set通过equals方法判断对象是否相同。若两个对象用equals方法为true,则set不能同时接受这两个对象。

     注:==运算符判断对象的内存地址-及两个对象是否为同一个对象。

           equals()判断两个对象是否相等。

HashSet

1. 无序性:此处无序性是指不能保证元素的排列顺序,遍历顺序和添加的顺序有可能发生变化,但对象存放的位置是固定的。
2. 线程非安全:不是同步的
3. 允许有null,但只能放入一个null
      当向HashSet结合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值来决定该对象在HashSet中存储位置
简单的说,HashSet集合判断两个元素相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode()方法返回值相等
      注意,如果要把一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写其hashCode()方法。其规则是如果两个对象通过equals方法比较返回true时,其hashCode也应该相同。另外,对象中用作equals比较标准的属性,都应该用来计算hashCode的值。

LinkedHashSet

       1. 有序性: 使用链表维护元素的次序。这样使得元素看起来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。

      由于使用链表维护元素所以LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色HashSet。

       2. 允许有null值
       LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置

TreeSet类

       1. 不允许有null值,否则运行抛异常。

       2. TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。

       3. TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。

       4. 向TreeSet中加入的必须是同一个类的对象。否则运行抛异常。
       TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
       自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列

      如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法
      Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。
obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。
如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0

Set引起内存溢出的情况:

    public void test(){
          String str = new String("abc");
          Set<String> set = new HashSet<String> ();
          set.add(str);//底层存储:根据hashCode值存在对象abc
          str = new String("bbb");
          set.remove(str);//内存溢出,此时set中仍有abc  原因:str此时的hashCode码已经改变,Set在该hashCode码指定位置上并没有存储对象。
          Iterator<String> it = set.iterator();
          for(;it.hasNext();){
               String s = it.next();
               System.out.println(s);
           }
      }

Set集合add remove方法都是根据参数的hashCode码找到Set中相应的对象进行操作。

分享到:
评论

相关推荐

    基础深化和提高-java容器

    在Java中,容器(Container)指的是用于存储和管理对象的数据结构。Java容器提供了一种统一的方式来组织和管理多个对象,使得开发者能够更加方便地对这些对象进行操作和处理。 Java容器主要分为两大类:Collection ...

    集合以及其相关方法介绍.txt

    Collection Map 存储都value 存储的是key - value 键、值 List set 有序可重复 无序无重复 key是无序无重复的 value 无序可重复 序:顺序的意思,向集合里面放进去的顺序和取出的顺序是一致的...

    java容器详解(collection,list,set,map)

    java集合的详解,collection,list,set,map疑难解答,对于对容器似懂非懂的新手来说,这无疑是给你指点迷津的一个非常不错的选择,讲解内容丰富。

    21天学通Java-由浅入深

    271 14.3 JPanel面板类 273 14.3.1 容器介绍 273 14.3.2 JPanel面板类简介 274 14.3.3 创建面板 274 14.4 JLabel标签类 275 14.4.1 JLabel标签类简介 275 14.4.2 创建标签 276 14.5 JButton按钮类 276 14.5.1 ...

    java中集合容器的详细介绍

    在常见用法中,集合(collection)和数学上直观的集(set)的概念是相同的。集是一个唯一项组,也就是说组中没有重复项。实际上,“集合框架”包含了一个 Set 接口和许多具体的 Set 类。但正式的集概念却比 Java ...

    JAVA容器讲解.pdf

    Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)

    JAVA集合(List,Set,Map)

     Java 2简化集合框架图 集合接口 1.Collection 接口 用于表示任何对象或元素组。想要尽可能以常规方式处理一组元素时,就使用这一接口。 (1) 单元素添加、删除操作: boolean add(Object o):将对象添加给集合...

    JAVA容器的作用和概览

    Collection 表示一组对象,它是集中,收集的意思,就是把一些数据收集起来 Collection接口的两个子接口: Set中的数据没有顺序,不可重复。 List中的数据有顺序,可重复。

    Java容器

    有两种容器:一个是Collection容器,存放对象的集合;另一种是Map容器,存放键值对(Key-value)集合 Collection容器 从图上我们可以看到Collection接口下有三个儿子,分别是Set,List,Queue;下面我来逐个介绍。 ...

    Java容器.xmind

    Collection 标记: 顶级接口 List 标记: interface ArrayList 标记: class CRUD : boolean add​(E e) boolean remove​(Object o) E set​(int index, E element) E get​(int index) 底层数组实现,查询快,...

    40道java集合面试题含答案(很全很详细)

    Collection容器存储一个元素集合,包括List、Set和Queue等类型。Map容器存储键/值对映射。 Collection接口是List、Set和Queue接口的父接口,定义了存取一组对象的方法。Collection接口继承自Iterable接口,这意味着...

    Java 基础核心总结 +经典算法大全.rar

    节点流和处理流 Java IO 的核心类 File Java IO 流对象 字节流对象InputStream OutputStream 字符流对象Reader Writer 字节流与字符流的转换新潮的 NIO 缓冲区(Buffer)通道(Channel) 示例:文件拷贝案例 BIO 和 NIO ...

    Java并发编程:同步容器

    为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具...  注意Collection和Map是一个顶层接口,而List、Set、Queue则继承了Collection接口,分别代表数组、集合和队列这三大类容器。  像ArrayLis

    Java基础知识点总结.docx

    &lt; java.util &gt; Collection接口 77 &lt; java.util &gt;Iterator接口 78 &lt; java.util &gt;List接口 78 &lt; java.util &gt;Set接口 80 &lt; java.util &gt;Map接口 81 把map集合转成set的方法 82 使用集合的技巧 83 Collections--集合工具...

    Java 容器类源码详解 Set

    主要介绍了Java 容器类源码详解 Set,Set 表示由无重复对象组成的集合,也是集合框架中重要的一种集合类型,直接扩展自 Collection 接口。,需要的朋友可以参考下

    Java面试宝典-经典

    62、List, Set, Map是否继承自Collection接口? 45 63、List、Map、Set三个接口,存取元素时,各有什么特点? 45 64、说出ArrayList,Vector, LinkedList的存储性能和特性 46 65、去掉一个Vector集合中重复的元素 46 ...

    Java容器详解

    1.什么是容器在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。2.常用的Java1.List有序的collection(也称为序列)。此接口的用户...

    java面试宝典

    65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...

    Java开发详解.zip

    031301_【第13章:Java类集】_认识类集、Collection接口笔记.pdf 031302_【第13章:Java类集】_List接口笔记.pdf 031303_【第13章:Java类集】_LinkedList类笔记.pdf 031304_【第13章:Java类集】_Set接口笔记.pdf ...

    javaconcurrent源码-java7-source-code:Java7源码/Concurrency同步

    java concurrent源码 Java7 核心类库源码解析 请直接查看.java ...Collection 都已经分析完毕 简化语言描述, 增加测试用例(实践用法) 接触到新的类再看源码(不能脱离实际场景瞎看, 容易迷茫没有方向) 20180

Global site tag (gtag.js) - Google Analytics