Java基础(二十二)集合(4)Set集合
Set集合为集类型。集是最简单的一种集合,存放于集中的对象不按特定方式排序,只是简单地把对象加入集合中。对集中存放的对象的访问和操作时通过对象的引用进行的,所以,在集中不能存放重复对象。
Set接口实现了Collection接口,从而拥有Collection接口提供的所有常用方法。
实现了Set接口的类有三种,分别是HashSet类(子类为LinkedHashSet类)、EnumSet类和TreeSet类。
1.HashSet类
由HashSet类实现的Set集合的优点是能够快速定位集合中的元素。
Set集合中的对象是无序的,遍历集合输出对象的顺序与向集合中插入对象的顺序并不相同。
由HashSet类实现的Set集合中的对象必须是唯一的,所以,添加到由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中的对象的标识的唯一性。(Eclipse代码编辑区,右键-Source-Generate hashCode() and equals()...)
由HashSet类实现的Set集合按照哈希码排序,根据对象的哈希码确定对象的存储位置,所以,添加到由HashSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合中的对象。(Eclipse代码编辑区,右键-Source-Generate hashCode() and equals()...)
创建一个HashSet类的对象(Person类实现了hashCode()和equals()方法):
Set<Person> hashSet = new HashSet<>();
由于LinkedHashSet类是HashSet类的子类,如果既想保留HashSet类快速定位集合中对象的优点,又想让集合中的对象按插入的顺序保存,可以通过LinkedHashSet类来实现Set集合。
Set<Person> hashSet = new LinkedHashSet<>();
使用HashSet和LinkedHashSet实现Set集合的代码示例:
package hashSet.jun.iplab; import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set; 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 String getName() {
return name;
} public long getId_card() {
return id_card;
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
/*由于最后的hashCode的类型是int, 而int只有32位,所以64位的Long值,
* 要砍掉一半。为了不失去一半的信息,这个expression的意思是,
* 会值的高32位和低32位的值进行exclusive OR的结果,
* 这样就保证结果均会受前后32位的影响,不会丢失信息。
* 如果直接把Long转成int, 那就会丢掉高32位的信息。
* */
result = prime * result + (int) (id_card ^ (id_card >>> 32));
result = prime * result + ((name == null) ? 0 : name.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;
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;
} public static void main(String[] args) { Set<Person> hashSet = new HashSet<>();
hashSet.add(new Person("小红", 13211041));
hashSet.add(new Person("小黄", 13211241));
hashSet.add(new Person("小蓝", 13213231)); Iterator<Person> it_Person = hashSet.iterator();
while (it_Person.hasNext()) {
Person person = (Person) it_Person.next();
System.out.println(person.getName() + " " + person.getId_card());
}
System.out.println(); Set<Person> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add(new Person("小红", 13211041));
linkedHashSet.add(new Person("小黄", 13211241));
linkedHashSet.add(new Person("小蓝", 13213231)); Iterator<Person> it_LinkedHashSet_Person = linkedHashSet.iterator();
while (it_LinkedHashSet_Person.hasNext()) {
Person person = (Person) it_LinkedHashSet_Person.next();
System.out.println(person.getName() + " " + person.getId_card());
}
} } 输出:
小蓝 13213231
小红 13211041
小黄 13211241 小红 13211041
小黄 13211241
小蓝 13213231
2.TreeSet类
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在遍历集合时按照递增的顺序获得对象。
遍历对象时可能是按照自然顺序递增排列,所以,存入由TreeSet类实现的集合的对象必须实现Comparable接口;也可能是按照指定比较器递增排列,即可以通过比较器对由TreeSet类实现的Set集合中的对象进行排序。
创建一个TreeSet类的对象为(其中Person实现了Comparable接口,因此必须实现compareTo方法):
TreeSet<Person> treeSet = new TreeSet<>();
TreeSet类由于实现了java.util.SortedSet接口而增加的一些常用方法:
示例代码:
- Person类中重写compareTo方法,按照id_card属性的大小进行访问排序,id_card大的返回1,相等返回0,小于返回-1
// 重写compareTo方法,按照id_card的大小进行比较,如果大的返回1,等于返回0,小于返回-1
@Override
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;
}
- 首先创建五个Person对象并添加到TreeSet集合中
Person person1 = new Person("小一", 13211123);
Person person2 = new Person("小二", 13223131);
Person person3 = new Person("小三", 13232412);
Person person4 = new Person("小四", 13521312);
Person person5 = new Person("小五", 13231231); TreeSet<Person> treeSet = new TreeSet<>();
treeSet.add(person1);
treeSet.add(person2);
treeSet.add(person3);
treeSet.add(person4);
treeSet.add(person5);
- 迭代器访问时,将通过id_card的大小按照从小到大访问
Iterator<Person> it = treeSet.iterator();
while (it.hasNext()) {
Person person = (Person) it.next();
System.out.println(person.getName() + " " + person.getId_card());
} 输出:
小一 13211123
小二 13223131
小五 13231231
小三 13232412
小四 13521312
- 通过headSet方法得到“小五”(不包括)前面部分的集合
it = treeSet.headSet(person5).iterator();
while (it.hasNext()) {
Person person = (Person) it.next();
System.out.println(person.getName() + " " + person.getId_card());
} 输出:
小一 13211123
小二 13223131
- 通过subSet方法得到“小二”(包括)到“小四”(不包括)部分的集合
it = treeSet.subSet(person2, person4).iterator();
while (it.hasNext()) {
Person person = (Person) it.next();
System.out.println(person.getName() + " " + person.getId_card());
} 输出:
小二 13223131
小五 13231231
小三 13232412
- 通过tailSet方法得到“小三”(包括)后面部分的集合
it = treeSet.tailSet(person3).iterator();
while (it.hasNext()) {
Person person = (Person) it.next();
System.out.println(person.getName() + " " + person.getId_card());
} 输出:
小三 13232412
小四 13521312
二、Queue集合
Queue是Collection接口的最后一个子接口。
队列只允许在队尾
Java基础(二十二)集合(4)Set集合的更多相关文章
- java基础第十二篇之集合、增强for循环、迭代器和泛型
Collection接口中的常用方法: * 所有的子类子接口都是具有的 * 集合的方法:增删改查 * * public boolean add(E e);//添加元素 返回值表示是否添加成功 * pu ...
- Java基础(十二):包(package)
一.Java 包(package): 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间.包的作用: 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹 ...
- 夯实Java基础(十二)——异常处理
1.异常处理概述 在Java程序执行过程中, 总是会发生不被期望的事件, 阻止程序按照程序员预期正常运行, 这就是Java程序出现的异常. 异常处理是基于面向对象的一种运行错误处理机制,通过对异常问题 ...
- java基础(十二章)
一.变量的作用域(有效的使用范围) 1.变量有2种 1.1成员变量(属性) 声明在类的里面,方法的外面 1.2 局部变量 声明在方法里面或for循环结构中 2.调用时的注意事项(初始值不同.作用域不同 ...
- Java基础(十二)IO输入输出
一.IO 概述 1.IO 概念 IO:I 代表 Input 输入:O 代表 Output 输出. Java 中 IO 是以流为基础进行输入输出,所有的数据被串行化(保存)写入输出流,或者从输入流读入. ...
- Java基础语法<十二> 泛型程序设计
1 意义 泛型程序设计意味着编写的代码可以被很多不同类型的对象所重用. 常见应用 : ArrayList 2 K T V E ? object等的含义 类型变量使用大写形式 E – Element ( ...
- java基础(十二)常用类总结(二)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- Scanner、String(java基础知识十二)
1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...
- Java基础(十二)lambda表达式
1.引入lambda表达式的重要性 lambda表达式是一个可传递的代码块,可以在以后执行一次或多次. 在前面的回调部分,有一个例子是,ActionListener类实现了TimePrinter接口并 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
随机推荐
- 【面试题】SpringMVC部分面试题
SpringMVC面试题 什么是SpringMVC ? 简单介绍下你对SpringMVC的理解 ? SpringMVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过Mo ...
- Spring Boot(三) 使用Lombok
C#写的多了用习惯了众多的语法糖,再写起来Java总会有一些非常不舒服的地方.比如用惯了C#的属性在用起来Java的属性,写起来就会感觉不够优雅.如:定义一个Person类 public cl ...
- js初学总结
基础 交换变量方式 //利用第三方变量进行交换 var num1 = 10; var num2 = 20; var temp; temp = num1; num1 = num2; num2 = tem ...
- Spring Security 梳理 - session
Spring Security默认的行为是每个登录成功的用户会新建一个Session.这也就是下面的配置的效果: <http create-session="ifRequired&qu ...
- Shell之Test命令
目录 Shell之Test命令 参考 Test简介 Test语法 表达式之逻辑运算 表达式之字符串判断 表达式之整数判断 表达式之文件判断 Shell之Test命令
- 58同城AES签名接口分析
背景:需要获取58同城上面发布的职位信息,其中的包括职位的招聘要求,薪资福利,公司的信息,招聘者的联系方式.(中级爬虫的难度系数) 职位详情页分析 某个职位详情页的链接 https://qy.m.58 ...
- python爬虫入门10分钟爬取一个网站
一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...
- Nginx简单介绍以及linux下使用Nginx进行负载均衡的搭建
1.Nginx简介 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支撑5 ...
- Linux入门(历史与现状)
Linux 入门之 历史与现状 Linux是一个计算机的操作系统,与windows类似,是一款系统软件.操作系统首先是一个计算机程序,使用计算机语言开发,比如C语言.VC语言.是计算机硬件和应用软 ...
- 你不可错过的Java学习资源清单
学习Java和其他技术的资源其实非常多,但是我们需要取其精华去其糟粕,选择那些最好的,最适合我们的,同时也要由浅入深,先易后难.基于这样的一个标准,我在这里为大家提供一份Java的学习资源清单. Ja ...