Java中HashSet的用法
HashSet是基于HashMap来实现的,实现了Set接口,同时还实现了序列化和可克隆化。而集合(Set)是不允许重复值的。
所以HashSet是一个没有重复元素的集合,但不保证集合的迭代顺序,所以随着时间元素的顺序可能会改变。
由于HashSet是基于HashMap来实现的,所以允许空值,不是线程安全的。
想了解这两者的区别,可以去我的Java专栏看。
HashSet是基于HashMap实现的,区别就在于在HashMap中输入一个键值对,而在HashSet中只输入一个值。
Java代码:
private transient HashMap map;
// Constructor - 1
// All the constructors are internally creating HashMap Object.
public HashSet()
{
// Creating internally backing HashMap object
map = new HashMap();
}
// Constructor - 2
public HashSet(int initialCapacity)
{
// Creating internally backing HashMap object
map = new HashMap(initialCapacity);
}
// Dummy value to associate with an Object in Map
private static final Object PRESENT = new Object();
而HashSet类的add的实现是这样子的,很明显可以看到是调用了HashMap里的put()方法。而里面的present则是常量,就是没用的。
public boolean add(E e)
{
return map.put(e, PRESENT) == null;
}
创建HashSet是首先需要创建一个HashSet类的对象,下面是几种构造函数。
该构造函数用于构建一个空的HashSet对象,其中默认初始容量为16,默认加载因子为0.75。如果我们希望创建一个名为 hs 的空 HashSet,则可以将其创建为:
示例:
HashSet<E> hs = new HashSet<E>();
//其实也可以写成,以下类推
Set<E> hs = new HashSet<E>();
该构造函数用于构建一个空的HashSet对象,在对象创建时指定initialCapacity。这里,默认的 loadFactor 保持为 0.75。
initialCapacity就是初始容量,loadFactor是负载因子。示例:如果初始容量为 16,负载因子为 0.75,则当表中有 12 个元素时,桶的数量将自动增加。
示例:
HashSet<E> hs = new HashSet<E>(int initialCapacity);
该构造函数用于构建一个空的HashSet对象,其中在创建对象时指定了initialCapacity和loadFactor。
示例:
HashSet<E> hs = new HashSet<E>(int initialCapacity, float loadFactor);
此构造函数用于构建包含给定集合中所有元素的 HashSet 对象。简而言之,当需要从任何 Collection 对象到 HashSet 对象的任何转换时,都会使用此构造函数。如果我们希望创建一个名为 hs 的 HashSet,它可以创建为:
示例:
HashSet<E> hs = new HashSet<E>(Collection C);
使用add(),但是HashSet不会存重复的元素,所以add相同的不会存进去。
hs.add("Geek");
示例:
// Java program to Adding Elements to HashSet
// Importing required classes
import java.io.*;
import java.util.*;
// Main class
// AddingElementsToHashSet
class GFG {
// Method 1
// Main driver method
public static void main(String[] args)
{
// Creating an empty HashSet of string entities
HashSet<String> hs = new HashSet<String>();
// Adding elements using add() method
hs.add("Geek");
hs.add("For");
hs.add("Geeks");
// Printing all string el=ntries inside the Set
System.out.println("HashSet elements : " + hs);
}
}
输出:
HashSet elements : [Geek, For, Geeks]
hs.remove("B");
示例:
// Java program Illustrating Removal Of Elements of HashSet
// Importing required classes
import java.io.*;
import java.util.*;
// Main class
// RemoveElementsOfHashSet
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an
HashSet<String> hs = new HashSet<String>();
// Adding elements to above Set
// using add() method
hs.add("Geek");
hs.add("For");
hs.add("Geeks");
hs.add("A");
hs.add("B");
hs.add("Z");
// Printing the elements of HashSet elements
System.out.println("Initial HashSet " + hs);
// Removing the element B
hs.remove("B");
// Printing the updated HashSet elements
System.out.println("After removing element " + hs);
// Returns false if the element is not present
System.out.println("Element AC exists in the Set : "
+ hs.remove("AC"));
}
}
输出:
Initial HashSet [A, B, Geek, For, Geeks, Z]
移除元素后 [A, Geek, For, Geeks, Z]
元素AC存在于Set中:false
boolean con = hs.add("Geek");
boolean con = hs.isEmpty();
int size = hs.size();
使用iterator()遍历,也就是迭代器。
还有一种方法是for循环。
for (String s : hs){}
//或者是
Iterator itr = hs.iterator();
while (itr.hasNext()){}
示例:
// Java Program to Illustrate Iteration Over HashSet
// Importing required classes
import java.io.*;
import java.util.*;
// Main class
// IterateTheHashSet
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating an empty HashSet of string entries
HashSet<String> hs = new HashSet<String>();
// Adding elements to above Set
// using add() method
hs.add("Geek");
hs.add("For");
hs.add("Geeks");
hs.add("A");
hs.add("B");
hs.add("Z");
// Iterating though the HashSet using iterators
Iterator itr = hs.iterator();
// Holds true till there is single element
// remaining in Set
while (itr.hasNext())
// Traversing elements and printing them
System.out.print(itr.next() + ", ");
System.out.println();
// Using enhanced for loop for traversal
for (String s : hs)
// Traversing elements and printing them
System.out.print(s + ", ");
System.out.println();
}
}
输出:
A,B,极客,对于,极客,Z,
A,B,极客,对于,极客,Z,
HashSet 操作的时间复杂度:HashSet的底层数据结构是 hashtable。因此,HashSet
的添加、删除和查找(包含方法)操作的摊销(平均或通常情况)时间复杂度需要O(1)时间。
只放较为常用的。
| 变量和类型 | 方法 | 描述 |
|---|---|---|
| boolean | add(E e) | 如果指定的元素尚不存在,则将其添加到此集合中。 |
| void | clear() | 从该集中删除所有元素。 |
| Object | clone() | 返回此 HashSet实例的浅表副本:未克隆元素本身。 |
| boolean | contains(Object o) | 如果此set包含指定的元素,则返回 true 。 |
| boolean | isEmpty() | 如果此集合不包含任何元素,则返回 true 。 |
| Iterator | iterator() | 返回此set中元素的迭代器。 |
| boolean | remove(Object o) | 如果存在,则从该集合中移除指定的元素。 |
| int | size() | 返回此集合中的元素数(基数)。 |
| Spliterator | spliterator() | 在此集合中的元素上创建late-binding和失败快速 Spliterator 。 |
今天在Leetcode刚写到有关HashSet的简单题,如果有时间可以去写一下,巩固一下:349. 两个数组的交集
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o