集合
来源:互联网 发布:js判断是否等于0 编辑:程序博客网 时间:2024/06/06 15:46
1. 集合
1.1. 数组的特性
数组访问速度快但创建之后容量无法改变。
如何解决数组长度增加问题?
可以等到容量快不够用的时候创建一个新数组,把旧数组的数据复制到新数组,ArrayList就是这么做的。
ArrayList比数组灵活,但效率更低。
问题:存储一个班的学员信息,假定一个班容纳20名学员。 加一个学生?Student[] stuArr = new Student[20];
如何存储每天的新闻信息?(每天的新闻总数不确定,太少,空间不足,太多,浪费空间。)
1.2. 数组和集合的区别
l 数组的大小是固定的,同一个数组只能存放类型一样的数据。
l 集合的大小可长可短 ,如果不知道要存放多少数据,需要使用集合,不能用数组。
l 在JAVA保存一组数据,速度最快的方式是数组,最灵活的是集合。
1.3. 什么是集合?
Java集合工具包位置是java.util.*,包含了集合、链表、队列、栈、数组、映射等。
1.4. Java集合主要可以划分为4个部分
画虚线的:接口
画实线的:类
l Collection 接口存储一组不唯一,无序的对象。
l List接口存储一组不唯一,有序,可重复的对象。
l Set接口存储唯一,无序的对象。
l Map接口存储一组键—值对象,提供Key—Value的映射。
l 工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。
Iterator衣特瑞特 、Enumeration以牛么瑞沈
1.5. 集合的体系结构
l 集合主要包含两大接口Collection和Map
l List和Set继承自Collection接口。Map也属于集合系统,但和Collection接口不同。
l Set无序、元素唯一 。HashSet和TreeSet是主要的实现类。
l List有序、元素可重复。ArrayList、LinkedList和Vector(淘汰)是主要的实现类。
l Map是键值对集合,根据一个对象查找对象。其中key列就是一个集合,key不能重复,但是value可以重复。HashMap、TreeMap和Hashtable是Map的主要实现类。
1.6. ArrayList
什么是ArrayList?
ArrayList是一个数组队列,相当于动态数组。与数组相比,ArrayList的容量能动态增长。
ArrayList包含什么功能?
l 添加、删除、修改、遍历一组数据。
l ArrayList 实现了Cloneable接口,覆盖了函数clone(),能被克隆。
l ArrayList 实现java.io.Serializable接口,支持序列化,能通过序列化传输。
l ArrayList中的操作不是线程安全的,所以,在单线程中才使用ArrayList,在多线程中可以选择Vector。
ArrayList 基本用法
ArrayList的3种遍历方式
结论:遍历ArrayList时,使用索引序号访问效率最高,使用迭代器的效率最低。
ArrayList和数组互相转换
ArrayList总结
l ArrayList 实际上是通过一个数组去保存数据的。当我们构造ArrayList时;若使用默认构造函数,则ArrayList的默认容量大小是10。
l 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”
l ArrayList的克隆函数,即是将全部元素克隆到一个数组中。
l ArrayList的使用场景:
l (1)长度不确定
l (2)经常访问
l (3)插入和删除不频繁
l (4)当数据量不大的时候基本都可以使用ArrayList
ArrayList<String>如何使用
练习
l 新建Book类,属性自拟。创建一个ArrayList,里面放3本书。遍历输出。
l 新建商品类,属性自拟。创建一个ArrayList,里面放3个商品,遍历输出。
1.7. LinkedList
AbstractSequentialList 实现了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)这些方法,ArrayList和LinkedList都继承了AbstractSequentialList。
ArrayList和LinkedList的区别
(1)ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
(2)插入删除元素LinkedLisst效率高,只需要改变指针地址,ArrayList效率低,要移动数据。
(3)随机访问元素LinkedLisst效率低,要从第一个开始查找,ArrayList效率高。
ArrayList和LinkedList增删改查比较
数据插入 :比如在i节点插入一个新数据
ArrayList:循环到i节点,插入一个新数据,然后把i节点后面的所有的数据的index加1 ->操作多
LinkedList:循环到i节点,把前一个节点的后续链接到新数据,然后把新数据链接到后一个数据就可以了 ->操作少
结论:平均效率LinkedList要好
数据删除 :比如删除i节点数据
ArrayList:循环到i节点,然后把i节点后面的所有的数据的index减1 ->操作多
LinkedList:循环到i节点,把前一个节点的后续链接到i节点的后一个数据就可以了 ->操作少
结论:平均效率LinkedList要好
数据查询 :比如查询i节点数据
ArrayList:循环到i节点->操作少
LinkedList:循环到i节点 ->操作少,但由于每个数据的地址不一样,查询比ArrayList慢
结论:平均效率 ArrayList要好
数据更新 :比如更新i节点数据
ArrayList:循环到i节点,把数据更新->操作少
LinkedList:循环到i节点,把前数据更新 ->操作少,但由于查询速度没有ArrayList好,所有效率没有ArrayList好
结论:平均效率ArrayList要好
这样我们就可以看到各有优点
LinkedList的使用:
(1)LinkedList中的大部分方法的使用和ArrayList一样
(2)LinkedList中部分特殊的方法
使用代码比较ArrayList和LinkedList的效率
练习: 使用LinkedList集合存储新闻标题(包含ID,名称,创建者),实现获取,添加,及删除头条和末条新闻标题信息,并遍历集合。
总结
如果查询操作较多ArrayList的效果更好。
如果删除,插入较多LinkedList的效果较好。
1.8. HashSet
什么是HashSet?
HashSet 是一个没有重复元素的集合。不保证元素的顺序,而且HashSet允许使用null 元素。
理解HashSet的不同。
练习:使用HashSet类常用方法存储并操作新闻标题信息,并遍历集合
1.9. 作业
l ArrayList必须精通
l 把用户管理系统、图书管理系统、商品管理系统的所有数组替换为ArrayList