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);
}

结果如上。

以上部分内容转自http://lchl826.iteye.com/blog/1106128

java中的Set的使用以及各种遍历方法(较为全面)的更多相关文章

  1. Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)

    一.学习ArrayList与Map时,关于常用遍历方法的记录如下:  二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...

  2. Java中取小数点后两位(四种方法)

    摘自http://irobot.iteye.com/blog/285537 Java中取小数点后两位(四种方法)   一 Long是长整型,怎么有小数,是double吧     java.text.D ...

  3. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  4. JAVA中比较两个文件夹不同的方法

    JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...

  5. Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题

    在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...

  6. Java中SSM+Shiro系统登录验证码的实现方法

    1.验证码生成类: import java.util.Random; import java.awt.image.BufferedImage; import java.awt.Graphics; im ...

  7. 总结:WPF中ResourceDictionary资源文件的查找和遍历方法

    原文:总结:WPF中ResourceDictionary资源文件的查找和遍历方法 一.查找包含制定关键字的资源 ResourceDictionary GetThemeDictionary()     ...

  8. Java中int和String互相转换的多种方法

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...

  9. 在Java中Arrays工具类实现功能的六种方法

    使用Arrays工具类,要先导入包即:import.java.util.Arrays 以下是实现六种功能的方法: 1.比较两个数组值是否相等: 结果为true.false.(布尔型不能比较) int ...

随机推荐

  1. hdu_4467_Graph(莫队算法思想)

    题目连接:hdu_4467_Graph 题意:给你n个点,m条边,每条边有一个权值,有两个操作,一个是修改单点的颜色,一个是询问边的两个端点都为指定颜色的权值和 题解:这题如果暴力的话,就是维护3个a ...

  2. listview的简单封装

    package com.itheima.googleplay.ui.view; import android.content.Context; import android.graphics.Colo ...

  3. shell判断文件是否存在,不存在则创建

    if [ ! -d "/myfolder" ]; then mkdir /myfolder fi 注意[]中的空格,否则会报错

  4. Linux 挂载aliyun数据盘

    适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...

  5. 利用线程把文本文件填充到richTextBox;防止导入大文本文件窗口假死现象

    private void btnDr_Click(object sender, EventArgs e) { richTextBox1.Text = ""; //richTextB ...

  6. 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)

    原文: https://www.v2ex.com/t/312651 在 2016 年做 PHP 开发是一种什么样的体验?(一) 嘿,我最近接到一个网站开发的项目,不过老实说,我这两年没怎么接触编程,听 ...

  7. xshell 图形化连接ubuntu

    原文: http://jingyan.baidu.com/article/d45ad148967fcd69552b80f6.html Xmanager4系列软件是一套非常好的liunx远程操作,尤其是 ...

  8. Recover Polygon (easy)

    Recover Polygon (easy) The zombies are gathering in their secret lair! Heidi will strike hard to des ...

  9. CentOS 修改Mysql的root密码

    1.知道密码 第一次登陆(无密码) mysqladmin -u root password NEWPASSWORD 修改过密码 mysqladmin -u root -p 'oldpassword' ...

  10. zencart的modules下数据库操作templates排版和common首页引用

    把这个学会,zencart的数据库操作,以及各种函数的调用基本会了 这个东西非常有用,你需要认真看一下,不要闲代码多. 如何在数据库中调出自己想要的产品,让它显示在首页. 据我本人不科学的理解,在in ...