黑马程序员_基础学习笔记(11)

---------------------- android培训java培训、期待与您交流! ---------------------- 



黑马程序员---比向东---第十五天

TreeSet

       可以对Set集合中的元素进行排序。排序时,当主要条件相同时,一定要

       判断一下次要条件。底层数据结构是二叉树。保证元素唯一行的依据,compareTo方法return 0;

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

                     元素需要实现Comparable接口,覆盖compareTo方法

                     这种方式也称为元素的自然顺序,或者叫做默认顺序

       TreeSet第二种排序方式:

              当元素自身不具备比较性时,或者具备的比较性不是所需要

              的,这时需要让集合(TreeSet)自身具备比较性。

              做法是在集合初始化时,就有了比较方式,即定义一个比较器

              将比较器作为参数传递给TreeSet集合的构造函数。

              比较器--定义一个类,实现Comparator接口,覆盖compare方法。

                            而当两种排序都存在时以比较器为主

泛型:   JDK1.5版本以后出现的新特性,用于解决安全问题,是一个安全机制

       好处:1 将运行时期出现的问题ClassCastException转移到了编译时期。

                            方便于程序员解决问题,让运行时期问题减少安全问题。

               2 避免了强制转换的麻烦。

       格式:通过<>来定义要操作的引用数据类型。

       使用:通常在集合框架中很常见,只要见到<>就要定义泛型。其实,<>

               就是用来接收类型的,当使用集合时,将集合中要存的数据类型

               作为参数传递到<>中即可

集合排序总结

       list: 元素是有序的,元素可以重复,因为该集合体系有索引(脚标)

           常用的子类对象:     面试题重点

              ArrayList 底层的数据结构是使用的数组结构 特点:查询速度快,但是增删比较慢

              LinkedList底层的数据结构使用的是链表结构 特点:增删速度快,但是查询比较慢

           Vector      底层是数组数据结构。线程同步,ArrayList线程不同步,替代了vector 

ArrayList 是可变长度数组,默认长度是10,当添加的元素大于10时,系统自动new一个新的数组且增长原数组的一半长度,并把之前的元 素复制到这个新数组中,vector和它一样,但是延长一倍。

 Set:无序,不可重复元素

            HashSet: 数据结构是哈希表,线程是非同步的。

                              保证元素唯一性的原理,判断元素的hashCode值是否相同

                              如果相同,还会继续判断元素的equals方法,是否为true。

              TreeSet: 可以对Set集合中的元素进行排序。底层数据结构是二叉树。

                              保证元素唯一行的依据,compareTo方法return 0;

                TreeSet 排序的第一种方式

                            让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖

                               compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序

                TreeSet第二种排序方式:

                         当元素自身不具备比较性时,或者具备的比较性不是所需要

                         的,这时需要让集合(TreeSet)自身具备比较性。

                         做法是在集合初始化时,就有了比较方式,即定义一个比较器

                         将比较器作为参数传递给TreeSet集合的构造函数。

                         比较器--定义一个类,实现Comparator接口,覆盖compare方法。

                               而当两种排序都存在时以比较器为主

 

关于ArrayList添加对象,自定义判断条件问题以及HashSet集合添加自定义对象问题

虽然两个集合的底层结构不同,但是他们都调用添加对象类中的equals方法,而

      

       ArrayList是通过contains()方法让系统自动调用equals方法

      

       HashSet是通过当add添加元素的时候 系统自动调用hashCode()方法判断hash值

       如果相等则不会被添加,如果相等,再通过hashCode方法调用equals方法判断。

       一般添加的时候都会在类中重写hashCode 和equals以满足实际条件的需求。

       但是,ArrayList和HashSet重写Object类中的equals方法原理都是一样的。

例如:                 

classPerson

{

       private String name;

       private int age;

       Person(String name,int age)

       {

              this.name=name;

              this.age=age;

       }

       public String getName()

       {

              return name;

       }

       public int getAge()

       {

              return age;

       }

此equals是重写Object中的equals方法

obj形参 实参是contains中的,相当于obj=new Person("xiaoxiao11",15); 多态

       public boolean equals(Object obj)

       {

             

判断传进来的对象是否是Person对象 不是的话就返回false

              if (!(obj instanceof Person)) 

              {

                     return false;

              }

 

因为穿参传进来的对象是Object的子类对象,体现多态性,必须向下转型

              Person p=(Person)obj;

      

              returnthis.name.equals(p.name)&&this.age==p.age;  

而return中的equlas是字符串中的equals方法~~! 比较字符串对象的内容是否相同

       }

 

}

关于TreeSet添加自定意对象,让其排序的问题。有两种方式

 

       第一种   让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖

                      compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序

                     class Student implementsComparable<Student>

                     {

                            private String name;

                            private int age;

                            Student(Stringname,int age)

                            {

                                   this.name=name;

                                   this.age=age;

                            }

              当在TreSet中添加对象的时候底层自动调用Comparable接口中的compareTo方法

              class Student implementsComparable <Student>

              {

                     private String name;

                     private int age;

                     Student(String name,intage)

                     {

                            this.name=name;

                            this.age=age;

                     }

                     public intcompareTo(Student s)

                     {

                            System.out.println(this.name+"...compareto...."+s.name);

                            int num= newInteger(this.age).compareTo(new Integer (s.age));

                            if(num==0)    

                                   returnthis.name.compareTo(s.name);//比较名字是否相同时次要条件

                            return num;

                     }

 

                     public String getName()

                     {

                            return name;

                     }

                     public int getAge()

                     {

                            return age;

                     }

              }

第二种:   当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让

                 集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,

                 即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。

                 比较器--定义一个类,实现Comparator接口,覆盖compare方法。

                 而当两种排序都存在时以比较器为主

                     使用了泛型--在集合初始化时把new Mycomparator()以构造方法传参传进去即可

                     class Mycomparatorimplements Comparator<String>

                     {

                            public intcompare(String o1,String o2)      

                            {

 

                                   int num=newInteger(o1.length()).compareTo(new Integer (o2.length()));

                                   if (num==0)

                                   {

                                          return    o1.compareTo(o2);

                                   }

                                   return num;

                            }

                     }     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值