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();

            }
        });

  

总结:

  

 

posted @ 2020-10-14 23:06  springcode  阅读(152)  评论(0编辑  收藏  举报