Java集合框架学习(二) HashSet详解
HashSet介绍
这个类实现了Set接口,背后是一个hash table(实际上是个HashMap 实例) 。它不保证元素的迭代顺序。尤其是,随着时间推
移它不保证某一元素的位置不变。这个类是非线程安全的,不过可以通过以下方式显式实现:
Set s = Collections.synchronizedSet(new HashSet(...));
HashSet特点
1)HashSet 不维护任何顺序, 元素将以随机顺序返回。
2)HashSet 不允许有重复元素, 如果你试图添加重复元素, 旧有的元素值将被覆盖
3)HashSet 允许有null值,然而如果你插入多个null它将只返回一个。
4)HashSet 是非线程安全的。
5)这个类返回的迭代器是快速失败的,也就是说如果你在创建迭代器之后又去修改HashSet,迭代器将抛出ConcurrentModificationException异常,除非你调用的是迭代器的remove方法。
HashSet日常操作
1.基本例子
package com.dylan.collection;
import java.util.HashSet;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class HashSetExample {
public static void main(String args[]) {
// HashSet declaration
HashSet<String> hset =
new HashSet<String>();
// Adding elements to the HashSet
hset.add("Apple");
hset.add("Mango");
hset.add("Grapes");
hset.add("Orange");
hset.add("Fig");
//Addition of duplicate elements
hset.add("Apple");
hset.add("Mango");
//Addition of null values
hset.add(null);
hset.add(null);
//Displaying HashSet elements
System.out.println(hset);
}
}
输出:
[null, Apple, Grapes, Fig, Mango, Orange]
2.删除所有元素
package com.dylan.collection;
import java.util.HashSet;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class EmptyHashSetExample {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Element1");
hset.add("Element2");
hset.add("Element3");
hset.add("Element4");
hset.add("Element5");
// Display HashSet elements
System.out.println("Before: HashSet contains: "+ hset);
/* public void clear(): It removes all the elements
* from HashSet. The set becomes empty after this
* method gets called.
*/
hset.clear();
// Display HashSet content again
System.out.println("After: HashSet contains: "+ hset);
}
}
输出:
Before: HashSet contains: [Element5, Element4, Element3, Element2, Element1]
After: HashSet contains: []
3.如何迭代
3.1 使用Iterator
3.2 使用for循环
package com.dylan.collection;
import java.util.HashSet;
import java.util.Iterator;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class IterateHashSet {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Chaitanya");
hset.add("Rahul");
hset.add("Tim");
hset.add("Rick");
hset.add("Harry");
//1.use Iterator
System.out.println("----use Iterator:");
Iterator<String> it = hset.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//2.use loop
System.out.println("----use loop:");
for (String temp : hset) {
System.out.println(temp);
}
}
}
输出:
----use Iterator:
Chaitanya
Rahul
Harry
Tim
Rick
----use loop:
Chaitanya
Rahul
Harry
Tim
Rick
4.转换为数组
package com.dylan.collection;
import java.util.HashSet;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class ConvertHashSettoArray {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Element1");
hset.add("Element2");
hset.add("Element3");
hset.add("Element4");
// Displaying HashSet elements
System.out.println("HashSet contains: "+ hset);
// Creating an Array
String[] array = new String[hset.size()];
hset.toArray(array);
// Displaying Array elements
System.out.println("Array elements: ");
for(String temp : array){
System.out.println(temp);
}
}
}
输出:
HashSet contains: [Element4, Element3, Element2, Element1]
Array elements:
Element4
Element3
Element2
Element1
5.转换为TreeSet
package com.dylan.collection;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class ConvertHashSettoTreeSet {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Element1");
hset.add("Element2");
hset.add("Element3");
hset.add("Element4");
// Displaying HashSet elements
System.out.println("HashSet contains: "+ hset);
// Creating a TreeSet of HashSet elements
Set<String> tset = new TreeSet<String>(hset);
// Displaying TreeSet elements
System.out.println("TreeSet contains: ");
for(String temp : tset){
System.out.println(temp);
}
}
}
package com.dylan.collection;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class ConvertHashSettoTreeSet {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Element1");
hset.add("Element2");
hset.add("Element3");
hset.add("Element4");
// Displaying HashSet elements
System.out.println("HashSet contains: "+ hset);
// Creating a TreeSet of HashSet elements
Set<String> tset = new TreeSet<String>(hset);
// Displaying TreeSet elements
System.out.println("TreeSet contains: ");
for(String temp : tset){
System.out.println(temp);
}
}
}
输出:
HashSet contains: [Element4, Element3, Element2, Element1]
TreeSet contains:
Element1
Element2
Element3
Element4
6.转换为List/ArrayList
package com.dylan.collection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
/**
* @author xusucheng
* @create 2018-01-27
**/
public class ConvertHashSetToArrayList {
public static void main(String[] args) {
// Create a HashSet
HashSet<String> hset = new HashSet<String>();
//add elements to HashSet
hset.add("Steve");
hset.add("Matt");
hset.add("Govinda");
hset.add("John");
hset.add("Tommy");
// Displaying HashSet elements
System.out.println("HashSet contains: "+ hset);
// Creating a List of HashSet elements
List<String> list = new ArrayList<String>(hset);
// Displaying ArrayList elements
System.out.println("ArrayList contains: "+ list);
}
}
输出:
HashSet contains: [Matt, Steve, Govinda, John, Tommy]
ArrayList contains: [Matt, Steve, Govinda, John, Tommy]
HashSet 对比 HashMap
1.相同点
1)两者都是非线程安全的。
2)都不保证元素的顺序
3)如果你看了HashSet源码就知道它的背后是HashMap在支持其各种操作。
4)两者在添加,删除元素等操作时的性能一致。
2.不同点
| HashSet | HashMap |
| 实现的是Set接口 | 实现的是Map接口 |
| 存储的是对象(元素或值),例如我有一个存储String元素的HashSet, 我可以这样描述:[null, Apple, Grapes, Fig, Mango, Orange] |
存储的是Key&Value(键值对) |
| 不允许有重复值 | 不允许有重复Key,但可以有多个重复value |
| 只允许有一个null元素 | 允许有一个null key, null的value可以有多个 |
Java集合框架学习(二) HashSet详解的更多相关文章
- Hibernate框架学习(二)——api详解
一.Configuration对象 功能:配置加载类,用于加载主配置,orm元数据加载. //1.创建,调用空参构造(还没有读配置文件) Configuration conf=new Configur ...
- Java集合框架学习(一)List
先附一张Java集合框架图. 从上面的集合框架图可以看到,Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Coll ...
- Java集合框架学习
集合框架 集合框架的目标 该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现必须是高效的. 该框架允许 不同类型的集合,以类似的方式工作,具有高度的互操作性. 对一个集合的扩展和适应必 ...
- java集合的方法及使用详解
一.java集合的分类及相互之间的关系 Collection接口:向下提供了List和Set两个子接口 |------List接口:存储有序的,存储元素可以重复 |------ArrayList(主要 ...
- Java 集合Collection与List的详解
1.什么是集合 存储对象的容器,面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,存储对象,集合是存储对象最常用的一种方式. 集合的出现就是为了持有对象.集合中可以存储任意类型的 ...
- 【java基础 11】java集合框架学习
导读:本篇博客主要是从整体上了解java的集合框架,然后主要介绍几个自己在项目中用到的结构,比如说:hashtable.hashmap.hashset.arraylist等! 一.宏观预览 从宏观上看 ...
- Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取
在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...
- java集合框架(二):HashTable
HashTable作为集合框架中的一员,现在是很少使用了,一般都是在面试中会问到其与HashMap的区别.为了能在求职的时候用上场,我们有必要对其原理进行解读. HashTable的实现原理跟Hash ...
- Java集合框架学习笔记
集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的长度不确定,就使用集合存储. 集合特点1.用于存储对象的容器.2.集合的长度可变.3.集合中不可以存储基本类型 集合容器因为内部的数据结 ...
- Java集合框架(二)
原文 http://www.jianshu.com/p/2070cb32accb List接口 查阅API,看 List 的介绍.有序的 collection (也称为序列).此接口的用户可以对列表 ...
随机推荐
- [转帖]记druid 连接池没满,但超时问题 GetConnectionTimeoutException active 5, maxActive 100
记druid 连接池没满,但超时问题 GetConnectionTimeoutException active 5, maxActive 100 问题说明 线上服务突然出现报错,通过日志查找发现是因为 ...
- [转帖]SQL Server数据库存储总结
SQL Server数据库存储文件类型:数据文件和日志文件.数据文件以页面作为存储单元存储数据. 页面:即数据页面,数据页(Page).是系统在磁盘间中分配的一段大小为8k的连续空间. 文件头(Fil ...
- [转帖]java -d 参数(系统属性) 和 环境变量
https://www.cnblogs.com/limeiyang/p/16565920.html 1. -d 参数说明 通过 java -h 查看可知: 注意:-D= : set a system ...
- KD-Tree 小记🐤
KD-Tree,是用来维护一个空间(其实一般是平面)中的信息的数据结构. 以下就 2D-Tree 进行讨论.(盲猜并不会考 3D 及以上) 思想:将一个大矩形以一种方式划分成若干个小矩形,然后询问时只 ...
- vue中sync的使用原来这么简单
sync的使用场景 有些时候子组件需要修改父组件传递过来的prop, 要去改变父组件的状态的时候就需要使用aync 看见这里有些同学可能会问?? 不是说不可以修改父组件传递到子组件的值吗? 为啥要修改 ...
- js循环之map在工作中的使用
map函数会返回一个全新的数组哈(重要 在实际中很有用) map循环空那个数组时,不会报错的. 使用map的优势 可以返回一个全新的数组 可以用于过滤 ps==>:map里面不要有判断,否者会返 ...
- 【笔记】grafana v8.4.2 中如何设置曲线图的双坐标轴
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu 公众号:一本正经的瞎扯 这个话题当然很久就有人研究过了,只不过版本已经很老了,不适合新版本. 1 ...
- ClickHouse(06)ClickHouse建表语句DDL详细解析
目录 当前服务器上创建表(单节点) 语法形式 使用显式架构 从相同结构的表复制创建 从表函数创建 从选择查询创建 分布式集群创建表 临时表 分区表 创建表语句关键字解析 空值或非空修饰符 默认值表达式 ...
- 在K8S中,Pod生命周期包含哪些?
在Kubernetes(简称K8s)中,Pod的生命周期经历了一系列状态变化.以下是Pod可能处于的一些主要状态: Pending: 当创建一个Pod时,它首先会进入Pending状态.这个状态下,K ...
- Gorm 数据库表迁移与表模型定义
目录 一.Docker快速创建MySQL实例 1.1 创建 1.3 创建数据库 二.AutoMigrate介绍与使用 2.1 AutoMigrate介绍 2.2 AutoMigrate 基本使用 三. ...