从屌丝到架构师的飞越(集合篇)-Set
一.介绍
Set注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素,用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。
Set集合里多个对象之间没有明显的顺序。基本与Collection方法相同。只是行为不同(Set不允许包含重复元素)。
Set集合不允许重复元素,是因为Set判断两个对象相同不是使用==运算符,而是根据equals方法。即两个对象用equals方法比较返回true,Set就不能接受两个对象。
Set是最简单的一种集合,它的对象不按特定方式排序,只是简单的把对象加入集合中,就像往口袋里放东西。
对Set中成员的访问和操作是通过集中对象的引用进行的,所以Set中不能有重复对象。
Set也有多种变体,可以实现排序等功能,如TreeSet,它把对象添加到TreeSet中的操作将变为按照某种比较规则将其插入到有序的对象序列中。它实现的是SortedSet接口,也就是加入了对象比较的方法。通过对集中的对象迭代,我们可以得到一个升序的对象集合。
二.知识点介绍
1、HashSet
2、LinkedHashSet
3、TreeSet
三.上课对应视频的说明文档
1、HashSet
虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看 HashSet的add(Object obj)方法的实现就可以一目了然了。
代码示例:
import java.util.*;
public class HTest{
public static void main(String[] args) {
//创建Set集合对象
Set<String> set = new HashSet<String>() ;
//添加元素(增)
set.add("hello");
set.add("java") ;
set.add("java") ;
set.add("world") ;
set.add("world") ;
set.add("world") ;
System.out.println("集合中添加的元素:"+set);//打印的
是内容(原因:传入参数类型是String,底层重写了toString()方法)
System.out.println("集合中元素的个数:"+set.size());
//增强for遍历
Iterator i=set.iterator();
while(i.hasNext()){
System.out.println(i.next());
}
//删除元素(删)
System.out.println("是否成功删除:"+set.remove
("hello"));//删除是否成功
System.out.println("删除后集合中的元素:"+set);
//查询
System.out.println("是否包含此元素:"+set.contains
("hello"));
}
}
class Book{
String name;
double price;
public Book(String name,double price) {
// TODO Auto-generated constructor stub
this.name = name;
this.price = price;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "[书名:" + this.name + " 价格:" + this.price + "]";
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
Book b = (Book) obj;
return this.name.equals(b.name);
}
}
public class demo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//不允许重复,增加自定义对象
HashSet<Book> books = new HashSet<Book>();
books.add(new Book("深入Javaweb",34));
books.add(new Book("java神书",78));
books.add(new Book("java神书",78));
// books.remove(new Book("java神书",78));
//修改书名
Iterator<Book> it = books.iterator();
while(it.hasNext()){
Book b = it.next();
if(b.name.equals("java神书")){
b.name = "java编程思想";
}
}
//为什么改了名字后不能删除了!
books.remove(new Book("java编程思想",78));
System.out.println("集合的元素: "+ books);
}
}
2、LinkedHashSet
LinkedHashSet是有序的而且不能重复,是HashSet的一个子类,一个链表; 以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代;
代码示例:
class Student{
private int age;
private String name;
public Student(int age,String name)
{
this.age = age;
this.name = name;
}
//要显示Student类的信息,必须重写toString 方法
public String toString(){
return "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.equalsIgnoreCase(s.name);
}
}
public class LinkedHashSetTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedHashSet linkHashSet = new LinkedHashSet();
Student linkedstu1 = new Student(18,"zxx");
Student linkedstu2 = new Student(23,"zyj");
Student linkedstu3 = new Student(25,"xmh");
Student linkedstu4 = new Student(25,"zah");
Student linkedstu5 = new Student(25,"zah");
linkHashSet.add(linkedstu3);
linkHashSet.add(linkedstu4);
linkHashSet.add(linkedstu1);
linkHashSet.add(linkedstu2);
linkHashSet.add(linkedstu5);
linkHashSet.add(null);
Iterator it = linkHashSet.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
//经过测试是有序的而且不能重复
}
}
3、TreeSet
SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
TreeSet提供一个使用树结构存储Set接口的实现,对象以升序顺序存储,访问和遍历的时间很快。
代码示例:
import java.util.*;
public class TreeSetDemo {
public static void main(String args[]) {
// Create a tree set
TreeSet ts = new TreeSet();
// Add elements to the tree set
ts.add("C");
ts.add("A");
ts.add("B");
ts.add("E");
ts.add("F");
ts.add("D");
System.out.println(ts);
}
}
综合案例:
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class SetDemo {
public static void main(String[] args) {
HashSet<String> hs = new HashSet<String>();
//增加元素
hs.add("B");
hs.add("A");
hs.add("D");
hs.add("E");
hs.add("C");
hs.add("F");
System.out.println("HashSet 顺序:\n"+hs);
LinkedHashSet<String> lhs = new LinkedHashSet<String>();
lhs.add("B");
lhs.add("A");
lhs.add("D");
lhs.add("E");
lhs.add("C");
lhs.add("F");
System.out.println("LinkedHashSet 顺序:\n"+lhs);
TreeSet<String> ts = new TreeSet<String>();
ts.add("B");
ts.add("A");
ts.add("D");
ts.add("E");
ts.add("C");
ts.add("F");
System.out.println("TreeSet 顺序:\n"+ts);
}
}