集合(一)
为了解决数组的定长问题, JDK在1.2版本开发了集合框架,
集合和数组的相同点和不同点
集合是容器,存储数据的,集合的长度是可变的,集合容器只存储引用数据类型
数组是容器,存储数据的,数组的长度是固定的,数组存储基本类型和引用类型
数据多了存数组, 对象多了存集合
集合框架学习要素 :
1.向集合容器中存储元素
2.取出集合容器中的元素
3.每种集合容器的自身特性
Collection集合接口
Collection 层次结构中的根接口,所有的子接口和实现类都会具有他的功能
Collection接口的方法 :
添加:add (存储元素)
移除:boolean remove(元素) 移除集合中指定的元素
removeAll(Collection c) ) 移除两个集合中相同元素
包含:boolean contains(元素) 判断元素是否包含在集合中
集合长度:集合.size()方法 :
数组.length 属性 , 字符串.length() 方法,
清空:void clear() 只清空元素, 集合容器本身依然可以使用
判断:boolean isEmpty() 判断集合中是否有元素,无元素true
转换为数组:Object[] toArray() 集合中的元素转成数组*
取交集:retainAll(Collection c) 两个集合取交集
Collections工具类
java.util.Collections 集合操作的工具类,提供方法来操作集合,方法全部是静态方法,不能实例化
方法 :
static void shuffle(List list) 集合元素随机排列
static void sort(List list) 集合中元素的自然顺序排序
static void sort(List list,Comparator c) 按照比较器的顺序进行排序
static 传递什么返回什么 synchronized开头(传递集合) 线程不安全集合,变成安全的集合
Comparator 是比较器接口, 需要自定义实现类,然后重写方法
集合遍历的两个方法
1.迭代器 Iterator:迭代器是所有的Collection集合的通用遍历方式.
获取迭代器接口Iterator的实现类对象 : Iterator<String> it = coll.iterator();
遍历: while ( it.hasNext() ) { String str = it.next();}
每个集合容器的内部特性不一样,迭代器是如何做到通用遍历?
迭代器接口全是内部类!迭代器接口实现类,都是集合的内部类实现, 可以完成遍历的通用性
2.增强for循环
for(数据类型 变量名 : 集合或者数组) { 方法体 }
弊端 : 无索引,不能修改容器中的元素内容
正式讲解各个集合子类之前讲一下常见的数据存储结构:
栈结构 :
内存 : 进口和出口是同一个.
元素进入到内存后,必须到达内存的底部.
数据先进后出
队列结构 :
内存 : 既有入口,也有出口
过安检, 在你前面的人,先过去
数据先进去的先出来, 先进先出
数组
数组也一种最基本的,使用频率最高的数据结构.
数组的地址是连续的
弊端 : 定长. 需要添加或者是删除元素,只能利用数组的复制方式来实现
数组在堆内存存储, 堆内存中数组的复制,非常消耗内存资源
数组特点 : 内存地址是连续, 数组的查询速度快,索引
数组的增和删的速度慢
链表
链表的数据存储结构 : 元素和元素之间保存地址的方式存储
链表 : 采用一个元素,记录下一个元素的内存地址方式, 单向链表
链表 : 元素记录下一个元素的内存地址,同时也记录前一个内存地址, 双向
链表特点 : 内存地址不是连续, 找元素,一个一个去找, 查询速度慢
增删速度快
List接口
特点就不用多说了吧,三个
方法很多继承自collection接口,在操作集合时可以根据index值操作
他也有子类,ArrayList和LinketList接口
ArrayList
底层是数组型结构实现,数组可复制,于是有点"可变"数组那个味了,线性不安全,有索引查询速度快,但因为复制数组增删速度就慢了
LinketList是双链表结构型
由链表结构特点可知,元素与元素之间储存地址,内存不是连续的,查询慢,修改快
具有特有方法:(不用索引可以直接操作)
addfirst(元素).addlast(元素).增添
getfirst().getlast():取出值
removefirst()removelast():移除元素
push(元素)压栈
元素 pop()弹栈
网友评论