Java基础-JAVA中常见的数据结构介绍

                                          作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.什么是数据结构

 答:数据结构是指数据存储的组织方式。大致上分为线性表、栈(Stack)、队列、树(tree)、图(Map)。 

二.线性表

  线性表又细分为两大类,即数组和链表。

1>.数组(Array)

  答:数组是连续的内存存储区。读取速度非常快。缺点就是容量固定,因此当你定义一个数组时,它的容量就已经固定不变啦!如果想要改变容量的话,只能创建新的数组,将之前的数据拷贝到新的数组中。典型代表:ArrayList(内部封装的是数组)。

2>.链表(linked list)

  答:链表在java中的实现是LinkedList,内部使用引用的方式(指针)来实现,集合内不同通过Node来实现,有指向上家和下家的指针,每个节点上关联了元素。列表存放了first和last元素。写入速度非常快,但是读取速度远不如ArrayList。

 1 private static class Node<E> {
 2      E item;
 3      Node<E> next;
 4      Node<E> prev;
 5
 6      Node(Node<E> prev, E element, Node<E> next) {
 7        this.item = element;
 8        this.next = next;
 9        this.prev = prev;
10      }
11 }

3>.Java中没有指针为什么又会抛出NullPointerException?

  答:Java中没有指针指的是没有指针操作。因为Java中并没有指针型变量,也没有取值符,所谓的指针变量在C,C++,Golang等面向对象编程语言都是有指针操作的!

4>.为什么ArrayList查询速度要比LinkedList快呢?

  答:他们底层的存储形式不同,ArrayList是基于数组形式存储的,由于数组的内存地址下标具有连续性,因此如果要在100w中查询第10w条数据时,可以根据偏移量来查询(比如一次性查阅10000条记录,只需要10次查询就能查到)。而LinkedList的存储是基于链表的形式进行存储的,此时内存地址是不连续的,因此想要在100w中查询第10w条数据时,无法通过偏移量来进行查询,必须得逐个查询,幸运的是在Java源码中你可以发现当你查询一个数据时,它会帮你判断你需要查询的索引所存在的位置(换句话说,它能把LinkedList切掉一半,然后去其中的一段遍历查询出你所需要的第10条数据)。

5>.为什么LinkedList写入速度要比ArrayList快呢?

  答:还是那句话,因此他们存储的形式不同,ArrayList是基于数组形式存储的,而数组有一个致命的缺点就是容量这个概念,也就是说当你定义一个数组时,那么这个数组存储的范围就已经被确定了。尽管ArrayList可以帮我们自动扩容,当我们去查看Java源码时,你会发现所谓的自动扩容就是当数组要存满时,它会自动把数组扩容一半,即将原来的数据拷贝一份到新的数据中,因此这个过程是相当耗费时间的!而LinkedList的存储是基于链表的形式进行存储的,他在插入数据时,只需要把last和prev的属性更改即可,不需要进行拷贝数据的过程!

6>.使用Java代码测试ArrayList和LinkedList的读写速度

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/import org.junit.Test;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class PerformanceTesting {@Testpublic void testInsertFirstArrayList(){long start = System.currentTimeMillis();List<Integer> list = new ArrayList<Integer>();for (int i = 0;i<1000000;i++){list.add(0,i);}long end = System.currentTimeMillis();System.out.printf("ArrayList的在第一个索引位置新增100W条数据用时为:[%d]毫秒(Millisecond)\n" , (end - start));start = System.nanoTime();list.get(50000);end = System.nanoTime();System.out.printf("ArrayList在获取某个元素用时为:[%d]纳秒(nanosecond)\n",(end - start));}@Testpublic void testInsertFirstLinkedList(){long start = System.currentTimeMillis();List<Integer> list = new LinkedList<Integer>();for (int i = 0;i<1000000;i++){list.add(0,i);}long end = System.currentTimeMillis();System.out.printf("LinkedList的在第一个索引位置新增100W条数据用时为:[%d]毫秒(Millisecond)\n",(end - start));start = System.nanoTime();list.get(50000);end = System.nanoTime();System.out.printf("LinkedList在获取某个元素用时为:[%d]纳秒(nanosecond)\n",(end - start));}
}/*
以上代码执行结果如下:ArrayList的在第一个索引位置新增100W条数据用时为:[124293]毫秒(Millisecond)ArrayList在获取某个元素用时为:[5440]纳秒(nanosecond)LinkedList的在第一个索引位置新增100W条数据用时为:[29]毫秒(Millisecond)LinkedList在获取某个元素用时为:[617912]纳秒(nanosecond)*/

三.栈(Stack)

1>.什么是栈

  答:栈是一种先进后出的结果,完全可以通过List模拟,手枪的弹夹就是典型的栈结构。

2>.用Java代码模拟栈

四.队列

1>.什么是队列

  答:队列是先进先出的结果,也可以通过List实现。

2>.用Java代码模拟队列

五.红黑树

1>.

2>.

六.图

转载于:https://www.cnblogs.com/yinzhengjie/p/9244986.html

Java基础-JAVA中常见的数据结构介绍相关推荐

  1. java中常见的数据结构分类

    自己总结了下java中常见的数据结构和分类 在这里,我总结了list中数据结构对应我们所学的线性表,属于顺序存储还是链式存储,但没有总结set数据结构对应我们所学的哪一种(按理说应该是集合),是因为t ...

  2. Java基础笔记 – 枚举类型的使用介绍和静态导入

    Java基础笔记 – 枚举类型的使用介绍和静态导入 本文由 arthinking 发表于404 天前 ⁄ Java基础 ⁄ 暂无评论 ⁄ 被围观 1,433 views+ 1.枚举(Enum): JD ...

  3. Java异常打印输出中常见方法的分析

    Java异常是在Java应用中的警报器,在出现异常的情况下,可以帮助我们程序猿们快速定位问题的类型以及位置.但是一般在我们的项目中,由于经验阅历等多方面的原因,依然有若干的童鞋在代码中没有正确的使用异 ...

  4. Java基础-Java中的堆内存和离堆内存机制

    Java基础-Java中的堆内存和离堆内存机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 转载于:https://www.cnblogs.com/yinzhengjie/p/9 ...

  5. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二. 转载于:https://www.cnblogs.com/yinzhengji ...

  6. [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别

    [重学Java基础][Java IO流][Exter.2]IO流中几种不同的读写方法的区别 Read 读入方法 read(): 一般是这种形式 public int read() 1.从流数据中读取的 ...

  7. Java基础-Java中常用的锁机制与使用

    Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...

  8. Java基础----Java编程语言概述

    Java基础----Java编程语言概述 文章目录 Java基础----Java编程语言概述 Java编程语言概述 1-1 软件开发介绍 1.1软件开发介绍 1.2 常用命令 1-2 计算机编程语言介 ...

  9. Java基础——Java多继承的三种实现方式

    Java基础--Java"多继承"的三种实现方式 Java语言本身只支持单继承(每个类只能有一个父类),但单继承的局限性很大,因此,可以通过以下的方式实现"多继承&quo ...

最新文章

  1. 玩转Mixly – 5、Arduino AVR编程 之 逻辑
  2. Lombok 子类如何使用 @Builder
  3. 漫画:35岁的IT会不会失业?
  4. Github上的版本和本地版本冲突的解决方法
  5. 关于“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的解决
  6. nuget 下载nupkg 以及依赖包
  7. QT之Button插入图片
  8. 使用PyTorch实现手写文字识别的学习
  9. Cadence Orcad Capture全局修改元件属性方法及技巧图文及视频演示
  10. 离线语音芯片-开发指南
  11. python-日历模块
  12. 科技部原副部长吴忠泽:尽早抢占元宇宙高地,掌握下一代互联网的话语权和主动权
  13. VB连接SQL SERVER 数据库时ODBC设置
  14. 百度地图SDK,报167错误,经纬度定位是4.9E-324的解决办法
  15. 蓝汛ChinaCache打破传输瓶颈,提高宽带利用率
  16. mysql 查询各个时间段的数据
  17. vue项目JS播放音频音效和背景音乐
  18. 11.02-smbios
  19. 旅游景区管理系统(一 )旅游路线导航(MFC实现)
  20. 电影那点事,如何看一部电影?

热门文章

  1. 分析型数据库受大数据市场追捧
  2. 一些通用性的haproxy调优tips
  3. 【C#】允许泛型方法T返回空值Null
  4. 【前端开发与项目管理】
  5. python3 subprocess_Python 3.4.3 subprocess.Popen获取命令输出而不管道?
  6. 启示录 产品经理 pdf_3个月,从公司前台转行互联网产品经理
  7. java xml特殊字符处理_dom4j特殊字符处理
  8. 密码的复杂化#个人隐私保护系列#
  9. Arduino可穿戴开发入门教程Windows平台下安装Arduino IDE
  10. centos树莓派安装mysql_用树莓派实现网络批量自动安装CentOS