Java集合框架(JCF)学习笔记

一、JCF概论

  • JCF的集合接口是Collection,包括add添加,contains包含,remove删除,size数据元素个数,iterator迭代器

  • JCF的迭代器接口是Iterator,包括hasNext是否有下一个元素,next获取下一个元素,remove删除某个元素

  • JCF主要的数据结构实现类:
    列表(List,ArrayList,LinkedList)
    集合(Set,HashSet,LinkedHashSet)
    映射(Map,HashMap,TreeMap,LinkedHashMap)

  • JCF的主要算法(工具)类:
    Arrays:对数组进行查找和排序等操作
    Collections:对Collection及其子类进行排序和查找操作

二、List

  • List:列表

    • 有序的Collection
    • 允许出现重复元素
    • 可嵌套:{1,2,3,{5,2},1,3}
  • List的主要实现:

    • ArrayList(非同步)

      • 以数组实现的列表,不支持同步
      • 利用索引位置可以快速定位访问
      • 不适合指定位置的插入、删除操作
      • 适合变动不大、主要用于查询的数据
      • 和Java数组相比,其容量是可动态调整的
      • ArrayList在元素填满容器时会自动扩充容器大小的50%
      • 使用for循环遍历速度最快
    • LinkedList(非同步)

      • 以双向链表实现的列表,不支持同步
      • 可被当做堆栈、队列和双端队列进行操作
      • 顺序访问高效,随机访问较差,中间插入和删除高效
      • 适用于经常变化的数据
      • 使用for循环遍历速度最快,使用随机访问最慢(两者速度相差三个数量级)
    • Vector(同步)

      • 用法同ArrayList一致
      • Vector同步,适合在多线程下使用
      • 原先不属于JCF框架,属于Java最早的数据结构,性能较ArrayList差一些
      • 官方文档建议在非同步情况下优先使用ArrayList

三、Set

  • Set:集合

    • 确定性:对任意一个对象都能判断其是否属于某一个集合
    • 互异性:集合内每个元素都是不相同的,注意是内容互异
    • 无序性:集合内的顺序无关
    • Set与高中数学中所学的集合别无二致
  • Set的主要实现:

    • HashSet(基于散列函数的集合,无序,不支持同步)

      • 基于HashMap实现的,可容纳null元素,不支持同步
        • 使用同步:Set s = Collections.synchronizedSet(new HashSet(……));
      • add 添加一个元素
      • clear 清除整个HashSet
      • contains 判断是否包含某个元素
      • remove 删除某个元素
      • size 大小
      • retainAll 计算两个集合的交集
    • LinkedHashSet(基于散列函数和双向链表的集合,默认按插入顺序排序,不支持同步)

      • 继承HashSet,也是基于HashMap实现的,可容纳null元素,不支持同步
        • 使用同步:Set s = Collections.synchronizedSet(new LinkedHashSet(……));
      • 方法与HashSet基本一致(add、clear、contains、remove、size)
      • 通过一个双向链表维护来插入顺序
    • TreeSet(基于树结构的集合,默认按元素大小排序,不支持同步)

      • 基于TreeMap实现的,不可以容纳null元素,不支持同步
        • 使用同步:Set s = Collections.synchronizedSet(new LinkedHashSet(……));
      • 方法与前二者一致(add、clear、contains、remove、size)
      • 根据compareTo方法或指定Comparator排序
  • Set总结:

    • HashSet、LinkedHashSet、TreeSet的元素都只能是对象

    • HashSet、LinkedHashSet判断元素重复的原则:

      1. 判断两个元素的hashCode返回值是否相同(T/F)
      2. 若hashCode相同,则判定equals方法(T/F)
      3. 注:hashCode和equals方法所有类都有,因为Object类有;添加到HashSet、LinkedHashSet中的元素需要改写hashCode、equals、toString三个方法,否则集合判定会出现异常
    • TreeSet判断元素重复的原则:

      1. 添加到TreeSet中的元素需要继承Comparable接口,并改写CompareTo方法(Java四个重要接口:Comparable可比较的,Clonable可克隆的,Runnable可线程化的,Serializable可序列化的)
      2. 比较两个元素的CompareTo方法

四、Map

  • Map:映射

    • 数学定义:两个集合之间的元素对应关系
    • 一个输入对应一个输出
    • 说白了就是键值对(K-V对)
  • Java中的Map

    • Hashtable(同步、慢、数据量小,较为过时)

      • K-V对,K和V都允许null
      • 同步,多线程安全
      • 无序的
      • 适合小数据量
      • 主要方法:clear、contains/containsValue/containsKey、get、put、remove、size
      • 遍历:Entry迭代器、KeySet迭代器、Enumeration迭代器(三者相差不大,Enumeration稍快)
    • HashMap(不支持同步、快、数据量大,当下较流行)

      • K-V对,K和V都允许null
      • 不同步,多线程不安全
        • 使用同步:Map m = Collections.synchronizedMap(new HashMap(……));
      • 无序的
      • 主要方法:clear、containsValue/containsKey、get、put、remove、size
      • LinkedHashMap
        • 基于双向链表并且维持插入顺序的HashMap
      • TreeMap
        • 基于红黑树的Map,可以根据key的自然顺序或者compareTo方法进行排序输出
    • Properties(同步、文件形式、数据量小)

      • 继承于Hashtable
      • 唯一一个可以将K-V对保存进文件中的类
      • 适用于数据量较少的文件
      • 主要方法:从Hashtable继承来的方法 + load文件加载、store文件写入、getProperty获取属性、setProperty设置属性

五、JCF工具类

  • 工具类概述:

    • 不存储数据,而是在数据容器上实现高效操作(包括排序和搜索)
  • Arrays类:处理对象是数组

    • 排序:对数组进行排序,sort/parallelSort
    • 查找:从数组中查找一个元素,binarySearch
    • 批量拷贝:从源数组批量复制元素到目标数组,copyOf
    • 批量赋值:对数组进行批量赋值,fill
    • 等价性比较:判定两个数组的内容是否相同,equals
  • Collection类:处理对象是Collection及其子类

    • 排序:对List进行排序,sort

    • 搜索:从List中搜索元素,binarySearch

    • 批量赋值:对List批量赋值,fill

    • 最大、最小:max、min

    • 反序:将List反序排列,reverse

    • 若是对对象的比较则需要让对象实现Comparable接口(修改对象类的compareTo方法)

      • compareTo方法:> 返回 1、== 返回 0、< 返回 -1,Arrays和Collections在进行对象sort时自动调用该方法
    • 若对象类不可修改,则新建Comparator比较器(需要实现comparator接口)

      • 重写compare方法,> 返回 1、== 返回 0、< 返回 -1,Comparator比较器将作为参数提交给工具类的sort方法
  • 注意:
    sort方法默认升序排列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值