【数据结构】:
啊哈,相信大家或多或少都接触了一些。线性数据结构lArrayList and LinkedList
非线性数据结构 HashSet and HashMap
今天提到这四个呢,并不是讲这几个怎么用,而是提出一个问题,为什么那么多大型公司面试官这么喜欢问这四个,这么喜欢比较他们的区别呢,我在面试阿里的时候这个基本是每一面都要提到的,区别,区别,情景模拟怎么用,哪些数据结构用到?我们来慢慢引出?首先讲一下他们的特性,以及怎么用?
===================================================================================
【ArrayList】:
数组列表 线性数据结构,可以在任何位置对元素进行增删查改。
但是:
- ArrayList是非同步的。在多线程并发操作ArrayList场景下,需要我们写代码对ArrayList进行同步
- ArrayList是利用数组实现的,本身可以看做是一个动态的数组,对元素增删都会引起数组内存分配空间动态发生变化,所以插入,删除会比较慢,但是检索速度快。
【看一下方法】:
boolean add(E e)
将指定的元素添加到此列表的尾部。
void add(int index, E element)
将指定的元素插入此列表中的指定位置。
boolean addAll(Collection<? extends E> c)
按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
boolean addAll(int index, Collection<? extends E> c)
从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
void clear()
移除此列表中的所有元素。
Object clone()
返回此 ArrayList 实例的浅表副本。
boolean contains(Object o)
如果此列表中包含指定的元素,则返回 true。
void ensureCapacity(int minCapacity)
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
E get(int index)
返回此列表中指定位置上的元素。
int indexOf(Object o)
返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
boolean isEmpty()
如果此列表中没有元素,则返回 true
int lastIndexOf(Object o)
返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
E remove(int index)
移除此列表中指定位置上的元素。
boolean remove(Object o)
移除此列表中首次出现的指定元素(如果存在)。
protected void removeRange(int fromIndex, int toIndex)
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
E set(int index, E element)
用指定的元素替代此列表中指定位置上的元素。
int size()
返回此列表中的元素数。
Object[] toArray()
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组。
<T> T[] toArray(T[] a)
按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
void trimToSize()
将此 ArrayList 实例的容量调
整为列表的当前大小。
============================================================================
【LinkedList】:
同上
注意:
-
非同步,并发多线程需要自己写代码控制
- 内部是链表实现,因此和ArrayList相比,增删很快,因为list不需要重新分配空间,但是检索速度慢
- 实现了Queue接口,可做先进先出队列使用
===============================================================================
【HashMap】
数组
数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;
链表
链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。
哈希表
那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。
我们来看一组生动的图:
可以看得出左边是数组,右边是链表的这种结合。
hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置。
这里HashMap里面用到链式数据结构的一个概念。上面我们提到过Entry类里面有一个next属性,作用是指向下一个Entry。打个比方, 第一个键值对A进来,通过计算其key的hash得到的index=0,记做:Entry[0] = A。一会后又进来一个键值对B,通过计算其index也等于0,现在怎么办?HashMap会这样做:B.next = A,Entry[0] = B,如果又进来C,index也等于0,那么C.next = B,Entry[0] = C;这样我们发现index=0的地方其实存取了A,B,C三个键值对,他们通过next这个属性链接在一起。所以疑问不用担心。也就是说数组中存储的是最后插入的元素。到这里为止,HashMap的大致实现,我们应该已经清楚了。
http://blog.csdn.net/vking_wang/article/details/14166593这个博客讲的更加清楚对Hashmap这个原理,能够看懂。
================================================================================
【HashSet】:
集合类型数据结构,实现了set的接口,满足数学定义,无序,不重复。
-
非同步,多线程并发需要自己写代码
- Hashset内部由HashMap实现,对元素增删查也有很高性能
- 元素无序,对其遍历,不保证顺序都一致,也就是说每一次打印出来的元素位置都不一样
- 没有重复元素,加入相同的对象到hashset里面,则最终hashset里面只有一个对象。
相关推荐
在《数据结构及其应用算法》这个主题中,我们重点关注了数据结构的定义、类型以及与算法的关系。 数据结构是由逻辑结构、存储结构和运算这三个关键组成部分构成的。逻辑结构定义了数据元素之间的关系,例如线性结构...
第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统和编译程序中涉及的动态存储管理的基本技术;第9章至第11章...
在第一章的《数据结构及其应用》笔记中,主要介绍了数据结构的基本概念、逻辑结构和存储结构,以及算法的相关特性。 1. 数据结构:数据结构是数据元素的集合,这些元素之间具有特定的结构关系。它可以是简单的数据...
使用场景及目标:旨在帮助读者深入理解各种数据结构的基本特征、运作原理及其优缺点,从而能够在不同应用场景下做出合理的选择和优化程序性能。 其他说明:文中提及的概念不仅限于理论上讨论,在实际项目中也有广泛...
《数据结构原理及其应用》这门课程旨在深入理解数据结构的基本概念,掌握其设计与分析方法,并通过实际编程实现加深对理论的理解。 课程内容通常包括以下几个主要部分: 1. **线性结构**:线性结构是最基础的数据...
第一章 简单程序 第二章 分支程序 第三章 循环程序 第四章 函数与过程 第五章 自定义数据类型 第六章 程序设计与基本算法 第七章 数据结构及其应用 第八章 搜索 第九章 其他常用知识和算法
根据给定的文件信息,本篇文章将深入探讨“数据结构-图及其应用”这一主题,重点解析图数据结构的表示方法、基本运算、遍历算法...希望本文能帮助读者更好地理解图数据结构及其应用,激发对数据结构学习的兴趣和热情。
本实验报告主要介绍了图的数据结构及其应用,旨在熟悉图的邻接矩阵(或邻接表)的表示方法,掌握建立图的邻接矩阵(或邻接表)算法,并熟悉图的基本运算和遍历算法。 一、实验目的和意义 本实验的目的是熟悉图的...
数据结构与应用算法是计算机科学中的核心课程,它关乎如何高效地存储和处理信息,是软件开发、系统设计以及算法分析的基础。中国科技大学提供的这门课件资源涵盖了数据结构的基本概念、常用的数据结构类型,以及如何...
未来的研究可以进一步探索新的数据结构及其应用,以应对日益复杂的问题和挑战。 钢筋混凝土结构论文 钢筋混凝土结构是一种由钢筋和混凝土两种材料组合而成的结构形式。钢筋具有高强度和延性,而混凝土具有高刚度和...
这本书的配套光盘包含了丰富的学习资源,旨在帮助学生和从业者更好地理解和掌握数据结构及其应用算法。 数据结构是计算机科学中的基础学科,主要研究如何在计算机中组织和存储数据,以便于高效地访问和修改。它包括...
数据结构是计算机科学中的核心课程,它...通过严蔚敏教授的教程和课后习题,学习者可以系统地掌握数据结构及其应用算法,为后续的软件开发和算法设计打下坚实基础。无论是对于初学者还是进阶者,这都是一份宝贵的资源。
第2章至第7章从抽象数据类型的角度,分别讨论线性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用;第8章综合介绍操作系统和编译程序中涉及的动态存储管理的基本技术;第9章至第11章...
第2章至第6章分别讨论了线性表、栈和队列、串和数组、树型结构和图结构等常用的数据结构及其应用,以及在.NET框架中相应的数据结构;第7、8两章分别讨论了排序和查找常用的各种方法及其应用以及在.NET框架中相应的...
1000多页的算法题解,包含数据结构,排序,查找,递归,回溯算法,二叉树,动态规划,贪心算法,双指针,滑动窗口,前缀和等。
本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书...
本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排1992年4月出版的《数据结构》(第二版)基本一致,但在本书...
本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及其综合分析比较。其内容和章节编排与1992年4月出版的《数据结构》(第二版)基本一致,但在...
综合来看,该文档可能是为对数据结构及其应用感兴趣的学习者或专业人士提供的详尽指南和资料,不仅包含了理论知识,还可能包括了实际操作的案例和应用。它可能是某个专业课程、自学材料或是技术分享的内容,旨在帮助...