c语⾔如何给数组扩容,数组的定义,扩容,增删元素,内存分
配,三种输出⽅式...
⼀、数组类型定义
* 在java中使⽤数组必须先进⾏类型说明。
数组说明的⼀般形式为:类型说明符 数组名[常量表达式],……;
其中,类型说明符是任⼀种基本数据类型或构造数据类型。数组名是⽤户定义的数组标识符。⽅括号中的常量表达式表⽰数据元素的个数,也称为数组的长度。
数组就是⼀次性定义相同数据类型的⼀组变量数组定义。
*举例
int a[10]; 说明整型数组a,有10个元素。若要表⽰第10个元素,则使⽤a[9]。第⼀个则是a[0]。
float b[10],c[20]; 说明实型数组b,有10个元素,实型数组c,有20个元素。
char ch[20]; 说明字符数组ch,有20个元素。
*特点
1.数组是相同数据类型的元素的集合。
2.数组中的各元素的存储是有先后顺序的,它们在内存中按照这个先后顺序连续存放在⼀起。
3.数组元素⽤整个数组的名字和它⾃⼰在数组中的顺序位置来表⽰。例如,a[0]表⽰名字为a的数组中的第⼀个元素,a[1]代表数组a的第⼆个元素,以此类推。
*⼀维数组
①定义:⼀维数组是最简单的数组,其逻辑结构是线性表。要使⽤⼀维数组,需经过定义、初始化和应⽤等过程。
②数组声明: 在数组的声明格式⾥,“数据类型”是声明数组元素的数据类型,可以是java语⾔中任意的数据类型,包括简单类型和结构类型。
“数组名”是⽤来统⼀这些相同数据类型的名称,其命名规则和变量的命名规则相同。
数组声明之后,接下来便是要分配数组所需要的内存,这时必须⽤运算符new,其中“个数”是告诉编译
器,所声明的数组要存放多少个元素,所以new运算符是通知编译器根据括号⾥的个数,在内存中分配⼀块空间供该数组使⽤。利⽤new运算符为数组元素分配内存空间的⽅式称为动态分配⽅式。
③举例:
int[] x; //声明名称为x的int型数组
x=new int[10]; //x数组中包含有10个元素,并为这10个元素分配内存空间
在声明数组时,也可以将两个语句合并成⼀⾏,利⽤这种格式在声明数组的同时,也分配⼀块内存供数组使⽤,格式如下:
数据类型[] 数组名= new数据类型[个数];
int[] x = new int [10];
int[] x= new int{1,3,9,4};
等号左边的int[]x相当于定义了⼀个特殊的变量x,x的数据类型是⼀个对int型数组对象的引⽤,x就是⼀个数组的引⽤变量,其引⽤的数组元素个数不定。等号右边的new int[10]就是在堆内存中创建⼀个具
有10个int型变量的数组对象。int[]x = new int [10];就是将右边的数组对象赋值给左边的数组引⽤变量。[5]
*⼆维数组
①定义:前⾯介绍的数组只有⼀个下标,称为⼀维数组, 其数组元素也称为单下标变量。在实际问题中有很多量是⼆维的或多维的, 因此Java中允许构造多维数组。多维数组元素有多个下标, 以标识它在数组中的位置,所以也称为多下标变量。
②⼆维数组类型说明的⼀般形式是:
类型说明符数组名[常量表达式1][常量表达式2]…;
其中常量表达式1表⽰第⼀维下标的长度,常量表达式2表⽰第⼆维下标的长度
int[][] arr2=new int[3][4];
♦int[][] arr=new int[4][];                            //⾸先开辟⼀个4⾏的⼀维数组
arr[0]=new int[]{12}; //然后给每⼀⾏数组进⾏赋值
arr[1]=new int[]{8,9}; //此时相当于新new了⼀个⼀维数组,然后将⼀维数组的地址,赋给arr[i]
arr[2]=new int[]{11,7,16}; //所以,在⼆维数组中,⼀维⼀般存的都是地址
arr[3]=new int[]{13,9,8,7};
注意:在⼆维数组中,⼀维⼀般存储地址
♥arr  arr1打印出是地址,是因为数组为引⽤数据类型,变量⾥存储地址,且变量在栈⾥存放,⽽new出来的数组内容在堆⾥存放
♥arr[0]打印出来是地址是因为在⼆维数组中,⼀维存放地址,⼆维存放内容,因此arr[0][1]打印出来是数值。
⼆维数组在概念上是⼆维的,即是说其下标在两个⽅向上变化, 下标变量在数组中的位置也处于⼀个平⾯之中, ⽽不是象⼀维数组只是⼀个向量。但是,实际的硬件存储器却是连续编址的, 也就是说存储器单元是按⼀维线性排列的。如何在⼀维存储器中存放⼆维数组,可有两种⽅式:⼀种是按⾏排列, 即放完⼀⾏之后顺次放⼊第⼆⾏。另⼀种是按列排列, 即放完⼀列之后再顺次放⼊第⼆列。在C语⾔中,⼆维数组是按⾏排列的。在如上中,按⾏顺次存放,先存放a[0]⾏,再存放a[1]⾏,最后存放a[2]⾏。每⾏中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节(图中每⼀格为⼀字节)。
*三维数组
三维数组,是指维数为三的数组结构。三维数组是最常见的多维数组,由于其可以⽤来描述三维空间中的位置或状态⽽被⼴泛使⽤。
三维数组就是维度为三的数组,可以认为它表⽰对该数组存储的内容使⽤了三个独⽴参量去描述,但更多的是认为该数组的下标是由三个不同的参量组成的。
数组这⼀概念主要⽤在编写程序当中,和数学中的向量、矩阵等概念有⼀定的差别,主要表现:在数组内的元素可以是任意的相同数据类型,包括向量和矩阵。
对数组的访问⼀般是通过下标进⾏的。在三维数组中,数组的下标是由三个数字构成的,通过这三个数字组成的下标对数组的内容进⾏访问。
⼆、数组的内存分配
*栈内存
在⽅法中定义的⼀些基本类型的变量和对象的引⽤变量都在⽅法的栈内存中分配,当在⼀段代码中定义⼀个变量时,java就在栈内存中为这个变量分配内存空间,当超出变量的作⽤域后,java会⾃动释放掉为该    变量所分配的内存空间。
java定义一维数组并赋值
*堆内存
堆内存⽤来存放由new运算符创建的对象和数组,在堆中分配的内存,由java虚拟机的⾃动垃圾回收器来管理。在堆中创建了⼀个数组或对象后,同时还在栈内存中定义⼀个特殊的变量。让栈内存中的这个变量    的取值等于数组或者对象在堆内存中的⾸地址,栈中的这个变量就成了数组或对象的引⽤变量,引⽤变量实际上保存的是数组或对象在堆内存中的地址(也称为对象的句柄),以后就可以在程序中使⽤栈的引⽤变    量来访问堆中的数组或对象
三、数组的特征
* 1.定义数组必须指定⼤⼩
* 2.数组的每⼀个元素的内存都是连续的
* 3.数组的随机访问操作,是⼀个常量时间arr[index]
* 4.每⼀个数组都内置了⼀个成员变量length,表⽰数组的总长度
* 5.数组增加元素,涉及增加位置后⾯的所有元素都要进⾏移动,所以该操作花费的
* 时间线性时间
* 6.数组删除元素,涉及增加位置后⾯的所有元素都要进⾏移动,所以该操作花费的
* 时间线性时间
* 7.数组的元素查花费时间为线性时间
四、数组的三种输出⽅式
①⽅式⼀:
// 输出数组⽅式⼀  标准for循环
for (int i = 0; i < arr.length; i++)
{
System.out.print(arr[i] + " ");
}
②⽅式⼆
// 输出数组⽅式⼆foreach  arr.length
for (int val : arr)
{
System.out.print(val + " ");                //⽤于输出⼀维数组
}
/*****************************/
for(int[] ints:arr)
{
for(int val: ints)
{
System.out.print(val+" ");    //⽤于输出⼆维数组
}
}
③⽅式三
//输出数组⽅式三String输出数组元素的内容
System.out.String(arr));                //⽤于输出⼀维数组
System.out.println(Arrays.deepToString(arr));        //⽤于输出⼆维数组
五,数组的辅助类Arrays
Arrays.deepToString  打印⼆维数组元素的值
Arrays.fill        给数组初始化/重置
Arrays.equals  ⽐较两个数组的内容是否相等
练习题:(分苹果问题)
n个奶⽜,每个奶⽜拥有的苹果数量不相同,现要求你每次只能从⼀个奶⽜⾝上取两个苹果起给其他奶⽜,问要⾄少移动多少次,可以将苹果均分,如果⽅案不存在输出-1。
练习题:(最长路径问题)
* 12
8 9
11 7 16
13 9 8 7
可以从每个结点 往下,往左斜下,往右斜下分别遍历,以致到⼀条从上到下的最长路径。