zoukankan      html  css  js  c++  java
  • Java数据结构之表的增删对比---ArrayList与LinkedList之一

    一、Java_Collections表的实现

      与c不同Java已经实现并封装了现成的表数据结构,顺序表以及链表。

      1、ArrayList是基于数组的实现,因此具有的特点是:1.有索引值方便查找,对于get和set操作花费常数时间,2.但是其缺点是:插入/删除某个数据的代价比较大。

          2、LinkedList是基于双链表实现,因此具有的特点是:1.基于链表方便插入与删除操作开销较小,2.但是不方便索引,不管是索引哪一个元素都需要从头开始逐次查找。

    就增删操作下面举个简单例子:给出一个表(具体实现未知),将该表中偶数值的项删除,比如该表中的元素为:1,2,3,4,5,调用该方法后得到元素:1,3,5

    //-----------------------------------------------------------

    //该代码主要是用来说明顺序表与链表在增删上的操作消耗

     1 import java.util.ArrayList;
     2 import java.util.Iterator;
     3 import java.util.LinkedList;
     4 import java.util.List;
     5 import java.util.ListIterator;
     6 
     7 /**
     8  * 找到一个表list中偶数值的项,并删除 下面显示逐渐优化的过程 对比顺序表:arrayList与LinkedList。自己把握
     9  * 
    10  * @author Administrator
    11  * 
    12  */
    13 public class RemoveEvens {
    14     public static void main(String[] args) {
    15         List<Integer> list = new ArrayList<>();
    16         list.add(1);
    17         list.add(2);
    18         list.add(3);
    19         list.add(4);
    20 
    21         // removeEvensVer2(list);
    22 
    23         for (int i : list) {
    24             System.out.println(i);
    25         }
    26     }
    27 
    28     // 基础版本
    29     /*
    30      * 对于ArrayList集合,get方法虽然较快,但是remove的时间消耗为二次时间,
    31      * 对于linkedlist集合,暴露两个问题首先是对get的调用效率不是很高因此例程花费二次时间,而且同时对remove
    32      * 的调用同样低效,因为要到达i的代价是昂贵的。
    33      */
    34     public static void removeEvensVer1(List<Integer> list) {
    35 
    36         int i = 0;
    37         // 遍历列表,获得每一个元素
    38         while (i < list.size()) {
    39             // 当前项是偶数,就移除
    40             if (list.get(i) % 2 == 0) {
    41                 list.remove(i);
    42             } else {
    43                 i++;
    44             }
    45         }
    46     }
    47 
    48     // 迭代器版本增强版本,避免并发修改异常
    49     // 对于linkedlist的迭代器的remove方法只消耗常数时间项,该方法对于arraylist仍是无可救药
    50     
    51     public static void removeEvensVer2(List<Integer> list) {
    52         Iterator<Integer> iterator = list.iterator();
    53         while (iterator.hasNext()) {
    54             if (iterator.next() % 2 == 0) {
    55                 iterator.remove();
    56             }
    57         }
    58     }
    59 
    60     // 并发修改异常,一般这里会出现,主要是由于迭代器的引用失效
    61     public static void removeEvensVer3(List<Integer> list) {
    62         // ListIterator<Integer> listIterator = list.listIterator();
    63         //增强for本质上是使用迭代器实现,而list的remove方法导致list发生变化,进一步导致原list的迭代器引用
    64         //发生变化,导致并发异常。
    65         for (Integer x : list) {
    66             if (x % 2 == 0) {
    67                 list.remove(x);
    68             }
    69         }
    70     }
    71 }
  • 相关阅读:
    spring @component的作用详细介绍
    @Scheduled(cron = "0/5 * * * * *")将时间改为配置
    java项目里classpath具体指哪儿个路径
    返回前多少行数据
    Gson的基本使用
    JSON.toJSONString中序列化空字符串遇到的坑
    指定JSON.toJSONString中实体类属性的输出顺序
    Javascript实现的图片隐写术
    IntelliJ IDEA 快捷键终极大全
    ECMAScript 6 入门
  • 原文地址:https://www.cnblogs.com/fuck1/p/6010228.html
Copyright © 2011-2022 走看看