黑马程序员--集合Set总结--java

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

集合Set总结

01、Set集合的特点

元素无序,唯一。

         注意:这里的顺序是指存储和取出顺序。

02、HashSet集合的特点

         (1)HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。

         (2)HashSet如何保证元素唯一性         

HashSet底层数据结构是哈希表。

通过分析源码,确定跟以下语句判断有关

e.hash == hash && ((k = e.key) ==key || key.equals(k))

                以上语句说明依赖两个方法:hashCode()和equals()

                顺序:

                           首先,判断hashCode()值是否相同。

                                     相同:

                                               继续走equals()方法,根据其返回值:

                                                        true:说明元素重复,不添加到集合。

                                                        false:说明元素不重复,添加到集合。

                                     不同:直接添加到集合。

         (3)怎么重写hashCode()和equals()方法呢?

                   hashCode():

                            把对象的所有成员变量值相加即可。

                            如果是基本类型,就加值。如果是引用类型,就加哈希值。

                   equals():

                            A:this==obj

                            B:! ( obj  instanceof Student )

                            C:所有成员变量的值比较。基本类型用==,引用类型用equals()。

 

         (4)开发中怎样重写hashCode()和equals()?

                自动生成,右键“source”,然后选择“Generate hashCode() and equals()”

注意:HashSet集合存储自定义对象时,需要去重写hashCode()和equals()

         (4)案例:

                   HashSet存储字符串并遍历案例:

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

public class SetDemo {
         publicstatic void main(String[] args) {
                   //创建集合对象
                   //Collection<String> c = new HashSet<String>();
                   //Set<String> set = new HashSet<String>();
                   //HashSet<String> hs = new HashSet<String>();
 
                   Set<String>set = new HashSet<String>();
 
                   //创建并添加元素
                   set.add("hello");
                   set.add("world");
                   set.add("java");
                   set.add("world");
 
                   //遍历
                   Iterator<String>it = set.iterator();
                   while(it.hasNext()) {
                            Strings = it.next();
                            System.out.println(s);
                   }
 
                   System.out.println("--------------");
 
                   for(String s : set) {
                            System.out.println(s);
                   }
         }
}

03、TreeSet集合的特点

         (1)TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。

                     按照实际的需求,可以对元素进行排序。并且保证唯一。


         (2)怎么保证的呢?

                   排序:底层结构是二叉树。按照树节点进行存储和取出。

                            两种实现:

                                     A:自然排序(元素具备比较性)

                                               TreeSet的无参构造,要求对象所属的类实现Comparable接口。     

自定义Student类实现Comparable实例:      

public class Student implements Comparable<Student>{
         privateString name;
         privateint age;
 
        publicStudent() {
         }
 
         publicStudent(String name, int age) {
                   this.name= name;
                   this.age= age;
         }
 
         publicString getName() {
                   returnname;
         }
 
         publicvoid setName(String name) {
                   this.name= name;
         }
 
         publicint getAge() {
                   returnage;
         }
 
         publicvoid setAge(int age) {
                   this.age= age;
         }
 
         //需求:我想按照对象的年龄排序,从小到大排序。怎么做?
         //@Override
         //public int compareTo(Student s) {
          需求是比较年龄
         //int num = this.age - s.age;     
          由于对象有多个成员变量,你不能根据其中的某一个决定其他的。
          当某一个相同的时候,你还需要判断其他的是不是也是相同的。
         //int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
         //return num2;
         //}
 
         //需求:我想按照姓名的长度排序,从小到大排序。怎么做?
         @Override
         publicint compareTo(Student s) {
                   //姓名的长度
                   intnum = this.name.length() - s.name.length();
//               System.out.println(num);
                   //很多时候,别人给我们的需求其实只是一个主要需要
                   //还有很多的次要需求是需要我们自己进行分析的。
                   //比较姓名的内容
                   intnum2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
                   //继续分析,姓名长度和内容都相同的情况下,年龄还可能不一样呢?
                   //所以,当姓名长度和内容都相同的时候,我们在比较下年龄就好了
                   intnum3 = (num2 == 0) ? (this.age - s.age) : num2;
                   returnnum3;
         }
}

                                     B:比较器排序(集合具备比较性)

                                               TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。

                   唯一:根据返回值是否为0。

比较器排序实现方法一:自定义MyComparator类实现Comparator接口

import java.util.Comparator;
 
public class MyComparator implements Comparator<Student> {
 
         @Override
         publicint compare(Student s1, Student s2) {
                   //按年龄排序,从小到大
                   intnum = s1.getAge() - s2.getAge();
                   //次要条件
                   intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
                   returnnum2;
         }
}

比较器排序实现方法二:匿名内部类

               

import java.util.Comparator;
 
public class MyComparator implements Comparator<Student> {
 
         @Override
         publicint compare(Student s1, Student s2) {
                   //按年龄排序,从小到大
                   intnum = s1.getAge() - s2.getAge();
                   //次要条件
                   intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num;
                   returnnum2;
         }
}

                   注意:

                            如果同时有两种方案,以比较器为主。


04、Collections工具类的使用

 面试题:
Collection和Collections的区别?

A:Collection是Collection体系的顶层接口,里面定义了这个体系中的共性方法.
B:Collections是针对Collection集合操作的工具类 里面一定了一些对集合操作的方法
比如 排序,查找,反转,最值,置换

public static void sort ( List list )
排序

public static <T> int binarySearch( List list, T key )
二分查找

public static void reverse( List list )
反转

public static T max( Collection coll )
最大值

public static void shuffle( List list )
随机置换.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值