Javan基础:集合

1、重点

     Set集合(去掉重复元素,排序)

 

2、三个集合的特点

A、Set     不能出现重复元素、元素的输出无顺序

B、List     可以有重复元素、有顺序

C、Map     键值对的集合,Map的键是Set集合

 

3、判断两个对象是否是同一个对象,我们的判断标准是两个对象的各个属性值是否一样。

 

4、Set集合判断是否是重复元素时的两个依据

A)两个对象的哈希码是否相同

B)两个对象使用equals比较时是否为真

     默认情况下,equals功能==是完全一样的,所以,为了让equals比较对象的属性值是否相等,必须重写equals方法。

5、equals方法的重写规则

A、考虑三种特殊的情况

     比较的两个引用(this和obj)是否指向同一个对象 

     参数obj是否为null

     参数obj和this是否是同一类型

B、考虑两对象的属性值是否相同

C、equals方法的代码实现

     public boolean equals(Object obj) {

          System.out.println("正在调用equals方法比较两个对象的属性是否相同");

          //比较this和参数obj是否相等

          //考虑三种特殊的情况

          //比较的两个引用(this和obj)是否指向同一个对象

          if(this == obj) return true;

          //参数obj是否为null

          if(obj == null) return false;

          //参数obj和this是否是同一类型

          if(!(obj instanceof Student)) return false;

          //判断两个对象的所有属性值是否相同

Student anObject = (Student) obj;

if(this.sid == anObject.sid

             && this.name.equals(anObject.name)

             && this.birthday.equals(anObject.birthday)){
    return true;

} else {

    return false;

}

6、hashCode()方法重写

     该方法是一个native方法,用于为对象产生一个哈希码。

 

7、自动生成hashCode()和equals()方法

 

8、TreeSet可以对Set集合中的元素进行排序

     如果不排序,不能使用TreeSet,只能使用HashSet

 

9、排序规则

     对集合中的元素进行排序,必须定义排序规则

          比较对象的哪个属性?

          返回的结果是大于0、等于0还是小于0?

     而排序必须要涉及到属性的比较,对象的排序本质一就是属性的排序

     只要是比较,就会产生三个结果:大于0、等于0、小于0

 

10、自然排序

     集合元素的类型实现Comparable接口,并实现compareTo(Object obj)方法

          比较的是this和obj的大小

示例:

public class Student implements Comparable<Student>{

     @Override

     public int compareTo(Student o) {

          //比较this和o的关系

          if(this.sid > o.sid)

               return 1;

          else if(this.sid == o.sid)

               return 0;

          else

               return -1;

     }

}

     自然排序的缺点:只能允许一种排序方式

 

11、客户化排序

     必须定义一个单独的排序类,排序类要实现Compartor接口,并实现compare(Object o1, Object o2),对o1和o2进行比较。

     示例:

public class IDSorted implements Comparator<Student>{

     @Override

     public int compare(Student o1, Student o2) {

          return o1.getSid() - o2.getSid();

     }

}

 

使用排序类

     IDSorted idSorted = new IDSorted();

     Set<Student> set = new TreeSet<Student>(idSorted);

 

     客户化排序更灵活,因为从设计的角度来说,客户化排序符合开-闭原则

 

小结:如果TreeSet的构造方法不带任何参数,则使用自然排序

      如果TreeSet的构造方法中指定了排序类,则使用客户化排序

 

12、List的排序

    Collections.sort(list, new IDSorted()); 对List进行客户化排序

    Collections.sort(list); 对List进行自然排序

 

13、集合的交集、并集、差集

    已知有两个集合:

          Set<String> list1 = new HashSet<String>();

          list1.add("aa");

          list1.add("bb");

          list1.add("cc");

         

          Set<String> list2 = new HashSet<String>();

          list2.add("cc");

          list2.add("dd");

          list2.add("ee");

     并集

          list1.addAll(list2);

          for(String a : list1){

               System.out.println(a);

          }

     交集

          list1.retainAll(list2);

          for(String a : list1){

               System.out.println(a);

          }

     差集

          list1.removeAll(list2);

          for(String a : list1){

               System.out.println(a);

          }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章