JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
Java学习日志(三)
今天学习了Colletion接口(集合),迭代器,增强for循环
Collection接口(集合)
java.util包中
集合与数组的区别
数组:
- 长度固定 new int[3]{1,2,3,4}
- 可以存储基本类型数据,int[] double[]
- 可以存储引用类型的数据, Person[]
集合:
- 长度可以变化 add()长度+1 remove()长度-1
- 只能存储引用类型的数据 ArrayList ArrayList
继承与实现关系
Collection常用方法
public boolean add(E e)
: 把给定的对象添加到当前集合中 。public void clear()
:清空集合中所有的元素。public boolean remove(E e)
: 把给定的对象在当前集合中删除。public boolean contains(Object obj)
: 判断当前集合中是否包含给定的对象。public boolean isEmpty()
: 判断当前集合是否为空。public int size()
: 返回集合中元素的个数。public Object[] toArray()
: 把集合中的元素,存储到数组中
import java.util.ArrayList;
import java.util.Collection;
public class Demo01 {
public static void main(String[] args) {
//多态
Collection<String> coll = new ArrayList<>();
coll.add("张三");
coll.add("李四");
coll.add("aaa");
coll.add("张三");
coll.add("ccc");
//集合重写了toString方法
System.out.println(coll);
/*
* public boolean remove(E e) : 把给定的对象在当前集合中删除。
* 如果集合中有对应的元素,移除元素,返回true
* 没有的话,不会对集合产生影响,返回false
* 如果有多个元素,只移除第一个
* */
boolean b1 = coll.remove("张三");
System.out.println(b1);
boolean b2 = coll.remove("张aaa");
System.out.println(b2);
System.out.println(coll);
/*
* public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
* 包含返回true
* 不包含返回false
* */
boolean b3 = coll.contains("aaa");
System.out.println(b3);
boolean b4 = coll.contains("aaaa");
System.out.println(b4);
/*
* public int size() : 返回集合中元素的个数。
* */
System.out.println(coll.size());//4
/*
* public Object[] toArray() : 把集合中的元素,存储到数组中
* */
Object[] arr = coll.toArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
/*
* public boolean isEmpty() : 判断当前集合是否为空。
* 集合为空,返回true
* 集合不为空,返回false
* */
System.out.println(coll.isEmpty());//false
/*
* public void clear() :清空集合中所有的元素。
* 集合还存在,元素被清空
* */
coll.clear();
System.out.println(coll);//[]
System.out.println(coll.isEmpty());//true
}
}
Iterator接口(迭代器)
java.util.Iterator
迭代器
由来:
- 集合有很多种,每种集合存储数据的原理不同,取出元素的方式也不同,
所以我们可以使用迭代器,来取出元素,是一种通用的取出集合中元素的方式.
原理::
- 即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个 元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代
迭代器的使用:
- 在Collection集合中有一个方法 iterator(),返回了Iterator接口的实现类对象Iterator iterator() 返回此集合中元素的迭代器。
了解:迭代器的实现类是每个集合的内部类
hasNext()与next()
成员方法:
boolean hasNext()
如果迭代具有更多元素,则返回 true 。E next()
返回迭代中的下一个元素。
使用步骤
迭代器的使用步骤:
- 创建集合对象,在集合中添加元素
- 使用集合的方法iterator获取迭代器的对象
- 使用迭代器Iterator中的方法hasNext和next依次取出集合中的元素
注意:若集合中已经没有元素,继续迭代,会报NoSuchElementException
异常
public class Demo02Interator {
public static void main(String[] args) {
// 1.创建集合对象,在集合中添加元素
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
coll.add("eee");
/*
* 2.使用集合的方法iterator获取迭代器的对象
* 迭代器的泛型跟着集合走
* */
Iterator<String> it = coll.iterator();
// 3.使用迭代器Iterator中的方法hasNext和next依次取出集合中的元素
/*boolean b = it.hasNext();
System.out.println(b);//true
String s = it.next();
System.out.println(s); //aaa
b = it.hasNext();
System.out.println(b);//true
s = it.next();
System.out.println(s);//bbb
b = it.hasNext();
System.out.println(b);//true
s = it.next();
System.out.println(s);//ccc
b = it.hasNext();
System.out.println(b);//true
s = it.next();
System.out.println(s);//ddd
b = it.hasNext();
System.out.println(b);//false
s = it.next();
System.out.println(s);//eee
b = it.hasNext();
System.out.println(b);//没有元素,再取出NoSuchElementException
s = it.next();
System.out.println(s);*/
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
并发修改异常
ConcurrentModificationException
产生的原因:在使用迭代器遍历集合的过程中,对集合的长度进行了修改(增加或删除元素)
并发:遍历和修改同时进行
解决方法:
- 不对集合进行修改
- 想要修改,可以使用Iterator接口的子接口ListIterator
public interface ListIterator<E> extends Iterator<E>{
//里面定义了往集合中添加元素和删除元素的方法
void add(E e){} //将指定的元素插入列表(可选操作)。
void remove(){} //从列表中删除 next()或 previous() (可选操作)返回的最后一个元素。
}
注意:ListIterator接口只能遍历list接口下边的集合
public class Demo03 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
// 获取迭代器对象
Iterator<String> it = list.iterator();
// 取出元素
while(it.hasNext()){
String s = it.next();
System.out.println(s);
/*
* 增加一个判断,如果存在aaa,就增加hhh
*
* */
/*if(s.equals("aaa")){
list.add("hhh"); //ConcurrentModificationException
}*/
// list.remove(s); //ConcurrentModificationException
}
System.out.println("---------------------");
// 使用ListIterator方法获取迭代器对象
ListIterator<String> lit = list.listIterator();
while(lit.hasNext()){
String s = lit.next();
System.out.println(s);
if(s.equals("aaa")){
lit.add("hhh");//使用迭代器增加元素的方法
}
}
System.out.println(list);
}
}
增强for循环
JDK1.5之后出现的新特性,底层就是一个迭代器,使用for循环的格式简化了迭代器的代码
作用:只要遍历都用增强for!!!
- 可以遍历数组
- 可以遍历集合
格式:
for(集合/数组中的元素数据类型 变量名:集合名/数组名){
sout(变量名);
}
使用增强for遍历数组
private static void show01() {
int[] arr = {1, 2, 3};
for (int a : arr) {
System.out.println(a);
}
}
增强for循环遍历的同时,可以使用元素特有的方法
/*
* 增强for循环遍历的同时,可以使用元素特有的方法
* */
private static void show03() {
String[] arr = {"111", "222", "333"};
for (String s : arr) {
System.out.println(s.length());
}
}
增强for遍历集合
private static void show04() {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(null);//用int可能会报空指针异常
list.add(3);
list.add(4);
// for (int i : list) {//自动拆箱,用int可能会报空指针异常
// System.out.println(i);
// }
for (Integer in : list) {
System.out.println(in);
}
}
增强for和普通for的区别
普通for:在遍历的过程中可以对数组或集合中的元素进行修改(索引修改)
增强for:没有索引,不能修改数组或集合中的元素
原理:
private static void show02() {
int[] arr1 = {1, 2, 3};
//普通for
for (int i = 0; i < arr1.length; i++) {
//把数组中的元素扩大二倍
arr1[i] *= 2;//扩大的是数组的值
System.out.println(arr1[i]);
}
//修改了
System.out.println("arr1[0]" + arr1[0]);
System.out.println("-------------------");
int[] arr2 = {1, 2, 3};
//增强for ---->arr2.for 快捷键
for (int i : arr2) {
//把数组中的元素扩大二倍
i *= 2;//扩大的是i的值,原数组没变
System.out.println(i);
}
//没有被修改!!!!!!!!!!!!!!!!!
System.out.println("arr2[0]" + arr2[0]);
}