首页 > 编程语言 > 详细

数组的基础知识点

时间:2019-09-27 09:59:45      阅读:52      评论:0      收藏:0      [点我收藏+]

一、数组的定义:

    一组数据,同一种类型数据的集合,其实数组就是一个容器;数组作为一个容器,能装数据。

二、数组与变量的区别:

    能装数据的是什么,是变量!变量只能装一个数据,装第二个就把第一个覆盖了。这是变量的特点。

三、数组的好处:

    可以自动给数组中的元素从0开始编号(举个例子:一班同学,老师无需记住每个学生名字,只需要给同学们按座位编号,然后叫座位号就可以找到相应同学)

四、Java对数组容器如何体现:

    1、格式

        首先看格式,这个格式就像模型一样,以不变应万变,
        数组类型 [] 数组名 = new 元素类型 [元素的个数或数组的长度]

    2、格式的创建由来以及格式关键词的具体分析     

        数组是一个容器,而容器就是一个实体,它在内存中要建立的话,必须得有区别于其它的内容,所以它需要一个关键字来建立,这个能存储很多数据的实体。
        这个关键字就是new,通过new,产生一个空间,这个空间里有很多数据,这里要存什么数据呀,比如说整数,而这些整数要存到哪个内存空间呀,

        因为容器有很多种,数组只是容器中的一种,
        所以 new int []; 就是建立一个能存储int类型的数据的数组,还没完,数组这个容器它最大的特点是一旦建立,必须要明确长度,想装3个,

        那么就是 new int [3];创建完
        之后能用么,很遗憾,用不了。我们要用它,得起个名字啥得,你要想起名字,通常情况下是不是得确定类型。比如我们写个3,这个3要想被应用得更方便,

        是不是给他起个名字,x = 3;x是不是代表3了,要是把3写得更确切一些,是不是 age = 3 , number =3;可是这个年龄的名字是不是得有一个类型呀,

        什么类型呀,int;现在我产生的是一个数组实体,所以 int [] arr = new int [3]; 第一个int表示数组装的什么元素,第一个 []代表变量类型,

        arr数数组名称,new是新建,int 是数组类型,[]是数组,3是数组长度;数组有很多种,怎么区分呀,就是int,苹果框,橘子框,声明了一个int类型的数组,

        名称叫arr,右边是用new关键字创建了一个数组实体,该数组中的元素是int类型,并可以存储3个整数类型数据。这就相当于我创建了一个箱子,

        箱子里面有三个格子,格子里面我装东西了么?没有。这格子里面有什么特点呢,是不是带着编号,0号格子,1号
        格子和2号格子。arr是数组名,你想操作数组中的某个格子该怎么办呀,arr[0],指的是数组的0角标的格子,专业术语叫索引,这样做,

        就是取出名称为arr数组中的0角标下的元素,那咱们就弄一下吧,这是几呀,arr[0]为0,arr[1]为0,都是0.这是什么概念,大家到这里我们就知道一点,

        大箱子创建完之后,里面它已划分好了格子,格子里面如果没有赋值的话,它里面有默认值,默认值为0;这就是对数组中的每个格子的基本操作,

        用的就是这种格式,数组名 加中括号,里面加索引号,大家,它有3角标么,有第三号角标么,这就是数组的定义和最简单的使用。

五、数组在内存中的一个基本分布:

    任何一款软件的启动都会划分一片内存空间,比如 这一片是qq,这一片是迅雷,这一块是jvm,它启动以后,jvm启动以后,这块内存空间会被划分出来,而划分完后,

    虚拟机还会对这块内存空间进行更细致的划分,为什么呢,不划分,就在这一片跑呗。说简单一点,我搞个运动场子,田径运动场,田径运动场不光有跑步,还有

    跳高,标枪,可劲来么,大家,如果在田径运动场上,我不准备划分这么多区域,就这片地,可劲用,跑步的不知道在哪跑,前面跳远的是不是得绕道呀,撇标枪得是不是
    就嗨了呀,说白了,是不是谁手里握着武器,就谁说得算,而跑步那哥们他到底跑几圈不重要,他要躲撇标枪得哥们,所以呀,这个田径运动场是不是要进行区域得划分
    为什么呀,和田径场是一样得,每一片内存内部数据的处理方式都不同,都有其自身处理特点,就是运算方式不一样,

六、内存的划分:

    1、内存类别

        1>、寄存器  2>、本地方法区 3>、方法区 4>、栈内存 5>、堆内存

        这五个内存都有什么特点呢?寄存器不用管了,是给cpu来处理的。本地方法区咱们暂时涉及不到,都是些和所在系统相关的,比如说Java虚拟机怎么样,是不是分版本呀,Linux window iOS,它在不同的版本下调用的是不同的操作系统的内容,所以这个是本地方法区的内容,指的是本地系统平台上的内容。3方法区,我们暂时讲不到,还没有讲到更多的类加载技术,这个区域后面肯定会讲的。还有栈和堆,我们今天就重点先说下栈和堆的内容。

 

    2、栈内存:

    它里面到底存的是什么,换句话说,它所定义的田径项目是什么,存储的都是局部变量,凡是定义在方法中的都是局部变量。所以先加载该函数,再在所属空间
那片区域中是不是再进行变量的定义呀。这局部变量还有哪有呀,for循环
      特点:   1、存储的都是局部变量
          2、而且变量所属的作用域一旦结束,该变量就自动释放。
          3、栈内存的声明周期很短,所以更新很快。

    3、堆内存:

      特点:1、存储的是数组和对象(其实数组就是对象),先知道数组存到堆里面。凡是new建立在堆中
            2、堆是不会随时释放的,要不然就和栈一样了。
            3、每一个实体都有着地址值
            4、堆内的每一个变量都有默认初始化值,根据类型的不同而不同,整数是0,小数是0.0或者是0.0f,bollean为false,char默认值为‘\u000’(反斜杠
          \u是unicode码,文字和数字对应关系的一张表);
            5、垃圾回收机制

    4、堆内存的详述: 

     首先,这哥们是不是在主函数当中,int [] arr 是不是局部变量,在栈内存当中的,new int [3]是不是数组对象,在哪呢,在堆内存当中呢,堆里面存的都是实体,
数组叫实体,对象也叫实体,什么叫实体,实实在在存储的个体,实体干嘛用的,我告诉你它的作用只有一个,用于封装数据,而且能封装多个,这是堆的特点,
堆里面存储了一个实体,实体里装一堆数据,有一个数据挂了,是不是其他数据还可以用,那能随便消失么?而栈不是,有N多变量,一个挂了随时消失,这就是
区别。
首先是主函数先进内存,是不是进栈内存,为什么方法要进栈呢?那是因为局部变量都在方法里面呢,方法不进栈,局部变量能进栈么?因为局部变量是属于方法
的么?为什么你的方法里有x,我这方法里也有x,为啥不冲突呢?它不冲突呢,是不是它有所属呀。所以呀,主函数先进栈,然后是arr。
    创建对象是不是右边赋给左边,右边是一个具体值么?不是,是不是一个实体呀,实体是不是创建在堆里面呀?堆就来了,它首先会通过new关键字在堆内存当中
开辟一个空间,开辟完之后,这个空间有一个特点,就是内存在存储数据的时候都通过地址来体现的。 所谓的内存地址,无非就是一串连续的二进制,懂么,就是
一堆数字,但是因为这个数字,因为太长,一个8位数一个二进制位单元字节是不是又8个二进制位,所以很长怎么了呢,就用了16进制来表示,大家都知道。
进制越大,表现形式变短。所以就给这个实体分配了一个内存地址,其实我跟你讲,任何数据在内存当中都有地址,内存杂存储,就是用地址存储的,数组就分配
完一个空间了,分配完以后,大家都知道,数组里是不是都有索引,就是角标,数组一初始化完,是不是就又三个格子呀,每个格子都有自己的编号,数组这个
实体,在堆内存产生完之后,它的每一个空间都会有一个默认初始化,这是堆内存的特点,堆内存的变量都会有一个默认初始化值,数组是个实体,它里面是不是
要存储很多数据呀,这些数据在没有初始化的时候,一般不能用呀,而在堆里面,这些数据可以用,而堆会对这些数据进行什么,叫做默认初始化,栈里面有么?
绝对没有,这就是栈堆内存的不同,初始化是几呀,不同类型,初始化的值是不一样的,byte int long 初始化都是0 。 小数初始化是0.00;如果是float类型
是0.0f;如果是bollean,默认值是假;

      怎么实现建立一个存储数值类型的数组赋给声明的数值类型变量。 这个实体是不是有地址呀,它就把这个地址赋给了arr,
arr有这个地址就指向了这个数组,基本数据类型是不是要把运算的具体数据存储道该变量当中,比如 int x=4;而到了数组,不再把整个实体存到变量中来,它存储
的仅仅是这个实体的地址,这种我们不再叫基本数据类型,叫引用数据类型。这个我们称之为arr引用了堆内存当中的一个实体,或指向,指针,记住,Java承掌自
c++,它是基于c++成长起来的语言, 它和c++非常像,它优化了c++,它把c++里面容易出问题的地方都给屏蔽掉了,或者换一种其它的方式,说白了,有点改良,
因成立于不同的公司,所以成为Java语言,c++中叫做指针,到这里叫做引用,(朝阳区国家会议中心北写字楼,是不是把这个地址给你,你就找到这个楼了呀,
这个楼一直在那,你根据那个地址是不是就能找到了呢),而把地址给你了,你把楼装兜里了么,没有把。所以想操作数组,就可以操作地址来。
sop(arr[0]),我这一输出arr这个数组,是不是代表着先找arr,找到以后呢,是不是通过这个地址找到arr所引用的数组,找到这个数组以后,是不是找0角标元素,
arr[0]=89;这个动作是啥意思?是不是给零角标上的元素进行赋值,是不是默认值0被覆盖了,然后取值的时候,是不是也是89了,
    arr是不是指向一个实体,不想让它指向了,怎么办,arr=0呗,多崩溃呀,arr是啥是不是引用数据类型,引用数据类型只能指向实体,要么什么都不指向,为空,
我现在的arr是什么类型,是数组类型,引用类型中的一种。你让arr不做任何实体指向,怎么办,这个时候就用到空了。arr=null;能取消这个引用型变量的指向,
当你给这个变量赋值为空,它就变化了,变成谁了呀,就变成了空,变成了空,还有这个值么,就没了。还指向么,指向什么东西呀,刚才我告诉你地址,现在不告诉
你了吧,你忘了吧,这个地址没了,卡一个如来神掌是不是失忆了呀,失忆了是不是啥都不知道了呀。 这个数组是不是没人用了,它在堆里面是不是除了
占地方,啥用都没有了呀。这个时候,注意,它不像栈内存,立刻被释放, 而是把它视作为垃圾,垃圾不垃圾的小事,关键是着垃圾怎么办呢,收,这个哥们的
垃圾是自动回收,

    啥时候收呀,在不定时的时间内,因为它里面做了一个垃圾回收机制,其实这是个程序,它自动的去检测堆里面是否有垃圾,如果有的话,
它会去做回收动作,但是什么时候去,不一定,它有它自己的机制。大家可以试想,堆里面就出现一个垃圾,有必要立刻回收么,没有必要。
垃圾回收就如同我们教室里出现了垃圾,环卫工人过来帮我们收是一个道理,这个优秀的内存管理机制和c++是不一样的,c++也有这样的对象,也有堆内存,
也有垃圾,但是它的回收是由程序员手动清理的,不清理,堆里面会越占空间越大,一会就死机了。内存溢出了,是这样的,c++里有一个功能,叫做析构
函数,来完成这个垃圾的回收,我着产生一个垃圾,我要自己把它收走,又产生一个,我愿意收的话,就再把它收走。也可以不收,等到下一个再收,反正
是你自己的,我着运行老多垃圾了,就是不收,周围全是垃圾。那你是不是挂了呀。Java不是这样的,垃圾有没有,垃圾回收机制会自动收,什么时候收不知道。
叫做环卫处会自动过来收垃圾,但是人家天天过来么,不一定,时时过来么,是不是也不一定,所以Java在内存管理这一块要优于c++;

    5、数组操作时所引发的一些小现象:

 

    int [] arr = new int [3];
    System.out.println(arr[3]);
    编译和运行是分开的,我编译可是我不运行,可是内存空间占了,我是不是运行的时间才需要占用内存空间,我编译的时间就快把内存空间占完了,可是我不运行,
这是不是浪费空间,所以编译只是检查语法错误,这句话又语法错误么?没有3这个角标呀,3这个角标是运行的时候才找吧,编译时候需要找么,不需要。
所以编译是没有问题的,注意看,运行时看谁,是看虚拟机了吧,虚拟机去创造了数值实体,创建完在走arr[3]的时候,到数组里面找角标3,有么,没有。
什么时候产生的问题?运行么。
当访问到数组中不存在的角标时,就会发生数组索引越界异常。
    int [] arr = new int [3];
    arr = null;
    System.out.println(arr[3]);
当引用型变量没有任何实体指向时,还在用其操作实体,就会发生空指针异常。
int[] arr= new int[3];
System.out.print(arr);//[I@1f32e575
    打印出来[I@1f32e575这玩意,1f32e575这是个哈希值,本身是一个算法,由这个算法来定义数组在内存当中存储的位置,你可以简单的把它理解为地址值,
但是算法算出来的值很有特点,如果冲突了,它会继续往下算,这个是Windows来支持的。Java是调用了Windows哈希这种方式来算出它在内存中的存储
位置,为什么,最终开辟分配空间,谁说的算,是不是Windows,这个值为什么这么乱呢,这个值它本身也是二级制地址值,只不过呢,为了简单表示,
变成16进制了,大家看是不是有字母。这值怎么算出来的,跟你没有关系,也不需要知道,这是哈希具体的算法内容。而这个@是分界线,左边是需要大家
看懂的。这个左边代表的是这个实体的类型,如果有一半中括号,这个实体类型是数组型实体,这里面写的i通常代表着int类型的。下回看见这东西就别发怵。
但是,大家看,打印这个有意义么。那么一般什么时候用呢,一般做测试的时候会用一下,什么时候测试呢,跟我们说的那个测试项目不太一样,当我们不知道
这个变量接收的是什么的时候,我们可以直接把这个引用型变量打印一下,打印完右边不用看,就看左边就可以了。这样,我就会知道,这个实体是什么类型的
实体。

 

     

     

 

数组的基础知识点

原文:https://www.cnblogs.com/wangwei07/p/11595470.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!