------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
java集合框架——Set接口
简介:
集合框架:一组专门用来存储其他对象的类(对象容器类)和接口的设计结构,统称为集合框架。而这组类的功能就是实现各种方式的数据存储。
Collection接口: 1、Set接口:存放的元素是无序并且不包含重复元素
2、List接口:存放的元素是有序并且允许有重复元素
注: 这2种接口中的元素:即对象引用,元素类型都为Object
这2种接口中的重复:是指两个对象用过equals判断相等
这2种接口中的有序:是指元素存入的顺序与取出的顺序相同
Set接口:(三种常见实现类)
1、HashSet类:
不保存元素的加入顺序,根据元素的哈希码进行存放的,所以取出时也可以根据哈希码快速找到
判断元素是否重复的方法:hashCode()和equals()注:(hashCode()的方法返回值是对象存储的物理地址的一个索引)
允许添加null元素
public class HashSetTest {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("张三");
hs.add("李四");
hs.add("王五");
hs.add("赵六");
hs.add("孙琦");
Iterator it = hs.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
结果如图:
可以看出HashSet添加的顺序与迭代显示的结果顺序不一致,也验证了HashSet不保存元素加入顺序的特征。
2、LinkedHashSet类:
根据元素的哈希码进行存放,同时用链表记录元素的加入顺序
注:通过链表来存储对象,一般插入和删除效率较高import java.util.Set;
public class LinkedHashSet {
public static void main(String[] args) {
Set<Student> linkHashSet = new LinkedHashSet<Student>();
Student stu1 = new Student(18,"zhw");
Student stu2 = new Student(23,"zhxd");
Student stu3 = new Student(25,"zhh");
Student stu4 = new Student(25,"zha");
Student stu5 = new Student(25,"zha");
linkHashSet.add(stu3);
linkHashSet.add(stu4);
linkHashSet.add(stu1);
//记录HashCode嘛顺序,按照顺序查找出来
linkHashSet.add(stu2);
linkHashSet.add(stu5);
linkHashSet.add(null);
Iterator it = linkHashSet.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
3、TreeSet类:
使用红黑树结构对加入的元素进行排序存放
注: 1、放入TreeSet类中的元素必须是可“排序”的。2、对加入的元素,若要实现compareTo()方法,必须实现comparable接口
如果对添加的对象没有实现comparable接口会引发异常:java.lang.ClassCastException
comparable接口强行对实现它的每个类的对象进行整体排序。
实现comparable接口的对象可以用作有序映射表中的键或有序集合中的元素,无序指定比较器
public class TreeSetTest {
public static void main(String[] args) {
Set ts = new TreeSet();
Student stu1 = new Student(18, "zhw");
Student stu2 = new Student(23, "zhxd");
Student stu3 = new Student(25, "zhh");
Student stu4 = new Student(25, "zha");
ts.add(stu3);
ts.add(stu4);
ts.add(stu1);
ts.add(stu2);
ts.add(null);
Iterator it = ts.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
结果如图:
上图出现的结果是因为没有在Student类中实现接口Comparable
如果实现了Comparable接口:
package com.collection.demo;
public class Student implements Comparable {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
// 因为需要打印Student类的相关信息,所以要重写toString()方法
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
public int hashCode() {
return age * name.hashCode();
}
public boolean equals(Object o) {
Student s = (Student) o;
return age == s.age && name.equals(s.name);
}
// 提供访问属性age的方法
public int getAge() {
return age;
}
// 提供设置属性age的方法
public void setAge(int age) {
this.age = age;
}
// 因为要实现comparable接口,所以要重写compareTo(Object o)方法
// 判断执行compareTo方法的Student对象与传入的对象按排序的条件相比
// 是大于,小于,还是等于传入的对象
public int compareTo(Object o) {
Student s = (Student) o;
if (s.getAge() < this.getAge())
return -1;
else if (s.getAge() == this.getAge())
return 0;
else
return 1;
}
}
结果如图: