资讯专栏INFORMATION COLUMN

Android基础之Java集合框架Collection

_Zhao / 2981人阅读

摘要:正因为有了集合框架,使我们能方便的批量操作数据或对象。三是不包含重复的元素的无序,并且都是基于实现的。如果使用方法存入已存在的元素,则会覆盖之前的元素。


【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!!


一、Collection是什么

首先我们一起来探讨一下Collection究竟是什么个玩意,如上图所示List、Set、Queue、Map都指向Collection,它们都只是一个接口,并不是实现类。正因为有了Collection集合框架,使我们能方便的批量操作数据或对象。

二、List
List是有序的Collection,我们可以非常轻松的来控制数据插入的位置,并且也能根据其索引来访问List中的某个元素。
其实List实现类还是挺多的【AbstractList, AbstractSequentialList, ArrayList, CopyOnWriteArrayList, LinkedList, Stack, Vector】,但今天我们主要来讲讲常用的类ArrayList、LinkedList、Vector。

2.1 ArrayList
看名称就知道Arraylist是基于数组的链表,且线程不同步。我们可以看下其实现的add方法源码:

@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线程不同步;

2.3 LinkedList
LinkedList与Vector、ArrayList有着明显的区别,其并不基于数组,所以对LinkedList元素进行增加、删除时,不需要批量移动其他元素。
其每个节点都包含以下两个信息:
1、该节点的数据
2、下一个节点的信息

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

三、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来实现的。

四、Map
我们在聊Set的时候说道了HashMap,所以Map始终是以键值对形式存在的,并且其中的键是不允许重复的。
Map的常见实现有:HashMap和TreeMap。
如果我们要往HashMap中存入数据就可以使用put(Object key,Object value)方法,如果要取出数据也特别简单,使用get(Object key)方法。
在这里,我主要想聊聊HashMap和HashTable两个类的区别:

一、HashTable类是基于抽象类Dictionary的,而HashMap类是基于Map接口的实现;
二、HashTable类是同步的,这就保证了线程的安全,HashMap类是不同步的;
三、HashTable类元素不能为空,否则系统会抛空指针异常,而HashMap类value是可以为空的,当然啦,其中key也是可以为空的,但是如果我们这样设置,似乎毫无意义。

五、Queue
Queue(队列)先进先出,Stack(栈)后进先出。
方法名 方法含义 备注
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞


【免费】全网独家:这是一份非常值得珍藏的Android知识体系!!!


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/14205.html

相关文章

  • java 基础 - 收藏集 - 掘金

    摘要:基础知识复习后端掘金的作用表示静态修饰符,使用修饰的变量,在中分配内存后一直存在,直到程序退出才释放空间。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因及实例?线上如何排查?) 2. 类加载机制 3. 垃圾回收 Java基础 什么是接口?什么是抽象...

    makeFoxPlay 评论0 收藏0
  • java 基础 - 收藏集 - 掘金

    摘要:基础知识复习后端掘金的作用表示静态修饰符,使用修饰的变量,在中分配内存后一直存在,直到程序退出才释放空间。将对象编码为字节流称之为序列化,反之将字节流重建成对象称之为反序列化。 Java 学习过程|完整思维导图 - 后端 - 掘金JVM 1. 内存模型( 内存分为几部分? 堆溢出、栈溢出原因及实例?线上如何排查?) 2. 类加载机制 3. 垃圾回收 Java基础 什么是接口?什么是抽象...

    Markxu 评论0 收藏0
  • java源码

    摘要:集合源码解析回归基础,集合源码解析系列,持续更新和源码分析与是两个常用的操作字符串的类。这里我们从源码看下不同状态都是怎么处理的。 Java 集合深入理解:ArrayList 回归基础,Java 集合深入理解系列,持续更新~ JVM 源码分析之 System.currentTimeMillis 及 nanoTime 原理详解 JVM 源码分析之 System.currentTimeMi...

    Freeman 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0
  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    dance 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<