Java基础之集合体系,ArrayList, LinkedList和Voctor区别, List 和 Map、Set 的区别

1. Java中的集合

集合类存放于 Java.util 包中,主要有 3 种:set(集)、list(列表包含Queue)和 map(映射)

  • Iterator:迭代器,可以通过迭代器遍历集合中的数据
  • Collection:Collection 是集合 List、Set、Queue 的最基本的接口。
  • Map:是映射表的基础接口
    Java基础之集合体系,ArrayList, LinkedList和Voctor区别, List 和 Map、Set 的区别_第1张图片
    接下来我们详细介绍下每个接口和实现类~

1.1 Iterator接口

Iterator接口是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法.如果实现Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到.通常无序集合实现的都是这个接口, 比如HashSet,HashMap.

1.2 LinkedIterator接口

LinkedIterator 在 Iterator 的基础上又添加了 add(),previous(),hasPrevious() 三种方法,那些元素有序的集合实现的一般都是 LinkedIterator 接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过 previous()访问前一 个元素,比如 ArrayList

1.3 Collection(集合的最大接口)继承关系

  • List 可以存放重复的内容
  • Set 不能存放重复的内容,所有的重复内容靠**hashCode()equals()**两个方法区分.
  • Queue 队列接口
  • SortedSet 可以对集合中的数据进行排序.
    Collection定义了集合框架的共性功能
    在这里插入图片描述
    add()方法的参数类型是Object,以便接受任意类型对象.
    集合中存储的都是对象的引用(地址)

1.4 List

凡是可以操作角标的方法都是该体系特有的方法.
Java基础之集合体系,ArrayList, LinkedList和Voctor区别, List 和 Map、Set 的区别_第2张图片

  • ArrayList底层是数组,查询速度快, 线程不安全.
  • Vector线程安全,但速度慢,已被ArrayList替代
  • LinkedList底层链表结果,增删速度快, 线程不安全.
  • TreeList 底层是二叉树型结构,保证增删复杂度都是0(log n), 增删性能远远高于ArrayListLinkedList.但是稍微占用内存.

1.5 Set

  • Set 元素是无序(存入和取出的顺序不一定一致),元素不可以重复.
    • HashSet 底层数据结构是哈希表.是线程不安全的,不同步.
      问题: HashSet是如何保证元素唯一性的呢?
      答:是通过元素的两个方法,hashCode()equals()方法来完成.
      如果元素的
      hashCode值相同
      ,才会判断
      equals是否为true.

      如果元素的hashCode值不同,不会调用equals()方法.
      注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法.
    • TreeSet 底层数据结构是二叉树,存放有序, TreeSet线程不安全
      可以对 Set 集合中的元素进行排序。
      通过 compareTo 或者 compare 方法来 保证元素的唯一性。
    • LinkedHashSet: 底层是链表+哈希表, 线程不安全.

1.5 Map

Correction、Set、List 接口都属于单值的操作,而 Map 中的每个元素都使用 key->value 的形式存储在集合中。
Map 集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性.
Java基础之集合体系,ArrayList, LinkedList和Voctor区别, List 和 Map、Set 的区别_第3张图片
Map接口的常用子类

  • HashMap: 底层详见下篇hashmap底层介绍,允许使用 null 值和 null 键,线程不安全.
  • hashtable底层hash表, 已被concurrenthashmap代替.
  • TreeMap:底层数据结构是二叉树, 线程不安全。可以用于给 map 集合中的键进行排序

2. ArrayList, LinkedList和Voctor区别

  • ArrayList 底层结构是数组,底层查询快,增删慢
  • LinkedList 底层结构是链表型的,增删快,查询慢
  • Voctor 底层结构是数组 线程安全的,增删慢,查询慢

3. List 和 Map、Set 的区别

3.1 结构特点

  • List 和 Set 是存储单列数据的集合,Map 是存储键和值这样的双列数据的集合;
  • List 中存储的数据是有顺序,并且允许重复;Map 中存储的数据是没有顺序的,其键是不能重复的,它的值是可以有重复的,Set 中存储的数据是无序的,且不允许有重复, 但元素在集合中的位置由元素的 hashcode 决定,位置是固定的(Set 集合根据 hashcode 来进行数据的存储,所以位置是固定的,但是位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的);

3.2 实现类

  • List 接口有三个实现类(LinkedList:基于链表实现,链表内存是散乱的,每 一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢; ArrayList:基于数组实现,非线程安全的,效率高,便于索引,但不便于插入删除;Vector: 基于数组实现,线程安全的,效率低)。
  • Map 接口有三个实现类(HashMap:基于 hash 表的 Map 接口实现,非线程安全, 高效,支持 null 值和 null 键;HashTable:线程安全,低效,不支持 null 值和 null 键; LinkedHashMap:是 HashMap 的一个子类,保存了记录的插入顺序;SortMap 接口:TreeMap, 能够把它保存的记录根据键排序,默认是键值的升序排序)。
  • Set 接口有两个实现类(HashSet:底层是由 HashMap 实现,不允许集合中有重复 的值,使用该方式时需要重写 equals()和 hashCode()方法;LinkedHashSet:继承与 HashSet,同时又基于 LinkedHashMap 来进行实现,底层使用的是 LinkedHashMp)。

你可能感兴趣的:(#,+Java-面试基础篇,java面试题,集合体系,ArrayList,LinkedList,List,Set,Map区别)