zoukankan      html  css  js  c++  java
  • java回顾之集合List

    java回顾之集合List

    一、List接口

    list的特点,元素有索引,元素可以重复,元素存取有序(存的时候和取得时候顺序是一样的)

    常用方法 add、get、remove、set

    1.2ArrayList

    ArrayList是具体的类,这个类的底层用的数组数据结构,查询快,增删慢。

    1.3LinkedList集合

    LinkedList集合底层是用双向链表来实现的,增删快,查询慢。

    常用方法:

    addFirst    往开头添加元素

    addLast    往末尾添加元素

    getFirst    获取开头的元素

    getLast  获取末尾的元素

    removeFirst  删除开头的元素

    removeLast  删除末尾的元素

    pop()  模拟栈的结构,弹出一个元素

    push()  模拟栈的结构,推入一个元素

    原理图

    二、Collections工具类

    Collection是集合的工具类,工具类提供了静态方法。

    shuffle(list)  随机打乱集合元素的顺序

    sort(list)  集合的排序从小到大

    sort(list,Comparator)按照指定的方式排序

    compare的意思是比较,可以用这个方法来规定比较的规则:

    ​ 参数: ​ o1代表要比较的数字, o2代表已经比较完的数字

    返回值: ​ 如果返回值是正数,代表o1 > o2,就会把o1移动到后面

    如果返回值是负数,代表o1 < o2,就会把o1移动到前面

    如果返回值是零,代表o1 == o2,就不会移动

    为什么Integer类,String类可以排序呢,应该类底层实现了Comparable接口。[知道就可以了]

       Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return o2-o1;
                }
            });

    排列自定义类型

    public class Demo02比较器对自定义类型比较 {
    public class Demo02比较器对自定义类型比较 {
        public static void main(String[] args) {
            //创建集合
            ArrayList<Student> list = new ArrayList<>();
    
            //添加元素
            list.add(new Student("柳岩",36));
            list.add(new Student("美美",26));
            list.add(new Student("罗志美美",26));
            list.add(new Student("郭美美",26));
            list.add(new Student("老王",62));
    
            //打印集合
            System.out.println(list);//存取有序
    
            //排序
            //按照年龄从小到大排序,如果年龄相同,按照姓名长度从小到大排序
            Collections.sort(list, new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    //年龄从小到大
                    if(o1.getAge() != o2.getAge()){
                        return o1.getAge() - o2.getAge();
                    }else{
                        //如果年龄相同
                        //按照姓名长度从小到大
                        return o1.getName().length() - o2.getName().length();
                    }
    
                }
            });
            
            //打印集合
            System.out.println(list);
    
        }
    }  

    三、可变参数

    可以接受同种类型任意个数的参数。

     public static void method(int... a){}//可变参数的本质其实是一个数组

    • 可变参数可以接受任意个参数,也可以接受一个数组

    • 一个方法只能有一个可变参数,并且可变参数必须放在最后。

    • 可变参数的本质其实就是数组,在方法中可以把可变参数当做数组来使用

    四、Set接口及子类

    4.1HashSet

    特点:元素不可重复、元素没有索引、元素存取无序,底层是哈希表

    4.2hash值

      在Object类中有一个方法hashCode(),这个方法的返回值是一个整数类型,在子类中会重写这个方法,我们把返回值成为hash值。在子类中重写的hashCode()方法可以粗略判断出两个对象是否相同。

    如果哈希值不同,两个对象一定不同,如果哈希值相同,两个对象不一定相同

    HashSet保证元素不重复依靠的是hashCode()和equals()方法

    p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))

    判断两个对象的hash值是否相同,
    如果对象的hash值不同,说明两个对象一定不同就【可以保存】
    如果对象的hash值相同,那么就调用equals方法判断
    如果equals返回的结果是false,代表两个对象不同,【可以存储】
    如果equals返回的结果是true,代表两个对象相同,【不可以存储】

    存储自定义类型的时候要重写hoshcode()和equal()两个方法,比如定义一个Student类,后面创建一个HashSet

    HashSet<Student> set = new HashSet<>();这个时候hashCode和equal方法需要重写

       @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Student student = (Student) o;
            return age == student.age &&
                    Objects.equals(name, student.name);
        }
    
        @Override
        public int hashCode() {
    
            return Objects.hash(name, age);
        }
    }
    

    4.2LinkedHashSet集合

    元素不可重复、元素没有索引、元素存取有序

    因为HashSet是存取无序集合,他儿子想要让存取变的有序,所以LinkedHashSet就是在HashSet的基础上加了一个链表,加的这个链表的作用记录元素的存储顺序。

    4.3、TreeSet集合

    TreeSet集合的底层是红黑树,元素不可重复,元素没有索引,元素会默认被排序

    比如Integer类,String类他们自带排序方式,因为这些类底层实现Comparable接口。不需要我们指定排序方式这就是自然排序。
    
    //创建集合
            TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {
                /*
                    compare的意思是比较,可以用这个方法来规定比较的规则:
                          参数:
                              o1代表要比较的数字, o2代表已经比较完的数字
                          返回值:
                              如果返回值是正数,代表o1 > o2,就会把o1移动到后面
                              如果返回值是负数,代表o1 < o2,就会把o1移动到前面
                              如果返回值是零,代表o1 == o2,就不会移动
                 */
                @Override
                public int compare(Student o1, Student o2) {
                    //按照年龄排序,年龄小的在前,年龄大的在后
                    return o1.getAge() - o2.getAge();
    
                }
            });
    

      

    总结:

      

  • 相关阅读:
    用vbox搭建Linux服务器
    mysql数据库两表关联查询统计同一字段不同值的个数
    2019-06-16 Java学习日记之XML&tomcat
    2019-06-15 Java学习日记之mysql多表查询
    2019-06-14 Java学习日记之SQL
    2019-06-13 Java学习日记之MySql
    XML & Tomcat
    数据库的CRUD操作
    PrepareStatement
    Dao模式(data Access Object 数据访问对象)
  • 原文地址:https://www.cnblogs.com/gushiye/p/13817964.html
Copyright © 2011-2022 走看看