Java学习笔记_22_Set接口的实现类
22.Set接口的实现类:
Set接口存放的元素是无序的且不包括反复元素。
1>实现类HashSet:
HashSet类依据元素的哈希码进行存放,取出时也能够依据哈希码高速找到。HashSet不保存元素的加入的顺序。
样例:
import java.util.HashSet;
import java.util.Iterator; public class Student { public static void main(String[] args) { HashSet<String> hs = new HashSet<String>(); hs.add("1 zxx");
hs.add("1 zxx");
hs.add("2 hahx");
hs.add("3 zyj");
hs.add("4 bmh"); Iterator<String> it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
输出结果:
1 zxx
4 bmh
3 zyj
2 hahx
由于Set集合中不能存放反复的元素,所以对于自己定义的类,要重写hashCode()和equals()方法,用来推断元素是否为反复对象。
样例:
public class Student {
private int age;
private String name;
// get、set方法省略
public Student(int age, String name) {
this.age = age;
this.name = name;
}
// 重写HashCode方法
public int hashCode() {
return age * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name);
}
}
注:假设两个对象同样,那么它们的hashCode值一定要同样;假设两个对象的hashCode值同样,他们并不一定同样。
2>实现类LinkedHashSet:
LinkHashSet类依据元素的哈希码进行存放,同一时候用链表记录元素的增加顺序。
简单的字符集合样例:
import java.util.Iterator;
import java.util.LinkedHashSet; public class TestLinkedHashSet {
public static void main(String[] args) {
//创建一个LinkedHashSet集合对象
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
//向集合对象中加入字符串
lhs.add("zxx");
lhs.add("abc");
lhs.add("hik");
lhs.add("hik");
lhs.add(null);
//生成一个迭代器
Iterator<String> it = lhs.iterator();
//输出字符串
while(it.hasNext()){
System.out.println(it.next());
}
}
}
输出为:
zxx
abc
hik
Null
自己定义对象的集合使用样例:
创建Student类:
public class Student {
//创建属性
private int age;
private String name;
//生成属性的get和set方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//包括參数的构造函数
public Student(int age, String name) {
this.age = age;
this.name = name;
}
//重写toString方法
public String toString() {
return "age :" + age + " name :" + name;
}
// 重写HashCode方法
public int hashCode() {
return age * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name);
}
}
測试LinkedHashSet的主函数:
import java.util.Iterator;
import java.util.LinkedHashSet; public class TestLinkedHashSet {
public static void main(String[] args) {
//创建一个LinkedHashSet集合对象
LinkedHashSet<Student> lhs = new LinkedHashSet<Student>();
//生成一些Student对象
Student sd1 = new Student(18, "zxx");
Student sd2 = new Student(23, "abc");
Student sd3 = new Student(25, "hik");
Student sd4 = new Student(25, "hik");
//向集合对象中加入Student对象
lhs.add(sd4);
lhs.add(sd2);
lhs.add(sd3);
lhs.add(sd1);
lhs.add(null);
//生成一个迭代器
Iterator<Student> it = lhs.iterator();
//输出字符串
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
输出:
age :25 name :hik
age :23 name :abc
age :18 name :zxx
null
注:通过链表来存储对象,一般插入和删除效率比較高,检索效率相对较低。
3>实现类TreeSet:
TreeSet的构造方法:
· TreeSet(): 构造一个空树集。
· TreeSet(Collection c): 构造一个树集,并加入集合c中的全部元素。
· TreeSet(Comparator c): 构造一个树集,而且使用特定的比較器对其经行排序。
· TreeSet(SortedSet s): 构造一个树集,加入有序集合s中的全部元素,而且使用与有序集s同样的比較器排序。
注意:放入TreeSet中的元素必须是能够排序的。假若要对增加的Student类经行排序,
则要实现compareTo()方法,那么就必须实现Comparable接口。
排序Student集合类样例:
Student中的代码:
public class Student implements Comparable {
// 创建属性
private Integer age;
private String name;
// 包括參数的构造函数
public Student(Integer age, String name) {
this.age = age;
this.name = name;
}
// 生成属性的get和set方法
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 重写toString方法
public String toString() {
return "age :" + age + " name :" + name;
}
// 重写HashCode方法
public int hashCode() {
return age * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name);
}
//重写compareTo(Object o)方法
public int compareTo(Object o) {
Student s = (Student) o;
if (s.getAge().compareTo(this.getAge()) > 0)
return -1;
else if (s.getAge().compareTo(this.age) == 0)
return 0;
else
return 1;
}
}
TestTreeSet类中的代码:
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; public class TestTreeSet {
public static void main(String[] args) {
// 创建一个LinkedHashSet集合对象
Set<Student> ts = new TreeSet<Student>();
// 生成一些Student对象
Student sd1 = new Student(18, "zxx");
Student sd2 = new Student(23, "abc");
Student sd3 = new Student(25, "hik");
Student sd4 = new Student(25, "hik");
Student sd5 = new Student(17, "cde");
// 向集合对象中加入Student对象
lhs.add(sd4);
ts.add(sd2);
ts.add(sd5);
ts.add(sd3);
ts.add(sd1);
// 生成一个迭代器
Iterator<Student> it = ts.iterator();
// 输出字符串
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
输出结果:
age :17 name :cde
age :18 name :zxx
age :23 name :abc
age :25 name :hik
非常明显TreeSet中的Student类按age由小到大的顺序排序。
使用Comparable接口能够完毕TreeSet的排序,但使用Comparable接口定义排序具有局限性,
实现此接口的类仅仅能按CompareTo()定义的这一种方法排序。假设同一类对象要有多种排序方式,
应该为该类定义不同的比較器。定义比較器实际上就是让自编写的类实现Comparator接口,
重写Comparator接口中的比較方法compare(Object a,Object b)。
排序Student集合类样例:
Student中的代码:
public class Student {
// 创建属性
private Integer age;
private String name;
private Integer score;
// 包括參数的构造函数
public Student(Integer age, String name, Integer score) {
this.age = age;
this.name = name;
this.score = score;
}
// 重写toString方法
public String toString() {
return "name :" + name + " age :" + age + " score :" + score;
}
// 生成属性的get和set方法
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
// 重写HashCode方法
public int hashCode() {
return age * score * name.hashCode();
}
// 重写equals方法
public boolean equals(Object obj) {
Student s = (Student) obj;
return age == s.age && name.equals(s.name)
&& score == s.score;
}
}
TestTreeSet类中的代码:
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet; //学生年龄比較器
class StudentAgeComparator implements Comparator<Student> {
public int compare(Student o1, Student o2) {
int i = o1.getAge() - o2.getAge();
return i;
}
} // 学生成绩比較器
class StudentScoreComparator implements Comparator<Student> {
public int compare(Student o1, Student o2) {
int i = o1.getScore() - o2.getScore();
return i;
}
} public class TestTreeSet {
public static void main(String[] args) {
// 创建一个LinkedHashSet集合对象
//按年龄有小到大排顺序
Set<Student> ts = new TreeSet<Student>(new
StudentAgeComparator());
//按成绩由小到大排序
//Set<Student> ts = new TreeSet<Student>(new
StudentScoreComparator()); // 生成一些Student对象
Student sd1 = new Student(18, "zxx", 60);
Student sd2 = new Student(23, "abc", 85);
Student sd3 = new Student(25, "hik", 45);
Student sd4 = new Student(25, "hik", 90);
Student sd5 = new Student(17, "cde", 33); // 向集合对象中加入Student对象
ts.add(sd1);
ts.add(sd2);
ts.add(sd3);
ts.add(sd4);
ts.add(sd5); // 生成一个迭代器
Iterator<Student> it = ts.iterator(); // 输出字符串
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
当选用Set<Student> ts = new TreeSet<Student>(new StudentAgeComparator());时。
输出结果:
name :cde age :17 score :33
name :zxx age :18 score :60
name :abc age :23 score :85
name :hik age :25 score :45
非常明显是按年龄由小到大排序的。
当选用Set<Student> ts = new TreeSet<Student>(new StudentScoreComparator());时。
输出结果:
name :cde age :17 score :33
name :hik age :25 score :45
name :zxx age :18 score :60
name :abc age :23 score :85
name :hik age :25 score :90
非常明显是按成绩由小到大排序的。
Java学习笔记_22_Set接口的实现类的更多相关文章
- Java 学习笔记(7)——接口与多态
上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...
- 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器
Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...
- java学习——JDK1.8接口和实现类
Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...
- Java学习笔记之——接口
接口(interface)和抽象类 为何要定义接口?------>实现不同的方法 Java的设计思想是单继承和多实现 类:属性和方法的集合,方法围绕着属性转,可以理解为自定义的类型 接口:与类是 ...
- Java学习笔记(8)---Scanner类,浅谈继承
1.Scanner类: a.定义: java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. Scanner s = new Scanner(S ...
- java学习笔记(三):类和对象
创建对象 构造器 每一个类都有一个构造器. 如果我们不单独为一个类编写构造器那么 Java 的编译器将会给这个类建立一个默认的构造器. 每当一个新的对象被创建,至少一个构造器将会被调用. 构造器的一 ...
- Java学习笔记(七)——获取类中方法的信息,java的LinkedList
[前面的话] 在实际项目中学习知识总是最快和最有效的,既能够较好的掌握知识,又能够做出点东西,还是简单的知识总结,最近一直在总结笔记,写的东西还是比较水,希望慢慢可以写出一些干货. 学习过程中的小知识 ...
- Java学习笔记 07 接口、继承与多态
一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...
- Java学习笔记之接口
一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(Str ...
随机推荐
- 动态RNN和静态RNN区别
调用static_rnn实际上是生成了rnn按时间序列展开之后的图.打开tensorboard你会看到sequence_length个rnn_cell stack在一起,只不过这些cell是share ...
- PlantUML——4.实例演示1
给自己发消息 @startuml Alice -> Alice : This is a signal to self.\nIt also demonstrates \nmultiline tex ...
- Ubuntu 搭建etcd
一.简介 etcd是一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现. 提供配置共享和服务发现的系统比较多,其中最为大家熟知的是 ...
- Web前端开发最佳实践(8):还没有给CSS样式排序?其实你可以更专业一些
前言 CSS样式排序是指按照一定的规则排列CSS样式属性的定义,排序并不会影响CSS样式的功能和性能,只是让代码看起来更加整洁.CSS代码的逻辑性并不强,一般的开发者写CSS样式也很随意,所以如果不借 ...
- centos6.5/6.3升级安装ImageMagick7.0.1-1
线上论坛和应用程序的验证码功能都是使用的ImageMagick,但是版本比较老(centos yum安装的ImageMagick6.5.9).接到最新漏洞预报,紧急升级! ImageMagick图象处 ...
- vue2.0组件通信各种情况总结与实例分析
Props在vue组件中各种角色总结 在Vue中组件是实现模块化开发的主要内容,而组件的通信更是vue数据驱动的灵魂,现就四种主要情况总结如下: 使用props传递数据---组件内部 //html & ...
- SIlkTest入门
http://bbs.51testing.com/thread-983434-1-1.html
- Unity:控制粒子特效的移动方向
前几天在项目中遇到一个问题,需求是界面中先展示一段闪光特效,停顿一段时间后特效飞往一个固定的位置然后消失,类似于跑酷游戏吃到金币后金币飞往固定的金币数值显示框那种效果(具体是通过特效来实现还是直接通过 ...
- HTTP/FTP压力测试工具siege
HTTP/FTP压力测试工具siege 压力测试可以检测服务器的承载能力.针对HTTP和FTP服务,Kali Linux提供专项工具siege.该工具可以模拟多个用户同时访问同一个网站的多个网页, ...
- js中对同步和异步的理解
你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流 ...