android 持续集合框架,Android基础之Java集合框架Collection

1、Collection是什么数组

1460000012634582

首先咱们一块儿来探讨一下Collection到底是什么个玩意,如上图所示List、Set、Queue、Map都指向Collection,它们都只是一个接口,并非实现类。正由于有了Collection集合框架,使咱们能方便的批量操做数据或对象。安全

2、List

List是有序的Collection,咱们能够很是轻松的来控制数据插入的位置,而且也能根据其索引来访问List中的某个元素。

其实List实现类仍是挺多的【AbstractList, AbstractSequentialList, ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector】,但今天咱们主要来说讲经常使用的类ArrayList、LinkedList、Vector。框架

2.1 ArrayList

看名称就知道Arraylist是基于数组的链表,且线程不一样步。咱们能够看下其实现的add方法源码:ide

@Override

public boolean add(E object) {

Object[] a = array;

int s = size;

if (s == a.length) {

Object[] newArray = new Object[s +

(s < (MIN_CAPACITY_INCREMENT / 2) ?

MIN_CAPACITY_INCREMENT : s >> 1)];

System.arraycopy(a, 0, newArray, 0, s);

array = a = newArray;

}

a[s] = object;

size = s + 1;

modCount++;

return true;

}

2.2 Vector

Vector也是基于数组的链表,可是其线程是同步的【以下add方法被synchronized修饰】,其实现的add方法源码:性能

@Override

public synchronized boolean add(E object) {

if (elementCount == elementData.length) {

growByOne();

}

elementData[elementCount++] = object;

modCount++;

return true;

}

性能方面:Vector比Arraylist和Array都低;

线程方面:Vector线程同步,ArrayList线程不一样步;this

2.3 LinkedList

LinkedList与Vector、ArrayList有着明显的区别,其并不基于数组,因此对LinkedList元素进行增长、删除时,不须要批量移动其余元素。

其每一个节点都包含如下两个信息:

一、该节点的数据

二、下一个节点的信息spa

小总结:基于Array的List(Vector、ArrayList)适合查询,LinkedList适合增删操做。.net

3、Set

Set是不包含重复的元素的无序Collection,而且Set都是基于Map实现的。

若是使用add()方法存入已存在的元素,则会覆盖以前的元素。

基于Set实现的类有AbstractSet, CopyOnWriteArraySet, EnumSet, HashSet, LinkedHashSet, TreeSet。线程

3.1 HashSet

咱们能够先看下HashSet中的add()方法的源码:指针

transient HashMap> backingMap;

@Override

public boolean add(E object) {

return backingMap.put(object, this) == null;

}

其中backingMap为HashMap对象,咱们应该知道HashMap是以键值对的形式来保存数据的,而在上述add()方法中,键为传入的对象,因此这就是Set不包含重复元素的最根本缘由。

3.2 TreeSet

TreeSet是SortedSet的子类,它与HashSet最根本的区别在于:TreeSet是有序的,由于TreeSet是基于SortedMap来实现的。

4、Map

咱们在聊Set的时候说道了HashMap,因此Map始终是以键值对形式存在的,而且其中的键是不容许重复的。

Map的常见实现有:HashMap和TreeMap。

若是咱们要往HashMap中存入数据就可使用put(Object key,Object value)方法,若是要取出数据也特别简单,使用get(Object key)方法。

在这里,我主要想聊聊HashMap和HashTable两个类的区别:

1、HashTable类是基于抽象类Dictionary的,而HashMap类是基于Map接口的实现;

2、HashTable类是同步的,这就保证了线程的安全,HashMap类是不一样步的;

3、HashTable类元素不能为空,不然系统会抛空指针异常,而HashMap类value是能够为空的,固然啦,其中key也是能够为空的,可是若是咱们这样设置,彷佛毫无心义。

5、Queue

Queue(队列)先进先出,Stack(栈)后进先出。

方法名 方法含义 备注

add 增长一个元索 若是队列已满,则抛出一个IIIegaISlabEepeplian异常

remove 移除并返回队列头部的元素 若是队列为空,则抛出一个NoSuchElementException异常

element 返回队列头部的元素 若是队列为空,则抛出一个NoSuchElementException异常

offer 添加一个元素并返回true 若是队列已满,则返回false

poll 移除并返问队列头部的元素 若是队列为空,则返回null

peek 返回队列头部的元素 若是队列为空,则返回null

put 添加一个元素 若是队列满,则阻塞

take 移除并返回队列头部的元素 若是队列为空,则阻塞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值