• Java笔记(二十二)……Collection集合


    概述

    为什么会出现集合类

    面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

    数组和集合类同是容器,有何不同

    数组虽然也可以存储对象,但是长度固定,集合长度可变

    数组中可以存储基本数据类型,集合只能存储对象

    集合类的特点

    集合类只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象

    集合框架

    Collection接口中定义了集合框架的构成及分类

    collection

    集合类常用方法

    Collection定义了集合框架的功能

    添加

    boolean
    add(E e)

    boolean
    addAll(Collection<? extends E> c)

    删除

    boolean
    remove(Object o)

    boolean
    removeAll(Collection<?> c)

    void
    clear()

    判断

    boolean
    contains(Object o)

    boolean
    isEmpty()

    获取

    Iterator<E>
    iterator()

    int
    size()

    取交集

    boolean
    retainAll(Collection<?> c)

    集合变数组

    Object[]
    toArray()

    <T> T[]
    toArray(T[] a)

    迭代器

    迭代器其实就是集合的取出元素方式,因为迭代器需要对集合中的元素直接操作,并且依赖于集合,所以将迭代器定义成集合中的内部类,通过集合的iterator()方法来获取迭代器的对象

    List接口

    元素是有序的,元素可以重复,因为该集合体系有索引

    List集合中的特有方法

    void
    add(int index, E element)

    boolean
    addAll(int index, Collection<? extends E> c)

    E
    remove(int index)

    E
    set(int index, E element)

    E
    get(int index)

    List<E>
    subList(int fromIndex, int toIndex)

    int
    indexOf(Object o)

    ListIterator<E>
    listIterator()

    List集合特有的迭代器ListIterator

    在迭代时,不可以通过集合对象的方法操作集合中的元素,因为此时迭代器和集合对象在同时操作集合里的对象,这样容易出现安全隐患,util包中提供了ConcurrentModificationException异常来提示此错误,所以我们在使用迭代器遍历集合时,只能通过迭代器的remove方法删除元素,只此一种。

    想要通过迭代器对集合中的元素进行更多的操作,List集合为我们提供了ListIterator,ListIterator是Iterator的子接口,该接口只能通过List集合的listIterator方法获取

    ArrayList类

    List接口的子类,底层的数据结构是数组结构

    特点:查询速度快,但是增删速度较慢,线程不同步

    LinkedList类

    List接口的子类,底层的数据结构是链表

    特点:增删速度很快,查询速度较慢,线程不同步

    特有方法:

    addFirst() addLast()

    getFirst() getLast()

    获取元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException

    removeFirst() removeLast()

    获取元素,并删除元素,如果集合中没有元素,会出现NoSucnElementException

    JDK1.6以后出现了替代方法

    offerFirst() offerLast()

    peekFirst() peekLast()

    获取元素,但不删除元素,如果集合中没有元素,返回null

    pollFirst() pollLast()

    获取元素,并删除元素,如果集合中没有元素,返回null

    由以上方法可知,LinkedList可以用来构建队列或者堆栈结构

    Vector类

    List接口的子类,底层的数据结构是数组结构,线程同步

    由于效率比较低,后期被ArrayList取代

    枚举Enumeration

    枚举就是Vector特有的取出方式,与迭代器很相似

    由于枚举的方法名称都过长,后期被迭代器取代

    Set接口

    元素是无序的,元素不可以重复,集合的功能与Collection接口一致

    HashSet类

    Set接口的子类,底层的数据结构是哈希表,线程不同步

    HashSet如何保证元素唯一性

    HashSet通过元素的两个方法hashCode和equals来完成唯一性的判断

    如果元素hashCode值不同,则认为元素不同

    如果元素hashCode值相同,则判断equals是否为true,若为false,则认为元素不同,否则元素相同,不会加入到集合中

    TreeSet类

    Set接口的子类,底层的数据结构是二叉树,线程不同步

    TreeSet元素排序方法

    第一种方法:让元素自身具备比较性

    元素需要实现Comparable接口,覆盖compareTo方法

    这种方式也称为元素的自然顺序,或者叫做默认顺序

    第二种方式:定义容器的比较性

    当元素本身不具备比较性时,或者具备的比较性不是我们所需的

    这时需要让容器自身具备比较性

    定义了比较器,即实现Comparator接口,将比较器对象作为参数传递给TreeSet集合的构造函数

    当两种比较方式都存在时,以比较器为主

    泛型

    JDK1.5之后出现的新特性,用于解决安全问题,是一个类型安全机制

    泛型好处

    将运行时期出现的问题ClassCastException转移到了编译时期,方便于程序员解决问题,让运行时更安全

    避免了强制转换过程

    泛型格式

    通过<>来定义要操作的引用数据类型

    在使用java提供的对象时,什么时候写泛型呢

    通常在集合框架中最常见

    只要见到类或者方法上有<>时,就要定义泛型

    <>就是用来接收类型的,类型为引用数据类型

    什么时候定义泛型类

    当类中要操作的引用数据类型不确定的时候

    早期定义Object来完成扩展

    现在用定义泛型来完成扩展

    泛型类定义的泛型,在整个类中都有效

    当不同方法操作的类型不同,且类型不确定时,可以将泛型定义在方法上

    注意:

    静态方法不可以访问类上定义的泛型

    如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上

    泛型的限定

    ?通配符

    <? extends E>:可以接收E类型或者E的子类型,即设置上限

    <? super E>:可以接收E类型或者E的父类型,即设置下限

  • 相关阅读:
    TC2.0库函数大全
    【转帖】2004年度电影作品盘点之好莱坞篇
    C++文件流读写txt文件
    Linux 使用技巧
    最长字符串匹配算法(KMP算法)
    回调函数
    C#中对XML文件的一些基本操作[转载]
    指针与引用的区别
    中文核心期刊目录
    十大最考验演技的角色
  • 原文地址:https://www.cnblogs.com/ShawnWithSmallEyes/p/3382232.html
Copyright © 2020-2023  润新知