java之Collection
java中的Collection可分为List、Set、Queue三种类型。
1、List。
List会按照插入的顺序保存对象,较为常用的实现类有ArrayList,LinkedList和Vector。
(1)ArrayList是通过数组实现的。当容量不足时,会扩容增加原容量的1/2。数组的缺陷是显而易见的,进行删除和扩容时的复制操作非常耗费资源;但它的优点是遍历和访问速度快。
ArrayList扩容源码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
(2)LinkedList是通过链表实现的。添加元素时,直接将新元素加到链表的末端。它适用于增加和删除元素,但不适用于访问和遍历。
LinkedList添加元素源码:
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
(3)Vector与ArrayList类似,都是通过数组实现的,最大的区别是,Vector线程安全,而ArrayList非线程安全;还有就是Vector的扩容增量可自己设置,若不设置,则扩容时将增加一倍。
Vector扩容源码:
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
capacityIncrement : oldCapacity);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
2、Set。
Set不保存重复的元素,它通常用于查询是否存在某个元素。它的常用实现类有HashSet、TreeSet。
(1)HashSet的底层通过HashMap实现,也可以选择LinkedHashMap。将插入的值作为Key插入到HashMap中,把Object对象常量作为Value。
添加元素操作源码:
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
(2)TreeSet通过TreeMap实现,与HashSet一样,也是将插入的元素作为Key,把Object对象常量最为Value。
设置排序方式源码:
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator));
}
3、Queue。
队列通常是一种FIFO的容器,但也可根据具体需求设置优先级。
表1中展示了队列的几个基本操作:
(1)add和offer方法都是往队列中添加元素,在一些容量限制的队列中,插入失败时,add方法将抛出异常;offer方法返回false。
(2)remove和poll方法都会移除并返回首个元素,当队列为空时,分别会抛出异常和返回null。
(3)element和peek方法都会返回首个元素而且不会移除,当队列为空时,分别会抛出异常和返回null。
表1 Queue的三对基本操作
| 抛出异常 | 返回特殊值 | |
| 插入 | add(e) |
offer(e) |
| 移除 | remove() |
poll() |
| 检查 | element() |
peek() |
Queue较为常用的实现类有LinkedList、PriorityQueue。
(1)LinkedList在上文中提到过,它是通过列表的形式实现的。它实现了List接口,同时也实现了Queue接口。
通常我们会根据需要将其向上转型为List或Queue类型,这里体现了向上转型的一个优点,它窄化了子类成员的访问权限,方便使用。
(2)PriorityQueue是无界优先级队列,它有以下特点:
它可根据自然顺序或根据提供的Comparator进行排序。
不允许插入不可比较的对象,若插入的元素类型未实现Comparable接口,且不提供Comparator对象,将会出错。
不允许插入null元素。
java之Collection的更多相关文章
- 模拟java.util.Collection一些简单的用法
/* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替 ...
- Java中Collection和Collections的区别(引用自:http://www.cnblogs.com/dashi/p/3597937.html)
1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Co ...
- java中Collection类及其子类
1:对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. 2:集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java ...
- java 15-2 Collection的高级功能测试
A: boolean addAll(Collection c):添加一个集合的元素 ,所有的元素,无论是否重复 B: boolean removeAll(Collection c):移除一个集合的 ...
- java 15-1 Collection集合的概述以及小功能介绍
集合的由来: 我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储. 而要想存储多个对象,就不能是一个基本的变量,而应 ...
- java集合——Collection接口
Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...
- [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)
source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...
- Java API ——Collection集合类 & Iterator接口
对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...
- 源码(03) -- java.util.Collection<E>
java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...
- JVM垃圾收集(Java Garbage Collection / Java GC)
JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...
随机推荐
- axios之增删查改操作
一.get方法获取数据 axios.get('url') .then(function (res) { console.log(res); }).catch(function (error) { co ...
- Shuffle Card HDU - 6707
题目链接:https://vjudge.net/problem/HDU-6707 题意:给你一个数组a[ ](a[1]=1,a[2]=2.....a[n]=n),然后m次操作,每次把那个数拿到最前面去 ...
- HDU(1420)Prepared for New Acmer(JAVA语言)【快速幂模板】
思路:快速幂裸题. //注意用long,否则会超范围 Problem Description 集训进行了将近2个礼拜,这段时间以恢复性训练为主,我一直在密切关注大家的训练情况,目前为止,对大家的表现相 ...
- [倍增]luogu P4155 [SCOI2015]国旗计划
题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...
- python自动统计zabbix系统监控覆盖率
脚本主要功能: 1)通过zabbix api接口采集所有监控主机ip地址: 2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址.主机名.操作系统.电源状态: 3)以上2步返回数据对比,找出未监控 ...
- 设计Web页面(2)
1.前面我们新建了一个空白的ASP.NET网页,那么接下来这章我们就讲一下设计Web页面 2.布局页面有两种方法,一种是通过Table表格来布局页面窗体,另一种是通过CSS+DIV来布局窗体,其中作为 ...
- 201871030127-王明强 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 18级卓越班 这个作业要求链接 实验三 软件工程结对项目 我的课程学习目标 1.熟悉PSP流程2. 熟悉github操作3.加深对D{0-1}问题的解法的理解4.熟悉ja ...
- leetcode 刷题(数组篇)74 题 搜索二维矩阵 (二分查找)
二分查找要注意边界值的取值,边界情况的判定 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一 ...
- Anacoda下报错conda command not found 以及TypeError: __new__() got an unexpected keyword argument 'serialized_options'
在anacoda安装完成后,执行conda list命令,显示command not found 解决方法: 对于anaconda 2 , 输入export PATH=~/anaconda2/bin ...
- BBR拥塞算法的简单解释
TCP BBR的ACM论文中,开篇就引入了图1,以此来说明BBR算法的切入点: 为何当前基于丢包探测的TCP拥塞控制算法还有优化空间? BBR算法的优化极限在哪儿? 图1 为了理解这张图花了我整整一个 ...