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

Java集合与数组详解
本文对比了数组与集合的特点及应用场景,详细介绍了Java集合框架中的Collertion接口及其常用方法,探讨了迭代器的使用及并发修改异常的问题,并介绍了增强for循环与泛型的概念。

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>();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值