zoukankan      html  css  js  c++  java
  • 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的父类型,即设置下限

  • 相关阅读:
    CSS3—— 2D转换 3D转换 过渡 动画
    CSS3——边框 圆角 背景 渐变 文本效果
    CSS3——表单 计数器 网页布局 应用实例
    CSS3——提示工具 图片廓 图像透明 图像拼接技术 媒体类型 属性选择器
    CSS3——对齐 组合选择符 伪类 伪元素 导航栏 下拉菜单
    CSS3——分组和嵌套 尺寸 display显示 position定位 overflow float浮动
    CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充
    Eclipse连接数据库报错Local variable passwd defined in an enclosing scope must be final or effectively final
    数据库——单表查询
    数据库——添加,修改,删除
  • 原文地址:https://www.cnblogs.com/ShawnWithSmallEyes/p/3382232.html
Copyright © 2011-2022 走看看