数据结构是计算机存储,组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或存储效率。数据结构往往同高效的检索算法和索引技术有关

java中常见的几种数据结构(也是初级工程师常见面试题)主要是一些常见的容器,它们主要来自于Collection和Map这2个集合;以下是2个集合的总体框架

(1)Collection接口图

(2)map接口图

上述2个图片分别来自于

http://www.cnblogs.com/nayitian/p/3266090.html

https://www.cnblogs.com/nayitian/p/3267110.html

下面我将每一个接口或类进行详细介绍,其中他们所拥有的方法就不介绍了,可以自行查API,另外,很多方法也不会用到,常见的方法就那么几个。

1.Collction: 

Collection接口继承自超级接口Iterator,是Collection层次结构中的根接口。Collection表示一组对象,这些对象也被称为Collection的元素。一些Collection允许有重复的元素(例如List),但是另一些则不允许有重复的元素,即可为无序的(如Set)。JDK不提供此接口的任何直接实现---它会提供更为具体的子接口(如Set和List),这从上面的UML也可以看出来。此接口用来传递Collection,并在需要最大普遍性的地方操作这些Collection。其实现类的底层是由数组或者链表组成,数组是通过首地址+(元素长度*下标),即通过下标查询的,因此查询速度快,而增删慢(在增删的时候,数组需要整体的移动,所以慢);链表不维护序号,即链表不存在下标的概念,所以查询很慢(通过地址查询的),而增删快(直接通过地址删掉某一个元素,其它元素不需要移动)

  数组:查询快,增删慢;链表:查询慢,增删快

1.1.List:有序,可重复

  ArrayList  :底层是数组结构,线程不安全。查询快,增删慢

  LinkedList :底层是链表结构,线程不安全。查询慢,增删快

  Vector:底层是数组结构,是线程安全的,所以效率很低,已经被ArrayList取代

1.2.Set :无序,不可重复

  HashSet类 及其实现类LinkedHashSet:底层是使用了哈希表来支持的,特点: 存取速度快,线程不安全,集合元素允许为NULL

  SortedSet接口及其实现类TreeSet:如果元素具备自然顺序 的特性,那么就按照元素自然顺序的特性进行排序存储。

1.3.EnumSet

  EnumSet类是专为枚举类设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值

2.Map

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组用于保存Map里的value,key和value都是可以任意引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false. 给key-value起个名字:Entry,表示一个键值对,对应Map的一个实体;把Entry放到集合set中就是一个Map 如果把Map所有value放在一起来看,元素与元素之间可以重复,每个元素可以根据索引来查找,相当于list集合,只是Map中的索引不再使用整数值,而是以另外一个对象作为索引。如果需要从List集合中取出元素,需要提供该元素的数字索引。 如果需要从Map中取出元素,需要提供该元素的key索引,因此,Map也被称为字典。

常见的实现类:

2.1.HashMap:

  采用哈希表算法, 此时Map中的key不会保证添加的先后顺序,key也不允许重复.key判断重复的标准是: key1和key2是否equals为true,并且与hashCode相等.其中实现类LinkedHashMap采用了链表和哈希表算法

2.2.TreeMap:

  sortedMap接口的实现类,采用红黑树算法,此时Map中的key会按照自然顺序或定制排序进行排序,,key也不允许重复.key判断重复的标准是: compareTo/compare的返回值是否为0.

2.3.Hashtable:

采用哈希表算法,是HashMap的前身(类似于Vector是ArrayList的前身).打死不用. 在Java的集合框架之前,表示映射关系就使用Hashtable.所有的方法都使用synchronized修饰符,线程安全的,但是性能相对HashMap较低.其子类Properties要求key和value都是String类型. 


本文摘自:

https://www.jianshu.com/p/b878a4e1c762

https://blog.csdn.net/qq_33440140/article/details/76945557

http://www.cnblogs.com/nayitian/p/3266090.html

https://www.cnblogs.com/nayitian/p/3267110.html

java基础(二):谈谈Java基本数据结构的更多相关文章

  1. Java面试题总结之Java基础(二)

    Java面试题总结之Java基础(二) 1.写clone()方法时,通常都有一行代码,是什么? 答:super.clone(),他负责产生正确大小的空间,并逐位复制. 2.GC 是什么? 为什么要有G ...

  2. 062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用

    062 01 Android 零基础入门 01 Java基础语法 07 Java二维数组 01 二维数组应用 本文知识点:二维数组应用 二维数组的声明和创建 ? 出现空指针异常 数组的名字指向数组的第 ...

  3. 010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二——变量类型——即Java中的数据类型

    010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二--变量类型--即Java中的数据类型 Java中变量的三要素 变量名 变 ...

  4. Java入土--Java基础(二)

    Java基础(二) 接上一讲,我们接着来聊聊Java的一些基础知识,下一讲就会进行流程的控制. 类型转换 首先呢,是类型的转换,接上一个内容的数据类型,类型转换就是数据类型更进一步的应用. 由于Jav ...

  5. java基础学习总结——java环境变量配置(转)

    只为成功找方法,不为失败找借口! 永不放弃,一切皆有可能!!! java基础学习总结——java环境变量配置 前言 学习java的第一步就要搭建java的学习环境,首先是要安装 JDK,JDK安装好之 ...

  6. 054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述

    054 01 Android 零基础入门 01 Java基础语法 06 Java一维数组 01 数组概述 本文知识点:数组概述 为什么要学习数组? 实际问题: 比如我们要对学生的成绩进行排序,一个班级 ...

  7. 006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序

    006 01 Android 零基础入门 01 Java基础语法 01 Java初识 06 使用Eclipse开发Java程序 Eclipse下创建程序 创建程序分为以下几个步骤: 1.首先是创建一个 ...

  8. 003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程

    003 01 Android 零基础入门 01 Java基础语法 01 Java初识 03 Java程序的执行流程 Java程序长啥样? 首先编写一个Java程序 记事本编写程序 打开记事本 1.wi ...

  9. Java基础16:Java多线程基础最全总结

    Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进 ...

  10. Java基础教程:Java内存区域

    Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

随机推荐

  1. 从git仓库导入idea的gradle项目无法添加依赖包问题

    引言 之前将项目导入到git仓库,后来同事从git仓库将项目导入到本地,发现无法导入依赖包. 解决方法 这个勾idea是默认勾上的,意思是idea将默认使用本地离线工作模式,使用的是本地仓库,每次依赖 ...

  2. 使用kibana可视化报表实时监控你的应用程序,从日志中找出问题,解决问题

    先结果导向,来看我在kibana dashborad中制作的几张监控图. 一:先睹为快 dashboard1:监控几个维度的日志,这么点日志量是因为把无用的清理掉了,而且只接入了部分应用. <1 ...

  3. 24分钟让AI跑起飞车类游戏

    本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...

  4. c# 多种方法调整屏幕亮度

    Github: https://github.com/CHNMaxGor/AjustScreenBrightness 方法一: 使用网上常说的 Gdi32.dll 下的 SetDeviceGammaR ...

  5. [PHP] debug_backtrace()可以获取到代码的调用路径追踪

    查看代码的时候,看到有使用这个函数,测试一下 1.debug_backtrace()可以获取到代码的调用追踪,以数组形式返回 2.debug_print_backtrace() — 打印一条回溯,直接 ...

  6. Python猜数小游戏

    使用random变量随机生成一个1到100之间的数 采集用户所输入的数字,如果输入的不符合要求会让用户重新输入. 输入符合要求,游戏开始.如果数字大于随机数,输出数字太大:如果小于随机数,输出数字太小 ...

  7. HTML 练习清除浮动 :after

    为 clearfix 类所在的 div 内部最后处添加一个 div 标签,内容为 . ,高度为0, 隐藏 <!DOCTYPE html> <html lang="en&qu ...

  8. 如何给自己的app添加分享到有道云笔记这样的功能

    文章同步自http://javaexception.com/archives/34 如何给自己的app添加分享到有道云笔记这样的功能 问题: 在之前的一个开源笔记类项目Leanote中,有个用户反馈想 ...

  9. 使用bat脚本永久激活Windows系统

    每次重装完系统后,右下角会提示系统未激活,无法进行一些个性化设置. 在这里我自己写了一个bat脚本用于激活Windows系统.(仅供学习) 文件下载: 链接:https://pan.baidu.com ...

  10. python 自学之路-Day one

    一.Python介绍 创始人吉多范罗苏姆(龟叔),脚本解释程序 应用领域广,数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等. 主要应用领域: 云计算:OpenStack: WEB开发:经 ...