List、Set

目录

一、数据结构

1.什么是数据结构?

2.常见的数据结构

二、List接口

1.List接口的特点

2.List接口中的常用方法以及常用子类

3.ArrayList的数据结构以及使用

4.LinkedList的数据结构以及使用

5.LinkedList的常用方法

三、Set接口

1.Set接口的特点

2.Set接口中的方法以及常用子类

3.HashSet的数据结构和使用

4.哈希表结构的拓展

5.LinkedHashSet的数据结构和使用

6.可变参数

四、Collections工具类

1.Collections的介绍

2.常用功能方法

3.Comparable自然排序接口

4.Comparator比较器排序接口


一、数据结构

1.什么是数据结构?

容器中存储数据结构的方式。

2.常见的数据结构

堆栈结构:先进后出

队列结构:后进先出

数组结构:查询快,增删慢,在内存中是连续的

链表结构:查询慢,增删快,在内存中是不连续的

二、List接口

1.List接口的特点

(1)元素存取有序

(2)有索引

(3)集合中元素可重复

2.List接口中的常用方法以及常用子类

常用方法:

public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。

public E get(int index) :返回集合中指定位置的元素。

public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。

boolean remove(Object o) :从列表中删除指定元素的第一个出现(如果存在)(可选操作)。

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

常用子类:

ArrayList           LinkedList                 Vector

3.ArrayList的数据结构以及使用

ArrayList没有特有方法,方法和List接口中的方法一样。

集合数据存储的结构是数组结构。元素增删慢,查找快。

思考题:

List集合中存储的是Integer元素时,remove()方法调用的是哪个?

 ArrayList<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    //删除角标1位置的元素
    list.remove(1);
    //删除ArrayList集合中元素为1的元素
    //list.remove(Integer.valueOf(1));
    System.out.println(list);
}

4.LinkedList的数据结构以及使用

集合数据存储的结构是链表结构。方便元素添加、删除的集合。

5.LinkedList的常用方法

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() :从此列表所表示的堆栈处弹出一个元素。(和removeFist()一样)

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

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

三、Set接口

1.Set接口的特点

(1)无序

(2)不重复

(3)无索引

2.Set接口中的方法以及常用子类

Set接口包括其实现类都没有特有方法。与Collection接口完全一样。

常用子类:

HashSet               LinkedHashSet                 TreeSet

3.HashSet的数据结构和使用

底层使用哈希表,查询快,增删快

面试题:

向哈希表集合中添加重复元素时,并没有覆盖原有重复元素,根本没有添加进去,add()方法返回的是false。

4.哈希表结构的拓展

(1)Java规定每一个对象都有一个哈希码值,调用对象的HashCode()方法就可以拿到。

(2)Java中的地址值是假的

打印出来的地址值是哈希码值的16进制体现

(3)Java中没有真正的地址值,地址值在对象名中

但是打印对象名会调用对象的ToString()方法,打印不出来真实地址值

哈希表如何保证元素的唯一性?

只有两个元素的哈希值相等,并且equals方法返回true,才判断这两个元素重复。

如果保存自定义元素,需重写equals方法和HashCode方法。

5.LinkedHashSet的数据结构和使用

底层使用链表+哈希表(数组+链表+红黑树),查询快,增删快

LinkedHashSet是有序的,HashSet是无序的。

6.可变参数

在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,

可变参数的本质是数组。

我们可以对其简化成如下格式:

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

等价于

修饰符 返回值类型 方法名(参数类型[] 形参名){ }

注意:

(1)如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置。

(2)一个方法中只能有一个可变参数

四、Collections工具类

1.Collections的介绍

集合工具类,用来对集合进行操作

2.常用功能方法

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

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

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

static void reverse(List<?> list) 反转指定列表中元素的顺序。

3.Comparable<T>自然排序接口

public int compareTo(Student o)

强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。

实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

4.Comparator<T>比较器排序接口

public int compare(String o1, String o2) :比较其两个参数的顺序。

强行对某个对象进行整体排序。这种排序我们称为比较器排序.可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以为那些没有实现Comparable接口的对象的集合提供排序。

练习题:分别用ComparableComparator两个接口对下列四位同学的成绩做降序排序,如果成绩一样,那在成绩排序的基础上按照年龄由小到大排序。

List<Student> list = new ArrayList<>();
list.add(new Student("张三丰", 20, 90));
list.add(new Student("陈真", 22, 90));
list.add(new Student("叶问", 20, 99));
list.add(new Student("李小龙", 22, 100));
Collections.sort(list, (o1, o2) -> {
    int i = (int) (o2.getScore() - o1.getScore());
    if (i != 0) {
        return i;
    } else {
        return o1.getAge() - o2.getAge();
    }
});
for (Student s : list) {
    System.out.println(s);
}

 

 

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/81876488