HashSet、LinkedHashSet和TreeSet

2023-11-05 16:08

本文主要是介绍HashSet、LinkedHashSet和TreeSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. 关键技术:  
  2.   
  3.     HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。  
  4.     TreeSet采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。  
  5.     LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。  



  1. package book.arrayset;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashSet;  
  5. import java.util.Iterator;  
  6. import java.util.LinkedHashSet;  
  7. import java.util.List;  
  8. import java.util.Set;  
  9. import java.util.TreeSet;  
  10.   
  11. /** 
  12.  * 演示各种Set的使用 
  13.  * 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。 
  14.  */  
  15. public class TestSet {  
  16.   
  17.     /** 
  18.      * 初始化Set的元素 
  19.      * @param set 
  20.      */  
  21.     public static void init(Set set){  
  22.         if (set != null){  
  23.             set.add("aaa");  
  24.             set.add("ccc");  
  25.             set.add("bbb");  
  26.             set.add("eee");  
  27.             set.add("ddd");  
  28.         }  
  29.     }  
  30.     /** 
  31.      * 输出set的元素 
  32.      * @param set 
  33.      */  
  34.     public static void output(Set set){  
  35.         if (set != null){  
  36.             //使用迭代器遍历Set,也只有这一种方法  
  37.             Iterator it = set.iterator();  
  38.             while (it.hasNext()){  
  39.                 System.out.print(it.next() + " ");  
  40.             }  
  41.         }  
  42.         System.out.println();  
  43.     }  
  44.     /** 
  45.      * 使用HashSet 
  46.      */  
  47.     public static void testHashSet(){  
  48.         Set mySet = new HashSet();  
  49.         init(mySet);  
  50.         System.out.println("使用HashSet: ");  
  51.         output(mySet);  
  52.     }  
  53.     /** 
  54.      * 使用TreeSet 
  55.      */  
  56.     public static void testTreeSet(){  
  57.         Set mySet = new TreeSet();  
  58.         init(mySet);  
  59.         System.out.println("使用TreeSet: ");  
  60.         output(mySet);  
  61.     }  
  62.     /** 
  63.      * 使用LinkedHashSet 
  64.      */  
  65.     public static void testLinkedHashSet(){  
  66.         Set mySet = new LinkedHashSet();  
  67.         init(mySet);  
  68.         System.out.println("使用LinkedHashSet: ");  
  69.         output(mySet);  
  70.     }  
  71.     public static void main(String[] args) {  
  72.         TestSet.testHashSet();  
  73.         TestSet.testTreeSet();  
  74.         TestSet.testLinkedHashSet();  
  75.           
  76.         Set mySet = new HashSet();  
  77.         init(mySet);  
  78.         //Set不允许元素重复  
  79.         mySet.add("aaa");  
  80.         mySet.add("bbb");  
  81.         System.out.println("为mySet加入aaa, bbb元素后: ");  
  82.         output(mySet);  
  83.         //删除元素  
  84.         mySet.remove("aaa");  
  85.         System.out.println("mySet删除aaa元素后: ");  
  86.         output(mySet);  
  87.         //增加另外一个集合中的所有元素  
  88.         List list = new ArrayList();  
  89.         list.add("aaa");  
  90.         list.add("aaa");  
  91.         list.add("fff");  
  92.         mySet.addAll(list);  
  93.         System.out.println("mySet添加另外一个集合的所有元素后: ");  
  94.         output(mySet);  
  95.         //删除除了另外一个集合包含的以外的所有元素  
  96.         mySet.retainAll(list);  
  97.         System.out.println("mySet删除除了另外一个集合包含的以外的所有元素后: ");  
  98.         output(mySet);  
  99.         //删除另外一个集合包含的所有元素  
  100.         mySet.removeAll(list);  
  101.         System.out.println("mySet删除另外一个集合包含的所有元素后: ");  
  102.         output(mySet);  
  103.         //获取Set中元素的个数  
  104.         System.out.println("mySet中当前元素的个数: " + mySet.size());  
  105.         //判断Set中元素个数是否为0  
  106.         System.out.println("mySet中当前元素为0?  " + mySet.isEmpty());  
  107.           
  108.         /** 
  109.          * (1)Set不允许重复元素,因此加入Set的Object必须定义equals()方法以确保对象的唯一性。 
  110.          * (2)HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode()。 
  111.          * (3)TreeSet采用红黑树的数据结构进行排序元素,能保证元素的次序,使用它可以从Set中提取有序的序列。 
  112.          * 需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。 
  113.          * (4)LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。 
  114.      */  
  115.     }  
  116. }  

这篇关于HashSet、LinkedHashSet和TreeSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350956

相关文章

Java重修笔记 第四十八天 TreeSet 类、TreeMap 类

TreeSet 类 1. TreeSet 底层是 TreeMap 2. 使用默认构造器创建的 TreeSet 对象,添加顺序和取出顺序不是有序的 3. 如果添加的是字符串或数字,它们默认会按照字母顺序或数值顺序进行排序 4. 可以在构造器中传入一个 Comparator 比较器来手动制定比较规则,之后传入的数据会根据改规则自动进行比较排序,如果根据比较器比较出的结果是相同的,即 com

容器第七课,Set,HashSet基本用法,源码分析

Set接口 Set接口是Collection接口的子接口,Set接口没有提供额外的方法,Set接口的特性是容器类中的元素是i没有顺序的,而且不可以重复。Set容易可以在数学中“集合”的概念相对应。J2SDK API中 所提供的Set容器类有HashSet、TreeSet等 package com.pkushutong.Collection;import java.util.HashSet;

Set判断重复,TreeSet排序

Set集合中,无序,不能重复,如何判断对象重复? 在对象的bean中实现hashCode 和 equals方法,选定属性,根据选定的属性判断两个对象是否相等。 TreeSet类 TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是

Java集合框架(Set与Map,HashSet与HashMap,TreeSet与TreeMap)

这是一个介绍集合类,数组以及容器关系的截图,便于我们对集合的理解。 一.Set和Map Set代表一种集合元素无序、不可重复的集合,Map则代表一种由多个key-value(键-值)对组成的集合。 从表面上看,它们之间的相似性很少,但实际上Map和Set之间有莫大的联系。可以说,Map集合是Set集合的扩展。 如果只考察Map集合的Key,不难发现,这些Map集合的key具有一个特

第一章 集合框架和泛型(ArrayList/LinkedList/HashSet/HashMap/泛型集合/Collections算法类)

第一章 集合框架和泛型 一、Collection 1、Collection 接口存储一组不唯一,无序的对象 二、List List 接口存储一组不唯一,有序(插入顺序)的对象 1.ArrayList 实现了长度可变的数组,在内存中分配连续的空间优点:遍历元素和随机访问元素的效率比较高ArrayList类是List接口的一个具体实现类ArrayList对象实现了可变大小

Java重修笔记 第四十五天 LinkedHashSet 类

LinkedHashSet 类 1. LinkedHashSet 是 HashSet 的子类,继承 HashSet 的方法 2. LinkedHashSet 的底层是 LinkedHashMap ,底层维护了一个数组加双向链表的组合 3. LinkedHashSet 根据元素的 hashCode 值来决定元素在 table 数组上的存储位置,同时使用链表结构来维护元素的次序(after

12. TreeSet的内部实现原理是什么?它是如何实现排序的?

TreeSet 是 Java 集合框架中的一个实现类,它实现了 NavigableSet 接口,并且是基于 TreeMap 实现的。TreeSet 的主要特性是元素自动排序,即元素会按照自然顺序或自定义的比较器顺序进行排序。在底层,TreeSet 是通过红黑树(Red-Black Tree)来实现的,这是一种自平衡的二叉搜索树。 TreeSet 的内部实现原理 1. 基于 TreeMa

Java重修笔记 第四十三天 Set 集合、HashSet 类

Set 接口 1. 它是无序的(添加和取出的顺序不一致,但取出的结果是固定的),没有索引 2. Set 接口也是 Collection 的子接口,所以继承了 Collection 的方法 3. Set 接口的遍历方式有两种,迭代器和增强 for 循环,但是不能使用索引遍历 HashSet 类 1. 底层是一个 HashMap,可以把 HashSet 看成 HashMap 2

Java重修笔记 第四十四天 HashSet 添加元素规则、树化规则和扩容规则

添加元素规则 1. HashSet 底层是 HashMap,所以他俩的逻辑是一样的 2. 添加一个元素时,先得到 hash 值再转成索引值(Hash值来自于却不等于HashCode()的值) 3. 看这个存储数据表 table 的索引位置是否已经存放有元素 4. 如果没有,直接加入  5. 如果有,则调用对象的 equals() 方法逐一进行比较,如果有相同的,就放弃添加,如果都不相

10. Java 中的 HashSet 和 HashMap 有什么区别?

HashSet 和 HashMap 是 Java 集合框架中的两个重要类,它们都基于哈希表(Hash Table)实现,并且在许多方面共享类似的特性。然而,它们的用途和实现上有一些重要的区别。 1. 功能和用途 HashSet: HashSet 是一个实现了 Set 接口的集合类,用于存储唯一的元素。集合中的元素不能重复。 它不保证集合的顺序(插入顺序也不保证),并且不允许存储 nu