java中的Set的使用以及各种遍历方法(较为全面)
1. 概述
Java 中的Set和正好和数学上直观的集(set)的概念是相同的。Set最大的特性就是不允许在其中存放的元素是重复的。根据这个特点,我们就可以使用Set 这个接口来实现前面提到的关于商品种类的存储需求。Set 可以被用来过滤在其他集合中存放的元素,从而得到一个没有包含重复新的集合。
2. 常用方法
按照定义,Set 接口继承 Collection 接口,而且它不允许集合中存在重复项。所有原始方法都是现成的,没有引入新方法。具体的 Set 实现类依赖添加的对象的 equals() 方法来检查等同性。
各个方法的作用描述:
public int size() :返回set中元素的数目,如果set包含的元素数大于Integer.MAX_VALUE,返回Integer.MAX_VALUE;
public boolean isEmpty() :如果set中不含元素,返回true ;
public boolean contains(Object o) :如果set包含指定元素,返回true
;
public Iterator iterator()
: 返回set中元素的迭代器,元素返回没有特定的顺序,除非set提高该保证的某些类的实例
;
public boolean add(Object o) :如果set中不存在指定元素,则向set加入
;
public boolean remove(Object o) :如果set中存在指定元素,则从set中删除
;
public boolean removeAll(Collection c) :如果set包含指定集合,则从set中删除指定集合的所有元素
;
public void clear() :从set中删除所有元素;
3. 原理分析
HashSet的元素存放顺序和添加进去时候的顺序没有任何关系;而LinkedHashSet 则保持元素的添加顺序;TreeSet则是对我们的Set中的元素进行排序存放。
一般来说,当要从集合中以有序的方式抽取元素时,TreeSet 实现就会有用处。为了能顺利进行,添加到 TreeSet
的元素必须是可排序的。 而同样需要对添加到TreeSet中的类对象实现 Comparable
接口的支持。对于Comparable接口的实现。假定一棵树知道如何保持 java.lang
包装程序器类元素的有序状态。一般说来,先把元素添加到 HashSet,再把集合转换为 TreeSet
来进行有序遍历会更快。这点和HashMap的使用非常的类似。
其实Set的实现原理是基于Map上面的。Set中很多实现类和Map中的一些实现类的使用上非常的相似。Map中的“键值对”,其中的
“键”是不能重复的。这个和Set中的元素不能重复一致,其实Set利用的就是Map中“键”不能重复的特性来实现的。
HashSet的巧妙实现:就是建立一个“键值对”,“键”就是我们要存入的对象,“值”则是一个常量。这样可以确保,
我们所需要的存储的信息之是“键”。而“键”在Map中是不能重复的,这就保证了我们存入Set中的所有的元素都不重复。而判断是否添加元素成功,则是通
过判断我们向Map中存入的“键值对”是否已经存在,如果存在的话,那么返回值肯定是常量:PRESENT
,表示添加失败。如果不存在,返回值就为null 表示添加成功。
代码范例:
存放的是String类型
Set <String>set = new HashSet<String>();
Set <String>s = new TreeSet<String>() ;
set.add("hello") ;
set.add("hollo") ;
set.add("hallo") ;
s.add("hello") ;
s.add("hollo") ;
s.add("hallo") ;
Iterator <String>it = set.iterator() ;
while(it.hasNext()){ //迭代器遍历
String str = it.next() ;
System.out.println(str) ;
}
System.out.println("***************");
for(String str : s){ //for循环遍历
System.out.println(str) ;
}
结果
hello //HushSet() 无序存放
hollo
hallo
***************
hallo //TreeSet() 有序存放
hello
hollo
当存放的是对象的时候:
package cc; import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; class A{
private String title ;
private int ID ;
public A(String title, int iD) {
this.title = title;
ID = iD;
}
@Override
public String toString() {
return "A [title=" + title + ", ID=" + ID + "]";
}
@Override
public int hashCode() {
final int prime = ;
int result = ;
result = prime * result + ID;
result = prime * result + ((title == null) ? : title.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
A other = (A) obj;
if (ID != other.ID)
return false;
if (title == null) {
if (other.title != null)
return false;
} else if (!title.equals(other.title))
return false;
return true;
} }
public class Demo { public static void main(String[] args) {
A a = new A ("haha" , ) ;
A a1 = new A("ooo" , ) ;
A a2 = new A("bbb" , ) ;
Set <A> set = new HashSet<A>() ;
set.add(a) ;
set.add(a1) ;
set.add(a2) ;
Iterator <A> it = set.iterator() ;
while(it.hasNext()){
System.out.println(it.next() ) ;
}
for(A temp : set){
System.out.println(temp);
}
} }
结果:
A [title=haha, ID=]
A [title=ooo, ID=]
A [title=bbb, ID=]
A [title=haha, ID=]
A [title=ooo, ID=]
A [title=bbb, ID=]
也可以使用泛型:
Set <Object> set = new HashSet<Object>() ;
set.add(a) ;
set.add(a1) ;
set.add(a2) ;
Iterator <Object> it = set.iterator() ;
while(it.hasNext()){
System.out.println(it.next() ) ;
}
System.out.println("********************");
for(Object temp : set){
System.out.println(temp);
}
结果如上。
java中的Set的使用以及各种遍历方法(较为全面)的更多相关文章
- Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)
一.学习ArrayList与Map时,关于常用遍历方法的记录如下: 二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...
- Java中取小数点后两位(四种方法)
摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法) 一 Long是长整型,怎么有小数,是double吧 java.text.D ...
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- JAVA中比较两个文件夹不同的方法
JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- Java中SSM+Shiro系统登录验证码的实现方法
1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; im ...
- 总结:WPF中ResourceDictionary资源文件的查找和遍历方法
原文:总结:WPF中ResourceDictionary资源文件的查找和遍历方法 一.查找包含制定关键字的资源 ResourceDictionary GetThemeDictionary() ...
- Java中int和String互相转换的多种方法
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- 在Java中Arrays工具类实现功能的六种方法
使用Arrays工具类,要先导入包即:import.java.util.Arrays 以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int ...
随机推荐
- linux的mount(挂载)NFS 共享,命令详解
Linux下挂载(mount)光盘镜像文件.移动硬盘.U盘.Windows和NFS网络共享 linux是一个优秀的开放源码的操作系统,可以运行在大到巨型小到掌上型各类计算机系统上,随着 linux系统 ...
- AJAX(XMLHttpRequest)进行跨域请求方法详解(一)
注意:以下代码请在Firefox 3.5.Chrome 3.0.Safari 4之后的版本中进行测试.IE8的实现方法与其他浏览不同. 跨域请求,顾名思义,就是一个站点中的资源去访问另外一个不同域名站 ...
- Android PopupWindow的使用技巧(转)
Android PopupWindow的使用技巧 PopupWindow是Android上自定义弹出窗口,使用起来很方便. PopupWindow的构造函数为 public PopupWindow(V ...
- 文件I/O实现cp复制功能
copy.c: #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include < ...
- Htpasswd 给网站后台目录加密
http://www.l0phtcrack.com/download.html打开apache配置文件 httpd.conf 配置如下: <Directory "/var/www/ ...
- Shortest Path
Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- Struts2--Global Result全局结果集
如果有很多action,有共同的result指向, 而且属于不同的包,那么可以继承上面的包, 然后写一个<global-results> 1. jsp显示文件: <ol> &l ...
- GetEnvironmentVariable 获取常用系统变量(转)
源:GetEnvironmentVariable 获取常用系统变量 //譬如 WINDIR 表示系统目录系统变量, 以这样获: var s:string; begin s:=GetEnvironmen ...
- 【HighCharts系列教程】三、图表属性——chart
一.chart属性说明 Chart是HighCharts图表中主要属性,包括了图表区域的颜色.线条.高度.宽度.对齐.图表类型等诸多属性,也是HighCharts图表中必须配置的属性之一. 配置cha ...
- mac home/end/pageup/pageDown
home:按fn+左键 end:按fn+右键 pageup:按fn+上键 pagedown:按fn+下键