通过实例学习Java集合框架HashSet
这篇文章主要介绍了通过实例学习Java集合框架HashSet,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
示例1:元素不能重复
Set中的元素,不能重复
packagecollection;
importjava.util.HashSet;
publicclassTestCollection{
publicstaticvoidmain(String[]args){
HashSetnames=newHashSet();
names.add("gareen");
System.out.println(names);
//第二次插入同样的数据,是插不进去的,容器中只会保留一个
names.add("gareen");
System.out.println(names);
}
}
示例2:没有顺序
Set中的元素,没有顺序。
严格的说,是没有按照元素的插入顺序排列
HashSet的具体顺序,既不是按照插入顺序,也不是按照hashcode的顺序。
以下是HashSet源代码中的部分注释
/** *Itmakesnoguaranteesastotheiterationorderoftheset; *inparticular,itdoesnotguaranteethattheorderwillremainconstantovertime. */
不保证Set的迭代顺序;确切的说,在不同条件下,元素的顺序都有可能不一样
换句话说,同样是插入0-9到HashSet中,在JVM的不同版本中,看到的顺序都是不一样的。所以在开发的时候,不能依赖于某种臆测的顺序,这个顺序本身是不稳定的
packagecollection;
importjava.util.HashSet;
publicclassTestCollection{
publicstaticvoidmain(String[]args){
HashSetnumbers=newHashSet();
numbers.add(9);
numbers.add(5);
numbers.add(1);
//Set中的元素排列,不是按照插入顺序
System.out.println(numbers);
}
}
示例3:遍历
Set不提供get()来获取指定位置的元素
所以遍历需要用到迭代器,或者增强型for循环
packagecollection;
importjava.util.HashSet;
importjava.util.Iterator;
publicclassTestCollection{
publicstaticvoidmain(String[]args){
HashSetnumbers=newHashSet();
for(inti=0;i<20;i++){
numbers.add(i);
}
//Set不提供get方法来获取指定位置的元素
//numbers.get(0)
//遍历Set可以采用迭代器iterator
for(Iteratoriterator=numbers.iterator();iterator.hasNext();){
Integeri=(Integer)iterator.next();
System.out.println(i);
}
//或者采用增强型for循环
for(Integeri:numbers){
System.out.println(i);
}
}
}
示例4:HashSet和HashMap的关系
通过观察HashSet的源代码,
可以发现HashSet自身并没有独立的实现,而是在里面封装了一个Map.
HashSet是作为Map的key而存在的
而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个。
privatestaticfinalObjectPRESENT=newObject(); packagecollection; importjava.util.AbstractSet; importjava.util.HashMap; importjava.util.Iterator; importjava.util.Set; publicclassHashSetextendsAbstractSet implementsSet ,Cloneable,java.io.Serializable { //HashSet里封装了一个HashMap privateHashMap map; privatestaticfinalObjectPRESENT=newObject(); //HashSet的构造方法初始化这个HashMap publicHashSet(){ map=newHashMap (); } //向HashSet中增加元素,其实就是把该元素作为key,增加到Map中 //value是PRESENT,静态,final的对象,所有的HashSet都使用这么同一个对象 publicbooleanadd(Ee){ returnmap.put(e,PRESENT)==null; } //HashSet的size就是map的size publicintsize(){ returnmap.size(); } //清空Set就是清空Map publicvoidclear(){ map.clear(); } //迭代Set,就是把Map的键拿出来迭代 publicIterator iterator(){ returnmap.keySet().iterator(); } }
练习:HashSet
创建一个长度是100的字符串数组
使用长度是2的随机字符填充该字符串数组
统计这个字符串数组里重复的字符串有多少种
使用HashSet来解决这个问题
答案:
packagecollection;
importjava.util.HashSet;
publicclassTestCollection{
publicstaticvoidmain(String[]args){
String[]ss=newString[100];
//初始化
for(inti=0;iresult=newHashSet<>();
for(Strings1:ss){
intrepeat=0;
for(Strings2:ss){
if(s1.equalsIgnoreCase(s2)){
repeat++;
if(2==repeat){
//当repeat==2的时候,就找到了一个非己的重复字符串
result.add(s2);
break;
}
}
}
}
System.out.printf("总共有%d种重复的字符串%n",result.size());
if(result.size()!=0){
System.out.println("分别是:");
for(Strings:result){
System.out.print(s+"");
}
}
}
privatestaticStringrandomString(intlength){
Stringpool="";
for(shorti='0';i<='9';i++){
pool+=(char)i;
}
for(shorti='a';i<='z';i++){
pool+=(char)i;
}
for(shorti='A';i<='Z';i++){
pool+=(char)i;
}
charcs[]=newchar[length];
for(inti=0;i
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。