黑马程序员:Java基础总结----子接口 set<E>及其实现类

黑马程序员:Java基础总结



子接口 set<E>及其实现类

  ASP.Net+Android+IO开发 .Net培训 、期待与您交流!




java.util
子接口 set<E>


特点:
Set:无序的,无索引,元素不可重复
Set集合的功能和Collection是一致的,一个不包含重复元素的 collection

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、
     |--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。!无序的
               HashSet是如何保证元素唯一性的呢?
               是通过元素的两个方法,hashCode和equals来完成。
               如果元素的HashCode值相同,才会判断equals是否为true。
               如果元素的hashcode值不同,不会调用equals。


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


     |--TreeSet:可以对Set集合中的元素进行排序。
!有自然排序的功能
                    底层数据结构是二叉树。
                    保证元素唯一性的依据:
                    compareTo方法return 0.

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

java.lang

接口 Comparable<T>

 intcompareTo(T o)
          比较此对象与指定对象的顺序。


                    TreeSet的第二种排序方式。
                    当元素自身不具备比较性时,或者具备的比较性不是所需要的。
                    这时就需要让集合自身具备比较性。
                    在集合初始化时,就有了比较方式
定义了比较器,
将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法


ava.util

接口 Comparator<T>

 intcompare(T o1, T o2)
          比较用来排序的两个参数。
 booleanequals(Object obj)
          指示某个其他对象是否“等于”此 Comparator。



hashSet集合中存入自定对象
              姓名和年龄相同为同一个人,重复元素(覆盖equals,hashcode方法)

       public  int  hashCode()
      {
            System.  out .println( this .name + "....hashCode"  );
              return  name.hashCode()+ age*37;
      }

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



TreeSet集合中存入自定对象使之具备比较性方便排序

 TreeSet排序的第一种方式:让元素自身具备比较性。

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) {

              // return 0;

              if  (!(obj  instanceof  Student))
                    throw  new  RuntimeException( "不是学生对象" );
            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;
              /**/
      }
}

TreeSet的第二种排序方式。让集合自身具备比较性。
TreeSet(Comparator<? super E> comparator)
          构造一个新的空 TreeSet,它根据指定比较器进行排序。

TreeSet tr =  new  TreeSet( new  MyCompare());

class  MyCompare  implements  Comparator
{
        public  int  compare (Object o1,Object o2)
      {
            Student s1 = (Student)o1;
            Student s2 = (Student)o2;

              int  num = s1.getName().compareTo(s2. getName());
              if (num==0)
            {

                    return  new  Integer(s1.getAge ()).compareTo( new  Integer(s2.getAge()));
                    /*
                  if(s1.getAge()>s2.getAge())
                        return 1;
                  if(s1.getAge()==s2.getAge())
                        return 0;
                  return -1;
                  */
            }      
              return  num;
      }
}






  ASP.Net+Android+IO开发 .Net培训 、期待与您交流!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值