Java集合

什么是集合?

  • Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法

集合与数组的区别

  • 数组长度是固定的,集合长度是动态扩展的
  • 数组只能存储相同类型的数据,集合可以存储不同数据类型的数据
  • 数组可以存储基本类型的数据,也可以是引用类型,而集合只能是引用类型

应用场景

  1. 无法预测存储数据的数量
  2. 同时存储具有一对一关系的数据
  3. 需要进行数据的增删
  4. 数据重复,可以直接使用集合 Set完成

集合中接口和类的特点

Collection

  • ​ 主要用于存储类的对象
  • Collection 有三个子接口
    • list(有序可重复)
    • Queue(有序可重复)
    • set(无序可重复)
  • List接口主要实现类包括ArrayList和LinkedList 同时实现了Queue接口
    • ArrayList的底层实现了数组,因此内存中是连续存储的。查询速度快,但增加和删除速度慢
    • LinkedList底层是居于双向链表的,增加和删除速度快,查询速度慢
  • Set接口的主要实现类有HashSet和TreeSet
    • HashSet是基于哈希表实现的,数组是无序的,HashSet元素可以是null,但是只能有一个null
    • TreeSet基于二叉树实现的,可以实现数据的自动排序,确保集合元素处于排序状态,不允许放入空值
    • HashSet性能优于TreeSet,一般情况建议使用HashSet,如果需要使用排序功能,建议使用TreeSet

Map

  • 用于存储键值对的数据
  • Map的主要实现类包括HashMap和TreeMap,其中HashMap基于哈希表实现,TreeMap基于红黑树实现。
  • HashMap适用于在Map中插入、删除和定位元素
  • TreeMap适用于按自然顺序或自定义顺序对键值进行遍历
  • HashMap比TreeMap性能好,所以HashMap使用更多一些,如果需要对数据进行排序可以使用TreeMap

集合框架的体系结构

  1. Collection (类的对象)
    1. List(有序,可重复)
      1. ArrayList
      2. LinkedList
    2. Queue(有序,可重复)
      1. LinkedList
    3. Set(无序,不可重复)
      1. HashSet
  2. Map(键值对)
    1. HashMap<key,value>

List(列表)

  • list是元素有序并且可以重复的集合,称之为序列
  • LIst可以精确的控制每个元素的插入位置或删除某个位置的元素
  • List的主要实现类:ArrayLIst 、LinkedList

ArrayList

  • ArrayList 底层是有数组实现的
  • 动态增长,以满足应用程序的需求
  • 在列表尾部插入活删除数据非常有效
  • 更适合查找和更新元素
  • ArrayList中的元素 是可以为null

Set

  • set 是元素无序并且不可重复的集合
  • HashSet
    • HashSet是Set的一个重要实现类,称为哈希集
    • HashSet中的元素无序并且不可重复
    • HashSet中只允许一个Null 元素
    • 有良好的存取和查找性能
  • Iterator(迭代器)
    • Iterator 接口可以以统一的方式对各种集合元素进行遍历
    • hasNext()方法检测集合中是否还有下一个元素
    • next()方法返回集合中的下一个元素

hashCode 与 equals 方法的用法

  • hashCode()方法用于给对象返回hash code值,equals()方法用于判断其他对象与该对象是否相等。HashSet中是不允许添加重复元素的,当调用add()方法向HashSet中添加元素时,这就用到了hashCode()和equals()方法。在添加数据时,会调用hashCode()方法得到hash code值,通过这个值可以找到数据存储位置,在该区域存储的数据的hashCode值都是相等的。如果该区域已经有数据了,就继续调用equals()方法判断数据是否相等,如果相等就说明数据重复了,就不能再添加了。如果不相等,就找到一个位置进行存储。
  • 这些是基于哈希算法完成的,它使得添加数据的效率得到了提升。假设此时Set集合中已经有100个元素,那么如果想添加第101个元素,如果此时没有使用哈希算法,就需要调用equals()方法将第101个元素与前100个元素依次进行比较,如果元素更多,比较所耗费的时间就越长。
  • 如果两个对象相等,那么他们的hashCode值一定相等。反之,如果两个对象的hashCode值相等,那么这两个对象不一定相等,还需要使用equals()方法进行判断。
  • 如果不重写hashCode()方法,默认每个对象的hashCode()值都不一样,所以该类的每个对象都不会相等。

Map

  • Map中的数据是以键值对(key-value)的形式存储的
  • Key-value 是以 entry 类型的对象实例存在的
  • 可以通过key快速查到 value
  • 一个映射不能包含重复的键
  • 每个键最多只能有一个值

HashMap

  • 基于哈希表的map接口实现

  • 允许使用 null值和null键

  • key值不允许重复

  • HashMap 中的Entry 对象是无序排列的

)

posted @ 2021-01-21 13:21  流年りゅう  阅读(113)  评论(0)    收藏  举报