Java— —集合

概述

为了保存这些数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以储存任意类型的对象,并且长度可变,我们把它们统称为集合!这些类都位于java.util包中,是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。


框架图

 Java集合

Collection集合

  • Iterator: 我们可以通过迭代器遍历集合中的数据;

  • Collection: Collection是List、Set、Queue 这3种集合的父级接口;

 Map集合

  • Map: Map是映射表的父级接口。


集合的好处

1.简单而快速的就能查询集合中存储的数据

2.集合可以对数据进行排序,比如Set接口中就可以对集合进行自然排序或比较器排序。

3.集合的长度是可以改变的

4.集合可以去掉数据中重复的值

5.集合具有映射关系,比如,在双列集合中,我们通过Key值可以找到它对应的value值,并且Key值可以是任意数据类型。

集合与数组的区别:

(1)长度区别:集合长度可变,数组长度不可变

  • 数组长度是固定的,不能自动增长
  • 集合是长度可变的,根据元素的多少来决定长度

(2)内容区别:集合可存储不同类型元素,数组存储只可单一类型元素

  • 数组在创建的时候 就会定义存储的数据类型 也就是只能存储一种数据类型
  • 集合指定泛型只能存储引用数据类型(对象) 
  • 集合中也可以存储基本数据类型(装箱)最终存储的还是Object类型
  • 如果没有泛型限定 默认存储的都是 Object类型的数据 也就是任意类型

(3)元素区别:集合只能存储引用类型元素,数组可存储引用类型也可存储基本类型

  • 数组可以存储基本数据类型和引用数据类型
  • 数组基本数据类型存的是值;引用数据类型存的是地址
  • 集合中保存的都是引用类型,如果是基本数据类型的话会自动转成其包装类.


集合的分类

集合按照储存结构又分为两大类,即单例集合(Collection)和双例集合(Map)。

1.单例集合(Collection)
Collection:单例集合类的根接口,用于储存一系列符合某种规则的元素,
List接口Set接口所继承。

List接口有三个实现类:ArrayList、LinkedList、Vector;

Set接口有三个实现类:HasSet、TreeSet、LinkedHashSet;

2.双例集合(Map)
Map:双例集合类的根接口,用于储存具有键(key),值(Value)映射关系的元素。

Map接口有两个实现类:HashMap、LinkedHashMap;


集合的特点

什么是哈希算法? 

哈希算法(也叫散列),就是把任意长度值(key)通过散列算法变换成固定长度的key(地址), 通过这个地址进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。

List接口:存储数据有序,有索引,可添加重复数据 

ArrayList:Collection接口主要实现类

数据结构:数组

特点:查询快,增删慢,线程不安全,效率高
        (默认长度是10 超过就会new一个新的数组 50%延长 节省空间)

底层分析:数组结构是有序的元素序列,在内存中开辟一段连续的空间,在空间中存放元素,每个空间都有编号,通过编号可以快速找到相应元素,因此查询快数组初始化时长度是固定的,要想增删元素,必须创建一个新数组,把源数组的元素复制进来,随后源数组销毁,耗时长,因此增删慢。

LinkedList

数据结构:数组+链表

特点:查询慢,增删快,线程不安全,效率高
        (数据结构是链表,双向链表)

底层分析:链表分为单向和双向,就是一条链子和两条链子的区别;多出的那条链子记录了元素的顺序,因此单向链表结构无序,双向链表结构有序;链表结构没有索引,因此查询慢;链表的增删只需在原有的基础上连上链子或切断链子,因此增快。

Vector:基本已经不用啦

数据结构:数组;

特点:查询快,增删慢,线程安全,效率低
       (默认长度是10 超过就会100%延长 变成20 浪费空间)

底层分析:和ArrayList一样,都是数组实现,因此具有相似的特性,它们之间的区别在于Vector是线程安全的,效率低,ArrayList是线程不安全的,但效率高。

Set接口:存储数据无序,无索引,不能添加重复数据

HashSet

数据结构:jdk1.8之前:数组+链表
                  jdk1.8之后:数组+链表+红黑树
               (当存储数据等于集合长度一半时,使用红黑树。)

特点:查询快,(元素无序,元素不重复,无索引

底层分析:和HashSet相似;

LinkedHashSet

数据结构:jdk1.8之前:数组+链表

                  jdk1.8之后:数组+链表+红黑树
               (当存储数据等于集合长度一半时,使用红黑树。)

特点:查询快,(元素无序,元素不重复,无索引

底层分析:和LinkedList相似;

TreeSet

数据结构:红黑树     

特点:查询快,可以使用自然排序和比较器排序。(元素有序,元素不重复,无索引

底层分析:TreeSet实现了继承于Set接口的SortedSet接口 ,它支持两种排序方法,自然排序和定制排序,自然排序的意思就是放入元素“a”,“b”,a会自然地排在b前面,其中还有几个特有方法。

Map接口:双列集合,元素无序,拥有键值对key值和value值

HashMap

数据结构:jdk1.8之前:数组+链表

                  jdk1.8之后:数组+链表+红黑树

               (当存储数据等于集合长度一半时,使用红黑树。)

特点:查询快,元素无序,
(key不允许重复但可以为null,value可以重复)

底层分析:底层是哈希表;

LinkedHashMap

数据结构:jdk1.8之前:数组+链表
                  jdk1.8之后:数组+链表+红黑树
(当存储数据等于集合长度一半时,使用红黑树。)
特点:查询快,元素有序,
key不允许重复但可以为null,value可以重复,但可以按照添加的顺序进行排序)
底层分析:LinkedHashMap就是在HashMap的基础上,在Entry<key,value>对象中添加了before和after两个指针,构成一个双向链表(最少使用的在head,最多使用的在tail),用来存储元素的访问顺序(get和put都算访问),这个双向链表的重要操作就是,当访问了一个元素,那么把他从双向链表中删除,并把它放进双向链表的表头。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值