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;
   
 }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值