Java笔记(二十二)……Collection集合
概述
为什么会出现集合类
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式
数组和集合类同是容器,有何不同
数组虽然也可以存储对象,但是长度固定,集合长度可变
数组中可以存储基本数据类型,集合只能存储对象
集合类的特点
集合类只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象
集合框架
Collection接口中定义了集合框架的构成及分类

集合类常用方法
Collection定义了集合框架的功能
添加
booleanaddAll(Collection<? extends E> c)
删除
booleanremoveAll(Collection<?> c)
voidclear()
判断
booleanisEmpty()
获取
intsize()
取交集
booleanretainAll(Collection<?> c)
集合变数组
<T> T[]toArray(T[] a)
迭代器
迭代器其实就是集合的取出元素方式,因为迭代器需要对集合中的元素直接操作,并且依赖于集合,所以将迭代器定义成集合中的内部类,通过集合的iterator()方法来获取迭代器的对象
List接口
元素是有序的,元素可以重复,因为该集合体系有索引
List集合中的特有方法
增
booleanaddAll(int index, Collection<? extends E> c)
删
改
查
List<E>subList(int fromIndex, int toIndex)
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集合的更多相关文章
- Java笔记(十二) 文件基础技术
文件基础技术 一.文件概述 一)基本概念 1.文件的分类: 1)文本文件:文件中每个二进制字节都是某个可打印字符的一部分.如.java文件 2)二进制文件:文件中每个二进制字节不一定用来表示字符,也可 ...
- 菜鸡的Java笔记 第二十二 - java 对象多态性
本次只是围绕着多态性的概念来进行讲解,但是所讲解的代码与实际的开发几乎没有关系,而且多态一定是在继承性的基础上才可以操作的, 而本次将使用类继承的关系来描述多态的性质,实际的开发中不会出 ...
- 菜鸡的Java笔记 第十二 - java 构造方法与匿名对象
1.点 构造方法的作用以及定义要求 匿名对象的使用 构造方法: 只要出现()的都表示方法 构造方法就是类构造对象时调用的方法,主要用来实例化对象.> ...
- JAVA之旅(二十二)——Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习
JAVA之旅(二十二)--Map概述,子类对象特点,共性方法,keySet,entrySet,Map小练习 继续坚持下去吧,各位骚年们! 事实上,我们的数据结构,只剩下这个Map的知识点了,平时开发中 ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十二周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十二周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- 深度学习课程笔记(十二) Matrix Capsule
深度学习课程笔记(十二) Matrix Capsule with EM Routing 2018-02-02 21:21:09 Paper: https://openreview.net/pdf ...
- (C/C++学习笔记) 二十二. 标准模板库
二十二. 标准模板库 ● STL基本介绍 标准模板库(STL, standard template library): C++提供的大量的函数模板(通用算法)和类模板. ※ 为什么我们一般不需要自己写 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
随机推荐
- 简单的powershell 批量生成身份证复印件
用Powshell 脚本批量完成,代码比较简单,出生日期,图片我都没有改,图片用于测试,附件. cls; $path = Split-Path -Parent $MyInvocation.MyComm ...
- 关于ASE日志空间示数不正常的解决办法
最近某系统的ASE数据库出现了异常,经过各种努力,终于把数据库正常又起起来了.但是经过检查,发现在查看剩余日志空间的时候(sp_helpsegment 'logsegment'),发现显示出来 ...
- JavaScript跨站脚本攻击
跨站脚本攻击(Cross-Site Scrpting)简称为XSS,指的是向其他域中的页面的DOM注入一段脚本,该域对其他用户可见.恶意用户可能会试图利用这一弱点记录用户的击键或操作行为,以窃取用户的 ...
- Oracle客户端PL_SQL的安装
Oracle数据库的操作大多还是在客户端完成的,因此在众多的客户端软件中我选择了PL_SQL,一下谈谈PL_SQL的基本安装和操作,以及在操作中碰到的一些问题: 1. 首先下载PL_SQL客户端软件, ...
- bzoj 3672: [Noi2014]购票 树链剖分+维护凸包
3672: [Noi2014]购票 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 480 Solved: 212[Submit][Status][D ...
- 黑客是怎样绕过WAF之三重防护绕过讲解
什么是WAF Web Application Firewall 通过执行一系列针对HTTP/HTTPS的安全策略来防御对Web应用的攻击. 目前主要有单设备WAF与云WAF WAF的现状 1.太多数W ...
- forward && redirect 区别介绍
解释一 一句话,转发是服务器行为,重定向是客户端行为.为什么这样说呢,这就要看两个动作的工作流程: 转发过程:客户浏览器发送http请求---->web服务器接受此请求-->调用内部的一个 ...
- POJ 1275 Cashier Employment(差分约束)
http://poj.org/problem?id=1275 题意 : 一家24小时营业的超市,要雇出纳员,需要求出超市每天不同时段需要的出纳员数,午夜只需一小批,下午需要多些,希望雇最少的人,给出每 ...
- maven 依赖排除
在项目中遇到一个问题,项目使用spring 3.x,引用了某些包,这些包又依赖了spring2.x,造成项目无法启动.这种情况就需要用到maven的依赖排除,配置如下: 使用以下代码排除依赖xxxx引 ...
- JAVA大数类练手
今天突然看到了OJ上的大数类题目,由于学习了一点大数类的知识.果断水了6道题......都是非常基础的.就当的练手的吧. 学到的只是一些大数类的基本操作.以后多做点这样的题,争取熟练运用水大数题... ...