14.Java语言List和Set集合归纳、Collection常用功能和Comparator比较器

List集合

java.util.List 接口继承自 Collection 接口,

List接口的特点:

1).数据的存取是有序的,是一个带索引的集合,通过索引操作集合元素

2).可以存储重复的数据

常用方法:

除了继承Collection接口的方法外,还有特有的方法。(继承了七个+一个迭代)

1).增public void add(int index, E element),添加指定元素到指定位置

2).删public E remove(int index),删除指定位置的元素,并且返回删除的元素

3).改public E set(int index,E element), :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

4).查public E get(int index),返回集合中指定位置元素

数据结构

数据结构就是存储数据的方式,不同的存储方式,会影响增、删、改、查操作的效率。

常见的数据结构:

1).数组:

a)有序,可存储重复数据,

b)在内存中是连续的,

c)长度不可变。

d)可以通过索引访问

e)查找快,增删慢

2).链表:

        a)多个节点,节点通过地址连接

        b).查询慢,增删快,因为增删只要把地址插入就行

14.Java语言List和Set集合归纳、Collection常用功能和Comparator比较器

3).栈

        a).先进后出

        b). 受限的线性表:添加、删除元素都在同一端(栈顶);

14.Java语言List和Set集合归纳、Collection常用功能和Comparator比较器

      4).队列

              a).先进先出

              b). 受限的线性表,添加、删除各占一端

14.Java语言List和Set集合归纳、Collection常用功能和Comparator比较器

      5)红黑树

14.Java语言List和Set集合归纳、Collection常用功能和Comparator比较器

List的子类

ArrayList集合:

内部是数组实现--查询快;增删慢;

开发中常用于查询数据、遍历

LinkedList集合:

数据存储是链表结结构,方便元素添加、删除

常用方法:

1).push():模拟压栈

2).poll():模拟弹栈(获取第一个元素,并删除第一个元素)

public void addFirst(E e) :将指定元素插入此列表的开头。

public void addLast(E e) :将指定元素添加到此列表的结尾。

public E getFirst() :返回此列表的第一个元素。

public E getLast() :返回此列表的最后一个元素。

public E removeFirst() :移除并返回此列表的第一个元素。

public E removeLast() :移除并返回此列表的最后一个元素。

public E pop() :从此列表所表示的堆栈处弹出一个元素。

public void push(E e) :将元素推入此列表所表示的堆栈。

public boolean isEmpty() :如果列表不包含元素,则返回true

poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常

Set集合

java.util.Set接口和List接口一样屙也是继承Collection接口,但是没有对功能进行补充

1.HashSet

java.util.HashSet 是 Set 接口的一个实现类。存储不可重复并且是无序的

HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于: hashCode 与 equals 方法。

2.哈希表

在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。

而JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树

特点:

       1).采用:数组 + 链表 + 红黑树实现

       2).验证元素的唯一性:

              1).先判断元素的hashCode()

                     不同:存

                     相同:再判断元素的equals()

                                   不同:存

                                   相同:不存

3.HashSet存储自定义对象:

给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一

public static void main(String[] args) {

    HashSet<Student> set = new HashSet<>();

    set.add(new Student("张三", 18));

    set.add(new Student("李四", 19));

    set.add(new Student("李四", 19));//先判断hashCode(),相              同,再判断equals(),相同:不存

    System.out.println("集合大小:" + set.size());

}

4.LinkedHashSet:

链表、哈希表组合实现,是Set的特例,有序的哈希表

5.可变参数

格式:修饰符 返回值类型 方法名(参数类型 ... 形参名){ }

例如:public static void test(int ... nums){} 可以不传值,底层实际是数组

public static void test(int[] nums){}

public static void main(String[] args) {

    test();

    test(1,12,3,4);

}

public static void test(int ... nums){

}

      在一个方法中最多只能有一个“可变参数”,而且必须位于参数列表的末尾

Collections类

1.常用功能:

java.utils.Collections 是集合工具类,用来对集合进行操作。

1).public static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。

public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();

    Collections.addAll(list,1,2,3,4,5);

}

2).public static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。

public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();

    Collections.addAll(list,1,2,3,4,5);

    Collections.shuffle(list);

}

3).public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。升序

public static void main(String[] args) {

    ArrayList<Integer> list = new ArrayList<>();

    Collections.addAll(list, 6,2,3,4,5);

    Collections.sort(list);

    System.out.println(list);

}

4).对自定义对象排序,对象类必须实现Comparable接口

public static <T> void sort(List<T> list)

ArrayList<Student> stuList = new ArrayList<>();

stuList.add(new Student("张三1", 18));

stuList.add(new Student("张三2", 19));

stuList.add(new Student("张三3", 17));

stuList.add(new Student("张三4", 10));

Collections.sort(stuList);//内部会调用compareTo()方法进行比较

 

public class Student implements Comparable<Student>{//这里要确定数据类型

    String name;

    int age;

     //重写compareTo方法

    @Override

    public int compareTo(Student o) {

        return this.age - o.age;

    }

}

5). public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

ArrayList<Student> stuList = new ArrayList<>();

stuList.add(new Student("张三1", 18));

stuList.add(new Student("张三2", 19));

stuList.add(new Student("张三3", 17));

stuList.add(new Student("张三4", 10));

Collections.sort(stuList, new Comparator<Student>() {

    @Override

    public int compare(Student o1, Student o2) {

        return o1.age - o2.age;

    }

});//匿名内部类实现Comparator接口,重写compare方法

System.out.println(stuList);

2.Comparator比较器:

       Comparator<? super T>将集合中元素按照指定规则排序的时候,需要重写compare方法,对java定义的数据类型只会按照默认的排序规则,如果需要按照其他规则,需要重写方法,但是不可能修改Java源码,可以使用Comparator的接口的compare方法(也就是使用Comparator比较器)进行排序

       使用Comparator比较器,需要先实现Comparator接口,可以定义一个类实现接口然后再实现类中重写compare方法,也可以写一个匿名内部类,一般使用匿名内部类作为Comparator比较器,使用方式就是public static <T> void sort(List<T> list,Comparator<? super T> )这个方法的使用