HashSet、LinkedHashSet和TreeSet
- 关键技术:
- HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。
- TreeSet采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。
- LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。
关键技术:
HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode方法。
TreeSet采用红黑树的数据结构进行排序元素,使用它可以从Set中提取有序(升序或者降序)的序列。需要注意的是,存入自定义类时,TreeSet需要维护元素的存储顺序,因此自定义类要实现Comparable接口并定义compareTo方法。
LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。
- package book.arrayset;
- import java.util.ArrayList;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.LinkedHashSet;
- import java.util.List;
- import java.util.Set;
- import java.util.TreeSet;
- /**
- * 演示各种Set的使用
- * 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。
- */
- public class TestSet {
- /**
- * 初始化Set的元素
- * @param set
- */
- public static void init(Set set){
- if (set != null){
- set.add("aaa");
- set.add("ccc");
- set.add("bbb");
- set.add("eee");
- set.add("ddd");
- }
- }
- /**
- * 输出set的元素
- * @param set
- */
- public static void output(Set set){
- if (set != null){
- //使用迭代器遍历Set,也只有这一种方法
- Iterator it = set.iterator();
- while (it.hasNext()){
- System.out.print(it.next() + " ");
- }
- }
- System.out.println();
- }
- /**
- * 使用HashSet
- */
- public static void testHashSet(){
- Set mySet = new HashSet();
- init(mySet);
- System.out.println("使用HashSet: ");
- output(mySet);
- }
- /**
- * 使用TreeSet
- */
- public static void testTreeSet(){
- Set mySet = new TreeSet();
- init(mySet);
- System.out.println("使用TreeSet: ");
- output(mySet);
- }
- /**
- * 使用LinkedHashSet
- */
- public static void testLinkedHashSet(){
- Set mySet = new LinkedHashSet();
- init(mySet);
- System.out.println("使用LinkedHashSet: ");
- output(mySet);
- }
- public static void main(String[] args) {
- TestSet.testHashSet();
- TestSet.testTreeSet();
- TestSet.testLinkedHashSet();
- Set mySet = new HashSet();
- init(mySet);
- //Set不允许元素重复
- mySet.add("aaa");
- mySet.add("bbb");
- System.out.println("为mySet加入aaa, bbb元素后: ");
- output(mySet);
- //删除元素
- mySet.remove("aaa");
- System.out.println("mySet删除aaa元素后: ");
- output(mySet);
- //增加另外一个集合中的所有元素
- List list = new ArrayList();
- list.add("aaa");
- list.add("aaa");
- list.add("fff");
- mySet.addAll(list);
- System.out.println("mySet添加另外一个集合的所有元素后: ");
- output(mySet);
- //删除除了另外一个集合包含的以外的所有元素
- mySet.retainAll(list);
- System.out.println("mySet删除除了另外一个集合包含的以外的所有元素后: ");
- output(mySet);
- //删除另外一个集合包含的所有元素
- mySet.removeAll(list);
- System.out.println("mySet删除另外一个集合包含的所有元素后: ");
- output(mySet);
- //获取Set中元素的个数
- System.out.println("mySet中当前元素的个数: " + mySet.size());
- //判断Set中元素个数是否为0
- System.out.println("mySet中当前元素为0? " + mySet.isEmpty());
- /**
- * (1)Set不允许重复元素,因此加入Set的Object必须定义equals()方法以确保对象的唯一性。
- * (2)HashSet采用散列函数对元素进行排序,是专门为快速查询而设计的。存入HashSet的对象必须定义hashCode()。
- * (3)TreeSet采用红黑树的数据结构进行排序元素,能保证元素的次序,使用它可以从Set中提取有序的序列。
- * 需要注意的是,生成自己的类时,Set需要维护元素的存储顺序,因此要实现Comparable接口并定义compareTo()方法。
- * (4)LinkedHashSet内部使用散列以加快查询速度,同时使用链表维护元素的插入的次序,在使用迭代器遍历Set时,结果会按元素插入的次序显示。
- */
- }
- }
HashSet、LinkedHashSet和TreeSet的更多相关文章
- HashSet、LinkedHashSet、TreeSet
以下内容基于jdk1.7.0_79源码: 关于HashSet.LinkedHashSet.TreeSet Set接口的实现类,最大特点是不允许出现重复元素: HashSet:基于HashMap实现,一 ...
- 规则集之探究何时使用HashSet、LinkedHashSet以及TreeSet?
前言 Java集合框架三种主要类型的集合:规则集(Set).线性表(List).队列(Queue).Set用来存储不可重复的元素:List用来存储有元素构成的有序的集合:而Queue则用于存储用先进先 ...
- Java集合框架(二)—— HashSet、LinkedHashSet、TreeSet和EnumSet
Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合与Collection基本上完全一样,它没有提供任何额外的方法. Se ...
- 一、集合框架(关于ArrayList,LinkedList,HashSet,LinkedHashSet,TreeSet)
一.ArrayList 解决了数组的局限性,最常见的容器类,ArrayList容器的容量capacity会随着对象的增加,自动增长.不会出现数组边界的问题. package collection; ...
- 09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHashSet,TreeSet
09 Collection,Iterator,List,listIterator,Vector,ArrayList,LinkedList,泛型,增强for,可变参数,HashSet,LinkedHas ...
- java集合框架之几种set(HashSet LinkedHashSet TreeSet )
参考http://how2j.cn/k/collection/collection-sets/691.html#nowhere HashSet LinkedHashSet TreeSet HashSe ...
- Java集合系列(三):HashSet、LinkedHashSet、TreeSet的使用方法及区别
本篇博客主要讲解Set接口的三个实现类HashSet.LinkedHashSet.TreeSet的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 1. HashSe ...
- Java中的集合HashSet、LinkedHashSet、TreeSet和EnumSet(二)
Set接口 前面已经简绍过Set集合,它类似于一个罐子,一旦把对象'丢进'Set集合,集合里多个对象之间没有明显的顺序.Set集合于Collection基本上完全一样,它没有提供任何额外的方法. Se ...
- Java自学-集合框架 HashSet、LinkedHashSet、TreeSet之间的区别
HashSet. LinkedHashSet.TreeSet之间的区别 步骤 1 : HashSet LinkedHashSet TreeSet HashSet: 无序 LinkedHashSet: ...
- Java Set 常用集合 HashSet、LinkedHashSet、TreeSet
Java 中的 Set 是非常常用的数据类型.Set 是无序的 Collection,Java Set 有三个常用的实现类,分别是:HashSet.LinkedHashSet.TreeSet 本文基于 ...
随机推荐
- css3实现圆角边框渐变
<button class="border">112233</button> 创建button .border{ position: relative; b ...
- React跨域问题解决
https://segmentfault.com/q/1010000012732581 非跨域问题报错 -rpccorsdomain="http://localhost:3000" ...
- 错误error: Exception at 0x613baa14, code: 0xc0000005: read access violation at: 0x0, flags=0x0 (first chance)的解决办法
一.错误原因 出现这个错误的原因多半是由于指针出现错误,即出现了空指针,也有说是变量没有初始化,笔者碰到的情况是发生了内存溢出. 二.定位方法 一般这种问题直接导致程序崩溃,直接调试,就能找到对应的问 ...
- android 远程Service以及AIDL的跨进程通信
在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问 ...
- 201621123033 《Java程序设计》第9周学习总结
第九次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 //stream(),filter(),collect() ...
- 【bzoj4994】[Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组
题目描述 给定长度为2N的序列,1~N各处现过2次,i第一次出现位置记为ai,第二次记为bi,求满足ai<aj<bi<bj的对数 样例输入 4 3 2 4 4 1 3 2 1 样例输 ...
- 【bzoj2694】Lcm 莫比乌斯反演+线性筛
题目描述 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m|\mu(gcd(i,j))|lcm(i,j)$,即$gcd(i,j)$不存在平方因子的$lcm(i,j)$之 ...
- 【bzoj4894】天赋 矩阵树定理
题目描述 小明有许多潜在的天赋,他希望学习这些天赋来变得更强.正如许多游戏中一样,小明也有n种潜在的天赋,但有一些天赋必须是要有前置天赋才能够学习得到的.也就是说,有一些天赋必须是要在学习了另一个天赋 ...
- Search Engine —— Regular Expression(Spider)
Regular Expression,即正则表达式:用来查找符合某些负责规则的字符串的需要.它真是用于描述这些规则的工具. 1. \b 是一个元字符,用来匹配一个位置,代表着单词的开头或结尾,也就是单 ...
- 《R语言实战》读书笔记--第三章 图形初阶(一)
3.1使用图形 可以使用pdf等函数将图形直接保存在文件中.在运用attach和detach函数的使用中经常出现错误,比如命名重复的问题,所以,应该尽量避免使用这两个函数. plot是一般的画图函数, ...