Collection,迭代器,foreach,泛型,数据结构简单介绍

Collection

概念

    单列集合的顶级接口,不能直接new对象。通过实现类去new 如:ArrayList
集合框架体系图

常用方法

  • boolean add(E e) 将指定对象添加到集合中
  • void clear(E e) 清空集合元素
  • boolean remove(E e) 把给定对象在当前集合删除
  • boolean contains(Object obj) 判断当前集合中是否包含给定对象
  • boolean isEmpty() 判断当前集合是否为空
  • int size() 返回集合长度
  • Object[] toArray() 把集合中的元素,存到数组中

迭代器

概念

  • 本身是一个Iterator接口
  • 在程序开发过程中 经常要遍历集合的元素,于是 JDK就提供了Iterator接口
  • 是Collection集合的通用遍历方式

获取迭代器

  • Iterator iterator()

获取元素

  • boolean hasNext() -->判断集合中有没有下一个元素
  • E next() -->获取下一个元素

使用步骤

		//创建集合
		ArrayList list = new ArrayList();
		list.add("第一个元素");
		list.add("第二个元素");
		list.add("第三个元素");
		//获取迭代器
		//*其实Iterator指向的是ArrayList的内部类Itr*
		Iterator<String> iterator = 集合.iterator();
		//由于我们要循环判断集合中有没有下一个元素,利用while循环
		while(iterator.hasNext()){
			String element = iterator.next();
			System.out.print(element )
		}

注意事项

    先来一个需求:使用迭代器遍历集合,判断集合中是否有元素 “2”,如果有再为集合中添加一个元素“4”。

public static void main(String[] args) {
        //创建集合
        Collection<String> collection = new ArrayList<>();

        //给集合添加数据
        collection.add("1");
        collection.add("2");
        collection.add("3");

        //获取迭代器
        Iterator<String> iterator = collection.iterator();

        //使用迭代器循环
        while(iterator.hasNext()){
            String str = iterator.next();
            //判断 如果集合中有 “2” 在为集合添加元素 “4”
            if("2".equals(str))
                collection.add("4");
        }
    }

    看了上面的代码,你可能觉得没有任何问题,但是一运行就会报一个ConcurrentModificationException(并发修改异常)异常。至于为什么还要研究一下底层实现源码。

    所以:使用迭代器去操作元素的过程中,不要修改元素长度!!

解决办法

    可以使用ListIterator这个接口:允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。
    ListIterator中的方法

  • void add(E e) 添加元素
  • boolean hasNext() 判断有没有下一个元素
  • E next() 获取下一个元素
    演示
public static void main(String[] args) {
        //创建集合
        Collection<String> collection = new ArrayList<>();

        //给集合添加数据
        collection.add("1");
        collection.add("2");
        collection.add("3");

        //获取ListIterator迭代器
        ListIterator<String> iterator = ((ArrayList<String>) collection).listIterator();

        //使用ListIterator迭代器循环
        while(iterator.hasNext()){
            String str = iterator.next();
            //判断 如果集合中有 “2” 在为集合添加元素 “4”
            if("2".equals(str))
                iterator.add("4");//这里必须使用ListIterator这个接口重写的add方法
        }
    }

增强for – foreach

概念

    遍历数组和集合 使用方法比迭代器简单,但是他遍历集合的时候底层也是迭代器,遍历数组不是!!

格式

  for(容器中元素的类型 变量名 :要变遍历的容器的名字){
            变量名就是要接受的元素;
       }

例:

		//创建集合
		ArrayList<String> list = new ArrayList();
		list.add("1");
		list.add("2");
		list.add("3");
		
		//利用迭代器遍历
		Iterator iterator = list.Iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		//利用增强for简历
		for(String element:list){
			System.out.println(element:list);
		}

注意事项

  • 使用foreach去操作元素的过程中,也不要修改元素长度!!
  • foreach在遍历集合的时候底层原理是迭代器。
  • 在遍历数组的时候底层原理不是迭代器。

泛型

好处

    定义的时候:让代码更通用,接收任意引用数据类型
    使用的时候:可以规定数据类型,防止类型转换异常

定义

1.定义类
      格式 :
          修饰符 class 类名<代码泛型变量一般用E表示>{}
创建对象的时候确定具体类型。

2.定义方法
      格式:
          修饰符<代码泛型变量一般用E表示> 返回值类型 方法名(参数){}
调用方法的时候确定泛型的类型

3.定义接口
      格式:
          修饰符 interface 接口名{}
实现类的时候确定泛型类型,如果在实现类的时候泛型没有确定,那么就要在new对象的时候确定了。

泛型通配符(了解)

一般使用在方法的参数上
    格式:
        修饰符 返回值类型 方法名(类型名称<?> 对象名){}
可以存Object类型

受限泛型

上限:

  格式:
      类型名称<? extent 类>对象名
  意义:
      ?只能接受extends后面类型的本身及它的子类类型

下限:

  格式
      类型名称<? suoer 类>对象名
  意义:
      ?只能接受super后面类型的本身及它的父类类型


数据结构(简单介绍)

  采用该数据结构集合的特点:先进后出(举例:压子弹)

队列

  采用该数据结构集合的特点:先进先出(举例:排队)

数组

  采用该数据结构集合的特点:有序的元素序列,查询快(下标直接定位),增删慢(要想给数组添加元素,需要创建新数组。)

链表

单向链表
概念

  • 就是把多个节点链接起来
  • 一个节点它是由两个部分组成,数据域(存储的数值),指针域(存储的地址)
  • 第二部分存的是下一个节点的地址。
  • 上一个节点保存着下一个节点的地址
  • 下一个节点没有保存上一个节点的地址
  • 不能保证元素的顺序

采用该数据结构集合的特点:查询慢,增删快

双向链表
概念

  • 有两个指针域
  • 一个节点它是由三个部分组成,上一个节点地址,数据域,下一个节点地址
  • 上一个节点记录下一个节点地址
  • 下一个节点记录着上一个节点地址
  • 可以保证元素的顺序
发布了30 篇原创文章 · 获赞 39 · 访问量 2059

猜你喜欢

转载自blog.csdn.net/weixin_44564242/article/details/104892171