JAVA集合框架 - Collection
collection大致介绍
Collection是集合层次结构中的根接口。
集合表示一组对象。有些集合允许重复元素,有些则不允许。有些是有序的,有些是无序的。
JDK没有提供此接口的任何直接实现:它提供了更具体的子接口(如Set和List)的实现。
这个接口通常用于在需要最大通用性的地方传递和操作集合 包或多集(可能包含重复元素的无序集合)应该直接实现此接口。
Collection的大致结构体系:

其中常用的有:
List, ArrayList, LinkedList, Vector.
Set, HashSet, TreeSet, LinkedHashList
下文中会挨个看看大致的特性和部分源码.
Collection接口提供的功能:
1.添加:
// 添加一个元素.
boolean add(E e);
// 添加多个元素.
boolean addAll(Collection<? extends E> c);
2.删除:
// 删除一个元素.
boolean remove(Object o);
// 删除多个元素.
boolean removeAll(Collection<?> c);
// 清空集合
void clear();
3.判断:
// 判断是否为空,为空则返回true
boolean isEmpty();
// 判断是否包含元素
boolean contains(Object o);
// 是否全部包含指定元素
boolean containsAll(Collection<?> c);
// 判断是否相等
boolean equals(Object o);
4.获取:
// 继承自Iterable<E>的迭代器, 用于遍历所有元素
Iterator<E> iterator();
// 返回集合的哈希码
int hashCode();
5.长度:
//返回此集合中的元素数目。如果数量超过int最大值就返回int最大值
int size();
6.交集:
// 移除未包含在c中的所有元素.返回值表示是否发生过移除操作
boolean retainAll(Collection<?> c);
7. 转换
// 转换为数组
Object[] toArray();
// 转换为特定类型的数组
<T> T[] toArray(T[] a);
8. 流操作
// 串行流操作
default Stream<E> stream()
// 并行流操作
default Stream<E> parallelStream()
Iterator 大致介绍
Iterator(迭代器),用于以迭代的方式遍历集合.
是一种模式、详细可见迭代器设计模式.
可以使得序列类型的数据结构的遍历行为与被遍历的对象分离,即我们无需关心该序列的底层结构是什么样子的。
只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。
一般是在集合内提供私有的实现方法,用于迭代集合类.
Tterator提供的接口:
// 是否有下一个元素
boolean hasNext();
// 返回迭代中的下一个元素。
E next();
/**
* 从基础集合中移除此迭代器返回的最后一个元素(可选操作)。
* 此方法在每次调用next时只能调用一次。
* 如果没有继承方法,默认会抛出 UnsupportedOperationException("remove") 异常
*/
default void remove()
// 提供函数式编程
default void forEachRemaining(Consumer<? super E> action)
Fail-Fast 机制
概念
fail-fast机制,即快速失败机制,是java集合中的一种错误检测机制。
当在迭代集合的过程中集合的结构发生改变(对集合结构的操作会记录操作次数),就会发生fail-fast,抛出ConcurrentModificationException异常。
在面对并发修改时,迭代器会快速而干净地失败,而不是在将来某个不确定的时间冒任意的、不确定的行为的风险。
fail-fast机制并不保证在不同步的修改下一定抛出异常,它只是尽最大努力去发现并抛出异常,迭代器的快速故障行为应该只用于检测bug。
源码中 如何实现的
以为迭代ArrayList为例:
fail-fast的实现依赖于ArrayList<E>的父类AbstractList<E>,在AbstractList<E>中,有一个protected transient int modCount = 0;的成员变量来记录集合被操作的次数.
在ArrayList中, add,remove,replace等操作都会有modCount++来记录集合的被操作次数.
在进行迭代的过程中调用每个方法前对modCount和开始迭代时记录的expectedModCount进行比对. 如果不一样就快速抛出ConcurrentModificationException错误,防止因为意外产生错误.
// 调用迭代器
public Iterator<E> iterator() {
return new Itr();
}
// ArrayList中自己实现的迭代器部分代码
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
// 初始化时记录当前的操作数
int expectedModCount = modCount;
......
......
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
......
......
}
// 比对操作数的值是否有差异
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
值传递和引用传递, 深复制和浅复制
值传递和引用传递概念:
- 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数.
- 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数.
在java中, 基本类型变量传递的是值的副本, 相当于把自己赋值一份传递,即使自己的副本变了,自己也不会改变.
而对象型变量, java传递的是引用的副本(复制指向地址的指针),而不是自己实际值的副本.所以传递后的对象被改变的话, 之前的对象也会同步改变.因为指向的内存中的实际对象被改变了.
P.S.在这里, String类型有些特殊, 一方面, String属于对象, 传递的是引用的副本, 另一方面,String的特殊结构(字符串常量都存在堆内存中的字符串常量池中), 且String不可更改, 只能创建新的.所以String传递后更改也不会影响之前的.
深复制和浅复制概念:
- 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
- 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝。
Collection中引用的System.arraycopy()就属于浅拷贝.
JAVA集合框架 - Collection的更多相关文章
- Java集合框架Collection
转自:http://www.cdtarena.com/javapx/201306/8891.html [plain] view plaincopyprint?01.在 Java2中,有一套设计优良的接 ...
- java集合框架collection(6)继承结构图
根据<java编程思想>里面的说法,java集合又叫容器,按照单槽和双槽分为两类,Collection和Map,这两个都是接口. 一.Collection Collection下面又分了三 ...
- java集合框架collection(4)HashMap和Hashtable的区别
HashMap和Hashtable的区别 HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别.主要的区别有:线程安全性,同步(synchronizatio ...
- java集合框架collection(3)Set、List和Map
Set.List和Map是java collection中最常用的三种数据结构. Set是集合,不允许有重复的元素,List是动态数组实现的列表,有序可重复,Map是key-value的键值对,用于快 ...
- java集合框架collection(5)HashMap和TreeMap
上图转载自:http://www.cnblogs.com/vamei/archive/2013/04/15/3000913.html 一.区别和联系 1.迭代器 迭代器是一种设计模式,它是一个对象,它 ...
- java集合框架collection(2)ArrayList和LinkedList
ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...
- Java集合框架Collection(1)ArrayList的三种遍历方法
ArrayList是java最重要的数据结构之一,日常工作中经常用到的就是ArrayList的遍历,经过总结,发现大致有三种,上代码: package com.company; import java ...
- Java自学-集合框架 Collection
Java集合框架 Collection Collection是一个接口 步骤 1 : Collection Collection是 Set List Queue和 Deque的接口 Queue: 先进 ...
- Java集合框架之Collection接口
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
随机推荐
- jchdl - GSL Node
https://mp.weixin.qq.com/s/Oa4qgjIUccu5Y-Jlqcyn_A org.jchdl.model.gsl.core.meta.Node.java gen ...
- [统计信息系列7] Oracle 11g的自动统计信息收集
(一)统计信息收集概述 在Oracle 11g中,默认有3个自动任务,分别是:自动统计信息收集.SQL调优顾问.段空间调整顾问,查看方法如下: SQL> SELECT CLIENT_NAME,T ...
- css3 属性阴影效果--box-shadow,text-shadow
1.text-shadow:h-shadow v-shadow blur color; h-shadow:水平阴影的位置,可以是负值,正值向右,负值向左 v-shadow:水平阴影的位置,可以是负值, ...
- Java实现 LeetCode 764 最大加号标志(暴力递推)
764. 最大加号标志 在一个大小在 (0, 0) 到 (N-1, N-1) 的2D网格 grid 中,除了在 mines 中给出的单元为 0,其他每个单元都是 1.网格中包含 1 的最大的轴对齐加号 ...
- Java实现 蓝桥杯VIP 算法训练 数的统计
问题描述 在一个有限的正整数序列中,有些数会多次重复出现在这个序列中. 如序列:3,1,2,1,5,1,2.其中1就出现3次,2出现2次,3出现1 次,5出现1次. 你的任务是对于给定的正整数序列,从 ...
- java实现排列序数
X星系的某次考古活动发现了史前智能痕迹. 这是一些用来计数的符号,经过分析它的计数规律如下: (为了表示方便,我们把这些奇怪的符号用a~q代替) abcdefghijklmnopq 表示0 abcde ...
- Mybatis多表操作
一:引言 在学习完前面的mybatis基本语法后,大家都有个认知,这个Mybatis太强大了,比之前使用JDBC写方便多了,但是你们当初在使用原生JDBC写SQL查询的时候有没有遇到过多表查询呢?肯定 ...
- 如何拿到阿里P8 Offer-候选人视角谈面试
自我介绍 首先简单自我介绍一下,我叫陈映平,花名叫做小卡,2011年校招进入腾讯,是腾讯课堂B侧的前端技术负责人.2015年响应总理的号召,跟朋友一起出来创业,跟前面一位讲师的经历有点像,然后2018 ...
- chrome浏览器版本与驱动不匹配问题的解决办法
1.浏览器与驱动如何匹配才不会报错 使用selenium模块的webdriver打开谷歌浏览器时常遇到这样的错误提示: selenium.common.exceptions.WebDriverExce ...
- 阻塞队列一——java中的阻塞队列
目录 阻塞队列简介:介绍阻塞队列的特性与应用场景 java中的阻塞队列:介绍java中实现的供开发者使用的阻塞队列 BlockQueue中方法:介绍阻塞队列的API接口 阻塞队列的实现原理:具体的例子 ...