map、set和list集合详解

集合是用来代替数组完成数组做不到的工作的,用过数组的都知道,数组有着很明显的短板,数据类型的限制,定长的不灵活性等,因此几乎被集合完全取代。

通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。它比数组功能要强大的多,灵活性也更高。但我们要注意:

集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。

集合类一共分为map、set以及list:

  • map是键值对
  • set是集合
  • List是列表

其中set和List有一个共同的父类即Collections
map可细分为TreeMapHashMap;
set可细分为TreeSetHashSet;
List可细分为ArrayListLinkedList;

注意:Collection和Collections只差了个s,但两者是不同的,Collections是集合类,有Set和List两个子类;而Collection是一个接口,Set和List实现了Collection接口,而Map则实现了Map接口。

关系图如下:
在这里插入图片描述

-List

  • ArrayList
    ArrayList是用数组的顺序存储存储数据的。
    • 优点:在存储的同时赋予了数据下标值,我们可以直接通过下标值获取到数据,查询数据非常方便。
    • 缺点:在添加数据的时候需要断开集合进行添加,之后对断点后的数据进行后移,要花费比较多的时间。
  • LinkedList
    LinkedList是用链表的方式存储数据的。
    • 优点:在添加数据的时候只需要将要断点位置前一个数据指针指向新数据,再将新数据的指针指向断点位置的后一个数据,非常快速,不用进行移位。
    • 缺点:由于LinkedList是用指针方式连接的,没有赋予下标值,于是在LinkedList中查询数据时,需要遍历列表,对列表数据一个个赋予下标,然后才能得到数据,费时费力。

总结:在List中
对于需要频繁添加数据的程序则使用LinkedList;
对于需要频繁查询数据的程序则使用ArrayList;

-Set

  • TreeSet
    树状集合,可以有序的存放数据,声明方式:
Set<E> set = new TreeSet<E>();

在使用TreeSet集合时,要注意以下几点:

  1. 要想指定排序的顺序和依据,被排序的对象需要实现Comparable接口;

  2. 树集合不能添加重复的元素;

  3. 树集合不能保存null值(添加时会调用Comparable方法,值不能为null);

  • HashSet
    散列集合,在添加和查找元素的时候用的是哈希算法,高效快速。
    相应的,它的声明方式为:
Set<E> set = new HashSet<E>();

在使用HashSet集合的时候,要注意以下几点:

  1. HashSet存储的对象,应该重写HashCode()和equals()两个方法;
  2. 当一个值添加到HashSet中的时候,不要修改能改变HashCode的元素;
  3. 不能添加重复的元素;

-Map

Map是一种键值对,用key对应value存储数据

  • TreeMap
    散列值键值对,速度更快(常用)
  • HashMap
    树状键值对,存放有序

猜你喜欢

转载自blog.csdn.net/Zetang_Wu/article/details/83019630