import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* 集合框架:Iterator
*Iterator(迭代器)用于遍历集合元素,获取迭代器可以使用Collection定义的方法:-Iterator iterator()
*迭代器Iterator是一个接口,集合在重写Collection的iterator()方法时利用内部类提供了迭代器的实现
*Iterator提供了统一的遍历集合元素的方式,其提供了用于遍历集合的方法(一般结合while()使用):
*boolean hasNext():判断集合是否还有元素可以遍历
*E next():返回迭代的下一个元素
*Object next():返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
* void remove():删除迭代器刚越过的元素
*
* Iterator有一个很大的优点,就是我们不必知道集合的内部结果,集合的内部结构、状态由Iterator来维持,
* 通过统一的方法hasNext()、next()来判断、获取下一个元素,
*/
public class IteratorDemo {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add("大哥");
c.add("二哥");
c.add("三哥");
Iterator ite=c.iterator();
while(ite.hasNext()) {
Object obj=ite.next();
System.out.println(obj);
}
System.out.println(c);
/**
* remove方法
* 在使用迭代器遍历集合时,不能通过集合的remove方法删除集合元素,否则会抛出并发更改异常
* 我们可以通过迭代器自身提供的remove()方法来删除通过next()迭代出的元素
* 迭代器的删除方法是在原集合中删除元素
* 这里需要注意:在调用remove方法前必须通过迭代器的next()方法迭代过元素
* 那么删除的就是这个元素。并且不能再次调用remove方法,除非再次调用next()后方可再次调用
*/
Iterator ite2=c.iterator();//必须写
while(ite2.hasNext()) {
Object obj=ite2.next();
if("三哥".equals(obj)) {
ite2.remove();
}
System.out.println(obj);
}
System.out.println(c);
/**
* 增强型for循环
* 只作用于遍历集合或数组
* 语法:
* for(元素类型 e:集合或数组) {
* 循环体
* }
* 新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式,所以新循环本质是迭代器
*
*/
for(Object obj:c) {
System.out.println(obj);
}
/**
* 泛型
* 泛型本质是参数化类型
* <String>泛型<约束类型>
* <String>约束了c1集合中只能存储String类型的数据,否则编译出错
*/
Collection<String> c1=new ArrayList<String>();
c1.add("a");
// c1.add(5);//编译错误
/**
* List接口是Collection的子接口,用于定义线性表数据结构。
* 可以将List理解为存放对象的数组,只不过其元素个数可以动态的增加或减少
* List是有序可重复的
*
* List接口的两个常见实现类为ArrayList和LinkedList,分别用动态数组和链表的方式实现了List接口
*
* 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,
* 只是在性能上有一定的差别,ArrayList更适合于随机访问
* 而LinkedList更适合于插入和删除。
*
* E get(int index)获取集合中指定下标对应的元素,下标从0开始
* E set(int index,E elment)将给定的元素存入给定位置,并将原位置的元素返回
*/
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("a");
String str=list.get(0);
String str1=list.set(1, "PP");
System.out.println(str+"------"+str1);
System.out.println(list);
/**
* 遍历:尽量使用Iterator\foreach
* ArrayList也可以利用get方法遍历
*/
for(int i=0;i<list.size();i++) {
String val=list.get(i);
System.out.println(val);
}
/**
* void add(int index,E element):将给定的元素插入到指定位置,原位置及后续元素顺序向后移动
* E remove(int index):删除给定位置上的元素,将元素返回
*/
list.add(0, "K");//插入
System.out.println(list);
System.out.println(list.remove(0));//删除
/**
* List的subList方法用于获取子List
* subList获取的List与原List占有相同的存储空间,对子List的操作会影响原List
* List<E> subList(int fromIndex,int toIndex)
* fromIndex和toIndex是截取子List的首尾下标(前包括,后不包括)
*/
List<Integer> list1=new ArrayList<Integer>();
for(int i=0;i<10;i++) {
list1.add(i);
}
System.out.println(list1);
List<Integer> subList=list1.subList(0, 4);//获取子列表
System.out.println(subList);
subList.remove(0);//子List和原List占有相同空间
System.out.println(subList);
System.out.println(list1);
/**
* List转换为数组
* List的toArray方法用于将集合转换为数组,但实际上该方法是在Collection中定义的,所以所有的集合都具备这个功能
* 其有两个方法:
* Object[] toArray()
* <T>T[] toArray(T[] a):比较常用的,传入一个指定类型的数组,该数组的元素类型应与集合的元素类型一致。返回值则是转换后的数组,该数组会保存集合中所有的元素
*
*/
Collection<String> list2=new ArrayList<String>();
list2.add("kk");
list2.add("gg");
list2.add("jj");
list2.add("jj");
list2.add("yy");
String[] str2=new String[7];
//将数组str2的每个元素填充(fill)为A
Arrays.fill(str2,"A");
//toString将数组中全部元素连接为字符串
System.out.println(Arrays.toString(str2));//[A, A, A, A, A, A, A]
//调用toArray复制集合到数组,如果str2的长度等于或小于原集合元素数量,则返回新数组的引用
String[] out=list2.toArray(str2);
System.out.println(Arrays.toString(out));//[kk, gg, jj, jj, yy, null, A]
/**
* Arrays类中提供了一个静态方法asList,使用该方法我们可以将一个数组转换为对应的List集合
*
*/
String[] arr={"tom","row","apple"};
List<String> list3=Arrays.asList(arr);
System.out.println(list3);
arr[0]="haohao";//修改数组内容,影响List
System.out.println(list3);
list3.set(0, "sanxing");//修改List,影响数组
System.out.println(Arrays.toString(arr));
// list3.add(0, "haha");//集合长度不能修改
}
}