Java学习笔记——集合
类集简介
从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学习笔记——集合的更多相关文章
- 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 ...
- 0015 Java学习笔记-集合-TreeMap集合
主要的方法 构造方法: TreeMap(); TreeMap(Comparator<?super K> comparator); TreeMap(Map<? extends K,? ...
- 0014 Java学习笔记-集合-HashMap集合
主要的方法 + 构造方法: * HashMap(); - 默认大小16,负载因子0.75 * HashMap(int initialCapacity); * HashMap(int initialCa ...
- Java学习笔记--集合元素的比较Comparable,Comparator
原文见: http://www.cnblogs.com/sunflower627/p/3158042.html 1. Comparator 和 Comparable 相同的地方 他们都是java的一个 ...
- java学习笔记 --- 集合
1.定义:集合是一种容器,专门用来存储对象 数组和集合的区别? A:长度区别 数组的长度固定 集合长度可变 B:内容不同 数组存储的是同一种类型的元素 而集合可以存储不同类型的元素 C:元 ...
- java学习笔记 --- 集合(续)
1.map集合 1.1.特点:将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.Map集合和Collection集合的区别? Map集合存储元素是成对出现的,Map集 ...
- java学习笔记-集合set
equals指内容(值)相等,== 指地址相等 ===============set类 set继承自collection,但set没有新增方法,只是set里的元素不重复,下面是set常用方法 ==== ...
- 0017 Java学习笔记-集合-集合一般:HashSet和HashMap
几个概念 桶(bucket):hash表里可以存储元素的位置 hash冲突:equals()返回false的不相等对象的hashCode()值相等,意味着一个bucket要放几个元素 容量(capac ...
- Java学习笔记之---集合
Java学习笔记之---集合 (一)集合框架的体系结构 (二)List(列表) (1)特性 1.List中的元素是有序并且可以重复的,成为序列 2.List可以精确的控制每个元素的插入位置,并且可以删 ...
随机推荐
- 最短路【bzoj2464】: 中山市选[2009]小明的游戏
2464: 中山市选[2009]小明的游戏 Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步 ...
- stl仿函数和适配器
所谓的适配器就是底层利用仿函数,然后修改仿函数的接口,达到自己的目的: 例如:template<class operation> class binder1st的适配器,其本质是一个类,它 ...
- TensorFlow车辆检测
1.先在UIUC Image Database for Car Detection下载训练数据集. 下载地址:http://cogcomp.org/Data/Car/ 下载解压之后文件目录如图所示,这 ...
- POJ1051 P,MTHBGWB
题目来源:http://poj.org/problem?id=1051 题目大意: Morse密码里每个字母用长度不定的点和线来表示,一条信息中字母的编码之间用空隙隔开.下表为Morse密码的编码表: ...
- P3348 [ZJOI2016]大森林(LCT)
Luogu3348 BZOJ4573 LOJ2092 题解 对于每个\(1\)操作建一个虚点,以后的\(0\)操作都连在最近建好的虚点上.这样每次整体嫁接的时候,直接把这个虚点断掉它原来的父亲,再\( ...
- chafen
//f(u)>=f(v)+w //求最大值 跑最短路 v->u -w //求最小值 跑最长路 u->v w
- datetimepicker使用
常考地址:http://www.bootcss.c 直接上代码: 步骤:1.http://www.bootcss.com/p/bootstrap-datetimepicker/下载包 2.将里面的js ...
- windows下安装TensorFlow(CPU版)
建议先到anaconda官网下载最新windows版的anaconda3.6,然后按步骤进行安装.(这里我就不贴图了,自己下吧) 1.准备安装包 http://www.lfd.uci.edu/~goh ...
- 18-----BBS论坛
BBS论坛(十八) 18.首页轮播图实现 (1)front/css/front_base.css .main-container{ width: 990px; margin: 0 auto; over ...
- java将pdf转成base64字符串及将base64字符串反转pdf
package cn.wonders.utils; import java.io.BufferedInputStream;import java.io.BufferedOutputStream;imp ...