类集简介

  从JDK1.2开始Java引入了类集开发框架,所谓的类集指的就是一套动态对象数组的实现方案,在实际开发之中没有有何一项开发可以离开数组,但是传统的数组实现起来非常的繁琐。而且长度是其致命伤,正是因为长度的问题,所以传统的数组是不可能大范围使用的,但是我们的开发又不可能离开数组,所以最初就只能依靠一些数据结构来实现动态的数组处理,而其中最重要的两个结构:链表、树。但是面对这些数据结构的实现又不得不面对如下的一些问题:

  • 数据结构的代码实现困难,对于一般的开发者是无法进行使用的;
  • 对于链表和二叉树当进行更新处理的时候的维护是非常麻烦的;
  • 对于链表或二叉树还需要尽可能保证其操作的性能。

  正是因为这样的原因,所以从JDK1.2开始Java引入了类集,主要就是对常见的数据结构进行完整的实现包装,并且提供有一系列的接口与实现子类来帮助用户减少数据结构所带来的开发困难,但是最初的类集实现由于Java本身的技术所限,所以对于数据的控制并不严格,全部采用了Object类型进行数据接收,而在JDK1.5之后由于泛型技术的推广,所以类集本身也得到了良好的改进,可以利用泛型来保存相同类型的数据,并随着数据量的不断增加,从JDK1.8开始类集中的实现算法也得到了良好的性能提升。

  在整个类集框架里提供有如下几个核心接口:Collection、List、Set、Map、Iterator、Enumeration、Queue、ListIterator。

Collection接口简介

  java.util.Collection是单值集合操作的最大父接口,在该接口之中定义有所有单值数据的处理,这个接口之中定义有如下的核心操作方法:

  

  在进行集合操作的时候有两个方法最常用:【增加】add()、【输出】iterator()。在JDK1.5以前,Collection只是一个独立的接口,但是从JDK1.5之后提供有了Iterable父接口,并且在JDK1.8的之后针对于Iterable接口也得到了一些扩充。另外在JDK1.2~JDK1.4的时代里如果要进行集合的使用往往会直接操作Collection接口,但是从JDK1.5时代开始更多的情况下都是选择的两个Collection的子接口:允许重复的List子接口、不允许重复的Set子接口。

    

List接口简介

  List是Collection子接口,其最大特点是允许保存有重复元素数据,该接口的定义如下:public interface List<E> extends Collection<E>

  但是需要清楚的是List子接口对于Collection接口进行了方法扩充。

  

  但是List本身依旧属于一个接口,那么想要使用List接口则必须通过子类实现定义,在List子接口中有三个常用子类:ArrayList、Vector、LinkedList。

  

ArrayList子类简介

  ArrayList是List子接口使用最多的一个子类,但是这个子类在使用时也是有前提要求的,在Java中对ArrayList的定义如下:

  public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess, Cloneable, Serializable

  ArrayList子类的继承结构如下:

  

  范例:使用ArrayList实例化List父接口

  

  通过本程序可以发现List存储特征:

  • 保存的顺序就是去存储顺序
  • List集合里面允许存储重复数据

  在以上的程序里虽然实现了集合的输出,但是这种输出的操作是直接利用了每一个类提供的toString()方法实现的,为了方便的进行输出处理,在JDK1.8之后Iterable父接口中定义有一个forEach()方法,方法定义如下:

  • 输出支持:default void forEach​(Consumer<? super T> action)

  范例:利用forEach()方法输出(不是标准输出)

  

  需要注意的是,此种输出并不是在正常开发情况下要考虑的操作形式。

  范例:观察List集合的其他操作方法

  

  如果以方法的功能为例,那么ArrayList里面操作支持与之前的链表形式是非常相似的,但是它并不是使用链表来实现的,通过类名称可以发现,ArrayList封装的应该是一个数组。

  

  通过有参构造方法可以发现,在ArrayList里面所包含的数据实际上就是一个对象数组。如果现在进行数据追加的时候发现ArrayList集合里面保存对象数组的长度不够的时候会进行新的数组开辟同时将原始旧数组内容拷贝到新数组中,而后数组的开辟操作:

  

  如果在实例化ArrayList类对象的时候并没有传递初始化长度,则默认情况下会使用一个空数组,但是如果在进行数据增加的时候,发现数组容量不够的情况下,则会判断当前增长的容量与默认的容量的大小,使用一个较大的数值进行新的数组的开辟。所有得出一个结论:

  

  当ArrayList之中保存的容量不足的时候会采用成倍的方式进行增长,原始长度为10,那么下次的增长就是20,以此类推。

  在使用ArrayList子类时一定要估算出数据量的大小,如果超过了10个,那么使用有参构造进行创建,以免垃圾数组的空间产生。

LinkedList子类简介

  LinkedList子类通过名称可以发现其是基于链表的实现,下面先观察LinkedList子类的定义:

  public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable

  LinkedList子类的继承关系:

  

  范例:使用LinkedList实现集合操作

  

  如果说只是观察程序功能会发现和ArrayList使用是完全一致的,但是其内部的实现机制是完全不同的,首先观察LinkedList的构造方法里面并没有提供有像ArrayList那样初始化大小的方法,而只是提供有无参构造方法:public LinkedList()。

  随后观察add()方法的具体实现:

  

Java学习笔记——集合的更多相关文章

  1. java学习笔记—集合之Map集合

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 12.0px Times } p.p2 { margin: 0.0p ...

  2. 0015 Java学习笔记-集合-TreeMap集合

    主要的方法 构造方法: TreeMap(); TreeMap(Comparator<?super K> comparator); TreeMap(Map<? extends K,? ...

  3. 0014 Java学习笔记-集合-HashMap集合

    主要的方法 + 构造方法: * HashMap(); - 默认大小16,负载因子0.75 * HashMap(int initialCapacity); * HashMap(int initialCa ...

  4. Java学习笔记--集合元素的比较Comparable,Comparator

    原文见: http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个 ...

  5. java学习笔记 --- 集合

    1.定义:集合是一种容器,专门用来存储对象 数组和集合的区别?   A:长度区别  数组的长度固定 集合长度可变 B:内容不同  数组存储的是同一种类型的元素  而集合可以存储不同类型的元素  C:元 ...

  6. java学习笔记 --- 集合(续)

    1.map集合 1.1.特点:将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.Map集合和Collection集合的区别? Map集合存储元素是成对出现的,Map集 ...

  7. java学习笔记-集合set

    equals指内容(值)相等,== 指地址相等 ===============set类 set继承自collection,但set没有新增方法,只是set里的元素不重复,下面是set常用方法 ==== ...

  8. 0017 Java学习笔记-集合-集合一般:HashSet和HashMap

    几个概念 桶(bucket):hash表里可以存储元素的位置 hash冲突:equals()返回false的不相等对象的hashCode()值相等,意味着一个bucket要放几个元素 容量(capac ...

  9. Java学习笔记之---集合

    Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...

随机推荐

  1. ArcGIS-各类问题

    arcgis 10.4破解方法*注意!Desktop,Engine,Server必须为同一版本 1.先安装License10.4 2.再安装Desktop10.4 3.再安装Engine10.4 4. ...

  2. Flashcache的 KEEP属性自动失效

    如果希望一个数据对象长期地缓存在flashcache中,则可以手动地将该数据对象的CELL_FLASH_CACHE属性设置为"keep". 其实需要说明的是,但不是数据对象的CEL ...

  3. N - 畅通工程再续 (最小生成树)

    相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政 ...

  4. redis初识及基本操作

    一.redis介绍: 1.Redis是什么: REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(Key-Value) ...

  5. 通过id、classname定位元素,程序仍报找不到元素的原因

    很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明明元素就在那儿,用firebug也可以看到,就是定位不到,这种情况很有可能是frame在搞鬼.我们知道了原因,你现在就解决问题.sw ...

  6. Photoshop入门教程(五):滤镜

    学习心得:滤镜通常用于摄影行业,是安装在相机镜头前用于过滤自然光的附加镜头,从而获得一些特殊的效果.同理,Photoshop的滤镜也是为了产生特殊的效果.Photoshop滤镜分为两类:一种是内部滤镜 ...

  7. Photoshop入门教程(一):文本新建与概念解析

    写在开头 <Photoshop实用入门>系列教程可能对于一点都没有接触过Photoshop的人来说不太容易接受,因为本教程并没有细致到教你如何使用画笔工具等一系列很基础的东西,有些地方的讲 ...

  8. uva 442

    #include<iostream>#include<stack>#include<map>using namespace std;struct node{ int ...

  9. Linux 进程间通信系列之 信号

    信号(Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:Linux除了支持Unix早期信号语义函数sigal外,还支持语义符 ...

  10. MQTT学习之一

    一MQTT特性: 基于C/S,发布订阅(发布者服务器->云平台代理->订阅客户端)一对多结构,适用于低带宽高延时,基于TCP/IP之上.