类集简介

  从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. luogu3380 树套树之线段树套线段树

    个人感觉可能是最不需要脑子写的方法 不过也不太好调 就是用一个普通的线段树维护这个序列,但是对于线段树的每一个区间,再开一个动态开点的权值线段树,里面存储这个区间所有元素值 单点修改只会涉及到log棵 ...

  2. CF580C Kefa and Park dfs

    Kefa decided to celebrate his first big salary by going to the restaurant. He lives by an unusual pa ...

  3. 3D电影转2D普通电影,电脑上看

    下了一些电影,打开发现是左右两个一样的画面,什么情况?原来这就是传说中的3D,怎么像正常电影一样的看呢?第一反应去搜3D眼镜,价钱倒是不贵,但是不应急呀,肿么办?以下是观看方法: 一.看电脑上有QQ影 ...

  4. element el-tree循环遍历树形结构,并动态赋值disabled属性

    凌晨3点,功夫不负有心人,已经累趴,效果终于出来: 贴上代码: <style scoped> .form { width: 50%; } </style> <templa ...

  5. CSS(十三).高度如何铺满全屏

    该需求来源一次面试题. IE6不认识!important声明,IE7.IE8.Firefox.Chrome等浏览器认识:而在怪异模式中,IE6/7/8都不认识!important声明,这只是区别的一种 ...

  6. java的Spring学习1--spring引用及属性(setter,getter)注入

    1.目录结构 项目->src->main->java->com.test.ppmoney 设置java文件夹为代码  在Project Structure 里的 Modules ...

  7. Qt中的标准对话框

    1. Qt为开发者提供了一些可复用的对话框类型,如QMessageBox,QFileDialog,QPrintDialog, QColorDialog, QInputDialog, QProgress ...

  8. eclipse安装阿里规范模板

    https://github.com/alibaba/p3c/tree/master/p3c-formatter 1.代码模板(含注释等) 2.代码格式化

  9. python文件引用其他文件中的变量

    问题: 然后再另一个文件中引用该变量 报错:Cannot find reference 'User_Agent' in '__init__.py' less... (Ctrl+F1) 正确写法: fr ...

  10. chrome浏览器解决 跨域调试问题

    1.关闭chrome浏览器(全部) 我们可以通过使用chrome命令行启动参数来改变chrome浏览器的设置,具体的启动参数说明参考这篇介绍.https://code.google.com/p/xia ...