类集框架(七)_2.Set子接口

知识点:

     1.Set子接口的操作特点以及常用子类。

     2.深入分析两个常用子类的操作特征。

具体内容:

     Collection接口的另外一个常用子类是Set接口(20%),并且这个接口没有扩充Collection中的方法,只是简单的继承l了Collection接口,因此就没有了List集合提供的get()方法了。

      Set接口有两个常用的子类,分别是:HashSet、TreeSet

 范例:观察HashSet子类的特点

package conll;

import java.util.HashSet;
import java.util.Set;

public class TestDemo {

	public static void main(String[] args) throws Exception {
			Set<String> all = new HashSet<String>();
			all.add("nihao");
			all.add("Hello");
			all.add("Hello");
			all.add("world");
			System.out.println(all);
			
		}
}


      通过以上代码发现,Set集合下没有重复元素(这一点是Set接口的特征),同时还发现是无序的,即:HashSet子类的特征属于无序排列。

范例:使用TreeSet子类

package conll;

import java.util.Set;
import java.util.TreeSet;

public class TestDemo {

	public static void main(String[] args) throws Exception {
			Set<String> all = new TreeSet<String>();
			all.add("X");
			all.add("B");
			all.add("B");  //重复数据
			all.add("A");
			System.out.println(all);
			
		}
}


     以上代码表明,TreeSet子类没有重复数据,以及所保存的内容自动排序。

关于数据排序的说明:

        TreeSet子类保存的内容可以排序。但是集合是一个动态的对象数组,如果要想为一组对象进行排序,在JAVA里面必须要使用比较器,应该使用Comparable完成比较。在比较方法里面需要将类中所有的属性进行比较。

  范例:TreeSet排序


package conll;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class Book implements Comparable<Book>{
	private double price;
	private String title;
	public Book(String title,double price){
		this.title=title;
		this.price=price;
	}
	
	public String toString(){
		return "书名:"+this.title+",价格:"+this.price+"\n";
	}

	@Override
	public int compareTo(Book o) {
		if(this.price>o.price){
			return 1;
		} else if(this.price<o.price){
			return -1;
		} else{	
		return this.title.compareTo(o.title);  //调用String类比较大小
		}
	}
}
 
package conll;

import java.util.Set;
import java.util.TreeSet;

public class TestDemo {

	public static void main(String[] args) throws Exception {
			Set<Book> all = new TreeSet<Book>();
			all.add(new Book("JAVA开发",79.8));
			all.add(new Book("JAVA开发",79.8));   //全部信息重复
			all.add(new Book("JSP开发",79.8));    //价格信息重复
			all.add(new Book("Android开发",89.8));  //都不重复
			System.out.println(all);
			
		}
}


     通过检测可以发现TreeSet类主要是依靠Comparable接口中的compareto进行比较排序的,当返回值为0的时候,那么它就认为是重复数据,不会被保存。comparable管TreeSet不管HashSet,因此HashSet就会现实所有的对象,TreeSet就不能现实所有对象。

关于重复元素的说明:

     很明显,Comparable接口只能够负责TreeSet子类进行重复元素的判断,它并不能真的用于重复元素的判断。因为它只有在排序的情况下有这样的功能。如果想要判断重复元素那么只能够依靠Object类中提供的方法:

                  1.取得哈西码:public int hashCode(),先判断对象的哈哈希码是否相同,依靠哈西码取得一个对象的内容。

                  2.对象比较:publican boolean equals(Object obj),再将对象的属性进行依次的比较。

代码:


package conll;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
class Book{
	private double price;
	private String title;
	public Book(String title,double price){
		this.title=title;
		this.price=price;
	}
	@Override
	public String toString(){
		return "书名:"+this.title+",价格:"+this.price+"\n";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		long temp;
		temp = Double.doubleToLongBits(price);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		result = prime * result + ((title == null) ? 0 : title.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Book other = (Book) obj;
		if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}

}
 

package conll;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;

public class TestDemo {

	public static void main(String[] args) throws Exception {
			Set<Book> all = new HashSet<Book>();
			all.add(new Book("JAVA开发",79.8));
			all.add(new Book("JAVA开发",79.8));   //全部信息重复
			all.add(new Book("JSP开发",79.8));    //价格信息重复
			all.add(new Book("Android开发",89.8));  //都不重复
			System.out.println(all);
			
		}
}


 以后在非排序的情况下,只要是判断重复的元素依靠的永远是hashCode()与equals()。

总结:

   1.在开发中。Set接口绝对不是首选,如果非得用那也选着HashSet子类.

   2.Comparable这种比较器大部分情况下只存在于JAVA理论范畴,例如:要进行TreeSet排序.

   3.Set不管如何操作,必须始终保持一个前提:数据不能重复。

   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值