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可以精确的控制每个元素的插入位置,并且可以删 ...
随机推荐
- k8s安装
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.3 安装docker 使用阿里的源https://mirrors.aliyun.com/ ...
- GUI JFrame窗体介绍:
GUI JFrame窗体介绍: https://www.cnblogs.com/-ksz/p/3422074.html
- Python语言、编译解释、动态库静态库、编译过程、头文件
学习Python这门语言首先要了解 什么是编译与解释,什么是连接,什么是动态库与静态库, 什么是编译: 编译就是先把高级语言设计的程序翻译成二进制的机器语言,然后CPU直接执行机器码就可以了.一把翻译 ...
- Python的主要应用领域及应用场景
参考链接:https://www.cnblogs.com/kaid/p/9016673.html 正文: Python简介 Python(英国发音:/ˈpaɪθən/美国发音:/ˈpaɪθɑːn/), ...
- 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)
取板粗 好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...
- Codeforces Round #305 (Div. 2) B
Description Mike and some bears are playing a game just for fun. Mike is the judge. All bears except ...
- PostgreSQL 存储过程/函数
1.有用的链接 postgresql 常用小函数 Postgresql数据库的一些字符串操作函数 PostgreSQL function里面调用function PostgreSQL学习手册(函数和操 ...
- django模型层之多表操作 增删改查
多表操作之创建模型 这边以书为中心创建一个模型 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(on ...
- WCF的三种模式
WCF通信的3种模式 1.正常模式:客户端调取接口->等待服务响应->接受响应->执行客户端后面代码(wcf服务有入参,有返回值) 2.数据报模式:客户端调取接口->不等待响应 ...
- C# Linq 查询数据库(DataSet)生成 Tree
效果图如下 cs代码 using System; using System.Collections.Generic; using System.ComponentModel; using System ...