通过实例学习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(Iterator iterator=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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。