目录
一.集合概述:
二.collection常见方法
三.迭代器
四. 增强for循环
1.1 集合简介:
- 集合是Java提供的一种容器,能够存储多个数据。
- Java 所有的集合类都位于 java.util 包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类,还有一些实现算法
1.2 集合和数组的区别:
- 长度:集合的长度是可以变化的,数组长度是固定的
- 存储数据:集合存储的全部是引用数据类型,数组既可以存储引用数据类型,也可以存储基本数据类型。数组只可以存储一种数据类型
注意:集合也可以存储基本数据类型,只要存储对应的包装类就可以了。如int-->integer
list.add(20); //相当于自动装箱,Integer i=20;
1.3 集合常用类的继承集合体系:
Java集合分为collction和Map两个根接口,这两个接口包含子接口(接口与接口之间可以继承)以及实现子类。
具体如下图:
黄色是接口,蓝色是实现类;
- Iterator接口是输出接口,用于遍历输出collection集合中的元素(迭代输出),literator对象就是迭代器, 当实现类是实现collection时,同时也要实现lierator。
- collection有三个子接口,分别是java.util.List和java.utli.Set以及Java.util.queue。List存储不重复,有序的元素,set存储重复的元素,而Queue 是 Java 提供的队列实现
List
接口的主要实现类有java.util.ArrayList
和java.util.LinkedList
,Set
接口的主要实现类有java.util.HashSet
和java.util.LinkedHashSet
。注意:接口只是提供一个规范,告诉我们必须要干什么。我们要对集合中的元素操作时,需要通过实现子类,实例化对象,调用方法,实现操作。
把集合分为接口,实现子类,算法这样更明显体现他的继承体系
如下图:
Collection是所有单列集合的父接口,对于他的子接口以及实现子类,collction的方法也是通用的。
2.1 collection常见方法以及作用:
1.void clear() 清空所有集合元素
2.boolean contains(Object o) 判断指定集合是否包含对象o
3.boolean contains(Object 0) 判断当前集合中是否包含给定的对象。
4.boolean isEmpty() 判断指定集合的元素size是否为0
5.boolean remove(Object o) 删除集合中的元素对象o,若集合有多个o元素,则只会删除第一个元素
7.int size() 集合的元素个数
8.T[] toArray(T[] a) 将集合转换为T类型的数组9.boolean add(E e) 向集合添加元素e,若指定集合元素改变了则返回true
10 .
Object[] toArray()
: 把集合中的元素,存储到数组中.
代码演示:
public class Oopjihe {
public static void main(String[] args) {
//创建一个集合对象
ArrayList list = new ArrayList();
//判断集合长度
int startsize=list.size();
list.add("hello");
list.add("add");
list.add("20");
list.add(20);
//相当于自动装箱,
Integer i=20;
//判断长度
int endsize=list.size();
//移除某个元素
list.remove("hello");
//判断是否有这个元素
boolean b1=list.contains("hello");
System.out.println(b1);//flase
//判断集合是否为空
boolean b2=list.isEmpty();
System.out.println(b2);//flase
//清除所有元素
list.clear();
boolean b3=list.isEmpty();
System.out.println(b3);//true
2.2 方法拓展:
get(int index) ;
作用: 拿到集合中的对应下标的元素。
TocharAraary()或者TostringArrary():
作用:把集合中的元素转为char数组或者string数组
案例分析:
定义一个String类型的List集合,统计该集合中每个字符 (注意,不是字符串)出现的次数。 例如:集合中有”abc”、”bcd”两个元素, 程序最终输出结果为:“a = 1,b = 2,c = 2,d = 1”
import java.util.ArrayList;
public class Excel3 {
public static void main(String[] args) {
ArrayList strings = new ArrayList<>();
strings.add("adc");
strings.add("bcc");
int count[]=new int[3];//计数器
//把集合中的元素转为char数组
for(int i=0;i
3.1 迭代器简介:
- 迭代是Collection集合元素遍历的一种方式。在取元素之前先判断集合中是否有元素,如果有,就把这个元素取出来。继续判断,如果有继续获取元素,直到集合中所有元素全部取出。这种取出方式专业术语称为迭代。
- 迭代器其实就是一个实现类的实例化对象,在
ArrayList
集合的Iterator
方法中,是通过返回Itr
对象来获得迭代器的。Itr
是ArrayList
的一个内部类,它实现了Iterator
接口- 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口
java.util.Iterator
,iterator称之为迭代器
3.2迭代器的使用 :
第一步:获取迭代器
Iterator iterator1= 集合.iterator();
第二步:使用迭代器的三个方法,对元素进行操作。
迭代器中三个方法:
boolean hasNext(): 判断是否有下一个元素
E next(): 返回下一个元素
void remove(): 删除下一个元素
使用实例:
//定义一个迭代器。输出集合中的元素
Iterator iterator = arrayList.iterator();//获取迭代器
while (iterator.hasNext()){//判断下一个是否有元素
Object s=iterator.next();//下一个元素
System.out.println(s);
}
注意点:
在进行集合元素获取时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会抛出java.util.NoSuchElementException没有集合元素异常。
在进行集合元素获取时,如果添加或移除集合中的元素 , 将无法继续迭代 , 将会抛出ConcurrentModificationException并发修改异常.
如果一定要删除某个元素,使用迭代器自己的remove方法。
Iterator iterator =list.iterator();
while(iterator.hasNext()){
System.out.println("长度为"+list.size());
// list.add("集合2");//在集合移除或者添加过程中,迭代获取元素会报错。
// list.remove("20");
String name=iterator.next().toString();
if("20".equals(name)){
iterator.remove();
}else{
System.out.println(name);
}
3.3. 迭代器实现原理:
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,
在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,调用next方法之前,会调用hasnext()方法判断下一个元素,如果为ture则调用next方法。
当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法之前,会再次调用hasnext()方法判断下一个元素,如果为ture则调用next方法。迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
for(变量类型 变量 :数组/集合){
处理遍历的数据,数据就保存在这个变量上面
}
注意点:因为foreach底层采用了迭代器,因此遍历集合时不要对集合元素进行增删操作。
案例
已知数组存放一批QQ号码,QQ号码最长为11位,最短为5位 String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"}。 将该数组里面的所有qq号都存放在LinkedList中,将list中重复元素删除,将list中所有元素分别用迭代器和增强for循环打印出来
import java.util.ArrayList;
import java.util.Iterator;
public class Excel2 {
public static void main(String[] args) {
String[] strs = {"12345","67891","12347809933","98765432102","67891","12347809933"};
//定义一个集合
ArrayList arrayList = new ArrayList();
//将数组中的元素放到集合中
for(int i=0;i