java中Set接口知识点

 

1.为什么需要集合?

c语言学习中,当我们遇到大量相同类型数据时,我们会定义该类型数组来存数这些数据,在java中,我们在面向对象编程中常常需要定义很多相同属性和方法的对象,那么这些对象存储在哪里,怎么存储才能使用户访问这些对象更加的快捷方便?对比c语言中数组java中集合具有相同的功能,但是集合具有动态存储的特点,可以更加灵活的存储、访问、调用对象。

在面向对象编程中,当存储的对象个数不确定时,以及存储的对象是复杂对象,具有映射关系时,我们就需要用集合存储。集合可以理解存放一组相同属性和方法的对象的容器。

2.Set接口和List接口的比较

ListArryList()  LinkedList()    Vector()     

Set:  HashSet()    TreeSet()  

List内存储的元素有序,可重复

Set内存储的元素无序,不可重复

3. HashSet和TreeSet的特点:

HashSet特点?

HashSet类是Set接口实现类之一,它不保存元素的加入顺序,HashSet()类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速查找

TreeSet特点?

TreeSet()类使用二叉树结构对加入元素进行排序存放,通过TreeSet构造方法来获取TreeSet对象。

注意:放入TreeSet类中的元素必须是可排序的。对加入的对象,若要实现comparaTo()方法必须实现implements Comparable接口

4.自定义比较器

实现implements Comparable接口定义排序有局限性,实现此接口只能按comparaTo()定义的这一种方法排序,如果同一对象有多种排序方式,应该定义不同的比较器,比如说学生对象可以按学号,分数,年龄等进行多种排序。

自定义比较器实质:让自己编写的类实现Comparator接口,重写Comparator中的比较方法compara(Object a,Objectb)

compara(Object a,Objectb)方法使用:

public  int compare(Object a,Object b){

  

  int i=b.对象属性- a.对象属性;

  

  return   i;   //返回0,表示this==obj  ;返回正数表示,this>obj; 返回负数,表示this<obj

  

  

5. HashSet和TreeSet的实际用法

5.1. HashSet用法

import java.util.Comparator;

public class Student {
	
	//声明属性
	private String name;
	private int age;
	
	
	//getter,setter方法
	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 Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		
		return name+age;
	}

}

测试类 :

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

import List.Student;

public class HashSetText {

	/**
	 * HashSet用法
	 */
	public static void main(String[] args) {
		
        /*声明对象*/
		Student zhangsan=new Student("张三",20);
		Student lisi=new Student("李四",19);
		Student liyun=new Student("李云",18);
		
		HashSet<Student> hs=new HashSet<Student>();
		
	   hs.add(liyun);
	   hs.add(liyun);
	   hs.add(zhangsan);
	   hs.add(lisi);
	   hs.add(lisi);
	   
	   
	   
	   Iterator it=hs.iterator();
	   
	   while(it.hasNext()){
		   
		   System.out.println(it.next());
	   }
	   
	   
}
}


 5.2 . TreeSet用法

让学生信息按照学生成绩排序输出

/**
 * 
 *学术类
 *
 */
public class Student {
	
	/*声明属性和方法*/
	private String name;
	private Integer age;
	private Integer score;
	
	
    /*getter,setter方法*/
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public Integer getScore() {
		return score;
	}
	public void setScore(Integer score) {
		this.score = score;
	}
	
	
	/*构造方法*/
	public Student(String name, Integer age, Integer score) {
		super();
		this.name = name;
		this.age = age;
		this.score = score;
	}
	@Override      //重写String,toString方法
	public String toString() {
	
		return "姓名:"+name+"    年龄:"+age+"      成绩:"+score;
	}
	
	
	@Override      //重写hasCode()方法
	public int hashCode() {
		
		return   age*name.hashCode();
	}
	
	
	
	@Override       //重写equals方法
	public boolean equals(Object o) {
		
		Student s=(Student) o;
		
        return  age==s.age&& name.equals(s.name);
		
	}
	
	
}

测试类:

import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;



	/**
	 * TreeSet测试类
	 */
	
	/*创建学生成绩比较器*/
	class StudentScoreComparator  implements Comparator<Student>{

		@Override
		public int compare(Student o1, Student o2) {
			int i= (int)(o2.getScore()-o1.getScore());
			return i;
			}
		}
	
	
	public class TreeSetTest {
	public static void main(String[] args) {
		
		  Set ts=new TreeSet(new StudentScoreComparator());   //创建TreeSet集合
		  
		  Student stu1=new Student("张三",18,85);
		  Student stu2=new Student("李四",19,88);
		  Student stu3=new Student("李红",20,60);
		  Student stu4=new Student("张丽",18,90);

		  ts.add(stu1);    //将对象放进TreeSet集合中
		  ts.add(stu2);
		  ts.add(stu3);
		  ts.add(stu4);
		  
		  
		  Iterator it=ts.iterator();    //声明迭代器
		  
		  while(it.hasNext()){
			  System.out.println(it.next());
			  
		  }
		  
		  
		  

	}

}


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值