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 ...
随机推荐
- HDU 5741 Helter Skelter
离线处理+扫描线.题意很容易转化:若干个矩形形成并集,询问一些点是否在并集中? 官方题解不是这样做的....那种做法效率更高,暂时还不会.我这样是4500ms G++过的,C++TLE...... 区 ...
- HDU 2475 BOX 动态树 Link-Cut Tree
Box Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) [Problem De ...
- haar_adaboost_cascade阅读资料
1,AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 2,浅谈 Adaboost 算法 3,浅析人脸检测之Haar分类器方法 4,http://wenku.bai ...
- php的header函数之设置content-type
//定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...
- Apache多端口配置
修改http.conf监听多个端口 Listen 80 Listen 8001 Listen 8002 配置站点 <VirtualHost *:8001> ServerName *:800 ...
- 几种在shell命令行中过滤adb logcat输出的方法
我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adblog ...
- JS清除dropdownlist绑定的项,并添加新项
<script type="text/javascript"> /*删除项*/ document.getElementById('KeyList').options.l ...
- C# 双引号的输出
Console.WriteLine("\"a little list.\"");
- cell选中与取消选中调用的方法
//选中与取消选中都会调用哦,注意!!- (void)setSelected:(BOOL)selected animated:(BOOL)animated{ [super setSelected:se ...
- 1058FBI<二叉树,递归,后序遍历>
问题描述 我们可以把由"0"和"1"组成的字符串分为三类:全"0"串称为B串,全"1"串称为I串,既含"0&q ...