数据结构(集合)学习之Set
集合
框架关系图:

Collection接口下面有三个子接口:List、Set、Queue。此篇是关于Set<E>的简单学习总结。
补充:HashTable父类是Dictionary,不是AbstractMap。
Set:
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中(可以存空元素)。常见的子类:HashSet、TreeSet、LinkedHashSet。
1、HashSet(无序,不可重复):
底层实际上是一个无序,不可重复的HashMap,源代码如下:
private transient HashMap<E,Object> map;
/**
* Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
* default initial capacity (16) and load factor (0.75).
*(默认初始容量是16,加载因子是0.75,元素个数超过16*0.75就扩容)
*/
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
因为Set的无序,不可重复,所以常用来去重。
public static void main(String[] args) {
Set<String> hash = new HashSet<String>();
hash.add("C");
hash.add("A");
hash.add("A");
hash.add("D");
hash.add("B");
hash.add("B");
hash.add("D");
hash.add("C");
Iterator it = hash.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
注意:当HashSet调用add(Object o)时,会把参数当为key,默认一个对象最为value:
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
2、LinkedHashSet(有序,不可重复):
LinkedHashSet继承HashSet,默认初始容量:16,加载因子:0.75。其实LinkedHashSet就是双向链状的HashSet,因为是链状,所以实现了有序性,但是不可重复。
public static void main(String[] args) {
Set<String> linked = new LinkedHashSet<String>();
linked.add("A");
linked.add("A");
linked.add("C");
linked.add("B");
linked.add("D");
linked.add("A");
linked.add("B");
Iterator it = linked.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
3、TreeSet(有序,不可重复):
TreeSet底层是TreeMap:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{
private transient NavigableMap<E,Object> m;
private static final Object PRESENT = new Object();
TreeSet(NavigableMap<E,Object> m) {
this.m = m;
}
public TreeSet() {
this(new TreeMap<E,Object>());
}
TreeSet中有个Compare比较器,会对数据进行排序:
public static void main(String[] args) {
Set<String> tree = new TreeSet<>();
tree.add("A");
tree.add("C");
tree.add("A");
tree.add("D");
tree.add("B");
Iterator<String> it = tree.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
数据结构(集合)学习之Set的更多相关文章
- 数据结构(集合)学习之Map(一)
集合 框架关系图: 补充:HashTable父类是Dictionary,不是AbstractMap. Map: Map(接口)和Collection都属于集合,但是Map不是Collection的子类 ...
- 数据结构(集合)学习之Queue
集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于Queue<E>的简单学习总结. 补充:HashTable父类是Dictionary, ...
- 数据结构(集合)学习之List
集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于List<E>的简单学习总结. 补充:HashTable父类是Dictionary,不 ...
- 数据结构(集合)学习之Map(二)
集合 框架关系图 补充:HashTable父类是Dictionary,不是AbstractMap. 一:HashMap中的链循环: 一般来说HashMap中的链循环会发生在多线程操作时(虽然HashM ...
- 数据结构(集合)学习之Collection和Iterator
集合 1.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使 ...
- 2019/3/4 java集合学习(二)
java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...
- 2019/3/2周末 java集合学习(一)
Java集合学习(一) ArraysList ArraysList集合就像C++中的vector容器,它可以不考虑其容器的长度,就像一个大染缸一 样,无穷无尽的丢进去也没问题.Java的数据结构和C有 ...
- 转:深入Java集合学习系列:HashSet的实现原理
0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...
- ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢
<!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...
随机推荐
- Django面试集锦(1-50)
目录 1.Django ORM查询中select_related和prefetch_related的区别? 2.only与defer的用法? 3.Django ORM是什么? 4.Django创建项目 ...
- CSS颜色表示的几种方式
在CSS中颜色有很多表示方式,今天列出一些常见的颜色表示方式及它们的用法. ①color:blue; 第一种,调用颜色属性,将颜色的英文输入在冒号后,以分号结束. 这种方法直接了当,但是能表示的颜色 ...
- Codeforces_734_C
http://codeforces.com/problemset/problem/734/C 枚举第一种,二分第二种,注意不取的情况. #include<iostream> #includ ...
- c++中的智能指针怎样释放连续的资源?
以前学智能指针时有点想当然了,一直以为智能指针很智能,不管你让它管理的是单个资源还是连续的资源它都能正确的将资源释放,现在发现自己大错特错. 先看代码: #include <iostream&g ...
- oracle怎么建立本地连接
sqlplus连接oracle数据库(连接本地oracle数据库和连接远程的oracle数据库) 虽然我们现在平时都是使用PLSQL Developer这个软件工具了,但是我们还是要了解sqlplus ...
- MySQL的简介
什么是数据库 1. 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同 的API(接口)用于创建,访问,管理,搜索和复制所保存的数据 2. 我们也可以将 ...
- 本地开发环境伪装成SSL连接的实现
本地ssl开发测试实现1,在外网服务器上使用测试域名和t.test.cn,用let's encrypt申请 证书并正常运行2,修改本地服务器host文件,将t.kennylee.vip指向127.0. ...
- 如何查看SparkSQL 生成的抽象语法树?
前言 在<Spark SQL内核剖析>书中4.3章节,谈到Catalyst体系中生成的抽象语法树的节点都是以Context来结尾,在ANLTR4以及生成的SqlBaseParser解析SQ ...
- MySql在Windows下自动备份的几种方法
以下几种全部是批处理命令中对于备份文件 1.复制date文件夹备份============================假想环境:MySQL 安装位置:C:\MySQL论坛数据库名称为:bbs数 ...
- 能否不同udp socket绑定到同一IP地址和port
http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-4.html http ...