美文网首页
从屌丝到架构师的飞越(集合篇)-Set

从屌丝到架构师的飞越(集合篇)-Set

作者: 走着别浪 | 来源:发表于2019-06-26 07:42 被阅读0次

    一.介绍

    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); 

    }

    相关文章

      网友评论

          本文标题:从屌丝到架构师的飞越(集合篇)-Set

          本文链接:https://www.haomeiwen.com/subject/oshiqctx.html