博客
关于我
Java面试之数组(详细)
阅读量:174 次
发布时间:2019-02-28

本文共 1277 字,大约阅读时间需要 4 分钟。

1、什么是数组?

数组(Array)是一种线性表数据结构,它用一组连续的内存空间,来存储相同类型的数据。

 

2 、什么是线性表(Linear List)?

线性表就是数据排成一条线一样的结构,每个线性表的数据最多只有前后两个方向。

例如:数组,链表,队列,栈 等都是线性表结构。

 

3、 什么是非线性表?

例如:二叉树,堆,图,等,是非线性表,是因为,在非线性表中,数据之间并不是简单的前后关系。

 

4、 数组是如何随机访问数组元素?

数组是如何实现根据下标随机访问数组元素的吗?

例如: int[]a=newint[10]

1,计算机给数组a[10],分配了一组连续的内存空间。2,比如内存块的首地址为 base_address=1000。3,当计算给每个内存单元分配一个地址,计算机通过地址来访问数据。当计算机需要访问数组的某个元素的时候,会通过一个寻址公式来计算存储的内存地址。

公式如下:

a[i]_address = base_address + i * data_type_size

arr[i] 首地址 = 数组内存块首地址 + 数据类型大小 * i ,其中i为偏移量。

baseaddress:内存块的首地址。datatype_size:数组中每个元素的大小,比如每个元素大小是4个字节。

1,数组使用二分法查找元素,时间复杂度是O(logn)。2,根据下标随机访问的时间复杂度是O(1)。

 

5、数组如何提高效率?

将多次删除操作中集中在一起执行,可以先记录已经删除的数据,但是不进行数据迁移,而仅仅是记录,当发现没有更多空间存储时,再执行真正的删除操作,这样减少数据搬移次数节省耗时。

这也是跟 JVM 标记清除垃圾回收算法的核心思想相似。

标记-整理垃圾回收算法。

在垃圾收集时此算法分为“标记”、“清除”两个阶段,先标记出需要回收的对象,再统一清除标记的对象。清除之后会产生大量不连续的内存碎片。

标记-整理垃圾回收算法

在标记完成之后让所有存活的对象都向一端移动,然后直接清理掉边界以外的内存。

 

6、用数组还是容器?

数组先指定容器大小,容器ArrayList可以动态扩容,并且封装了好多方法,一旦超过存储容量,扩容时比较耗时,因为涉及内存申请和数据复制搬移到扩容后的数组。

如果已知数据大小,且涉及的数据操作比较简单,可以用数组。2,比如已知 1 万条数据要存入 ArrayList,我们就可以事先指定容器大小。

例如下代码,就可以,省掉多次的,内存申请,和数据搬移操作

  1. ArrayList<User> users = new ArrayList(10000);
  2. for (int i = 0; i < 10000; ++i) {
  3. users.add(xxx);
  4. }

容器无法存储基本类型,比如 int long 需要转换成包装类型,类型的转换有性能消耗。4,业务开发,使用容器足够,追求性能,首先用数组。

 

7、为什么数组要从 0 开始编号,而不是1?

从偏移角度理解a[0] 0为偏移量,如果从1计数,会多出K-1,增加cpu负担。

 

转载地址:http://zwdi.baihongyu.com/

你可能感兴趣的文章
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>