java day025 集合【容器】
1.为什么需要集合
目前来说,我们对于多个数据处理方式只能依靠数组进行,但是数组存在诸多问题。
-
复用度差
数组对于多个数据的操作只支持一个数据类型,一旦需要操作其他的数据类型则需要从新创建数组。
-
空间固定
数组的空间一旦在创建过程中确定,空间无法修改。如果想扩容或者缩小,必须创建一个新的数组
-
方法很少
数组的方法都是自己编写实现,体验太差。。Java中对于数组操作的方法太少。
而集合可以解决以上所有的问题:
- 集合采用泛型的模式,用户可以指定任意类型进行存储操作
- 空间可以在合理范围以内自行扩展,不需要考虑容量问题
- 方法很多
2.集合的架构
interface Collection Java中所有集合的总接口
----| interface List List接口,数据存储可重复,有序
--------| class ArrayList
重点 可变长数组
--------| class LinkedList
重点 双向链表模式
--------| class Vector
线程安全的可变长数组
----| interface Set Set接口,数据存储不可以重复,无序
--------| HashSet
底层存储数据的结构是一个哈希表,存储效率,查询效率极高!
--------| TreeSet
底层存储数据的结构是一个平衡二叉树,要求数据必须有比较方式
3.Collection接口下常用的方法
增:
boolean add(E e)
添加当前集合约束的指定数据类型的数据
boolean addAll(Collection<? extends E> c);
添加另一集合到当前集合,要求添加集合中的元素必须是当前元素的本身或者子类对象
删:
boolean remove(Object o);
删除集合中的指定元素,成功返回true,没有找到返回false。若有多个元素,删除第一个。
boolean removeAll(Collection c);
删除当前集合与指定集合的交集
boolean retainAll(Collection c):
保留当前集合与指定集合的交集
void clear();
清空整个集合
查:
int size();
有效元素个数
boolean isEmpty();
判断当前集合是否为空
boolean contains(Object o);
判断指定元素是否存在
boolean containsAll(Collection<?> c);
判断传入的集合是否为当前集合的子集
Object[] toArray();
返回集合中所有元素所组成的Object类型数组
案例代码:
package com.qfedu.study.collection;
import java.util.ArrayList;
import java.util.Collection;
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}
public class TestCollection {
public static void main(String[] args) {
Collection<String> c1 = new ArrayList<String>();
Collection<String> c2 = new ArrayList<String>();
c1.add("哈哈");
c1.add("嘿嘿");
c1.add("嘻嘻");
c1.add("嗯嗯");
c2.add(" ");
System.out.println(c1);
System.out.println("c1有效元素个数:" + c1.size());
c1.remove("哈哈");
c1.addAll(c2);
System.out.println(c1);
Object[] obj = c1.toArray();
System.out.println(obj);
Collection<Animal> a1 = new ArrayList<Animal>();
Collection<Dog> a2 = new ArrayList<Dog>();
Collection<Cat> a3 = new ArrayList<Cat>();
a1.addAll(a2);
a1.addAll(a3);
a1.add(new Dog());
a1.add(new Cat());
}
}
/*
输出结果:
[哈哈, 嘿嘿, 嘻嘻, 嗯嗯]
c1有效元素个数:4
[嘿嘿, 嘻嘻, 嗯嗯, ]
[Ljava.lang.Object;@15db9742
*/
4.迭代器Iterator
迭代器方法:
获取迭代器
Iterator iterator();
迭代器使用到的方法:
boolean hasNext();
判断当前集合是否可以继续得到元素,继续遍历
E next();
1. 获取迭代器当前指向的元素
2. 将迭代器指向下一个元素
void remove();
删除通过next方法获取的元素
注意:
- remove方法只能删除通过next方法获取到的元素
- remove方法只能在next方法之后执行
- 没有next方法不能使用remove方法
- 不建议使用remove方法
案例代码
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class TestIterator {
public static void main(String[] args) {
Collection<String> c1 = new ArrayList<String>();
c1.add("哈哈");
c1.add("嘿嘿");
c1.add("嘻嘻");
c1.add("嗯嗯");
Iterator<String> it = c1.iterator();
System.out.println(c1);
System.out.println("迭代器hasNext()演示:" + it.hasNext());
System.out.println("迭代器next()演示:" + it.next());
System.out.println("迭代器remove()演示:");
it.remove();
System.out.println(c1);
while (it.hasNext()) {
String string = (String) it.next();
System.out.println(string);
}
}
}
/*
输出结果:
[哈哈, 嘿嘿, 嘻嘻, 嗯嗯]
迭代器hasNext()演示:true
迭代器next()演示:哈哈
迭代器remove()演示:
[嘿嘿, 嘻嘻, 嗯嗯]
嘿嘿
嘻嘻
嗯嗯
*/
注意:
对于集合和迭代器而言,集合在内存中的空间是共享资源!
迭代器对于集合是有规划的,集合的每次改变,迭代器也必须改变否则会报错!