数组

来源:互联网 发布:windows自带录制视频 编辑:程序博客网 时间:2024/04/30 07:23

 

 

 

//数组的定义 

         就是同一种类型数据的几何,其实数组就是一个容器。

         我们在运算的时候,可能会有很多数据参与运算,我们先想的不是运算,而是先要把这些数据临时存储起来,以便于方便后期运算,数组就是存储数据的一种方式。

         定义的数组就是一个容器,装的东西就是数组中的元素,元素的类型可以是任意的,但是一个数组里面的元素类型必须要是统一的。因为只要数组一定义,里面的类型就已经固定了。

//数组的好处:数组这个容器会自动给存在里面的元素进行编号,从0开始编号,以便方便操作这些原始。

//数组的格式:

格式1:元素类型[]  数组名=new 元素类型[元素个数或数组长度];

                            有的人把[]放在数组名称后面也是正常的,但是通常上面的为规范的。

                   需求:定义一个可以存储3个整数的容器。

                   int[] x=new int[3];

                            []表示这个定义的东西是数组,

                            new这个关键字用来在内存中产生一个容器实体,

                            其中x表示的数据类型是数组类型(引用数据类型中的一种),不是整数类型

         任何一个应用程序在内存中运行的时候,都是需要先在内存中开辟一个空间。

 

应该可以这么来理解,数组类型其实就是一种变量集合,就像数学里面的元素,元素的集合一样,我可以用数学里面的一些概念来进行类比java里面的概念进行理解。

 

 

//内存结构

 

java程序在运行的时候,需要在内存中分配空间,为了提高运算效率,有对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

//栈内存:用于存储局部变量,当数据使用完,所占空间会自动释放;

//堆内存:

数组和对象,通过new建立的实体(即数组或者对象)都存放在堆内存中;

每一个实体都有一个存放位置,即内存地址值;内存里都是一些二进制的地址值,来标示数据存放的位置。引用时,只需要引用这个地址值,就会输出这个地址值上存放的数据。

只要数组或者对象一被定义,里面的实体中的变量都有默认初始化值;都是根据数组中元素的类型定义默认值。boolean型默认为false。

实体不再被使用,会在不确定的时间内被垃圾回收器回收。

//方法区,本地方法区,寄存器。

//主函数运行的时候会在栈内存里开辟一个空间进行运行;再定义个新函数同时又会在栈内存里继续开辟新空间,

//栈内存的特点:数据使用完毕,会自动释放。

//凡是局部变量都在栈内存里。

         局部变量就是定义在方法中的变量,定义在方法中的参数的变量,定义在for循环里面的变量都是局部的变量。

//new产生出来的东西或者说实体都在堆内存里面,实体包括数组和对象,数组也能称之为对象。

//如果不想让定义的数组类型的变量指向数组,那么就定义x=null;只有引用数据类型才可以用这个null常量。x=null表示值为空。这时候这个变量就与堆内存没有关系了。是无法再调用或者引用数组中的数据的,他已经不再指向原数组了。当堆内存的一个实体没有任何引用来使用它时,jvm会视这个实体为垃圾,这个垃圾不会立刻被内存清除掉,而是在不定时的时间内启动一个垃圾回收机制,将这个实体在堆内存中清除。

在int[] x=new int[3];这种格式中,可以这么理解,前面部分就是放在栈内存中的,后面内存就是放在堆内存中的。

 

//java垃圾回收机制

java成长自c++,优化了c++语言的一些特性,而变得更简单易学易用,尤其在内存这块,其优化比c++做的好,c++的程序会运行时在内存中占用空间,当内存中的实体越来越多的时候比较占用内存空间,哪一个实体不用了就需要释放内存去存放其他的数据。c++的做法是由程序员手动调用一个功能将内存中的数据清除掉,需要手动做,如果程序员忘记做了,这个程序运行时间越长,程序越慢,甚至最后死机。而java把这个过程优化了,不需要手动清除,只要这个对象或者实体已变成垃圾,jvm就会自动启动垃圾回收机制将堆内存中不会使用的实体清除掉,但是不一定会马上执行,实在不定时的时间清楚。

                   这里堆内存与栈内存就不一样, 栈内存是自动释放,堆内存是垃圾回收机制。

 

//引用数据类型和基本数据不一样的特点:

 

注意:1、数组类型和对象类型数据不是必须要放在堆内存里面的,但是堆内存里面放的数据只能是这两种类型;

2、堆内存中的数据必须要是某些关键词如new等定义的数组或者对象数据。只要是new,内存就会开辟一个新的区间。

3、堆内存里的数据被引用不是直接引用的数据本身,而是引用的数据对应的内存的位置的二进制地址值。因此地址值上的表示的变量的值发生变化,就是堆内存里的这个数据就发生了变化。其实操作引用数据变量就是直接操作这个对应的地址值上的数据。可以理解为堆内存是一个碗,用不同个变量名去取名或者操作,就是让他们去端这个碗进行操作,同一个碗,无论谁操作后,任何人再想操作这个碗时里面的数据就是之前的操作者放的数据了。

4、数组类型与变量的主要区别就是数组可以多个人去用,结果都是一样的,而变量则不同,谁用就谁去定义。有一个特点就是,一个人把结果改变了,大家都要用新结果。数值结果可以任意变,但最后结果会随着数值结果变而变,而不需要对数组变量进行改变。因为碗没有变化。

 

案例,两个引用在同时操作同一个数组,一个引用的变量值发生变化,另一个也肯定是发生变化了的。

 

x=null是表示x不在引用数组里面的数据了。

int[]x=new int [3];

int[]y=x;

y[1]=89;   打印出来的x[1]也是89;

而,基本数据类型中,int a=5;int b=a; b=8;最后a还是等于5的。

 

//数组的格式:

         格式2:

                   元素类型[] 数组名 = new 元素类型[]{元素,元素。。。。。};

                   可以简化写为:元素类型[]数组名 ={元素,元素。。。。。};

 

                   静态处理方式

                   创建一个数组实体,并在每一个位置都添加了具体的数据。

 

//数组在操作中出现的常见问题:

1、数组在运行时才会在内存中定义出来并被分配编号,在编译时还没有定义出来分配编号,编译只会检查语法错误,所以当你的数组脚标出现错误时,在编译时是不会被提示,只有在运行时会提示。如

int[]arr=new int[3];

System.out.println(arr[3]);  这个数组最高的脚标只是2,因为从零开始编号的。

2、x=null;System.out.print(x[3]);这也是在编译中不会报错,而是在运行中报错。理由同上,编译不会被内存去定义数组空间和分配,所以识别不出来。

 

 

//最常见的数组操作应用:

1、获取数组中的元素:

//数组中有一个属性可以直接获取到数组的元素和个数;length。使用方式,数组名称.length=

         注意,但凡有数组的情况下,一般都会用到for循环。

         练习,求一个数组中所有数据的和。

                            定义功能,用于打印数组中的元素。元素间用逗号隔开。

 

 

同函数中,不能取同一变量名,不同函数无所谓。

 

//练习

         1、获取数组中的最大值,以及最小值。

         在初始化时,可以将临时初始化为数组中的任一个数据,也可以为任一数据的脚标,同样的原理。

         小细节:java中如果用-的话不要直接用,而是用下划线。

 

         2、对给定数组进行排序。

 

//比较排序,

//冒泡排序,面试中比较常见。

         冒泡排序:相邻的两个元素进行比较,如果如何条件进行换位。

         特点:所有数据比完一次后,最大值就到了最后面的位置,在下一轮的比较中,是不需要再参与比较了的。

//这些排序都差不多,原理都一样,只是比较的方式有区别,排序是一种算法,了解这种算法原理就可以了,排序有很多中,什么插入排序,快速排序,其实最快的一种排序方式是shell排序,他是三层循环夹着位运算来排序,速度是最快的,效率是最高的。一般是不需要了解和使用它。

上面排序编写的代码方式不只一种。有很多很多种。

如果数组中要比较的数据很多的话,要考虑效率和性能的问题,课堂上讲的一种代码方法是性能比较低的,只是代码好记而已。性能低是因为每一次符合条件就需要在数组中对数组内部的元素进行位置的置换,而堆内存中换位置比较消耗资源,当然不算太大,如果对需要换位置的元素先不要在堆内存中置换,我先把他们的脚标和对应的元素在栈内存中定义两个变量临时记下来。当把所有元素比较完后,我取最终需要换位置的值就可以了。即把在堆内存中频繁的换位置转移到栈内存中,堆内存第一圈比较我就换一个位置就够了,避免无用的反复置换互换。但是在真实开发中这种思路并不常见。这种思路比堆内存需要在栈内存中多定义两个变量。

         java语言有一个非常好的排序的功能。用Arrays.sort(arr);的关键字就可以了。但是好像只能从小到大排,另一方式咋回事。

             Arrays.sort(arr);是java中已经定义好的一种排序方式,开发中对数组排序,就要使用该句代码。

        

         注意一点的是,在编程中,可以就一个同一种运算可以进行功能封装,也可以就某一个变化的因素通过变量进行功能封装。比如上面的排序中,可以单独就位置置换的运算进行功能抽取。

 

应该可以这么来理解,数组类型其实就是一种变量集合,就像数学里面的元素,元素的集合一样,我可以用数学里面的一些概念来进行类比java里面的概念进行理解。

 

//数组的另外一个操作——查找一个元素在数组中的位置。

         一般最简单的方式就是在遍历的过程中进行判断。

         定义功能获取元素的位置时,都是第一次出现的数组中的位置。因为函数中的return功能有结束语句的功能,一旦符合条件之后,语句就执行结束。

 

//折半查找。——可以提高查找的效率。缩小范围查找。这种方法有一个前提就是这个数组要先是有序的数组才可以。——课堂上演示了两种思路。

 

练习:有一个有序的数组,想要将一个元素插入到该数组中,还要保证该数组继续是有序的。

意思就是获取该元素在数组中的位置。

 

进制转换的练习。

 

//查表法:将所有的元素临时存储起来,都建立对应关系,每一次&15后的值都作为索引去查建立好的这张表。就可以找到对应的元素。这样比“-10+a”简单的多。

可以通过数组的形式来建立表。

 

字符数组在数组中的默认初始值值是”\u0000”是unicode码,表示空位。

 

x- -与- -x的含义的不同:见视频57最后几分钟。

这两个符号他有一个赋值的含义在里面,只是把前面的变量给省略了。

即后减减的含义是指,先取给定的x值,然后再减1,减一后得到的新值又赋给x新值重新被取用,如此反复。

先减减的含义是指:先取给定的x值减去1的值,后面接着取再减1的值。

 

return关键字,就是结束语句并返回值的功能,可以放在函数任何的需要的地方

 

//二维数组:

         可以理解为数组当中的数组。

         格式:

                   int [] arr =new int[3];//这是定义了一个一位数组;

                   int[][] arr = new int [][];//定义了名称为arr的二维数组,二维数组中有3个一维数组,每一个一维数组里面有四个元素。

                   3是二维数组的长度,4是指二维数组中每一个一维数组的长度。

                   地址值,哈希值。

         格式2:

                   int[][] arr=new int[3][];表示三个一维度的数组还没有初始化,所以用的是默认初始化,而数组是属于引用数据类型,所以其值就为空即null,即这三个变量都没有任何的小数组指向。。

                   不规则数组,规则数组

 

                   int[][] arr = new int[3][];没有初始化一维数组;

                   arr[0]=new int[3];手动初始化二维数组中的一维数组;

                   arr[1]=new int[2];   arr[2]=new int[4];      给数组中的元赋值arr[1][1]=69;

 

                   System.out.println(arr.length);  是指打印二维数组的长度即为3;

                   System.out.println(arr[0].length);指打印二维数组中第一个一维数组的长度。

 

//另外一种初始化的方式:数组的静态初始化方式,直接指定元素内容。

         int[][] arr={{},{},{}}

数据多了需要进行容器的存储。

 

//数组的定义方式

int[]x;intx[];这是一维数组的定义方式;

int[][]y;int y[][];int[] y[]; 这是二维数组的定义方式;

int[]x,y[];这是x表示一位数组,y表示二维数组;一般实际开发中不用这种定义方式,不实用,太复杂,容易看错。

定义含义表示,[]在谁的后面就是跟谁走在一起。

 

 

                  

         

0 0
原创粉丝点击