java集合框架(set)

 

  Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

               HashSet:底层数据结构是哈希表。是线程不安全的。不同步。    

   HashSet是如何保证元素唯一性的呢?   

             是通过元素的两个方法,hashCode和equals来完成。    如果元素的HashCode值相同,才会判断equals是否为true。    如果元素的hashcode值不同,不会调用equals。

           注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

Set集合的功能和Collection是一致的。

   下面代码演示了hashset的使用方法:

   

 1 package com.itheima.day14;
 2 
 3 import java.util.*;
 4 
 5 public class HashSetDemo {
 6 
 7     /**
 8      * hashset的存储是不重复了 
 9      */
10     public static void sop(Object obj){
11         System.out.println(obj);
12     }
13     
14     public static void main(String[] args) {
15         HashSet hs=new HashSet();
16          hs.add("java1");
17          hs.add("java2");
18          hs.add("java1");
19          hs.add("java2");
20          
21          Iterator it=hs.iterator();
22          
23          while(it.hasNext()){
24              sop(it.next());
25          }
26                   
27     }
28 
29 }

 

 实例二:传入类 保证类的唯一性

   

package com.itheima.day14;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {

    /**
     * 往hashSet集合中存入自定对像            
     *  姓名和年龄相同为同一个人,重复元素。
     */
    
    public static void sop(Object obj){
        System.out.println(obj);
    }
    public static void main(String[] args) {
        HashSet hs=new HashSet();
        
        hs.add(new person("zhangsan",25));
        hs.add(new person("lisi",26));
        hs.add(new person("whangwu",27));
        hs.add(new person("zhangsan",25));
        
        Iterator it=hs.iterator();
        while(it.hasNext()){
            person p=(person)it.next();
            sop(p.getName()+p.getAge());
        }
    }

}
class person{
    private String name;
     private int age;
     
     person(String name, int age){
         this.name=name;
         this.age=age;
     }
     //重写object的equals方法
     public boolean equals(Object obj){
         if(!(obj instanceof person)){
             return false;
         }
         person p=(person)obj;
         System.out.println(this.name+"...equals.."+p.name);
         return this.name.equals(p.name)&&  this.age==p.age  ;
     }
     //重写hashcode方法
     public int hashCode()
        {
            System.out.println(this.name+"....hashCode");
            return name.hashCode()+age*37;
        }
    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;
    }
    
    
    
}

 

       TreeSet:可以对Set集合中的元素进行排序。     

                    底层数据结构是二叉树。     保证元素唯一性的依据:     compareTo方法return 0.

                TreeSet排序的第一种方式:

                    让元素自身具备比较性。     元素需要实现Comparable接口,覆盖compareTo方法。     也种方式也成为元素的自然顺序,或者叫做默认顺序。

                TreeSet的第二种排序方式。

                    当元素自身不具备比较性时,或者具备的比较性不是所需要的。     这时就需要让集合自身具备比较性。     在集合初始化时,就有了比较方式。

 

package com.itheima.day15;

import java.util.Iterator;
import java.util.TreeSet;


public class TerrSetDemo {

	/**
	 * 需求:
	 * 往TreeSet集合中存储自定义对象学生。
	 * 想按照学生的年龄进行排序
	 */
	
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();

		ts.add(new student("lisi02",22));
		ts.add(new student("lisi007",20));
		ts.add(new student("lisi09",19));
		ts.add(new student("lisi08",19));
		ts.add(new student("lisi007",20));
		ts.add(new student("lisi01",40));

		Iterator<student> it = ts.iterator();
		while(it.hasNext())
		{
			student stu = (student)it.next();
			System.out.println(stu.getName()+"..."+stu.getAge());
			
		}
	}

	}


class student implements Comparable{
	private String name;
	private int age;
	
	student (String name ,int age){
		this.name=name;
		this.age=age;
	}
	public int compareTo(Object obj){
		if(!(obj instanceof student)){
			return 0;
		}
		student s = (student)obj;

		System.out.println(this.name+"....compareto....."+s.name);
		if(this.age>s.age)
			return 1;
		if(this.age==s.age)
		{
			return this.name.compareTo(s.name);
		}
		return -1;
		
		
	}
	
	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;
	}
	
	
}

  

 

 

 

posted @ 2012-10-17 13:33  张学东  阅读(165)  评论(0编辑  收藏  举报