您的位置:首页 > 职场人生

黑马程序员——java集合框架——Set接口

2015-10-15 10:15 363 查看
------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;

}

}


结果如图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: