集合特点

  1:对象封装数据,对象多了也需要存储。集合用于存储对象。

  2:集合是可变长度的

集合和数组的区别:

  1:数组是固定长度的;集合可变长度的。

  2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型

  3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

 数据结构:就是容器中存储数据的方式。

  对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个容器的内部数据结构不同。

  集合容器在不断向上抽取过程中。出现了集合体系。

   在使用一个体系时,原则:参阅顶层内容。建立底层对象。

上图分析:

Collection: 

  |--List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。

  |--Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。

Collection方法:

  1,添加:

  add(object):添加一个元素

  addAll(Collection) :添加一个集合中的所有元素。

  2,删除:

  clear():将集合中的元素全删除,清空集合

  remove(obj) :删除集合中指定的对象。注意:删除成功,集合的长度会改变。

  removeAll(collection) :删除部分元素。部分元素和传入Collection一致。

  3,判断:

  boolean contains(obj) :集合中是否包含指定元素 。

  boolean containsAll(Collection) :集合中是否包含指定的多个元素。

  boolean isEmpty():集合中是否有元素。

  4,获取:

  int size():集合中有几个元素。

  5,取交集:

  boolean  retainAll(Collection) :对当前集合中保留和指定集合中的相同的元素。如果两个集合元素相同,返回flase;如果retainAll修改了当前集合,返回true。

  6,获取集合中所有元素:

  Iterator  iterator()迭代器

  7,将集合变成数组:

  toArray();

--< java.util >-- Iterator接口:

迭代器:是一个接口。作用:用于取集合中的元素。

boolean

hasNext()  如果仍有元素可以迭代,则返回 true。

E

next()   返回迭代的下一个元素。

void

remove()  从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。

每一个集合都有自己的数据结构(就是容器中存储数据的方式),都有特定的取出自己内部元素的方式。为了便于操作所有的容器,取出元素。将容器内部的取出方式按照一个统一的规则向外提供,这个规则就是Iterator接口

也就说,只要通过该接口就可以取出Collection集合中的元素,至于每一个具体的容器依据自己的数据结构,如何实现的具体取出细节,这个不用关心,这样就降低了取出元素和具体集合的耦合性。

Iterator it = coll.iterator();//获取容器中的迭代器对象,至于这个对象是是什么不重要。这对象肯定符合一个规则Iterator接口。

public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc0");
coll.add("abc1");
coll.add("abc2");
//--------------方式1----------------------
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//---------------方式2用此种----------------------
for(Iterator it = coll.iterator();it.hasNext(); ){
System.out.println(it.next());
}
}

--< java.util >-- List接口:

  List本身是Collection接口的子接口,具备了Collection的所有方法。现在学习List体系特有的共性方法,查阅方法发现List的特有方法都有索引,这是该集合最大的特点。

  List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。

  |--ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。

  |--LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。

  |--Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。

List方法:List集合支持对元素的增、删、改、查。

  1,添加:

  add(index,element) :在指定的索引位插入元素。

  addAll(index,collection) :在指定的索引位插入一堆元素。

  2,删除:

  remove(index) :删除指定索引位的元素。 返回被删的元素。

  3,获取:

  Object get(index) :通过索引获取指定元素。

  int indexOf(obj) :获取指定元素第一次出现的索引位,如果该元素不存在返回-1;

  所以,通过-1,可以判断一个元素是否存在。

  int lastIndexOf(Object o) :反向索引指定元素的位置。

  List subList(start,end) :获取子列表。

  4,修改:

  Object set(index,element) :对指定索引位进行元素的修改。

  5,获取所有元素

  ListIterator listIterator():list集合特有的迭代器。

List集合因为角标有了自己的获取元素的方式: 遍历。

 for(int x=0; x<list.size(); x++){

  sop("get:"+list.get(x));

  }

  在进行list列表元素迭代的时候,如果想要在迭代过程中,想要对元素进行操作的时候,比如满足条件添加新元素。会发生.ConcurrentModificationException并发修改异常。

导致的原因是:

  集合引用和迭代器引用在同时操作元素,通过集合获取到对应的迭代器后,在迭代中,进行集合引用的元素添加,迭代器并不知道,所以会出现异常情况。

如何解决呢?

  既然是在迭代中对元素进行操作,找迭代器的方法最为合适.可是Iterator中只有hasNext,next,remove方法.通过查阅的它的子接口,ListIterator,发现该列表迭代器接口具备了对元素的增、删、改、查的动作。

ListIterator是List集合特有的迭代器

  ListIterator it = list.listIterator;//取代Iterator it = list.iterator;

  

方法摘要

void

add(E e) 将指定的元素插入列表(可选操作)。

boolean

hasNext() 以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。

boolean

hasPrevious() 如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

E

next() 返回列表中的下一个元素。

int

nextIndex() 返回对 next 的后续调用所返回元素的索引。

E

previous() 返回列表中的前一个元素。

int

previousIndex() 返回对 previous 的后续调用所返回元素的索引。

void

remove() 从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。

void

set(E e) 用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

可变长度数组的原理:

  当元素超出数组长度,会产生一个新数组,将原数组的数据复制到新数组中,再将新的元素添加到新数组中。

  ArrayList:是按照原数组的50%延长。构造一个初始容量为 10 的空列表。

  Vector:是按照原数组的100%延长。

ArrayList扩从机制 http://blog.csdn.net/u013399093/article/details/51162652?locationNum=4

    private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
} ensureExplicitCapacity(minCapacity);
} private void ensureExplicitCapacity(int minCapacity) {
modCount++;//定义于ArrayList的父类AbstractList,用于存储结构修改次数 // overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//有些虚拟机会在数组内保留一些头部信息,尝试分配更大的容量可能会导致内存溢出
//容量扩容的精髓
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//当前容量的1.5倍赋值给新的容量
if (newCapacity - minCapacity < 0)//判断新容量是否足够,足够则使用当前新容量创建新数组,不够就将数组长度设置为需要的长度
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)//判断有没超过最大限制
newCapacity = hugeCapacity(minCapacity);
//将原来数组的值copy新数组中去, ArrayList的引用指向新数组(如果数据量很大还是建议初始化的时候指定容量的大小,提高效率)
elementData = Arrays.copyOf(elementData, newCapacity);
}

Vector扩从机制 http://cmsblogs.com/?p=1180

  按照原数组的100%延长,实现的接口和提供的四种构造函数如下:

public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
    /**
* 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
*/
public Vector() {
this(10);
} /**
* 构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。
*/
public Vector(Collection<? extends E> c) {
elementData = c.toArray();
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount,
Object[].class);
} /**
* 使用指定的初始容量和等于零的容量增量构造一个空向量。
*/
public Vector(int initialCapacity) {
this(initialCapacity, 0);
} /**
* 使用指定的初始容量和容量增量构造一个空的向量。
*/
public Vector(int initialCapacity, int capacityIncrement) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}

注意:对于list集合,底层判断元素是否相同,其实用的是元素自身的equals方法完成的。所以建议元素都要复写equals方法,建立元素对象自己的比较相同的条件依据。

LinkedList:的特有方法。

  addFirst();

  addLast();

  在jdk1.6以后。

  offerFirst();

  offerLast();

  getFirst():获取链表中的第一个元素。如果链表为空,抛出NoSuchElementException;

  getLast();获取链表中的最后一个元素。如果链表为空,抛出NoSuchElementException;

  在jdk1.6以后。

  peekFirst();获取链表中的第一个元素。如果链表为空,返回null。

  peekLast();

  removeFirst():获取链表中的第一个元素,但是会删除链表中的第一个元素。如果链表为空,抛出NoSuchElementException

  removeLast();

  在jdk1.6以后。

  pollFirst();获取链表中的第一个元素,但是会删除链表中的第一个元素。如果链表为空,返回null。

  pollLast();

看到Array就是数组结构,有角标,查询速度很快。

看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();

java基础集合简介List/Vector(三)上的更多相关文章

  1. java基础集合简介Map(三)下

    --Map接口简介 今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢! 可 ...

  2. java基础集合简介Set(三)中

    今天主要说夏set集合,每天抽出一个小时总结下,生活会更加美好! --< java.util >-- Set接口: 数据结构:数据的存储方式: Set接口中的方法和Collection中方 ...

  3. JAVA基础-集合(二)

    一.Map整体结构体系 Map是集合的另一大派系,与Collection派系不同的是Map集合是以键值对儿的形式存储在集合的.两个键为映射关系,其中第一个键为主键(主键是唯一的不可重复),第二个键为v ...

  4. Java基础-集合的嵌套

    Java基础-集合的嵌套 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.静态导入 静态导入是在JDK1.5后的新特性,可以减少开发的代码量,但是实际用处是很一般,静态导入的标准 ...

  5. Java基础类库简介

    Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...

  6. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  7. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  8. Java基础-集合框架-ArrayList源码分析

    一.JDK中ArrayList是如何实现的 1.先看下ArrayList从上而下的层次图: 说明: 从图中可以看出,ArrayList只是最下层的实现类,集合的规则和扩展都是AbstractList. ...

  9. java基础---集合(1)

    一. 基本概念 集合.数组都是对多个数据进行存储操作的结构,简称Java容器 数组:长度确定,类型确定,对于添加.删除.插入等操作效率不高,元素有序可重复 Java中集合框架顶层框架是:java.ut ...

随机推荐

  1. Excel 如何做不定长区间汇总统计

    第一步:创建数据-区间 辅助表(注意:首列值必须以升序排列,为后面vlookup模糊匹配做准备) 第二步:用vlookup模糊匹配生成一个新的“金额区间”字段 第三步:以“金额区间”字段为行透视汇总

  2. PowerMock学习(七)之Mock Constructor的使用

    前言 我们在编码的时候,总习惯在构造器中传参数,那么在powermock中是怎么模拟带参数构造的呢,这并不难. 模拟场景 我们先模拟这样一个场景,通过dao中的传入一个是布尔类型(是否加载)和一个枚举 ...

  3. MySQL 、PDO对象

    目录 1, singleton 2, pdo与db 3, singleton获取pdo 4, pdo实现db增删改查 5, pdo异常处理exception 6, pdo预处理prepare 7, p ...

  4. Stream系列(六)Match方法使用

    条件比配 视频讲解 https://www.bilibili.com/video/av77403655/ EmployeeTestCase.java package com.example.demo; ...

  5. /etc/security/limits.conf配置文件详解

    这个文件主要是用来限制用户对系统资源的使用.是/lib64/security/pam_limits.so模块对应的/etc/serurity/pam_limits的配置文件. # /etc/secur ...

  6. ehcache同步原理

    最近研究ehcache同步时发现一个问题: 现有A.B两个服务器,由A服务器向B服务器同步信息,采用RMI方式手动方式进行同步 配置信息如下: <?xml version="1.0&q ...

  7. 老男孩 python 自学 打印05 dict 复习总结

    dict 语法       {key : value} key 必须是可hash的 可哈希的目前有int . str . tuple .bool value 是没有任何限制的 2. 字典的相关操作 增 ...

  8. 构建调试Linux内核网络代码的环境MenuOS系统

    构建MenuOS系统 1.将指定文件拷贝到本地: git clone https://github.com/mengning/linuxnet.git 此过程可能需要输入github账号和密码. 2. ...

  9. python中字典数据类型常用操作

    创建字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: ...

  10. 第四章 开始Unity Shader学习之旅(1)

    1. 一个最简单的顶点/片元着色器 现在,我们正式开始学习如何编写Unity Shader,更准确的说是,学习如何编写顶点/片元着色器 2.顶点/片元着色器的基本结构 我们在以前已经讲过了Unity ...