zoukankan      html  css  js  c++  java
  • 集合的笼统介绍之List

    上文中我们得知了集合的顶层接口Collection,但根据面向对象的特点,子类虽然继承父类的全部方法,但却有自己独有的功能,作为有下标的集合。我们来看下它的不同。

    list的独特特点

    它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。

    它是一个带索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

    集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素

    下面的集合有ArrayList和linkedlist

    ①创建对象

    list<泛型> 变量名=new 子类集合<泛型>();

     List<String> list =new ArrayList<String>();

    ②常用方法

    这里和collection唯一不同的是remove方法(移除第一次出现的指定元素)返回值为被删除的元素返回值为被删除的元素比起collection多了一个返回值,和ArrayList基本一致

    ③遍历 因为我们发现它有get获取元素的方法,可以用普通for循环,或者增强for,或者迭代器。基本和ArrayList一样

    package com.oracle.demo4;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo {
        public static void main(String[] args) {
            List<String> list =new ArrayList<String>();
            list.add("a");
            //在指定位置插入元素
            list.add(0,"b");
            list.add("c");
            //遍历,因为有下标,可以直接遍历
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
            }
            //删除指定下标的元素
            String str=list.remove(2);
            //修改指定位置上的值
            list.set(0, "你好");
            System.out.println("删除的元素为"+str);
            //增强for遍历
            for(String  s:list){
                System.out.println(s);
            }
        }
        
    }

    在list集合中也可以使用Iterator迭代器,但我们注意如果要利用迭代器进行操作要注意出现并发修改异常。也就是

        //迭代集合,当有元素为"abc2"时,集合加入新元素"a"
            Iterator<String> it = list.iterator();
            while(it.hasNext()){
                String str = it.next();
                //判断取出的元素是否是"abc2",是就添加一个新元素
                if("abc2".equals(str)){
                    list.add("a");// 该操作会导致程序出错
                }
            }
            //打印容器中的元素
            System.out.println(list);
        }
    }
    运行上述代码发生了错误 java.util.ConcurrentModificationException这是什么原因呢?
    在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
    并发修改异常解决办法:在迭代时,不要使用集合的方法操作元素。
    那么想要在迭代时对元素操作咋办?通过ListIterator迭代器操作元素是可以的,ListIterator的出现,解决了使用Iterator迭代过程中可能会发生的错误情况。

    list的存储数据结构

    简单分为:堆栈、队列、数组、链表。

    简单来说,ArrayList是队列、堆栈,队列、数组的存储结构,增删慢,查找快。

     linkedlist是连表结构。增删快,查找慢。

    堆栈,采用该结构的集合,对元素的存取有如下的特点:

    先进后出(即,存进去的元素,要在它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。

    栈的入口、出口的都是栈的顶端位置

    压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。Main方法就是这样子,最后弹出

    弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

    链表,采用该结构的集合,对元素的存取有如下的特点:

    多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。

    查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素

    增删元素快

    增加元素:操作如左图,只需要修改连接下个元素的地址即可。

    删除元素:操作如右图,只需要修改连接下个元素的地址即可。

    我们得知linkedlist是一个链表结构它的数据域对应的指针域是对应的下一个,如11对应0x02的地址。

    我们也从集合三步走。

    ①创建对象

    父类类型<泛型> 变量名=new 子类类型 <泛型>();

    list<string> list=new linkedlist<泛型>();

    ②常用方法

    因为是一个链表结构,所以他增删改查都需要加上具体的位置,还有比较重要的一点是判断集合中有没有这个元素 boolean flag=list.isEmpty,返回true或者false,默认是有的false

    代码如下:

        public static void main(String[] args) {
            LinkedList<String> arr=new LinkedList<String>();
            arr.addFirst("a");
            arr.addFirst("b");
            arr.addLast("c");
            arr.addFirst("d");
            //超级for遍历
            for(String s:arr){
                System.out.println(s);
            }
            //移出第一个位置的元素
            System.out.println("------------");
            arr.removeFirst();
            //返回第一个
            System.out.println(arr.getFirst());
            System.out.println("------------");
            arr.removeLast();
            System.out.println(arr.getLast());
            System.out.println("------------");
            System.out.println();
            for(String s:arr){
                System.out.println(s);
                }
            System.out.println("------------");
            //清空集合
            arr.clear();
            //判断集合中是否有元素,布尔值可以直接打印,有元素返回false
            System.out.println(arr.isEmpty());
            System.out.println("------------");
        
        }

  • 相关阅读:
    inner join(inner可省) 与 left join 之间的区别
    Jedis+Redis+spring缓存
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"/>
    js中的blob,图片base64URL,file之间的关系
    批量压缩图片
    xhr 的 onpregress 监听上传数据的 已上传 和 总大小
    如何禁止浏览器 前进功能
    获取页面滚动高度
    bootstrap的字体设置
    忽略 文件夹下的所有node/modules
  • 原文地址:https://www.cnblogs.com/a199706/p/11361496.html
Copyright © 2011-2022 走看看