java Set(集合)
set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化.
set具有与Collection完全一样的接口,因此没有额外的功能,实际上set就是Collection,只是行为不同.(这是继承与多态思想的典型应用:表现不同的行为.)Set是基于对象的值来确定归属性的,
通用set类型: HashSet LinkedHashSet
java Set类
package java.util;
public interface Set<E> extends Collection<E> {
int size(); //输出集合大小
boolean isEmpty(); //判空
boolean contains(Object o);//检查集合中是否包含对象o
Iterator<E> iterator(); //迭代器
Object[] toArray();
<T> T[] toArray(T[] a);
boolean add(E e); //添加一个元素e
boolean remove(Object o); //移除对象o
boolean containsAll(Collection<?> c); //检查集合中是否包含集合C的所有元素
boolean addAll(Collection<? extends E> c); //添加集合c的所有元素
boolean retainAll(Collection<?> c); //保留本集合和集合c的差集
boolean removeAll(Collection<?> c); //移除集合中和集合c相同的元素
void clear(); //清除所有element
boolean equals(Object o); //当hashCode()方法返回的哈希码有重复时,调用Object方法
int hashCode(); //添加元素时,首先调用本方法返回哈希码,如果没重复则添加到集合,否则调用equals()方法返回的哈希码有重复时
//哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上
@Override
default Spliterator<E> spliterator() { //splitable iterator可分割迭代器
return Spliterators.spliterator(this, Spliterator.DISTINCT);
}
}
HashSet示例
//一个HashSet的示例
//: holding/SetOfInteger.java
package object;
import java.util.*; public class SetOfInteger {
public static void main(String[] args) {
Random rand = new Random(new Date().getTime());
Set<Integer> intset = new HashSet<Integer>();
for(int i = 0; i < 10000; i++)
intset.add(rand.nextInt(30));
System.out.println(intset);//0~29之间的数出现了10000次但每一个数只有一个出现在结果中
}
} /* Output:
[15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13, 28, 20, 25, 10, 5, 0]
*///:~
由于出于速度的原因HashSet使用了散列.HashSet的维护与TreeSet或LinkedSet都不同,因为它们的实现具有不同的元素存储方式,TreeSet将元素存储在红--黑树数据结构中,而HashSet使用了散列函数,LinkedSet出于速度原因也使用了散列,但看起来它使用了链表来维护元素的插入顺序
用HashSet一般没有规律可循,如果相对结果排序可以使用TreeSet代替HashSet
能产生每个元素都唯一的列表是相当有用的功能,例如,要找出SetOperatoration.java文件中所有的单词的时候,通过编程思想的net.mindview.TextFile工具,可以打开一个文件,并将其放入Set中:
//: holding/UniqueWords.java
package object;
import java.util.*;
//import net.mindview.util.*; public class UniqueWords {
public static void main(String[] args) {
Set<String> words = new TreeSet<String>(
new TextFile("src/object/SetOperations.java", "\\W+"));//"\\W+"为正则表达式,表示"一个或多个字母"
//TreeSet是按字典排序的,因此大小字母和小写字母被放到了不同的组中
System.out.println(words);
}
} /* Output:
[A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K, L, M, N, Output, Print, Set, SetOperations, String, X, Y, Z, add, addAll, added, args, class, contains, containsAll, false, from, holding, import, in, java, main, mindview, net, new, print, public, remove, removeAll, removed, set1, set2, split, static, to, true, util, void]
*///:~
如果想按照字母顺序排序,那么可以向TreeSet的构造其中传入String.CASE_INSENTIVE_ORDER比较器(比较器是建立排序顺序的对象)
//: holding/UniqueWordsAlphabetic.java
// Producing an alphabetic listing.
package object;
import java.util.*;
//import net.mindview.util.*; public class UniqueWordsAlphabetic {
public static void main(String[] args) {
Set<String> words =
new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);//CASE_INSENSITIVE_ORDER比较器(比较器是建立排序顺序的对象
words.addAll(
new TextFile("src/object/SetOperations.java", "\\W+"));
System.out.println(words);
}
} /* Output:
[A, add, addAll, added, args, B, C, class, Collections, contains, containsAll, D, E, F, false, from, G, H, HashSet, holding, I, import, in, J, java, K, L, M, main, mindview, N, net, new, Output, Print, public, remove, removeAll, removed, Set, set1, set2, SetOperations, split, static, String, to, true, util, void, X, Y, Z]
*///:~
java Set(集合)的更多相关文章
- 【Java】集合_学习笔记
一.集合 1.集合类也称容器类,主要负责保存.盛装其他数据. 2.集合可以保存数量不确定的数据,保存具有映射关系的数据(也称关联数组). 3.Java5后提供一些多线程安全的集合类,放在java.ut ...
- java的集合框架最全详解
java的集合框架最全详解(图) 前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作 ...
- 谈谈Java的集合组件
让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...
- java.util 集合框架集合
java的集合框架为程序提供了一种处理对象组的标准方式.设计了一系列标准泛型接口: ⑴Collection ()接口,扩展了Iterable接口,位于集合层次结构的顶部,因此所有的集合都实现Colle ...
- Java基础——集合框架
Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...
- Java学习-集合(转)
在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在是太丰富了,有常用的ArrayList. ...
- java的集合框架之一
java是一套很成熟的东西,很多商用的东西都喜欢用它,用的人多,稳定.不过一般也不怎么说起它,因为太常见了,私下里说,写java应用层得就像农民工,每一处都是搭积木,根据设计师的东西如何优雅地搭好积木 ...
- 浅谈Java的集合框架
浅谈Java的集合框架 一. 初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...
- Java之集合初探(一)
一.集合概述.区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器. 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的 ...
- Java面向对象 集合(下)
Java面向对象 集合(下) 知识概要: (1)Map集合的体系结构 (2)Map集合的方法 (3)HashMap TreeMap (4)集合框架中的常用工具类 ( ...
随机推荐
- 深入理解学习Git工作流(git-workflow-tutorial)
转载:https://segmentfault.com/a/1190000002918123#articleHeader11 人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协 ...
- 【设计模式】——工厂方法FactoryMethod
前言:[模式总览]——————————by xingoo 模式意图 工厂方法在MVC中应用的很广泛. 工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建 ...
- Java学习之基本数据类型和引用数据类型区别
JAVA中分为基本数据类型和引用数据类型区别一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存 ...
- Cyclic Components CodeForces - 977E(找简单环)
题意: 就是找出所有环的个数, 但这个环中的每个点都必须只在一个环中 解析: 在找环的过程中 判断度数是否为2就行...emm... #include <bits/stdc++.h> us ...
- MT【110】巧设法向量解决距离问题
分析:设面的法向量$n=(x,y,z)$
- 本地如何连接虚拟机上的MySql
今天在本地链接虚拟机上的MySql,然而链接失败了!甚是尴尬! 首先想一想是什么原因导致链接失败: 基础环境:在Linux上安装mysql 1.检查虚拟机IP在本地是否可以ping 通过 虚拟机IP: ...
- Qt ------ QTableView QTableWidget
QTableView model提供数据 view提供视图 view用来显示model的数据 必须将model绑定到某个view中才能显示 QStandardItemModel* mod ...
- linux ------ 使用 TFTP 在两个主机之前传输文件
TFTP是用来下载远程文件的最简单网络协议,它是基于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp- ...
- python的内置模块re模块方法详解以及使用
正则表达式 一.普通字符 . 通配符一个.只匹配一个字符 匹配任意除换行符"\n"外的字符(在DOTALL模式中也能匹配换行符 >>> import re ...
- 比特币全节点(bitcoind) eth 全节点
运行全节点的用途: 1.挖矿 2.钱包 运行全节点,可以做关于btc的任何事情,例如创建钱包地址.管理钱包地址.发送交易.查询全网的交易信息等等 选个节点钱包:bitcoind 1.配置文件: ...