集合概述:
1、集合、数组都是度多个数据进行存储的操作结构。
2、数组在存储多个数据特点
初始化完成,长度就确定了
数组定义好了,元素的类型就确定了。
数组储存数据有序、可重复。
3、数组的缺点
数组提供的方法有限,对于增、删、改操作不方便
数组和集合的区别:
- 长度区别
数组的长度固定;集合长度可变 - 内容不同
数组存储的是同一种类型的元素;集合可以存储不同类型的元素 - 元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用类型。
Collection
Collection与Collections有何区别?
- Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供最大化的统一操作方式
- Collections 是一个包装类。它包含各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
二、集合
|----Collection接口:单列集合,存一个一个对象的。
|-----List接口:存储有序、可重复数据。
|----ArrayList
|----LinkedList
|----Vector
|-----Set接口:存储无有序、不可重复数据。
|----HashSet
|----LinKedHashSet
|---TreeSet
|----Map接口:双列集合,用来存储key---value数据
常用方法:*.add(*)
添加元素*.addALL(*)
将另一个集合中的全部元素添加进当前集合中*.clear()
暴力清除集合中所有元素*.remove(*)
删除集合内某一个元素*.removeAll(*)
从一个集合内删除全部与另一个集合中相等的元素*.size()
返回值类型:int。返回集合中的元素个数*.contains(Object o)
返回值类型:boolean。判断集合是否包含某个元素(调用的是equals
方法)*.containsAll(*)
返回值类型:boolean。判断集合是否包含另一个集合中的所有元素(调用的是equals
方法)*.isEmpty(*)
返回值类型:boolean。判断集合是否为空,若为空则返回true*.retainAll(*)
:交集:获取当前集合和coll1集合的交集,并返回给当前集合*.hashCode()
:返回集合的哈希值
Arrays.asList(arrs)
;数组---->集合
String []arrs={"aa","bb","cc"};
Collection strings = Arrays.asList(arrs);
集合---->数组
Object[] objects = c1.toArray();
System.out.println(Arrays.toString(objects));
迭代器:
iterator() 迭代器。返回值类型:IteratorIterator (迭代器名) = (集合名).iterator();
Iterator迭代器接口
注意事项:
- Iterator对象称为迭代器(设计模式的一种),GOF给迭代器模式的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器模式,就是为容器而生
- Iterator 仅用于遍历集合,Iterator 本身并不提供承装对象的能力。
- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前
- 在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
注意!每一次迭代都需要创建一个新的迭代器,因为上一个用过的迭代器都已经指针下移,不能再使用
迭代器只能用变量接收,不能直接写在while循环里,不然会死循环,因为每次走到while循环的时候,都会新创建一个迭代器对象,所以会一直执行下去
错误如下:
while( 某一个集合.iterator.hasNext() ){ xxxxxx } 这种方式会在while的每一次循环中,都创建一个该集合的迭代器,永远指针指向第一位,不断循环
正确方式:
Iterator iterator=newList.interator
while( itertor.hasNext() ) { xxxx }
在循环内删除集合内元素不要直接调用集合的remove方法,要调用迭代器提供的
remove方法
若在循环体内调用了集合的remove方法会因为指针参数未更新而报error
迭代器的逆序遍历
iterator中没有逆序遍历的相关方法,因此要使用listiterator 中的hasPrevious()来进行逆序
ArrayList<Object> objects = new ArrayList<>();
ListIterator<Object> iterator01 = new ListIterator<>();
iterator01.hasPrevious();
方式一 iterator.next():获取值 不要使用,容易报错
Iterator iterator = c1.iterator();
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
System.out.println(iterator.next());
方式二:循环遍历,可以使用但不推荐
增强for循环
格式:for (Object o : list)
public void test1(){
String[] str = new String[5];
for (String myStr:str) {
myStr = "atguigu";
System.out.println(myStr); //输出六个atguigu
}
for (int i = 0; i <str.length ; i++) {
System.out.println(str[i]); //输出6个null
}
}
for (int i = 0; i <c1.size() ; i++) {
System.out.println(iterator.next());
}
方式三:推荐 (在循环遍历中添加.hashNext来判断下一个位置是否还有元素)
迭代器名.hasNext()
判断是否还有下一个元素
while (iterator.hasNext()){
//①指针下移 ②将下移以后集合位置上的元素返回
System.out.println(iterator.next());
}