一.集合
什么是集合,数组其实就是一个集合,集合实际上就是一个容器,可以用来容纳其他数据类型
1.数组的缺陷
1)长度开始时必须时固定的,而且一旦指定,不能更改
2)保存的必须是同一类型的元素
3)使用数组进行增加/删除元素比较麻烦
2.集合优点
1)可以动态保存任意多个对象,使用比较方便
2)提供了一系列比较方便的对象,如:add、remove、set、get、等
3)集合主要是两组(单列集合、双列集合)
4)Collection 接口有两个重要的子接口,List Set,他们的实现子类都是单列集合
5)Map 接口的实现子类都是双列集合,存放的时 K-V
**注意:**集合不能直接储存基本数据类型,另外集合也不能直接储存java对象,集合当中储存的都是java对象的内存地址(或者说集合储存的是引用)
3.集合的框架体系即结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XIkSLZX1-1655696165742)(Java.assets/image-20220226133502014.png)]
集合的继承结构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eQMIUv9W-1655696165743)(Java.assets/集合的继承结构图.png)]
4.Collection接口
1.Collection 接口的特点
1)Collection 接口实现了子类可以存放多个元素,每个元素可以是Object
2)有些Collection 的实现类,可以存放重复的元素,有些不可以
3)有些Collection 的实现类,有些是有序的(List),有些是无序的(Set)
4)Collection 接口没有直接的实现子类,是通过他的子接口Set、List 来实现的
2.Collection 接口的常用方法
方法 | 描述 |
---|---|
boolean add(Object o) | 用于向集合中添加一个元素如果集合不允许重复且已包含了指定元素,则返回false |
boolean addAll(Collection c) | 将集合c里所有元素添加到指定集合里。添加成功返回true |
void clear() | 清除集合中所有元素,将集合长度变为为0 |
boolean contains(Object o) | 判断集合中是否包含指定元素 |
boolean containsAll(Collection c) | 判断集合中是否包含集合c里所有的元素 |
boolean remove(Object o) | 删除集合中的指定元素o。当集合中包含了一个或多个元素o时,这些元素将被删除。删除成功,返回true |
int size() | 返回集合里元素的个数 |
boolean retainAll(Collection c) | 从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集)如果该操作改变了调用该方法的集合,则返回true |
boolean removeAll(Collection c) | 从集合中删除集合c里包含的所有元素如果删除了一个或一个以上的元素,则返回true |
boolean isEmpty() | 如果此集合中不包含任何元素,则返回true |
Object[] toArray() | 该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素 |
public static void main(String[] args) {
//Collection 的常用方法示例
List list=new ArrayList();
//1.add 添加单个元素
list.add("java");
list.add(10);
list.add(true);
System.out.println(list);
//2.remove 删除指定元素 检索下标
list.remove(1);
System.out.println(list);
//3.contains 查找元素是否存在
System.out.println(list.contains("java"));
//4.size 获取元素个数
System.out.println(list.size());
//5.isEmpty 判断是否为空
System.out.println(list.isEmpty());
//6.clear 清空
list.clear();
System.out.println(list.isEmpty());
//7.addAll 添加多个元素
ArrayList list2 = new ArrayList();
list2.add("刘备");
list2.add("张飞");
list.addAll(list2);
System.out.println(list);
//8.containsAll 查找多个元素是否都存在
System.out.println(list.containsAll(list2));
//9.removeAll 删除多个元素
list.add("关羽");
list.removeAll(list2);
System.out.println(list);
}
3.迭代器(Iterator)
1)Iterator 对象称为迭代器,主要用于遍历Collection 集合中的元素
2)所有实现了Collection 接口的集合类都有一个Iterator() 的方法 ,用以返回一个实现了Iterator接口的对象,即可以返回一个迭代器
3)Iterator 仅用于遍历集合,Iterator 并不会存放数据
4)Iterator的使用必依赖于Collection对象
5)使用Iterator迭代访问Collection集合时,可调用Iterator的remove()方法删除集合元素
6))Iterator 的常用方法
方法 | 描述 |
---|---|
boolean hasNext() | 是否存在下一个迭代元素,存在则返回true |
Object next() | 返回迭代的下一个元素 |
void remove() | 删除集合里上一次next()方法返回的元素 |
注意:使用Iterator对集合元素进行迭代时,是把集合元素的值传给迭代器,因此,删除迭代器中存储的值不会影响集合中保存的元素;集合结构只要发生改变,迭代器必须重新获取。当集合结构发生改变没有重新获取迭代器时调用next() 方法会出现异常。
4.增强for
可以代替迭代器,特点:增强for就是简化版的iterator ,本质一样。只能用于遍历集合或者数组,底层仍旧是迭代器,可以理解为简化版的迭代器。
语法:
for(Object object : col ){
System.out.println(object);
}
**注意:**与Iterator接口类似,foreach循环中迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量。因此,在foreach循环中修改迭代变量的值也没有任何实际意义
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Dog("小黑", 10));
list.add(new Dog("小黄", 100));
list.add(new Dog("小绿", 1000));
//增强for循环输出
for (Object o : list) {
System.out.println(o);
}
//迭代器输出
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object dog = iterator.next();
System.out.println(dog);
}
}
5.List接口
单项列表:
优点:随机增删元素效率较高(因为增删元素不涉及大量元素位移)
缺点:查询效率较低,每一次查找都需要从头结点开始往下遍历
1)List接口是Collection 接口的子接口
2)List 集合类中元素有序(即添加顺序和取出顺序一致)、且可重复
3)List 集合中每个元素都有其对应的顺序索引,即支持索引,索引从0开始
4)List 容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素
5)JDK API 中List 接口的常用实现类:ArrayList、LinkedList、Vector
6)List接口的常用方法
方法 | 描述 |
---|---|
void add(int index,Object element) | 将元素(element)插入到List的指定位置(index)处 |
boolean addAll(int index,Collection c) | 将集合c所包含的所有元素都插入List集合指定位置(index)处 |
Object get(int index) | 返回集合index索引处的元素 |
int indexOf(Object o) | 返回对象o在List集合中第一次出现的位置索引 |
int lastIndexOf(Object o) | 返回对象o在List集合中最后一次出现的位置索引 |
Object remove(int index) | 从集合中删除指定位置的元素 |
boolean remove(Object o) | 从集合中删除指定对象 |
Object set(int index,Object element) | 将index索引处的元素替换成element对象,返回新元素 |
List subList(int fromIndex,int toIndex) | 返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合 |
public static void main(String[] args) {
//List类常用方法
List list = new ArrayList();
list.add("tom");
list.add("张飞");
list.add("关羽");
//在索引为1的位置插入数据
list.add(1, "刘备");
System.out.println(list);
List list2 = new ArrayList();
list2.add("jake");
list2.add("tom");
//将集合2 的所有的元素加入到list中
list.addAll(list2);
System.out.println(list);
//返回该数句在集合中第一次出现的位置
System.out.println(list.indexOf("tom"));
//返回该数句在集合中最后一次出现的位置
System.out.println(list.lastIndexOf("tom"));
//移除指定元素,并返回该元素
list.remove(0);
System.out.println(list);
//指定下标替换为指定元素
list.set(0, "林黛玉");
System.out.println(list);
//返回一个指定区域位置的子集合
List returnlist = list.subList (0,2);
System.out.println(returnlist);
}
7)集合遍历的三种方式
public static void main(String[] args) {
List list = new ArrayList();
list.add("tom1");
list.add("tom2");
list.add("tom3");
list.add("tom4");
//迭代器遍历集合
System.out.println("=====迭代器");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
System.out.println(next);
}
//增强for遍历集合
System.out.println("======增强for");
for (Object o : list) {
System.out.println(o);
}
//普通for 遍历集合
System.out.println("======普通for");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
示例代码
//集合按价格排序
public static void main(String[] args) {
List list = new ArrayList();
list.add(new Books("三国", "罗贯中", 10.1));
list.add(new Books("小李飞刀", "古龙", 5.1));
list.add(new Books("红楼梦", "曹雪芹", 34.6)