- 浏览: 521729 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (114)
- C基础 (1)
- C指针 (0)
- C语言库函数相关 (1)
- Linux (2)
- Linux网络编程 (1)
- PostgreSQL (0)
- Redis (2)
- Java Web (2)
- JAVA基础 (35)
- Ubuntu (8)
- Android (2)
- MySQL (3)
- 日志 (1)
- 书虫 (1)
- 数据结构 (0)
- 算法 (0)
- 开发工具 (1)
- 转载 (13)
- 英语 (18)
- tomcat启动脚本分析 (3)
- Oracle基础 (4)
- tomcat源码分析 (3)
- tomcat (1)
- Java相关 (1)
- Oracle基本原理--Oracle体系结构 (0)
- Oracle基本原理--表 (0)
- Oracle基本原理--索引 (0)
- Oracle基本原理--事务 (0)
- Oracle开发--SQL (1)
- Oracle基本原理--PL/SQL (0)
- Oracle基本原理--常用函数 (0)
- Oralce管理--用户及权限管理 (0)
- Oracle管理--安装调试 (0)
- Oracle管理--备份恢复 (0)
- Oralce管理--数据迁移 (0)
- Oracle管理--闪回 (0)
- Oracle管理--故障处理 (0)
- Oracle优化原理--统计信息 (0)
- Oracle优化原理--执行计划 (0)
- Oracle优化原理--诊断工具 (0)
- Oracle优化原理--深入理解表 (0)
- Oracle优化原理--深入理解索引 (0)
- Oracle优化原理--表连接原理 (0)
- Java--OOP (0)
- Java--异常 (0)
- Java--泛型 (0)
- Java--集合 (0)
- Java--IO (0)
- Java--枚举类型 (0)
- Java--注释 (0)
- Java--多线程 (0)
- Java--XML (0)
- Java--JDBC (3)
- Servlet (0)
- JSP (0)
- JSTL (0)
- 设计模式 (0)
- DAO与MVC (0)
- Javascript (2)
- Ajax (0)
- JQuery (0)
- HTML/CSS (0)
- 前端相关 (1)
- HTTP (0)
- TCP/IP (0)
- GO基础 (0)
最新评论
-
jsonmong:
推荐一个开发平台,采用的是插件化的设计思想,效果很不错的。ht ...
构建Java Web开发环境 -
wxm198427:
首先表示辛苦了!我想问个问题:我的是windows 7 x64 ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
握着橄榄枝的人:
我之前按照你的update mysql.user set pa ...
Windows7下MySQL5.5.20免安装版的配置 -
confident_f:
安装了32的客户端后,用plsql导入导出表有问题,生成不了d ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
confident_f:
安装数据库的时候第9步卡住了 是怎么回事呢?
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤
4、Set集合
Set集合为集类型,集是最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象加入集合中,类似于向口袋里放东西。对集中存在的对象的访问和操作是通过对象的引用进行的,因此在集中不能存放重复对象。Set集合包括Set接口以及Set接口的所有实现类。因为Set接口继承了Collection接口,所以Set接口拥有Collection接口提供的所有常用方法。
(1)使用HashSet类
由HashSet类实现的Set集合的优点是能够快速定位集合中的元素。
由HashSet类实现的Set集合中的对象必须是惟一的,因此需要添加到由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中对象的标识的惟一性。
由HashSet类实现的Set集合的排列方式为按照哈希码排序,根据对象的哈希码确定对象的存储位置,因此需要添加到由HashSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合中的对象。
由于Set集合中的对象是无序的,这里所谓的无序并不是完全无序,只是不像List集合按对象的插入顺序保存对象。
例如:
源文件:Person.java
源文件:TestSet.java
程序的运行结果如下:
李小姐 22018
李先生 22020
马先生 22015
如果既想保留HashSet类快速定位集合中对象的优点,又想让集合中的对象按插入的顺序保存,可以通过HashSet类的子类LinkedHashSet实现Set集合,即修改上述代码如下:
将
修改为:
(2)使用TreeSet类
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在遍历集合时按照递增的顺序获得对象。遍历对象时可能是按照自然顺序递增排列,因此存入用TreeSet类实现的Set集合的对象必须实现Comparable接口;也可能是按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
TreeSet类通过实现java.util.SortedSet接口增加的方法如下表4所示:
例如:
源文件:Person.java
源文件:TestSet.java
程序的运行结果如下:
初始化的集合:
22012 王先生
22015 马先生
22016 李先生
22018 王小姐
22020 尹先生
截取前面部分得到的集合:
22012 王先生
截取中间部分得到的集合:
22015 马先生
22016 李先生
截取后面部分得到的集合:
22018 王小姐
22020 尹先生
在使用由TreeSet类实现的Set集合时,也可以通过单独的比较器对集合中的对象进行排序。
例如:
比较器既可以作为一个单独的类,也可以作为对应类的内部类,本例中移内部类的形式实现比较器。
源文件:Person.java
源文件:TestSet.java
程序的运行结果如下:
客户化排序前,默认按编号升序排序:
22015 马先生
22016 李先生
22018 王小姐
客户化排序后,按编号降序排序:
22018 王小姐
22016 李先生
22015 马先生
Set集合为集类型,集是最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象加入集合中,类似于向口袋里放东西。对集中存在的对象的访问和操作是通过对象的引用进行的,因此在集中不能存放重复对象。Set集合包括Set接口以及Set接口的所有实现类。因为Set接口继承了Collection接口,所以Set接口拥有Collection接口提供的所有常用方法。
(1)使用HashSet类
由HashSet类实现的Set集合的优点是能够快速定位集合中的元素。
由HashSet类实现的Set集合中的对象必须是惟一的,因此需要添加到由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中对象的标识的惟一性。
由HashSet类实现的Set集合的排列方式为按照哈希码排序,根据对象的哈希码确定对象的存储位置,因此需要添加到由HashSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合中的对象。
由于Set集合中的对象是无序的,这里所谓的无序并不是完全无序,只是不像List集合按对象的插入顺序保存对象。
例如:
源文件:Person.java
public class Person{ private String name; private long id_card; public Person(String name,long id_card){ this.name = name; this.id_card = id_card; } public long getId_card(){ return id_card; } public void setId_card(long id_card){ this.id_card = id_card; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public int hashCode(){//重新实现hashCode()方法 final int PRIME = 31; int result = 1; result = PRIME*result+(int)(id_card^(id_card>>>32)); result = PRIME*result+((name ==null)?0:name.hashCode()); return result; } public boolean equals(Object obj){//重新实现equals()方法 if(this == obj){ return true; } if(obj == null){ return false; } if(getClass()!=obj.getClass()){ return false; } final Person other = (Person)obj; if(id_card!=other.id_card){ return false; } if(name == null){ if(other.name != null){ return false; } } else if(!name.equals(other.name)){ return false; } return true; } }
源文件:TestSet.java
import java.util.*; public class TestSet{ public static void main(String args[]){ Set<Person> hashSet = new HashSet<Person>(); hashSet.add(new Person("马先生",22015)); hashSet.add(new Person("李小姐",22018)); hashSet.add(new Person("李先生",22020)); Iterator<Person> it = hashSet.iterator(); while(it.hasNext()){ Person person = it.next(); System.out.println(person.getName()+" "+person.getId_card()); } } }
程序的运行结果如下:
李小姐 22018
李先生 22020
马先生 22015
如果既想保留HashSet类快速定位集合中对象的优点,又想让集合中的对象按插入的顺序保存,可以通过HashSet类的子类LinkedHashSet实现Set集合,即修改上述代码如下:
将
Set<Person> hashSet = new HashSet<Person>();
修改为:
Set<Person> hashSet = new LinkedHashSet<Person>();
(2)使用TreeSet类
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在遍历集合时按照递增的顺序获得对象。遍历对象时可能是按照自然顺序递增排列,因此存入用TreeSet类实现的Set集合的对象必须实现Comparable接口;也可能是按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。
TreeSet类通过实现java.util.SortedSet接口增加的方法如下表4所示:

例如:
源文件:Person.java
public class Person implements Comparable{ private String name; private long id_card; public Person(String name,long id_card){ this.name = name; this.id_card = id_card; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public long getId_card(){ return id_card; } public void setId_card(long id_card){ this.id_card = id_card; } public int compareTo(Object o){//默认按编号升序排序 Person person = (Person)o; int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1); return result; } }
源文件:TestSet.java
import java.util.*; public class TestSet{ public static void main(String args[]){ TreeSet<Person> treeSet = new TreeSet<Person>(); Person p1 = new Person("马先生",22015); Person p2 = new Person("李先生",22016); Person p3 = new Person("王小姐",22018); Person p4 = new Person("尹先生",22020); Person p5 = new Person("王先生",22012); treeSet.add(p1); treeSet.add(p2); treeSet.add(p3); treeSet.add(p4); treeSet.add(p5); System.out.println("初始化的集合:"); Iterator<Person> it = treeSet.iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getId_card()+" "+p.getName()); } System.out.println("截取前面部分得到的集合:"); it = treeSet.headSet(p1).iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getId_card()+" "+p.getName()); } System.out.println("截取中间部分得到的集合:"); it = treeSet.subSet(p1,p3).iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getId_card()+" "+p.getName()); } System.out.println("截取后面部分得到的集合:"); it = treeSet.tailSet(p3).iterator(); while(it.hasNext()){ Person p = it.next(); System.out.println(p.getId_card()+" "+p.getName()); } } }
程序的运行结果如下:
初始化的集合:
22012 王先生
22015 马先生
22016 李先生
22018 王小姐
22020 尹先生
截取前面部分得到的集合:
22012 王先生
截取中间部分得到的集合:
22015 马先生
22016 李先生
截取后面部分得到的集合:
22018 王小姐
22020 尹先生
在使用由TreeSet类实现的Set集合时,也可以通过单独的比较器对集合中的对象进行排序。
例如:
比较器既可以作为一个单独的类,也可以作为对应类的内部类,本例中移内部类的形式实现比较器。
源文件:Person.java
import java.util.Comparator; public class Person implements Comparable{ private String name; private long id_card; public Person(String name,long id_card){ this.name = name; this.id_card = id_card; } public String getName(){ return name; } public void setName(String name){ this.name = name; } public long getId_card(){ return id_card; } public void setId_card(long id_card){ this.id_card = id_card; } public int compareTo(Object o){//默认按编号升序排序 Person person = (Person)o; int result = id_card>person.id_card?1:(id_card==person.id_card?0:-1); return result; } static class PersonComparator implements Comparator{ public static final int NAME = 1; public static final int ID_CARD = 2; private int orderByColumn = 1;//默认为按姓名排序 public static final boolean ASC = true; public static final boolean DESC = false; private boolean orderByMode = true;//默认为按升序排序 public int compare(Object o1,Object o2){//实现Comparator接口的方法 Person p1 = (Person)o1; Person p2 = (Person)o2; int result = 0;//默认的判断结果为两个对象相等 switch(orderByColumn){//判断排序条件 case 1: String s1 = CnToSpell.getFullSpell(p1.getName()); String s2 = CnToSpell.getFullSpell(p2.getName()); if(orderByMode){//升序 result = s1.compareTo(s2); } else{//降序 result = s2.compareTo(s1); } break; case 2: if(orderByMode){//升序 result = (int)(p1.getId_card()-p2.getId_card()); } else{//降序 result = (int)(p2.getId_card()-p1.getId_card()); } break; } return result; } public void orderByColumn(int orderByColumn){//用来设置排序条件 this.orderByColumn = orderByColumn; } public void orderByMode(boolean orderByMode){//用来设置排序方式 this.orderByMode = orderByMode; } } }
源文件:TestSet.java
import java.util.*; public class TestSet{ public static void main(String args[]){ TreeSet<Person> treeSet1 = new TreeSet<Person>(); Person p1 = new Person("马先生",22015); Person p2 = new Person("李先生",22016); Person p3 = new Person("王小姐",22018); treeSet1.add(p1); treeSet1.add(p2); treeSet1.add(p3); System.out.println("客户化排序前,默认按编号升序排序:"); //新创建一个Set集合,不进行客户化排序,默认按编号升序排序 TreeSet<Person> treeSet2 = new TreeSet<Person>(treeSet1);//通过构造函数初始化集合 Iterator<Person> it1 = treeSet2.iterator(); while(it1.hasNext()){ Person p = it1.next(); System.out.println(p.getId_card()+" "+p.getName()); } System.out.println("客户化排序后,按编号降序排序:"); //新创建一个Set集合,进行客户化排序,客户化排序方式为按编号降序排序 Person.PersonComparator pc = new Person.PersonComparator();//创建比较器(内部类)的实例 pc.orderByColumn(Person.PersonComparator.ID_CARD);//设置排序依据的属性 pc.orderByMode(Person.PersonComparator.DESC);//设置排序方式 TreeSet<Person> treeSet3 = new TreeSet<Person>(pc);//必须通过构造函数设置比较器 treeSet3.addAll(treeSet1);//初始化集合 Iterator<Person> it2 = treeSet3.iterator(); while(it2.hasNext()){ Person p = it2.next(); System.out.println(p.getId_card()+" "+p.getName()); } } }
程序的运行结果如下:
客户化排序前,默认按编号升序排序:
22015 马先生
22016 李先生
22018 王小姐
客户化排序后,按编号降序排序:
22018 王小姐
22016 李先生
22015 马先生
发表评论
-
foreach循环
2013-06-24 16:15 1495从JDK1.5开始,Java提供了一个更简单的循环:forea ... -
可变参数
2013-06-24 15:38 1224从JDK1.5开始,Java允许使用可变参数为方法指定数量不确 ... -
泛型(core java 笔记)
2013-06-18 16:18 20741.为什么引入泛型 package generic; ... -
两个程序的说明
2010-10-19 09:26 11651、程序1的结果是: clas ... -
构造器初始化
2010-10-18 14:42 1535可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动 ... -
成员初始化
2010-10-18 07:55 1247Java尽力保证:所有变量在使用前都能得到恰当的初始化。 对 ... -
线程的死锁
2010-10-11 19:21 1523当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚 ... -
线程的同步
2010-10-11 19:00 1290一个经典的关于线程安全性的问题:银行取钱问题。 银行取钱的基 ... -
java网站收集
2010-10-10 18:13 1294JAVA开发者最常去的25个英文网站:http://www.i ... -
控制线程
2010-10-10 16:06 20261、线程睡眠:sleep 如果我们需要让当前正在执行的线程暂 ... -
线程的状态
2010-09-28 19:00 1076线程从创建到执行完毕的整个过程称为线程的生命周期,在整个生命周 ... -
Java中Thread类的start()和run()的区别
2010-09-27 15:33 41371、start()方法来启动线程,真正实现了多线程运行,这时无 ... -
Java中创建线程的两种方法
2010-09-26 10:18 5646在Java中创建线程有两种方法:继承Thread类和实现Run ... -
创建String对象过程的内存分配小结
2010-09-23 20:32 2794常量池(Constant Pool):指的是在编译期被确定,并 ... -
Java堆和栈的区别 经典总结(转载)
2010-09-18 16:48 1289栈与堆都是Java用来在Ram中存放数据的地方。 与C++不 ... -
Java初学者都必须理解的七大问题
2010-09-18 10:36 1131问题一:我声明了什么 ... -
关于计算java程序运行时间(转载)
2010-09-18 09:22 1136//第一种,伪代码 long startTime= ... -
for循环的优化
2010-09-17 20:29 2158在程序中经常用到for循环,当一些算法实时性要求非常高时,对f ... -
详细解析Java中抽象类和接口的区别(转载)
2010-09-17 10:16 1126在Java语言中,abstract class和inter ... -
集合类(四):Map集合
2010-09-16 20:26 21545、Map集合 Map集合为映射类型,映射与集和列表有明显的区 ...
相关推荐
集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、remove、contains 等。Collection 接口没有实现类,因此需要通过其子接口来实现。 Set 是一个...
Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...
在本场景中,我们关注的是一个特定的集合类型——`IntSet`,它专门用于存储整型数值。`IntSet`通常以高效、无序且不允许重复的方式来组织数据。在本文中,我们将深入探讨`IntSet`的定义、实现和测试,以及如何在实际...
根据给定文件的信息,我们可以对整数集合类`integerSet`进行详细的知识点解析与功能实现探讨。 ### 整数集合类integerSet #### 类定义 `integerSet`类用于存储10个位于20至80之间的整数。此类包含了一个整型数组...
在C++编程语言中,集合类(通常称为Set)是一种数据结构,用于存储不重复的元素。`CSet`可能是作者自定义的一个集合类实现,它可能提供了类似于STL(Standard Template Library)中的`std::set`容器的功能。STL是C++...
java集合类list-set-map.doc
实现整数集合类 要求: 1、类中含两个私有变量,集合中元素的个数和集合中元素组成的数组。 2、用Set函数输入,Show函数输出结果(按从小到大的顺序输出各个元素)。 3、实现运算符+的重载,表示两个集合的并集。实现...
本文将深入探讨如何在C++中创建一个名为`IntegerSet`的集合类,以及在这个过程中涉及的关键知识点。 首先,集合类通常用于存储和操作一组特定类型的元素,比如整数。在C++中,我们可以通过定义一个类来实现这个概念...
首先,我们需要定义一个集合类,通常以`Set`为名称。这个类应该包含一个内部数据结构来存储元素,如动态数组或关联数组(如红黑树)。这里我们使用STL中的`std::set`作为底层数据结构,因为它自动处理元素的唯一性和...
在C++标准库中,`std::set` 是一个模板类,实现了一个关联容器,它包含唯一对象的集合。这里,我们主要关注两个集合的交集操作。 在C++中,我们可以使用内置的`std::set_intersection`函数来找到两个集合的交集。这...
同时,文章深入探讨了各种集合类的底层数据结构,包括List、Set、Map的实现细节,并讨论了如何确保集合的线程安全以及集合的快速失败机制。 适合人群:适用于初学者及有一定经验的Java开发者,尤其是那些需要深入...
自定义集合类则是开发者根据特定需求扩展Java集合框架的行为,以满足个性化或特定业务场景的功能需求。以下是对"java自定义集合类"这一主题的详细解释。 首先,Java集合框架包括接口(如List、Set、Map)和实现这些...
在编程领域,集合类是数据结构中的重要组成部分,主要用于存储一组不重复的元素。在Java中,`java.util.Set`接口及其子接口如`HashSet`、`TreeSet`等提供了整数集合的操作。本篇文章将深入探讨如何实现整数集合的...
### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。Java集合框架提供了多种数据结构,包括列表(List)、集(Set)和映射(Map),这些数据结构...
MFC 集合类可以按形态和设计方案来分类。MFC 为三种类型的集合形态提供了类: 列表 数组 映射 MFC 还提供三种类型的设计方案: 不使用 C++ 模板。 使用由简单元素组成的基于 C++ 模板的集合。 使用由类型...
Java集合类是Java编程语言中一个非常重要的概念,它提供了数据结构和算法的实现,使得在处理一组对象时更加高效和灵活。Java集合框架包括接口(如List、Set、Queue等)和实现这些接口的类(如ArrayList、HashSet、...
"Java集合类总结" Java集合类是Java语言中的一种重要数据结构,用于存储和管理数据。Java集合类可以分为两种:Collection接口和Map接口。Collection接口有两个子接口:List接口和Set接口。List接口是有序的,可以...
本文将详细介绍 `set` 类的使用方法及其基本操作,旨在帮助初学者更好地理解和掌握集合类的基本概念与应用。 #### 二、集合的基本概念 集合是数学中的一种基本概念,在计算机科学中也有广泛应用。集合是由一些特定...
本教程将详细讲解如何使用C++实现集合的基本操作,包括交运算、并运算、相对补和对称差,并介绍Set类的封装调用。 首先,C++标准库提供了`std::set`容器,它是基于红黑树的数据结构,支持O(log n)的时间复杂度进行...
### Java集合类详解总结 在Java编程中,集合框架(Collection Framework)是处理一组对象的强大工具,它提供了标准的数据结构来存储和操作这些对象。Java集合框架主要包括`Collection`、`Set`、`List`、`Queue`、`...