在学习集合之前我们一直用数组来存放数据:
1.数组: 假设存放元素过多,需要频繁扩容,否则会数组越界
假设元素过少,会造成内存浪费。
而且存放数据类型单一。
从 java 1.2 开始引入集合
2.集合(容器):广泛用于存储,获取和处理一组紧密相关的数据。
Java类库中java.util包中包含若干用于实现集合(如链表、队列)的接口和类,并提供了有效地处理这些紧密相关数据的各种算法。
3.集合框架图如下:
① 单列集合: 根接口 Collection
② 双列集合(是按照一对存在映射关系的键值对 Map<key,value>进行存储):
根接口 Map
4.根接口Collection中的15种方法:
对比一下 +toArray()
+toArray(T[] a)
需要注意的是:
接口我们都不可以用new来创建实例对象,需要借助已知实现类
List<String> list=new ArrayList<>();
1>toArray();
此方法是将集合元素转换为数组,并将数组返回,对数组做任何的修改都不会对原集合造成影响。
返回的类型为Object类型:
输出结果:
2>toArray(T[] a);放置到指定数组a中
分为以下几种情况:
①传入数组大小刚好放置集合元素
(1)长度刚好且没有初始值
str1已经存储下来集合元素,并作为返回值传递给str2;
(2)长度刚好有初始值
String[] str1=new String[list.size()];
str1[0]="***"; //并不影响输出结果
String[] str2=list.toArray(str1);
②传入数组大小小于集合元素
list.add("123");
list.add("124");
list.add("125");
list.add("126");
list.add("126"); //从运行结果我们可以看出List里可以放置相同的元素
String[] str1=new String[list.size()-1]; //创建新数组的大小小于元素个数
String[] str2=list.toArray(str1); //有参的方法返回值也是一个相同类型的数组
for (Object o : str1) {
System.out.print(o+" ");
}
System.out.println();
for (Object o : str2) {
System.out.print(o+" ");
}
运行结果:
我们可以看出当数组过小时,str1放置不了所有元素,则重新 开辟空间将值返回给str2;
③传入数组大小大于集合元素
(1)原数组没有初始值
可以看出剩余的为null
(2)原数组有初始值
当初始值放置下标在集合元素数内时,不会影响输出结果
String[] str1=new String[list.size()+2];
str1[list.size()+1]="000";
String[] str2=list.toArray(str1);
输出结果:
由此可得:元素为从前往后依次存放,会进行数据覆盖。
5.迭代器 iterator()方法:
遍历输出数组元素的三种方式:
1–>for循环
2–>foreach循环
3–>迭代器
Iterator迭代器:在java.util包下,能够遍历各种集合类型,所有的Collection接口的子接口,子类都支持Iterator迭代器,可调用集合中的 iterator()方法来获得该集合的迭代器。
Iterator三种方法:
①hasNext() 判断集合中是否存在下一个元素,返回值为boolean值
②next () 返回集合中的下一个元素
③remove() 将集合中上一个由next()方法返回的元素删除
remove() 方法:运行结果中没有 “124”
而我们知道在List集合中也有一个remove() 方法:
运行结果:抛出异常java.util.ConcurrentModificationException------>此时引出了JAVA迭代器(快速失败)