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接口的实现类的更多相关文章

  1. Java 学习笔记(7)——接口与多态

    上一篇说了Java面向对象中的继承关系,在继承中说到:调用对象中的成员变量时,根据引用类型来决定调用谁,而调用成员方法时由于多态的存在,具体调用谁的方法需要根据new出来的对象决定,这篇主要描述的是J ...

  2. 疯狂java学习笔记之面向对象(一) - 定义类、方法、构造器

    Java面向对象 1.定义类 2.创建对象.调用方法 类和对象: 某一类对象的概念定义. 比如:人类 - 抽象出来的概念(不特指某个人) 对象 - 在类的概念下产生的一个实例,它就是一个对象了. ja ...

  3. java学习——JDK1.8接口和实现类

    Java 8 新特性:接口的静态方法和默认方法 https://blog.csdn.net/sun_promise/article/details/51220518 接口的默认方法和静态方法 http ...

  4. Java学习笔记之——接口

    接口(interface)和抽象类 为何要定义接口?------>实现不同的方法 Java的设计思想是单继承和多实现 类:属性和方法的集合,方法围绕着属性转,可以理解为自定义的类型 接口:与类是 ...

  5. Java学习笔记(8)---Scanner类,浅谈继承

    1.Scanner类: a.定义: java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. Scanner s = new Scanner(S ...

  6. java学习笔记(三):类和对象

     创建对象 构造器 每一个类都有一个构造器. 如果我们不单独为一个类编写构造器那么 Java 的编译器将会给这个类建立一个默认的构造器. 每当一个新的对象被创建,至少一个构造器将会被调用. 构造器的一 ...

  7. Java学习笔记(七)——获取类中方法的信息,java的LinkedList

    [前面的话] 在实际项目中学习知识总是最快和最有效的,既能够较好的掌握知识,又能够做出点东西,还是简单的知识总结,最近一直在总结笔记,写的东西还是比较水,希望慢慢可以写出一些干货. 学习过程中的小知识 ...

  8. Java学习笔记 07 接口、继承与多态

    一.类的继承 继承的好处 >>使整个程序架构具有一定的弹性,在程序中复用一些已经定义完善的类不仅可以减少软件开发周期,也可以提高软件的可维护性和可扩展性 继承的基本思想 >>基 ...

  9. Java学习笔记之接口

    一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(Str ...

随机推荐

  1. maven scope 'provided' 和 ‘compile’的区别

    解释 其实这个问题很简单. 对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact(模块)对应的jar包在classpath中. 而对 ...

  2. Centos简介

    Centos作为主流的一种Linux操作系统,以后项目中,比如后期Redis,以及部署一些项目,会把Centos作为服务器操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍, ...

  3. Java编程思想第四版第二章练习题答案

    练习1:创建一个类,它包含一个int域和一个char域,它们都没有被初始化.将他们的值打印出来,以验证Java执行了默认初始化 public class JavaThinking { private ...

  4. 20155309 《Java程序设计》实验三(Java面向对象程序设计)实验报告

    一.实验内容及步骤 (一)编码标准 在IDEA中使用工具(Code->Reformate Code)把代码重新格式化. (二)在码云上把自己的学习搭档加入自己的项目中,确认搭档的项目加入自己后, ...

  5. C#重写ToString

    C# 中的每个类或结构都可隐式继承 <xref:System.Object> 类. 因此,C# 中的每个对象都会获取 <xref:System.Object.ToString%2A& ...

  6. GUC-9 ReadWriteLock : 读写锁

    import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWrit ...

  7. eschop购物实现立即购买和加入购物车

    后台=>平台=>商店设置=>购物流程 是否一步购物设置为否 2:修改代码 .js/common.js function addToCartShowDivResponse(result ...

  8. Unity:控制粒子特效的移动方向

    前几天在项目中遇到一个问题,需求是界面中先展示一段闪光特效,停顿一段时间后特效飞往一个固定的位置然后消失,类似于跑酷游戏吃到金币后金币飞往固定的金币数值显示框那种效果(具体是通过特效来实现还是直接通过 ...

  9. POJ 2260 Error Correction 模拟 贪心 简单题

    Error Correction Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6825   Accepted: 4289 ...

  10. 洛谷——P2083 找人

    P2083 找人 题目背景 无 题目描述 小明要到他的同学家玩,可他只知道他住在某一单元,却不知住在哪个房间.那个单元有N层(1,2……N),每层有M(1,2……M)个房间. 小明会从第一层的某个房间 ...