`
jieke_ZJ
  • 浏览: 44818 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据结构-表-ArrayList,LinkedList

 
阅读更多

数据结构中的"表"的理解可以和数据库的表一样来理解,只是概念上的理解即:表有很多条记录(数据元素),每条记录都有一样的形式,由很多个数据项组成。不过了解数据结构的表就要关注它数据在内存中的存储形式。

 
表分两种:
线性表,和链表。
线性表在内存中是一块连续的存储空间;如:一个表中的内容是:【1,2,3】则它在内存中可能是如下存储的:
1
2
3
通过这个结构可以看出,只要知道了第一个元素在内存中所在的位置。就可以很容易的知道其他元素的位置。因为每一个元素占的空间是一样的。所以,如果我们知道第一个元素:1在内存号:1000;而每一个元素占8个内存空间;则第二个元素:2所在的内存空间为:1000 + 8;依此类推。所以,在线性表中访问数据元素是很快的。它的缺点也正因为它是连续的一块内存空间。所以,如果往中间添加或在中间删除一个元素。都要移动其他的元素。如:我在最前面加入一个元素:0.则1,2,3都要往后移一位;或,我将1删除,则2,3都要往前移一位;估算一下运算时间:在第一个元素处添加,要移动所有的元素。花费的时间是添加元素的时间 X 加上移动其他元素的时间:N,在最后面加元素不需要移动任何元素。时间仅为添加元素的时间: X .所以添加元素要的平均时间是 (N + 2X)/2;删除操作和添加操作是一样的;所以,当改变线性表长度的时间,它会在移动元素上花费大量的时间。
在JAVA中。线性表的最直接应用就是数组:Array;但Array在初始化的时间必须规定其元素长度。如:
int[] arr = new int[5];必须规定其长度,但内容可以不填。它要知道长度,然后去开辟一块内存空间。一旦数组初始化,它就不能往里面添加,删除元素了。但可以将元素值设为空;
如果需要扩充数组长度,JAVA 提供了另一个类:ArrayList.
JAVA中所有的虚拟出来的数据容器都继承自接口:Collection;ArrayList继承自:List.而List又继承了Collection;Collection提供了几种基本方法:add();clear();remove();size();toArray();iterator()等;
ArrayList提供了较灵活的用法:
List<Long> lists = new ArrayList<Long>();
ArrayList<Long> lists = new ArrayList<Long>();
上面的用法使用了泛型。而且lists并未规定长度。它可以在程序中自由扩充。但这一特点就意味着它可能在运行时因为将内存耗尽而出现问题;数组是规定长度的,所以如果内存不足,你根本初始化不了,一旦初始化了就可以随便用。
ArrayList,和Array都是数据结构中线性表的实现。
链表;
链表的存储是链式的,它不强迫数据是在一片连续的内存空间;它可以是分散存储的。所以,它的每个元素除了包括元素的值外,还要包括一些额外的信息;如:它的下一个元素在什么地方。
最基本的链式存储中的元素包括两部分:元素值和下个元素的位置;
可以如下理解:
内存空间:        值           下一元素空间
50                46             空
.
100               10             200
 .
 .
200               15             50
当存在这个链的时候,我们肯定知道链头在哪,我们假设上面链头在内存空间100处。则上述的链表表示的数据形式是:[10,16,46];知道了链头在哪里,如果要查找其他元素。必须从链头开始,依次查找下一内存空间里的值;所以查找用的时间为N/2;显然就比线性表慢了。如果是删除或添加元素。例,现在要将:[10,16,46]改成:[10,16,30,46];我们要做的是,将30放在内存中,假设它的内存地址是500;然后再将16这个值的下一元素空间的值改成500;并将30这一数值对应的下一元素空间值改成50(46这个值对应的内存空间);看起来要比线性表简单。但细看会发现:要添加或删除一个元素,必须知道它的上一个元素是谁;但现在数据中存储的只有某一无线的下一个元素。如果要找上一个元素,则又要从链头开始遍历。这会浪费大量时间,还不如线性表好用。所以这时候出现了另一链表:双链表.它和基本链表不同的是,每个元素里不但存储了下一个元素的空间,还存储了上一个元素的空间。
JAVA 中对链表的实现是通过类:LinkedList 来实现的。LinkedList 最终也是上溯到了Collection接口;
所以它也有上面说的诸如:add().clear()等方法。
分享到:
评论

相关推荐

    arraylist-linkedlist-test.zip

    通过"arraylist-linkedlist-test.zip"中的测试结果,我们可以量化分析两种数据结构在不同场景下的性能表现,以帮助选择在实际项目中更适合的集合类型。在选择ArrayList或LinkedList时,应根据应用的需求(如插入、...

    java基础--list(ArrayList、LinkedList、匿名类).docx

    【Java基础——List接口详解...在实际开发中,根据具体需求选择合适的数据结构,可以提高程序性能并降低复杂度。同时,掌握如何对List进行排序,无论是通过Comparable接口还是Comparator接口,都能使数据处理更加灵活。

    ArrayList-LinkedList-源码.rar

    总的来说,理解ArrayList和LinkedList的源码有助于我们更好地利用这两种数据结构,根据具体需求做出更优的选择。通过深入学习源码,我们可以看到Java集合框架的精妙设计,提升我们的编程技巧和问题解决能力。

    ArrayList LinkedList Vector区别

    ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 Vector 都是采用数组方式存储数据的,这种...

    ArrayList-LinkedList--Vector-Map.zip_vector

    总结来说,理解并熟练掌握`ArrayList`、`LinkedList`、`Vector`和`Map`各自的特性,能够帮助我们根据具体的应用场景选择最适合的数据结构,从而优化代码性能和效率。在实际编程中,灵活运用这些集合类可以极大地提高...

    java提高篇(二一)-----ArrayList.pdf

    《Java提高篇(二一)-----ArrayList.pdf》这篇文章主要深入讲解了Java编程语言中的ArrayList类的内部工作机制以及如何高效地使用这个重要的数据结构。ArrayList是基于数组实现的动态数组,用于存储顺序的集合,并且...

    数据结构--表、栈、队列(java)

    **表**是一种常见的线性数据结构,它允许用户在任意位置插入或删除元素。在Java中,表通常由`List`接口表示。 ##### 1. 数组实现 **数组实现**的表,即`ArrayList`,具有固定的初始容量,但在必要时可以自动扩容。...

    Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度1

    在 Java 中,ArrayList 和 LinkedList 是两种常用的集合类,它们各自具有不同的特性和适用场景,主要体现在数据结构、访问效率和操作性能上。 1. 数据结构: - ArrayList 实现了一个动态数组,它内部是一个 Object...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    ArrayList和Linkedlist1

    1. **ArrayList**:ArrayList基于动态数组(顺序表)的数据结构,它内部维护了一个Object类型的数组。由于存储位置连续,ArrayList支持随机访问,通过索引获取元素的时间复杂度为O(1)。然而,由于数组的特性,当在...

    从底层数据结构和CPU缓存两方面剖析LinkedList的查询效率为什么比ArrayList低.docx

    首先,从底层数据结构方面,ArrayList 的查询效率高于 LinkedList,因为 ArrayList 底层数据结构是动态数组,可以根据索引值直接推导出某个索引位置对应的内存地址,而 LinkedList 底层数据结构是双向链表,需要递进...

    Arraylist与LinkedList区别

    1,ArrayList是数组的数据结构,LinkedList是链表的数据结构。 2,随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于 3,索引(index)的数据结构,可以直接映射到。 4,插入、...

    javalist数据结构-Java数据结构-------List.pdf

    Java中的List接口是集合框架的重要组成部分,它定义了一组有序的元素序列,允许有重复的元素。ArrayList、Vector和LinkedList都是List接口的实现...在实际使用中,根据业务需求权衡性能和功能,选择最适合的数据结构。

    关于arraylist和linkedList的区别

    - **缺点**:在数组中间插入或删除元素时,需要移动大量元素来保持数据结构的连续性。因此,`add(i, element)`和`remove(i)`操作的时间复杂度为O(n),效率较低。 3. **应用场景**: - 当需要频繁进行查找操作而很...

    ArrayList LinkedList Vector性能对比

    3. **内存消耗**:LinkedList比ArrayList和Vector占用更多的内存,因为它需要存储额外的指针来维护链表结构。 4. **初始容量和增长策略**:预估集合大小并合理设置初始容量,可以减少不必要的扩容操作,提高性能。 ...

    数据结构(java描述)

    在Java中,这些数据结构可以通过内置类(如ArrayList、LinkedList、Stack、Queue)或自定义类来实现。例如,ArrayList是基于动态数组实现的,提供了快速随机访问;LinkedList适合频繁插入和删除,但随机访问较慢;...

    java数据结构--学习

    9. **图**:图数据结构用于表示对象之间的复杂关系,如邻接矩阵和邻接表是常见的图表示方法。图的遍历(深度优先搜索、广度优先搜索)和最短路径算法(Dijkstra、Floyd-Warshall)等在路由算法、社交网络分析等场景...

Global site tag (gtag.js) - Google Analytics