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 ...
随机推荐
- Reverse complement DNA
用法:python rev_comp.py input.fa out.fa 输入文件为 fasta 格式文件,若输入文件中序列的 header 有 '+' 或 '-' 号标记正负链,则带有 '+' 的 ...
- 分享一款CSS框架
1.http://bulma.io/documentation/elements 2.支持IE9+ 3.内容:
- MongoDB如何设置权限(类似关系型数据库的用户名和密码)
MongoDB 缺省是没有设置鉴权的,业界大部分使用 MongoDB 的项目也没有设置访问权限.这就意味着只要知道 MongoDB 服务器的端口,任何能访问到这台服务器的人都可以查询和操作 Mongo ...
- h5的瀑布流
<!doctype html><html><head><meta charset="utf-8"><title>超简易瀑 ...
- Entity Framework 学习中级篇1—EF支持复杂类型的实现
本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...
- DFS序的题目列表
所谓dfs序就是将之前的顺序进行修改,获得一个新的序列,然后再新的序列下进行一系列其他的操作 一般题目给你的都会是一棵树,然后点之间都是无关的,我们首要的任务就是先把这些序列重新排.然后再根据dfs的 ...
- emacs redo
c / c/ cg c/ cg c/ tramp: /sudo::/usr/
- OpenGL学习-------visual studio 2010配置和第一个OpenGL程序讲解
OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性. 1.与C语言紧密结合. OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenG ...
- Block 使用场景
转载自:http://blog.csdn.net/totogo2010/article/details/7839061 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块 ...
- PhpStorm11.0 配置在浏览器中打开文件
转自:http://www.bubuko.com/infodetail-1420190.html 点击File-Settings-Deployment . 点+按钮增加服务器 Mapping 设置工程 ...