一、Java_Collections表的实现

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

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

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

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

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

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

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator; /**
* 找到一个表list中偶数值的项,并删除 下面显示逐渐优化的过程 对比顺序表:arrayList与LinkedList。自己把握
*
* @author Administrator
*
*/
public class RemoveEvens {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4); // removeEvensVer2(list); for (int i : list) {
System.out.println(i);
}
} // 基础版本
/*
* 对于ArrayList集合,get方法虽然较快,但是remove的时间消耗为二次时间,
* 对于linkedlist集合,暴露两个问题首先是对get的调用效率不是很高因此例程花费二次时间,而且同时对remove
* 的调用同样低效,因为要到达i的代价是昂贵的。
*/
public static void removeEvensVer1(List<Integer> list) { int i = 0;
// 遍历列表,获得每一个元素
while (i < list.size()) {
// 当前项是偶数,就移除
if (list.get(i) % 2 == 0) {
list.remove(i);
} else {
i++;
}
}
} // 迭代器版本增强版本,避免并发修改异常
// 对于linkedlist的迭代器的remove方法只消耗常数时间项,该方法对于arraylist仍是无可救药 public static void removeEvensVer2(List<Integer> list) {
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next() % 2 == 0) {
iterator.remove();
}
}
} // 并发修改异常,一般这里会出现,主要是由于迭代器的引用失效
public static void removeEvensVer3(List<Integer> list) {
// ListIterator<Integer> listIterator = list.listIterator();
//增强for本质上是使用迭代器实现,而list的remove方法导致list发生变化,进一步导致原list的迭代器引用
//发生变化,导致并发异常。
for (Integer x : list) {
if (x % 2 == 0) {
list.remove(x);
}
}
}
}

Java数据结构之表的增删对比---ArrayList与LinkedList之一的更多相关文章

  1. Java数据结构——顺序表

    一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...

  2. java的List接口的实现类 ArrayList,LinkedList,Vector 的区别

    Java的List接口有3个实现类,分别是ArrayList.LinkedList.Vector,他们用于存放多个元素,维护元素的次序,而且允许元素重复. 3个具体实现类的区别如下: 1. Array ...

  3. java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析

    java面试中经常被问到list常用的类以及内部实现机制,平时开发也经常用到list集合类,因此做一个源码级别的分析和比较之间的差异. 首先看一下List接口的的继承关系: list接口继承Colle ...

  4. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  5. Java数据结构-线性表之静态链表

    静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...

  6. Java数据结构-线性表之单链表LinkedList

    线性表的链式存储结构,也称之为链式表,链表:链表的存储单元能够连续也能够不连续. 链表中的节点包括数据域和指针域.数据域为存储数据元素信息的域,指针域为存储直接后继位置(一般称为指针)的域. 注意一个 ...

  7. 线性表之何时使用ArrayList、LinkedList?

    前言 线性表不仅可以存储重复的元素,而且可以指定元素存储的位置并根据下表访问元素. List接口的两个具体实现:数组线性表类ArrayList.链表类LinkedList. ArrayList Arr ...

  8. Java 总结 数据底层原理 【包括 ArrayList、LinkedList、hash table、HashMap、Hashtable、ConcurrentHashMap、hash code、HashSet、LinkedHashMap、LinkedHashSet】

    1.ArrayList (1)底层是由动态数组实现的[使用了List接口]. (2)动态数组是长度不固定,随着数据的增多而变长. (3)如果不指定,默认长度为10,当添加的元素超过当前数组的长度时,会 ...

  9. 【Java面试题】37 说出ArrayList,Vector, LinkedList的存储性能和特性

    ArrayList和Vector都是使用数组方式存储数据,此 数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插 ...

随机推荐

  1. 不断优化,重构我的代码-----拖拽jquery插件

    最近学东西学的有点太散了,歇一阵子,重新完善之前的JQ插件,今天先上拖拽吧 // JavaScript Document (function($){ var defaults = { actionEl ...

  2. JSON 与 JSONP

    JSON (JavaScript Object Notation) is a lightweight data-interchange format. 即 JSON 是一种轻量级的数据交换格式. 1. ...

  3. windows中查看开机时间

    windows中查看开机时间     在windows下可以使用systeminfo命令来查看. 下面是网站摘录的关于windows启动了多长时间的内容 1. windows系统可以查看从开机到现在共 ...

  4. 关于xib的一些细节/ 真机调试/ GitLab

    ---------------------------------------------------------------------------------------------------- ...

  5. Android--Intent(意图)

    Intent(意图)是安卓系统中最重要的概念, 它是一种消息传递机制, 用于系统与应用程序组件之间的交互, 意图可以分为3类, 分别是: 活动意图, 广播意图和服务意图 1. Activity Int ...

  6. 针对功能权限(url访问)如何避免越权访问

    你可以用request获得之前的页面路径:Request.getHeader("Referer");然后你可以判断一下,这个是字符串类型的. 如果是需要登录的,你可以从sessio ...

  7. 使用js实现点击按钮下载文件

    有时候我们在网页上需要增加一个下载按钮,让用户能够点击后下载页面上的资料,那么怎样才能实现功能呢?这里有两种方法: 现在需要在页面上添加一个下载按钮,点击按钮下载文件. 题外话,这个下载图标是引用的 ...

  8. ui-grid

    html代码: <html ng-app="myApp">       <head>         <meta charset="utf- ...

  9. angularJs之定时器

    $timeout 服务 AngularJS $timeout 服务对应了 JS window.setTimeout 函数. 实例 两秒后显示信息: var app = angular.module(' ...

  10. django url.py使用

    主要对象:patterns和url url有两个主要的参数,第一个是正则模板,第二个是处理的方法 他们的对应关系是,当我们在浏览器当中url的形式与正则相匹配时 就转向处理方法 如果url.py中的值 ...