概述

为什么会出现集合类

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

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

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

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

集合类的特点

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

集合框架

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的父类型,即设置下限

Java笔记(二十二)……Collection集合的更多相关文章

  1. Java笔记(十二) 文件基础技术

    文件基础技术 一.文件概述 一)基本概念 1.文件的分类: 1)文本文件:文件中每个二进制字节都是某个可打印字符的一部分.如.java文件 2)二进制文件:文件中每个二进制字节不一定用来表示字符,也可 ...

  2. 菜鸡的Java笔记 第二十二 - java 对象多态性

    本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的,        而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...

  3. 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象

    1.点    构造方法的作用以及定义要求    匿名对象的使用    构造方法:        只要出现()的都表示方法        构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...

  4. JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习

    JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...

  5. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  6. 201871010106-丁宣元 《面向对象程序设计(java)》第十二周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十二周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  7. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  8. 深度学习课程笔记(十二) Matrix Capsule

    深度学习课程笔记(十二) Matrix Capsule with EM Routing  2018-02-02  21:21:09  Paper: https://openreview.net/pdf ...

  9. (C/C++学习笔记) 二十二. 标准模板库

    二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...

  10. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

随机推荐

  1. 51nod贪心算法入门-----活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? 输入 第1行:1个数N,线段的数量(2 <= N <= 10000) 第2 ...

  2. python学习笔记——列表生成式与生成器

    1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行 ...

  3. ToString()字符转换类型

    100.ToString("n");结果是100.00 100.ToString("c");结果是¥100.00 100.ToString("e&qu ...

  4. Cygwin下设置ls显示颜色

    vi ~/.bashrc 找到alias ls="xxxxxxxxxxxxxxxxxxxxxxxx"这一项,把注释去掉 修改后的这一行为: alias ls='ls -hF --c ...

  5. 【已解决】Vmware无法创建虚拟网卡的问题

    最近因为各种需要,要在虚拟机里使用桥接方式连接.但是不管怎么操作,都无法添加虚拟网卡.连续好多天需要用到桥接上网,今儿多方搜索,找到了解决方案. 参考资料:http://tieba.baidu.com ...

  6. Android App性能优化笔记之一:性能优化是什么及为什么?

    By Long Luo   周星驰的电影<功夫>里面借火云邪神之口说出了一句至理名言:“天下武功,唯快不破”. 在移动互联网时代,同样如此,留给一个公司的窗口往往只有很短的时间,如何把握住 ...

  7. zepto源码学习-01-整体感知

    在公司一直做移动端的项目,偶尔会做点PC端的东西,但基本上都是和移动端打交道. 移动端嘛必须上zepto,简单介绍下Zepto:它是一个面向高级浏览器的JavaScript框架的,实现JQuery的大 ...

  8. php获得当前日期时间 date函数

    time()得到从1970-01-01到现在共走了多少秒 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就是 time()*60*60*24*365 那么如何把这个数字换 ...

  9. 关于Failed to convert property value of type [org.quartz.impl.StdScheduler] to required type [org.springframework.scheduling.quartz.SchedulerFactoryBean

    在一个业务类有下列属性 private SchedulerFactoryBeanscheduler; public SchedulerFactory BeangetScheduler() { retu ...

  10. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...