集合(三)

集合(三)

set部分代码及集合总结

1.Set(掌握)
    (1)无序(元素的存储和取出顺序),唯一。
    (2)Set体系图
        Set
            |--HashSet
                底层数据结构是哈希表。
                唯一,无序。
                怎么保证唯一性的?
                    依赖两个方法:hashCode()和equals()
                    首先判断hashCode()是否相同:
                        同:继续比较equals()方法
                            如果true:说明元素存在。
                            如果false:就直接添加。
                        不同:就直接添加。
                |--LinkedHashSet
                    底层数据结构是哈希表和链表。
                    唯一,有序。
                    由哈希表保证唯一。
                    由链表保证有序。
            |--TreeSet
                底层数据结构是二叉树。
                唯一,有序。
                怎么保证唯一性的?
                    根据自然排序或者比较器返回的值是否是0。
                两种实现方案:
                    A:元素具备比较性 实现Comparable接口 自然排序
                    B:集合具备比较性 实现Comparator接口 比较器

                    一般推荐使用B方案。
    (3)HashSet案例
        需求:存储自定义对象,认为属性相同即为同一个元素。
      

  public class Student
        {
            private String name;
            private int age;

            public Student(){}

            public Student(String name,int age)
            {
                this.name = name;
                this.age = age;
            }

            public void setName(String name)
            {
                this.name = name;
            }

            public String getName()
            {
                return name;
            }

            public void setAge(int age)
            {
                this.age = age;
            }

            public int getAge()
            {
                return age;
            }

            @Override
            public int hashCode()
            {
                return this.name.hashCode()+this.age*13;
            }

            @Override
            public boolean equals(Object obj)
            {
                if(this==obj)
                {
                    return true;
                }

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

                Student s = (Student)obj;
                return this.name.equals(s.name) && this.age == s.age;
            }
        }


  

     public class HashSetDemo
        {
            public static void main(String[] args)
            {
                HashSet<Student> hs = new HashSet<Student>();

                Student s1 = new Student("zhangsan",20);
                Student s2 = new Student("lisi",30);
                Student s3 = new Student("wangwu",40);
                Student s4 = new Student("zhaoliu",25);
                Student s5 = new Student("zhangsan",20);

                hs.add(s1);
                hs.add(s2);
                hs.add(s3);
                hs.add(s4);
                hs.add(s5);

                for(Student s : hs)
                {
                    System.out.println(s.getName()+"***"+s.getAge());
                }
            }
        }


    (4)TreeSet案例
        需求:我要按照姓名的长度比较,当长度相同,我要按年龄的从大到小比较。

      

  public class Student
        {
            private String name;
            private int age;

            public Student(){}

            public Student(String name,int age)
            {
                this.name = name;
                this.age = age;
            }

            public void setName(String name)
            {
                this.name = name;
            }

            public String getName()
            {
                return name;
            }

            public void setAge(int age)
            {
                this.age = age;
            }

            public int getAge()
            {
                return age;
            }
        }


        

      

 public class TreeSetDemo
        {
            public static void main(String[] args)
            {
                TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>(){
                    @Override
                    public int compare(Student s1,Student s2)
                    {
                        int num = s1.getName().length()-s2.getName().length();
                        int num2 = (num==0)?s1.getName().compareTo(s2.getName()):num;
                        int num3 = (num2==0)?s2.getAge()-s1.getAge():num2;
                        reutrn num3;
                    }
                });

                Student s1 = new Student("zhangsan",20);
                Student s2 = new Student("lisi",30);
                Student s3 = new Student("wangwu",40);
                Student s4 = new Student("zhaoliu",25);
                Student s5 = new Student("zhangsan",20);

                ts.add(s1);
                ts.add(s2);
                ts.add(s3);
                ts.add(s4);
                ts.add(s5);

                for(Student s : ts)
                {
                    System.out.println(s.getName()+"***"+s.getAge());
                }
            }
        }


2.Collection集合的总结

    Collection (add,size,iterator,remove,contains)
        |--List (get,set)
            元素有序,可重复。
            |--ArrayList
                底层数据结构是数组,查询块,增删慢。
                线程不安全,效率高。
            |--Vector
                底层数据结构是数组,查询块,增删慢。
                线程安全,效率低。
            |--LinkedList
                底层数据结构是链表,查询慢,增删快。
                线程不安全,效率高。
        |--Set
            元素无序,唯一。
            |--HashSet
                底层数据结构是哈希表。
                唯一,无序。
                怎么保证唯一性的?
                    依赖两个方法:hashCode()和equals()
                    首先判断hashCode()是否相同:
                        同:继续比较equals()方法
                            如果true:说明元素存在。
                            如果false:就直接添加。
                        不同:就直接添加。
                |--LinkedHashSet
                    底层数据结构是哈希表和链表。
                    唯一,有序。
                    由哈希表保证唯一。
                    由链表保证有序。
            |--TreeSet
                底层数据结构是二叉树。
                唯一,有序。
                怎么保证唯一性的?
                    根据自然排序或者比较器返回的值是否是0。
                两种实现方案:
                    A:元素具备比较性 实现Comparable接口 自然排序
                    B:集合具备比较性 实现Comparator接口 比较器

                    一般推荐使用B方案。



3.使用哪种集合。
    元素是否重复:
        是:List
            线程是否安全:
                是:Vector
                不是:ArrayList,或者LinkedList
                    查询多:ArrayList
                    增删多:LinkedList

            如果不知道,用ArrayList
        否:Set
            是否排序:
                是:TreeSet
                否:HashSet
            如果不知道,用HashSet
    如果不知道,用ArrayList。

4.常见的数据结构
    ArrayXxx : 底层数据结构是数组,查询块,增删慢。
    LinkedXxx :底层数据结构是链表,查询慢,增删快。
    HashXxx :底层数据结构是哈希表,想到两个方法:hashCode()和equals()
    TreeXxx : 底层数据结构是二叉树,想到两种方式:自然排序(Comparable),比较器(Comparator)

5.可变参数(理解)
    (1)参数个数不固定。
    (2)格式:
        修饰符 返回值类型 函数名(数据类型... 变量名)
        {
        
        }

        注意:
            这个变量其实是一个数组。
            如果一个函数有多个参数,可变参数只能放在最后边。
    (3)举例:
        

public static int sum(int... x)
        {
            int result = 0;

            for(int i : x)
            {
                result+=i;
            }

            return result;
        }


6.Arrays工具类的使用
    (1)对数组进行操作的工具类
    (2)要掌握的功能:
        A:toString()
        B:sort()
        C:binarySearch()
    (3)把数组变成集合的功能
        asList(T... t)

        注意:把数组转成集合后不能添加和删除。但是可以修改。


    (1)对Collection集合进行操作的工具类
    (2)面试题:Collection和Collections的区别
        前者是集合的顶层接口,里面定义了集合的常见功能。
        后者是对集合操作的工具类,里面定义了排序,查找等功能。
    (3)需要了解
        A:排序
        B:查找
        C:最大值
        D:反转
        E:随机置换
    (4)案例:
        模拟发牌
        模拟点名
        验证码的变化
7.Collections工具类的使用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值