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的更多相关文章

  1. 模拟java.util.Collection一些简单的用法

    /* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替 ...

  2. Java中Collection和Collections的区别(引用自:http://www.cnblogs.com/dashi/p/3597937.html)

      1.java.util.Collection 是一个集合接口(集合类的一个顶级接口).它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Co ...

  3. java中Collection类及其子类

    1:对象数组(掌握) (1)数组既可以存储基本数据类型,也可以存储引用类型.它存储引用类型的时候的数组就叫对象数组. 2:集合(Collection)(掌握) (1)集合的由来? 我们学习的是Java ...

  4. java 15-2 Collection的高级功能测试

    A:  boolean addAll(Collection c):添加一个集合的元素 ,所有的元素,无论是否重复 B:  boolean removeAll(Collection c):移除一个集合的 ...

  5. java 15-1 Collection集合的概述以及小功能介绍

     集合的由来:  我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储.  而要想存储多个对象,就不能是一个基本的变量,而应 ...

  6. java集合——Collection接口

    Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...

  7. [翻译]Java垃圾收集精粹(Java Garbage Collection Distilled)

    source URL: http://www.infoq.com/articles/Java_Garbage_Collection_Distilled Name: Java Garbage Colle ...

  8. Java API ——Collection集合类 & Iterator接口

    对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...

  9. 源码(03) -- java.util.Collection<E>

     java.util.Collection<E> 源码分析(JDK1.7) -------------------------------------------------------- ...

  10. JVM垃圾收集(Java Garbage Collection / Java GC)

    JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...

随机推荐

  1. Serverless Wordpress 系列建站教程(三)

    从前面两篇教程文章里,我们可以了解到 Serverless WordPress 的低门槛部署,免运维等功能优势.而建站场景中,开发者关注的另一个重点则是成本问题,Serverless 架构究竟如何计费 ...

  2. 全真教程:Windows环境Jupyter Notebook安装、运行和工作文件夹配置

    全真教程:Windows环境Jupyter Notebook安装.运行和工作文件夹配置 @ 目录 全真教程:Windows环境Jupyter Notebook安装.运行和工作文件夹配置 一.Jupyt ...

  3. TIOBE 编程语言排行榜

    https://www.tiobe.com/tiobe-index/ TIOBE 编程语言排行榜是编程语言流行趋势的一个指标

  4. 再探循环依赖 → Spring 是如何判定原型循环依赖和构造方法循环依赖的?

    开心一刻 一天,侄子和我哥聊天,我坐在旁边听着 侄子:爸爸,你爱我妈妈吗? 哥:这话说的,不爱能有你吗? 侄子:确定有我不是因为荷尔蒙吗? 哥:因为什么荷尔蒙,因为爱情! 侄子:那我妈花点钱,你咋老说 ...

  5. javascript 最权威的知识点总结

    JavaScript中如何检测一个变量是一个String类型?请写出函数实现typeof(obj) === "string"typeof obj === "string& ...

  6. 基于sk_learn的k近邻算法实现-mnist手写数字识别且要求97%以上精确率

    1. 导入需要的库 from sklearn.datasets import fetch_openml import numpy as np from sklearn.neighbors import ...

  7. Python3实现短信轰炸机

    短信轰炸机的基本原理:利用某些限制不严格的网站短信注册接口,用Python模拟请求,传入被炸人手机号码,实现轰炸 实现方式:利用requests模块.time模块.完成请求模拟 模块安装: 在终端窗口 ...

  8. Java 学习记录

    •Eclipse相关 Eclipse常用设置 解决 Eclipse 项目中有红色感叹号的详细方法(图文) JRE System Library [JavaSE-1.8](unbound) •Java ...

  9. Android 之 TableLayout 布局详解

    TableLayout简介 •简介 Tablelayout 类以行和列的形式对控件进行管理,每一行为一个 TableRow 对象,或一个 View 控件. 当为 TableRow 对象时,可在 Tab ...

  10. Android Studio 之 制作 Nine-Patch 图片(.9图片)

    •引言 9.png 可以保证图片在合适的位置进行局部拉伸,避免了图片全局缩放造成的图片变形问题. 但是由于Android Studio对于.9图片的检查更加严格,所以不符合AS要求的.9图片会带来很多 ...