List

List是一个接口,是实现于collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。而我们常用的ArrayList、LinkedList集合也是实现于List接口的。

ArrayList集合

概念

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口,并且List集合是有序的,且元素可以重复。

ArrayList存储结构

因为ArrayList其实就像一个动态的数组,所以是可以通过索引来查找元素,因此它的查询较快,如图

list作为索引 list集合有没有索引_List

ArrayList集合添加数据时,集合中会新开辟一个空间并给予索引

list作为索引 list集合有没有索引_List_02

当ArrayList进行指定索引添加操作的时候,集合依然是在后面开辟一个存储空间,并给予索引

同时要添加索引的值发生改变,原来未改变前的值以此向后移动一位

list作为索引 list集合有没有索引_java_03

 删除指定索引的元素的元素,在ArrayList集合将指定索引的元素内容删除,并且后面的索引值向前一位,最后删除最后一位索引空间,这个时候才算是完成删除操作

list作为索引 list集合有没有索引_list作为索引_04

 那么由上面可以看到,在查询方面ArrayList集合较快,但是由于其的存储结构,使其在删除和添加的操作上比较繁琐,因为改动一个可能会使其一部分变动,所以效率不高,速度不快

特点:ArrayList查询快、增删慢

ArrayList的使用

1.导入java.util包下的ArrayList包

import java.util.*;//代表util包下所有的类

2.构造一个ArrayList对象

List<String> list = new ArrayList<>();

3.使用方法操作数据 

ArrayList常用方法  

add(E           将指定的元素添加到此列表的尾部。

 例如:

List<String> list = new ArrayList<>();//集合初始化
            list.add("a");//添加元素
            list.add("b");
            list.add("c");
            list.add("d");
            System.out.println(list);//打印集合

 结果如下:

list作为索引 list集合有没有索引_list_05

add(int index, E           将指定的元素插入此列表中的指定位置。

  例如:

List<String> list = new ArrayList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            list.add(1,"e");
            //遍历元素
            for (String s : list) {
              System.out.println(s);
           }

 结果如下:

list作为索引 list集合有没有索引_数据结构_06

clear()           移除此列表中的所有元素。

 例如:

List<String> list = new ArrayList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            System.out.println(list);
            list.clear();
            //遍历元素
            for (String s : list) {
              System.out.println(s);
           }

 结果如下:

list作为索引 list集合有没有索引_java_07

get(int index)           返回此列表中指定位置上的元素。

 例如:

List<String> list = new ArrayList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            //打印输出
            System.out.println(list.get(1));

 结果如下:

list作为索引 list集合有没有索引_List_08

size()           返回此列表中的元素数

 例如:

List<String> list = new ArrayList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            System.out.println(list.size());//打印集合元素个数

 结果如下:

list作为索引 list集合有没有索引_List_09

indexOf(Object           返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。

 例如:

List<String> list = new ArrayList<>();
            //添加元素
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            System.out.println(list.indexOf("b"));//元素索引
            System.out.println(list.indexOf("2"));//找不到对应索引则输出-1

 结果如下:

list作为索引 list集合有没有索引_List_10

LinkedList

概念

LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之前的区别主要就是数组和链表的区别。

LinkedList的存储结构

list作为索引 list集合有没有索引_java_11

 如图所示,在每个数据的左右都有前后指针,后指针指向后面的一个数据,前指针指向前面的一个数据。

因为LinkedList的底层是通过双向链表来实现存储的,所以用LinkedList来存储数据的时候,比如我们要查询第三个数据时,通过索引查找,但是在LinkedList集合中的查询是从索引0开始依次往后找,直到索引为2时才停止,这还是三个数据,一般来说我们的数据会放入的很多很多,如果用LinkedList集合放入数据,查询的效率就比较慢;但是对应的,正因为他的底层不是数组而是链表,每个数据都有前后指针,那么,对于增删的操作,我们只需要找到对应的指针就可以了,增删的效率就会很快了。

特点:LinkedList查询慢、增删快

LinkedList的常用方法

list作为索引 list集合有没有索引_数据结构_12

Set接口

Set也是一个集合接口,继承了Collection接口,

使用的大环境:无序(添加的顺序)、不重复

HashSet实现类

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。

HashSet 允许有 null 值。

HashSet 是无序的,即不会记录插入的顺序。

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。

HashSet 实现了 Set 接口。

使用HashSet

实现HashSet对象

Set<Integer> set = new HashSet<>();

 添加元素

//添加元素
            set.add(1);
            set.add(12);
            set.add(3);
            set.add(4);

 常用方法

list作为索引 list集合有没有索引_java_13

迭代器遍历集合

Iterator<Integer> it1 = set.iterator();
              //判断it1是否有下一个值
              while (it1.hasNext()){
                  //获取这个值
                  Integer number = it1.next();
                  System.out.println(number);
            }

Map

概念

Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象。其中,map中键可以是任意类型的对象,键对象不允许重复,每个键都有一个对应的值。值对象可以重复,并且值对象还可以是 Map 类型的。

使用方法

因为Map是一个接口不能直接实现,需要通过创建Map类的实现类HashMap

Map<String,Object> map =new HashMap<>();

添加操作put

map.put("姓名","蔡徐坤");
 map.put("爱好","唱跳rap篮球");
 map.put("代表作","鸡你太美");

常用方法

list作为索引 list集合有没有索引_数据结构_14

迭代器遍历 HashMap集合

Set<String> keySet = map.keySet();//从map中获取Key值放入新的集合
Iterator<String> it2 = keySet.iterator();//使用迭代器
//判断是否有下一个值
while (it2.hasNext()){
    //获取迭代当前的值
    String key = it2.next();
    Object values = map.get(key);//用获取到的Key获取values
    //打印
    System.out.println(key+"--->"+values);
}