Java学习之路(四十六)| 集合(十)—— 集合总结

各自努力,最高处见!加油!

一、Collection接口

Collection:包含多个对象
常用方法:
size()
add()
remove()
contains(Object)
toArray()

1、List 接口

List接口定义以列表形式存储的集合,List接口为集合中每个对象都分配了一个索引index,标记对象在List中的位置,并可以通过index定位到指定位置的对象。
有序(即添加顺序和取出顺序一致)且元素可重复
List的三种遍历方式:迭代器、增强for循环(底层也是迭代器)、for循环
List接口增加的方法:
get(int ):返回指定index位置上的对象
add(E):在List指定/末尾位置上插入一个对象
set(int ,E):替换置于List指定index位置上的对象
indexOf(Object):返回指定对象在List中index位置
subList(int ,int ):返回指定其实index到终止index的子List对象

(1)Vector类

和ArrayList类似,但Vector是线程安全的,但是效率不高。
Vector可以定义数组长度扩容因子,ArrayList不能

(2)ArrayList类

(线程不安全)
基于数组来实现集合的功能,其内部维护了一个可变长的对象数组elementData,集合内所有对象存储于这个数组中,并实现数组长度的动态伸缩。
当创建ArrayList对象时,如果使用的是无参构造器,则初始的elementData容量为0.第一次添加,则扩容elementData为10,如需再次扩容,则扩容elementData为1.5倍。

(3)LinkedList类

基于双向链表来实现集合的功能,实现了静态Node。集合中的每个对象都有一个Node保存。

2、Set接口

(无序,没有索引)

  1. Set接口用于存储不含重复元素(null也只允许有一个)的集合。几乎所有的Set实现都是基于同类型的Map(底层用的是Map)。每一个Set内都有一个同类型的Map实例(CopyOnWriteArraySet除外,它内置的是CopyOnWriteArraYList实例)
  2. Set把元素作为key存储在自己的Map实例中,value则是一个空的Object
  3. 遍历方式:迭代器、增强for

(1)TreeSet类

  1. 当使用无参构造器来创建TreeSet时,仍然是无序的。
  2. 使用TreeSet提供的一个构造器,可以传入一个比较器,指定排序规则。

(2)HashSet类

底层是HashMap

(3)LinkedHashSet类

  1. LinkedHashSet底层是一个LinkedHashMap,底层维护了一个数组+双向链表。
  2. LinkedHashSet根据元素hashCode值来决定元素的存储位置,同时使用链表维护元素的次序,这使得元素看起来是以插入的顺序来保存的。
  3. LinkedHashSet不允许重复添加元素

二、Map接口

  1. Map接口:存放的集合以键值对的形式key-value。

  2. Map中的key和value可以是任何引用类型,会封装到HashMap$Node对象中。key常为String

  3. Map中的key不允许重复,value可以重复

  4. Map中的可以可以为null,value也可以为null,注意key为null,注意key为null,只能有一个,value为null,可以多个。

  5. Map是key和value的映射,在Map里面key和value并不是单独存放的,在底层会生成一个entry对象,entry对象里面封装了value和key,所以获得了entry对象就可以同时获得key和value。

  6. 遍历方法:
    A、先取出所有的key,然后通过key取出对应的value。增强for,迭代器。
    B、把所有的value取出。增强for,迭代器。
    C、通过EntrySet来获取key-value。增强for,迭代器。

  7. 常用方法:
    size()
    put(key,value)
    get(key)返回key对应的对象
    keySet():返回包含Map中所有key的Set对象
    values():返回包含Map中所有value的Collection对象
    EntrySet():返回包含Map中所有key-value对的EntrySet
    containsKey(key):判断Map中是否存在指定key/value

(1)HashMap类

当中含有Entry类、KeySet类、EntrySet类。

  1. entrySet 中 ,定义的类型是Map.Entry(接口),但实际上存放的还是HashMap$Node 链表、红黑树、数组
  2. 允许null键null值
  3. 有LinkedHashMap类

(2)TreeMap类

TreeMap类(线程不安全)
当中含有Entry类、KeySet类、EntrySet类

(3)Hashtable类

Hashtable类(线程安全)
当中含有Entry类、KeySet类、EntrySet类
使用方法和HashMap类似
底层有数组Hashtable$Entry[ ] ,初始化大小为11(0~10)
不允许null键null值

Properties类

Properties类
键值对保存数据
Properties可以用于从xxx.properties文件中,加载数据到Properties类对象
Properties还可以用于从xxx.properties文件中,加载数据到Properties类对象

二、类图关系

在这里插入图片描述
相关文件:
链接:https://pan.baidu.com/s/10cA0bj0tMCwgV9ZRA2i7vg
提取码:whj6

三、选型归纳

在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类的特性进行选择。

  1. 先判断存储类型(一组对象[单列]或一组键值对[双列])
  2. 一组对象[单列]:Collection接口
    允许重复:List
    –增删多:LinkedList[底层维护了一个双线链表]
    –改查多:ArrayList[底层维护Object类型的可变数组]
    不允许重复:Set
    –无序:HashSet[底层是HashMap,维护了一个哈希表,即(数组+链表+红黑树)]
    –排序:TreeSet
    –插入和取出顺序一致:LInkedHashSet,维护数组+双向链表。
  3. 一组键值对[双列]:Map
    –键无序:HashMap[底层是哈希表 jdk7:数组+链表;jdk8:数组+链表+红黑树]
    –键排序:TreeMap
    –键插入和取出顺序一致:LinkedHashMap
    –读取文件:Properties
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值