day07-集合【迭代器、增强for、泛型】

来源:互联网 发布:php 抓取url内容 编辑:程序博客网 时间:2024/06/03 23:03

1.数组与集合的区别

1.数组的长度是固定的,集合的长度是可变的。

2.数组中可以存储任何类型的元素(基本类型和引用类型),而集合中只能存储引用类型的元素;

应用场景:
1.在知道存储的元素的个数的情况下,可以使用数组;

2.否则,就使用集合。ArrayList<Integer> list=new ArrayList<Integer>();list.add(1);

2.集合

在Java中提供了很多个集合,因为用户要求存储数据的方式的不同,就需要使用不同的集合来存储数据。

3.Collertion接口

方法:

1.boolean add(E e):向集合中添加一个元素,添加成功就返回true,否则返回false;2.boolean addAll(Collection<? extends E> c): 把集合C中的所有元素都添加到当前集合中;3.void clear():清空集合中的元素,集合中就没有元素了,但是几个对象还是存在;4.boolean contains(Object o):判断数据o在集合中是否存在,如果存在返回true,否则返回false;5.boolean isEmpty():判断集合是否为空,如果为空就返回true,否则就返回false;6.boolean remove(Object o):从集合中移除数据o,如果移除成功,就返回true,否则返回false;7.int size():得到集合的大小,就是集合中元素的个数,也叫集合的长度;8.Object[] toArray():把集合中的元素都放到一个数组中,并返回这个数组;

4.迭代器 Iterator

JDK给所有的集合提供了一种统一的遍历元素的方式,这个方式迭代的方式。

使用步骤:

1.通过几个对象得到 迭代器对象(就相当于八级和中的元素都拷贝到迭代器对象中了);2.循环遍历迭代器中的每个元素;    1.先判断下个位置是否有元素;    2.如果有,就得到下一个位置的元素;public static void main(String[] args){    Collection<String> c=new ArrayList<String>();    c.add("冬冬");    c.add(“冰冰”);//使用步骤:// 1.通过集合对象得到 迭代器对象;Iterator<String> it=c.iterator();// 2.循环遍历 迭代器中的每个元素;// 1.循环判断下一个位置是否有元素;while(it.hasNext()){        //如果有,就得到下一个位置的元素。        String name=it.next();        System.out.println(name);    }}

5.并发修改的异常

java.util.ConcurrentModificationException:并发修改的异常

原因:

当通过集合对象得到迭代器时,长度是集合原来的长度,迭代器按照原来的长度开始遍历元素,但是当使用迭代器遍历元素时,又向集合中改变原长度,迭代器就不知道怎么遍历剩下的元素了,所以在用迭代器时不能改变集合长度;

解决方法:

1.当使用迭代器遍历元素时,如果想改变集合的长度,使用迭代器去改变;2.当使用集合遍历元素,如果想改变集合的长度,使用集合对象去改变;遍历ArrayList时,使用for循环遍历;示例代码:  /*    * 1.当使用迭代器遍历元素时,如果想改变集合的长度,使用迭代器去改变;     */    private static void method02() {        ArrayList<String> c = new ArrayList<String>();            c.add("冬冬");            c.add("冰冰");            c.add("圆圆");            c.add("娇妹");    // 使用步骤:    // 1.通过集合对象得到 迭代器对象(就相当于把集合中的元素都拷贝到迭代器对象中了);    ListIterator<String> it = c.listIterator();    // 2.循环遍历 迭代器中的每个元素:    // 1.循环判断下一个位置是否有元素;        int i = 0;        while (it.hasNext()) {            i++;    // 在使用迭代器遍历元素时,向集合对象中添加元素(修改集合的长度)    if (i == 2) {        // c.add("冠希哥");        it.add("冠希哥");    }    // 2.如果有,就得到下一个位置的元素.    String name = it.next();        System.out.println(name);            }        System.out.println(c);        }    /*     * 2.当使用集合遍历元素,如果想改变集合的长度,使用集合对象去改变;     */    private static void method03() {        ArrayList<String> c = new ArrayList<String>();            c.add("冬冬");            c.add("冰冰");            c.add("圆圆");            c.add("娇妹");    for (int i = 0; i < c.size(); i++) {            if (i == 1) {            c.add("冠希哥");            }    System.out.println(c.get(i));        }    }

6.增强for循环

是for循环语句的一种格式;可以简化传统的for循环语句的代码;

格式:

for(数据类型 变量名 : 数组/集合){    循环体;}

示例代码:

public class ForPlusDemo{    public static void main(String[] args){        int[] iArray={1,2,3,4,5}    //每次从数组中取出一个元素赋值给变量i        for(int i: iArray){            //打印元素        System.out.println(i);    }  }}

示例代码2:

public static void main(String[] args) {    ArrayList<Integer> list = new ArrayList<Integer>();    list.add(1);    list.add(3);    list.add(5);    list.add(7);    for (Integer integer : list) {        System.out.println(integer);    }}

1.当使用增强for循环遍历数组时,底层使用的普通的for循环语句;

2.当使用增强for循环遍历集合组时,底层使用迭代器;

7.泛型

表示一种不确定的数据类型;

泛型可以用在:

类,方法,接口上面;

好处:

提高代码的重复使用率;1.泛型用在类的上面    class D<T>{        T t;    }2.泛型用在方法的上面    修饰符 泛型 返回值类型 方法名(泛型 参数名){        ....    }3.泛型用在接口上面    修饰符 interface 接口名(泛型){        .....        修饰符 返回值类型 方法名(泛型 t);    }4.泛型的通配符    ? 是泛型的的通配符;    通配符的第一种写法:        ArrayList<? extends T>:?表示T类型或者T的子类类型        boolean  addAll(Collection< ? extends E> c):?表示E类型或者E的子类类型        boolean  addAll(Collection< ? extends Person> c):    通配符的第二种写法:        ArrayList<? super T> :?表示T类型或者T的父类类型        ArrayList<? super Student> :?表示Student类型或者Student的父类类型;        // 这个?表示的类型与后面<>中的类型一样        ArrayList<?> c2 = new ArrayList<String>();