数据结构二之动态数组

本文介绍了数据结构中的动态数组,包括线性结构、树形结构和图形结构的基础知识。重点讨论了动态数组的概念,强调其长度可变、支持泛型以及在Java中的实现,如ArrayList。分析了动态数组的优缺点,并提到了对象存储和内存管理的注意事项,特别是与垃圾回收机制的关系。

在学习动态数组的时候我们先来认识一下什么是数据结构
数据结构是计算机存储和组织数据的结构
按照结构形式,常见的有线性结构、树形结构、图形结构

1、线性结构
线性表是指:具有n个相同类型元素的有限序列(n >= 0)
在这里插入图片描述
在这里插入图片描述
常见的线性结构有:数组、链表、栈、队列、哈希表(散列表)
在这里插入图片描述

2、树形结构
常见的属性结构有:二叉树、二叉搜索树、平衡二叉树、AVL树、红黑树、B树等
在这里插入图片描述3、图形结构
常见的图形结构有:邻接矩阵、邻接表
在这里插入图片描述
数组
数组就是⼀种可以存储⼤量数据类型相同的变量的数据结构,数组就是⼀个具有相同数据类型的数据集
合。
注意:
1、需要注意的是用同一个数组,里边储存的必须是相同的数组类型。
2、数据一旦创建,长度是固定的(一旦在推中开辟内存将不能修改)
3、如果存的的基本数据类型,则存储的是他们的数值,如果储存的是对象类型,则存的是对象的内存地址

数组的基本要素
1、数据类型
2、数组名称(也叫是它的变量名)
3、数据下标(数据的下标是从0开始的)
4、元素内容(每一个下标对应储存一个元素,)

数组的创建方式
1、语法:数据类型[] 数组变量名 = {值1, 值2,……} Int [] array = {12, 34, 56,……};数组的长度就是值的数量
2、语法:数据类型[] 数组变量名 =new 数据类型[capacity]; int[] arr = new int[10];,生命的时候带上数组的长度
3、语法:数据类型[] 数组变量名 =new 数据类型[]{元素1、元素2…}; int[] arr2 =new int[]{1,2,3,4,5};

数据常见的错误
1、数据类型不匹配
2、边声明边赋值的⽅式,代码必须写在同⼀⾏,不能换⾏。
3、数组下标越界。

动态数组

动态数组,可有理解为长度可变的数组,就是可以动态的改变数组的长度,java中底层使用了动态数组的就是ArrayList,arrayLisy在规划在集合体系中
特点:
1、长度可变
2、支持泛型,所以同一个ArrayList可以同时存储所有的所有的数据类型。
3、可以储存重复的元素,可以储存null
动态数组的优点
1、可以动态改变数组长度,使用方便
2、可以储存任意的数据类型
3、根据下标查找任意的元素效率高,直接根据下标计算出它的存储地址,时间复杂度为O(1)
缺点
1、删除和修改非末尾的元素效率低,若删除添加中间的某个元素,后边的元素都要移动,重新计算下标地址,这时候他的时间复杂度为O(n);
2、有可能造成空间的浪费,因为动态数组固然涉及到扩容,看以下源码可以知道int newCapacity = oldCapacity + (oldCapacity >> 1);,java官方的ArrayList扩容后的长度是扩容前的1.5被,比如初始化一个长度为1000的数组,并存999个元素,但是当我又想往里边存两个的时候 由于1001 >1000 ,容量不足,则会发生扩容,扩容后的长度变为了1500,但是这时候只存了1001个元素,就是说还有499个位置是空的,这就造成了浪费

 private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

注意
需要注意的是当储存的是对象类型的时候,他储存的是对象的内存地址,当我们要删除某个对象的时候,只要把它对象的内存地址设为null就可,你可能想,这样会不会造成内存的浪费,因为虽然对象对应的内存地址没了,但是对象还存在堆中,会不会占用了堆内存;不会的,java有个垃圾回收机制,也就是gc,当jvm检测到对象没有引用的时候,会自动的回收这个对象,释放内存,如下图:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值