java基礎---類集框架二


 

學習筆記 -  Set、HashSet、TreeSet

 

一、Set簡介

 * -set :元素是無序(存入和取出的順序不一定一致),元素不可以重複
  *   |--HashSet:底層數據結構是哈希表
  *    HashSet是如何保證元素唯一性的呢?
  *    如果元素的HashCode值相同,纔會判斷equals是否爲true
  *    如果元素的HashCode值不同,不會調用equals
  *    
  *    注意:對於判斷預算是否存在,以及刪除等操作,依賴的方法是元素的hashcode和equals方法
  *    先依賴hashcode在依賴equals方法    
  *   
  *   |--TreeSet
  *
  * set集合的功能和Collection是一致的

 

二、HashSet使用示例

public class HashSetText {

 /**
  * 向hashSet集合中存入自定義對象
  * 姓名和年齡相同一個人,重複元素
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
 public static void main(String[] args) {
  //需要讓他們的哈希值不同
  HashSet hs2 = new HashSet();
  hs2.add(new Person2(11,"jj"));//都是new出來的,哈希值不同
  hs2.add(new Person2(22,"ll"));
  hs2.add(new Person2(33,"kk"));
  hs2.add(new Person2(11,"jj"));
  
  sop("jj:"+hs2.contains(new Person2(11, "jj")));
  
  sop("ll:"+hs2.remove(new Person2(22,"ll")));
  
  Iterator it2 = hs2.iterator();
  while(it2.hasNext()){
   Person2 p = (Person2) it2.next();
   sop(p.getAge()+":"+p.getName());
  }
 
 }
 public static void sop(Object obj){
  System.out.println(obj);
 }

}
class Person2{
 private  int age;
 private String name;
 
 Person2(int age,String name){
  this.age = age;
  this.name = name;
 }
 //注意hasCode  和  hashCode
 public int hashCode(){
//  return 60;
  System.out.println(this.name+"....hascode");
  return name.hashCode()+age*39;
 }
 
 public boolean equals(Object obj){
  if(!(obj instanceof Person2))
   return false;
  Person2 p = (Person2) obj;
  
  System.out.println(this.name+"...."+p.name);
 
  return this.name.equals(p.name)&&this.age==p.age;  
 }
 
 public int getAge() {
  return age;
 }
 
 public String getName() {
  return name;
 }
 
}

 

三、TreeSet簡介

* set無序,不可以重複元素。
  *   |--HashSet:數據結構是哈希表,線程是非同步的。
  *      保證元素唯一性的原理:判斷元素的hashcode值是否相同。
  *      如果相同,還會繼續判斷元素的equals方法,是否爲true
  *
  *   |--TreeSet:可以對set集合中的集合進行排序。
  *      底層數據結構是二叉樹
  *      保證元素唯一性的依據
  *      CompareTo方法 return 0
  *
  *      TreeSet排序的第一種方式:讓元素自身具備比較性.
  *      元素需要實現 Comparable接口,覆蓋comparableTo方法。
  *      這種方式也稱爲元素的自然順序,或者默認順序。
  *
  *      TreeSet的第二種排序方式
  *      當元素自身不具備比較性時,或者具備的比較性不是所需要的
  *      這時就需要讓集合自身具備比較性
  *      在集合初始化時,就有了比較方式。
  *      
  * 需求:
  * 往TreeSet集合中存儲自定義對象學生。
  * 想按照學生的年齡進行排序。
  *
  * 排序時,當主要條件相同時,一定判斷一下次要條件。

 

四、TreeSet使用示例

 

public class TreeSetDemo2 {

 /**
  * 當元素自身不具備比較性,或者具備的比較性不是所需要的。
  * 這時需要讓容器自身具備比較性。
  * 定義了比較器,將比較器對象作爲參數傳遞給TreeSet集合的構造函數。
  *
  * 當兩種排序都存在時,以比較器爲主。
  *
  * 定義一個類,實現Comparator接口,覆蓋compar方法
  */
 @SuppressWarnings({ "unchecked", "rawtypes" })
 public static void main(String[] args) {
  //構造一個新的空set,該set根據元素的自然順序進行排序。
  
  TreeSet ts = new TreeSet(new MyCompare());
  //往treeSet中存取的對象必須具有比較性
  ts.add(new Student2("lisi04",14));
  ts.add(new Student2("lisi002",11));
  ts.add(new Student2("lisi002",12));
  ts.add(new Student2("lisi3",13));
  ts.add(new Student2("lisi4",18));
  ts.add(new Student2("lisi4",19));
  
  Iterator it = ts.iterator();
  while(it.hasNext()){
   Student2 stu = (Student2)it.next();
   System.out.println(stu.getAge()+"..."+stu.getName());
  }
 }

 }
@SuppressWarnings("rawtypes")
class Student2 implements Comparable //該接口強制讓學生具備比較性
{
 private String name;
 private int age;
 Student2(String name ,int age){
  this.name = name;
  this.age = age;
 }
 public String getName() {
  return name;
 }
 public int getAge() {
  return age;
 }
 @Override
 public int compareTo(Object obj) {
  //return 1;//怎麼存的怎麼打出來,從大到小取
  //return -1;//從小到大取
  if(!(obj instanceof Student2))
   throw new RuntimeException("不是學生對象");
  Student2 s = (Student2)obj;
//  System.out.println(this.name+"....."+s.name);
  if(this.age>s.age)
   return 1;
  if(this.age == s.age)
  {
   return this.name.compareTo(s.name);
  }
  return -1;
 }
 
}
/**
 * 1.讓元素自身具有比較性
 * 2.讓容器自身具備比較性
 * 
 * 以比較器爲主
 *
 */
class MyCompare implements Comparator
{

 @Override
 public int compare(Object o1, Object o2) {
  Student2 s1 = (Student2) o1;
  Student2 s2 = (Student2) o2;
  int num = s1.getName().compareTo(s2.getName());
  if(num == 0){
   return new Integer(s1.getAge()).compareTo(s2.getAge());
//   if(s1.getAge()>s2.getAge())
//    return 1;
//   if(s1.getAge() == s2.getAge())
//    return 0;
//   return -1;
  }
  return num;
   
 }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章