java 集合(Set接口)


Set接口:無序集合,不允許有重復值,允許有null值

                    存入與取出的順序有可能不一致

 

HashSet:具有set集合的基本特性,不允許重復值,允許null值

       底層實現是哈希表結構

       初始容量為16

       保存自定義對象時,保證數據的唯一性,主要由哈希表的結構決定

       先判斷hashCode()是否相同,若相同,再判斷equals()是否相同

       

哈希表結構:哈希表中存放的都是對象的哈希碼值,當想要給哈希表中存放對象時,需要先進行對象的哈希碼值比較,若表中已經存在了相同的哈希碼,則繼續比較equals方法,比較對象的值是否相同,若返回false,則存入哈希表中,相當於兩個對象共享同一塊內存地址。若表中無相同的哈希碼值,則直接存入。

package com.itycl.array;

/*

 * 用HashSet去除重復值  重寫toString()  hashCode()   equals()

 */

import java.util.HashSet;

import java.util.Iterator;

 

public class HashSetDemo {

public static void main(String[] args) {

   

    HashSet<Integer> set=new HashSet<>();

    set.add(1);

    set.add(2);

    set.add(3);

    set.add(3);

    set.add(4);

    set.add(4);

    Iterator it=set.iterator();

    while(it.hasNext()) {

       Integer value = (Integer) it.next();

       System.out.println(value);

    }

    System.out.println(set);

}

}

 

 

HashSet存放自定義對象:

package SetDemo1;

 

import java.util.HashSet;

import java.util.Iterator;

/*課堂練習:

 *    

 *

 *

 * System.out.println():默認添加內容.toString

 * 輸出該對象的字符串表示

 *

 *

 *

 */

 

public class HashSetDemo2 {

   public static void main(String[] args) {

    HashSet<Person> ps=new HashSet<>();

    ps.add(new Person("小花","18"));

    ps.add(new Person("小綠","19"));

    ps.add(new Person("小紅","19"));

    ps.add(new Person("小粉","18"));

   

    ps.add(new Person("小草","19"));

    ps.add(new Person("小草","19"));  

    Iterator<Person> it=ps.iterator();

    while(it.hasNext()) {

       System.out.println(it.next());    

    }     

}

}

 

Person類:

package collection;

 

public class Person implements Comparable<Person> {

private String name;

private int age;

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public int getAge() {

    return age;

}

public void setAge(int age) {

    this.age = age;

}

public Person(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

@Override

public int compareTo(Person o) {

    if(this.age>o.age) {

       return 1;

    }else if(this.age<o.age) {

       return -1;

    }else {

       return this.getName().compareTo(o.getName());

    }

   

}

@Override

public String toString() {

   

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

@Override

public int hashCode() {

    return this.name.hashCode()+this.age*7;

}

@Override

public boolean equals(Object obj) {

   

    if(obj==null) {

       throw new RuntimeException("傳入的對象不能為空!");

    }

   

    if(!(obj instanceof Person)) {

       throw new RuntimeException("傳入的對象不是Person的實例!");

    }

   

    Person p = (Person) obj;

    return p.getName().equals(this.name) && p.getAge()==(this.age);

 

}

}

 

    

   TreeSet:具有set集合的基本特性,有序集合,不允許重復值,允許null。

          底層實現是樹的數據結構。

                   兩種排序方式:

a)實現自comparable接口:自然順序,實現該接口類自身就具備了一種可比較性

*重寫compareTo()方法

b)自定義一個比較器comparator:可以作為參數傳給set集合,讓集合具有明確的比較

1.實現自comparable接口:      

package SetDemo1;

import java.util.Iterator;

import java.util.TreeSet;

/*使用TreeSet集合保存自定義對象

 * 並且,認為年齡和姓名相同對象為同一個學生對象

 *

 */

public class TreeSetDemo1 {

   public static void main(String[] args) {

    TreeSet<Student> ts=new TreeSet<>();

    ts.add(new Student("java01",20));

    ts.add(new Student("java02",10));

    ts.add(new Student("java03",20));

    ts.add(new Student("java04",30));

    ts.add(new Student("java05",20));

    ts.add(new Student("java05",20));//不允許重復值

    ts.add(null);

    Iterator<Student> it=ts.iterator();

    while(it.hasNext()) {      

       System.out.println(it.next()); 

    }     

}

   

 

Person類:

package com.itycl.array;

//實現comparable<T>接口

public class Person implements Comparable<Person> {

private String name;

private int age;

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public int getAge() {

    return age;

}

public void setAge(int age) {

    this.age = age;

}

public Person(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

//重寫compareTo()

@Override

public int compareTo(Person o) {

    if(this.age>o.age) {

       return 1;

    }else if(this.age<o.age) {

       return -1;

    }else {

       return this.getName().compareTo(o.getName());

    }

   

}

//重寫toString()

@Override

public String toString() {

   

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

}

 

2.自定義一個比較器:comparator,讓集合具有明確的比較

自定義比較器:實現implements Comparator接口

package com.itycl.array;

import java.util.Comparator;

public class MyComparator implements Comparator<Student> {

    @Override

    public int compare(Student o1, Student o2) {

       System.out.println(o1+":"+o2);

       if(o1==null || o2==null) {

           throw new RuntimeException("比較的參數不能為空");

       }

       if(o1.getAge()>o2.getAge()) {

           return 1;

       }else if(o1.getAge()<o2.getAge()) {

           return -1;

       }else {

           return o1.getName().compareTo(o2.getName());

       }

          

    }

}

 

Student類:

package com.itycl.array;

public class Student {

private String name;

private int age;

public Student(String name, int age) {

    super();

    this.name = name;

    this.age = age;

}

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

public int getAge() {

    return age;

}

public void setAge(int age) {

    this.age = age;

}

@Override

public String toString() {

    return "Person[name="+name+","+"age="+age+"]"+"\t";

}

}

 

TreeSetDemo1:

package com.itycl.array;

import java.util.Iterator;

import java.util.TreeSet;

public class TreeSetDemo1 {

public static void main(String[] args) {

    MyComparator my=new MyComparator();//創建比較器對象,並且傳到set集合中,使set集合本身具有明確的比較

    TreeSet<Student> set=new TreeSet<>(my);

    set.add(new Student("張倩",12));

    set.add(new Student("李雷",10));

    set.add(new Student("蘭蘭",6));

    set.add(new Student("老劉",26));

    set.add(new Student("王樂",21));

    Iterator it=set.iterator();

    while(it.hasNext()) {

       Student s = (Student) it.next();

       System.out.println(s.toString());

    }

}

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM