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可以精确的控制每个元素的插入位置,并且可以删 ...
随机推荐
- boost库checked_delete的使用
在查看boost库时发现一个小文件checked_delete.hpp里面几个小函数,它的作用用很简短的话来说:防止未定义的行为造成delete时的内存泄露.实现如下: template<cla ...
- Servlet中Web.xml的配置详解(一)
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的 ...
- centos6.4安装过程中无法出现图形化界面
今天在VMware9.0安装centos6.4的时候,前面的步骤都没问题,到跳过媒体检查这一步后,就发现和之前的不一样了,这次安装不是图形界面,导致后面的安装不方便 一开始以为是centos的版本不一 ...
- SQL语句 ANSI_NULLS 值(ON|OFF)的含义
官方说明: 1.当 SET ANSI_NULLS 为 ON 时,即使 column_name 中包含空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行. 即 ...
- P4159 [SCOI2009]迷路
传送门 先考虑只有 01 边权的情况 显然可以DP+矩阵加速 但是现在边权不止 1 然鹅最大也只有 9 所以从这里入手,把点拆成 9 个,然后点之间的边权也就可以变成 1 了 同样的转移和矩阵加速 注 ...
- Experimental Educational Round: VolBIT Formulas Blitz B
Description The city administration of IT City decided to fix up a symbol of scientific and technica ...
- BeautifulSoup4模块的使用
1. 安装 pip3 install beautifulsoup42. 使用 from bs4 import BeautifulSoup obj = BeautifulSoup("HTML内 ...
- 第十章:DOM
<div class="wrap"> <ul id="ul"> <li>01</li> <li>02 ...
- 分配一维动态数组or 二维动态数组的方法以及学习 new 方法or vector
先来个开胃菜 // 使用new动态分配存储空间 #include<iostream> using std::cout; int main() { // 第1种方式 int *a=new i ...
- C# Linq 查询数据库(DataSet)生成 Tree
效果图如下 cs代码 using System; using System.Collections.Generic; using System.ComponentModel; using System ...