集合类库的学习_Iterator接口&List集合

Iterator接口的概念

  • java.util.Iterator接口主要用于描述迭代器对象,可以遍历Collection集合中的所有元素。
  • java.util.Collection接口继承Iterable接口,因此所有实现Collection接口的实现类都可以使用该迭代器对象

数据准备

//1.准备一个Collection集合并放入元素后打印
        Collection c1 = new ArrayList();
        c1.add("one");
        c1.add(2);
        c1.add(new Person("张飞",30));
        System.out.println("c1="+c1);//[one,2,Person{name='张飞',age=30}] 最后一个是toString的效果

这里自动调用toString方法,打印的其实是一个String类型的整体
在这里插入图片描述
附上toString方法
在这里插入图片描述

遍历方式二:使用迭代器来遍历集合中所有元素

首先要使用iterator()获取当前集合中的迭代器对象
再使用以下方法
在这里插入图片描述

//2。遍历方式二:使用迭代器来遍历集合中所有元素
        //获取当前集合中的迭代器对象
        Iterator iterator1 = c1.iterator();//获取c1集合中的迭代器对象
        //判断是否有元素可以访问
        System.out.println(iterator1.hasNext());//true
        //取出一个元素并指向下一个
        System.out.println("获取到的元素是:"+iterator1.next());//取到第一个元素one
        System.out.println(iterator1.hasNext());//true
        System.out.println("获取到的元素是:"+iterator1.next());//取到第2个元素2
        System.out.println(iterator1.hasNext());//true
        System.out.println("获取到的元素是:"+iterator1.next());//取到第3个元素Person{name='张飞',age=30}
        System.out.println(iterator1.hasNext());//false

在这里插入图片描述
我们可以把一个Collection理解为一个容器,第一个放"one",第二个放2,第三个放Person{name=‘张飞’, age=30}

Iterator iterator1 = c1.iterator();

这就创建了一个迭代器
则相当于一个指向第一个元素前面的箭头
hasNext()根据箭头所指位置判断是否有下一个
以上代码可写为

while (iterator1.hasNext()){
    
    
            System.out.println(iterator1.next());
        }

在这里插入图片描述

使用迭代器模拟toString()方法

迭代器的优点在于更加灵活

//模拟toString方法
        //先重置迭代器箭头
        iterator1 = c1.iterator();
        StringBuilder sb1 = new StringBuilder();
        sb1.append("[");
        while (iterator1.hasNext()){
    
    
            //当获取的元素是最后一个元素时,则拼接元素加中括号
            Object obj = iterator1.next();
            if(!iterator1.hasNext()){
    
    
                sb1.append(obj).append("]");
            }
            //否则 拼接元素+逗号+空格
            else {
    
    
                sb1.append(iterator1.next()).append(",").append(" ");
            }
        }
        System.out.println("c1="+sb1);

在这里插入图片描述

迭代器迭代过程中删除元素

不断获取集合中元素并判断,当元素值为"one"时删除该元素
remove()用于删除访问到的最后一个元素 next谁remove就删谁

//不断获取集合中元素并判断,当元素值为"one"时删除该元素
        System.out.println("----------------");
        iterator1 = c1.iterator();
        while(iterator1.hasNext()){
    
    
            Object obj = iterator1.next();
            if("one".equals(obj)){
    
    
                iterator1.remove();//remove()用于删除访问到的最后一个元素 next谁remove就删谁
            }
        }
        System.out.println("删除后的集合中元素为:"+c1);

在这里插入图片描述
注意不能用c1.remove(),因为一个线程不允许修改Collection,而另一个线程正在迭代它

foreach结构(for each循环)

使用foreach结构实现集合和数组中元素的遍历 代码简单灵活
是增强型for循环

语法格式

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

执行过程

不断地从数组/集合中取出一个元素赋值给变量名并执行循环体,直到取完所有元素为止

//使用foreach方法 实现c1中元素的遍历
        for(Object obj:c1){
    
    
            System.out.println("取出来的元素是:"+obj);
        }

在这里插入图片描述
for each实现数组遍历

/数组遍历
        int[] arr = new int[]{
    
    11,22,33,44,55};
        for(int i:arr){
    
    
            System.out.println("i="+i);
        }

在这里插入图片描述

List集合

List具有Collection的所有功能,且有一些单独属于自己的。集合中允许有重复的元素并且有先后放入次序

  • 主要实现类有:ArrayList类、LinkedList类、Stack类、Vector类
  • ArrayList类采用动态数组(内部已封装)进行数据管理,访问方便,增删不方便,动态调整容量大小。 ArrayList在new出来的时候并没有申请内存空间,add方法添加元素时会给数组申请长度为10的一维数组,原始长度的1.5倍
  • LinkedList类底层是采用双向链表进行数据管理,访问不方便,增删元素方便,每个节点都有个地址,内存空间不连续,所以访问不方便;增删不会影响其他元素
  • ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别

Stack和Vector类

  • Stack类的底层是采用动态数组进行数据管理的,该类主要用于描述栈
  • 中Vector类的底层是采用动态数组进行数据管理的,该类与ArrayList类相比属于线程安全的类,效率比较低

List集合中的常用方法

这里的add方法是可以向指定位置添加元素
在这里插入图片描述

//1.准备一个List集合并打印
        List lt1 = new LinkedList();
        System.out.println("lt1="+lt1);//啥也没有
        System.out.println("----------------------------");

        //2.向集合中添加元素并打印
        lt1.add(0,"one");//向集合中的开头位置添加元素
        System.out.println("lt1="+lt1);//[one]
        lt1.add(1,3);//向集合中的末尾位置添加元素
        System.out.println("lt1="+lt1);//[one,3]
        //向集合中的中间位置添加元素
        lt1.add(1,"two");
        System.out.println("lt1="+lt1);//[one,two,3]

在这里插入图片描述

在这里插入图片描述

据参数指定的下标来获取元素

这里因为one的返回值是String类型的,所以这里强转了一下

/3.根据参数指定的下标来获取元素
        String str1 = (String)lt1.get(0);//根据下标返回元素
        System.out.println("获取到的元素是"+str1);//one

在这里插入图片描述

使用get方法获取集合中的所有元素并打印

这里实现的意义在于使用一下Object去接不同类型的元素,不用强制转换类型

//使用get方法获取集合中的所有元素并打印
        for(int i = 0;i< lt1.size();i++){
    
    
            Object obj = lt1.get(i);
            System.out.println("获取到的元素是:"+obj);
        }

在这里插入图片描述

另一种实现方法

StringBuilder sb1 = new StringBuilder();
        sb1.append("[");
        for(int i=0;i<lt1.size();i++){
    
    
            Object obj = lt1.get(i);
            if(lt1.size()-1==i){
    
    
                sb1.append(obj).append("]");
            }else{
    
    
                sb1.append(obj).append(",").append(" ");
            }
        }
        System.out.println("获取到的元素是:"+sb1);

在这里插入图片描述

查找指定元素出现的索引位置

//查找指定元素出现的索引位置
        System.out.println("one第一次出现的索引位置为:"+lt1.indexOf("one"));//0
        lt1.add("one");
        System.out.println("lt1 = "+lt1);
        System.out.println("one反向查找第一次出现的索引位置是:"+lt1.lastIndexOf("one"));//3

在这里插入图片描述

实现集合中元素的修改

在这里插入图片描述
这个方法返回的是被修改的元素

//实现集合中元素的修改 把3改为 three
        System.out.println("lt1="+lt1);//[one, two, 3, one]
        Integer it1 = (Integer) lt1.set(2,"three");
        System.out.println("被修改的元素是:"+it1);
        System.out.println("修改后集合中的元素有:"+lt1);//[one,two,three,one]

在这里插入图片描述

Queue集合

Queue集合是Collection集合的子集合,与List集合属于平级关系

  • Queue集合实现了先进先出特征的数据结构,也就是队列
  • 该集合的主要实现类是LinkedList类,因为该类在增删方面比较有优势

主要方法

在这里插入图片描述

案例

准备一个Queue集合,将数据11、22、33、44、55依次入队并打印,然后查看队首元素并打印,然后将队列中所有数据依次出队并打印

//1.准备一个Queue集合
        Queue queue = new LinkedList();//Queue是一个接口所以只能new实现类的对象
        System.out.println("队列中的元素有"+queue);//[]

        System.out.println("-----------------------");
        //2.将数据11、22、33、44、55依次入队并打印
        for(int i = 1;i<=5;i++){
    
    
            boolean b1 = queue.offer(i*11);
            //System.out.println("b1="+b1);

        }
        System.out.println("队列中的元素有:"+queue);
        System.out.println("-----------------------");
        //3.然后查看队首元素并打印,
        System.out.println("队首元素是:"+queue.peek());
        System.out.println("-----------------------");
        //4.然后将队列中所有数据依次出队并打印
        int len = queue.size();
        for (int i = 1;i<=len;i++){
    
    
            System.out.print("出队的元素是:"+queue.poll()+"\t");//11 22 33 44 55
        }
        System.out.println("");
        System.out.println("-----------------------");
        //5.查看队列中的最终元素
        System.out.println("队列中的元素有:"+queue);

在这里插入图片描述

Guess you like

Origin blog.csdn.net/Maybe_do_it/article/details/121347662