集合
1. Collection
1.1 概述
通过继承体系发现,集合中两大分类,List和Set 并且 两个都继承了Collection
那也就意味着,Collection中的方法是List和Set都有的,
所以我们先讲Collection,看看它里面都有什么方法
Collection 集合 只能存储单个元素,并且只能保存引用数据类型,不能保存基本数据类型
因为 底层就是 Object[] 数组,既然是Object 所以 即可以说 只能保存Object单一元素,也可以说
可以保存任何元素,因为Object是祖类,所有类型都会发生向上转型(多态)
基本类型真的不能存吗? 真的,因为基本类型和Object没有关系,但是 可以把基本类型转换为对应的包装类类型,而 包装类 是Object的子类,这样就能间接存储基本类型了
常用方法 :
boolean add() : 添加元素
void clear() : 清空集合
boolean remove() 删除某个元素
boolean isEmpty() 判断集合中是否为空
boolean contains() : 是否包含某个元素
int size() 返回集合中 元素个数
java集合是使程序能够存储和操纵元素不固定的一组数据。 所有Java集合类都位于java.uti包中。
【问】:之前我们需要把多个元素放到一起的时候,使用的是数组。那么为何还要提供Java集合工具类呢?
我们通过对比数组和Java集合工具类来解释Java集合工具类的必要性。
注意:如果集合中存放基本类型,一定要将其 “装箱”成对应的”基本类型包装类”。
Collection接口是List接口和Set接口的父接口,它定义的方法可以用于操作List集合和Set集合。
Collection接口定义的方法
1.2 继承体系
由以上两图我们可以看出Java集合类有清晰的继承关系,有很多子接口和实现类。但是,并不是所有子接口或实现类都是最常用的。
下面我们列举出最常用的几个子接口和实现类:
Collection ——> List ——> ArrayList类
Collection ——> List ——> LinkedList类
Collection ——> Set ——> HashSet类
Collection ——> Set ——> SortedSet接口 ——> TreeSet类
Map ——> HashMap类
Map ——> SortedMap ——> TreeMap类
2. Iterator概述
Iterator是迭代器
迭代器是一种模式,它可以使序列类型的数据结构的遍历行为和被遍历的对象分离
也就是 我们无需关心该序列底层数据结构是什么样子的,只要拿到这个对象,使用迭代器就可以遍历这个对象的内部数据
创建迭代器对象
Iterator it = 集合对象.iterator();
调用集合对象自己的iterator方法就可以创建属于自己的迭代器
Iterator方法
1 boolean hasNext() : 判断光标下一位 是否还有元素,有就返回true,没有就返回false,
生成迭代器的时候,光标不是指向第一个元素的,而是在最顶端,没有指向任何元素
光标不会自动复位,使用完之后,必须重新生成
2 E next() : 把光标向下移动一位,并返回该位上的数据
3 remove() : 删除当前光标指向的元素
三个方法的使用顺序,就是 1,2,3
迭代器 一旦创建,如果集合中添加或者删除元素,那么迭代器必须重新重新生成,
否则调用next()方法会报错
但是 更改数据 不用重新生成
增强for循环,forEach 就是为了让用iterator循环访问的形式变简单,写起来方便,当然功能不太全,没有办法删除
所以需要有删除操作的话,还是要用原来的iterator形式
所以 forEach也是迭代器,使用forEach和使用iterator一样,不能添加或删除集合数据,但是更改可以
而 普通for和while这种遍历,都是和数据结构存储有关系的,比如数组 需要使用 arr[index]去访问,并且可以进行添加和删除操作
注意 使用迭代器进行遍历操作时 如果需要删除元素,只能使用 迭代器的remove方法,不能使用集合的remove方法
3 注意 : Contains和Iterator
- Collection接口的iterator()和toArray()方法都用于获得集合中的所有元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。
- Iterator接口隐藏底层集合中的数据结构,提供遍历各种类型集合的统一接口。
4注意 : Contains和remove
boolean contains(Object o)
判断集合中是否包含某个元素
boolean remove(Object o)
在集合中删除指定元素
两个方法,底层都会去调用equals方法进行比较
c.contains(“asd”) , 会用 asd 调用String的equals方法 挨个和集合中元素进行比较
判断谁,就用谁调用equals方法,和集合中元素进行比较
所以如果是存储的自定义类型(类对象),就需要根据需求覆写equals方法