1.一维数组
定义:是相同类型数据的有序集合,描述的是相同类型的若干个数据,按照一定先后次序排列组合而成,其中,每个数据称为一个数组元素,每个数组元素可以通过一个下标来访问它们。(必须先声明才能使用,或者声明的时候已经创建好了)(声明的时候数组并不在,只有创建的时候才存在)
#声明语法:
dataType[]arrayRefVar;//首选方法
dataType arrayRefVar[];//效果相同,但是不首选
#用new操作符来创建(声明创建同时):
dataType []arrayRefVar=new dataType[arraySize];
数组的元素是通过索引访问的,从0开始索引。
#获取数组的长度:
array.length
int []arr=new int[10]; for (int i = 0; i < arr.length; i++) { arr[i]=i;//赋值每个元素,没有赋值的话就按初始值算 } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); }//循环输出每个元素 int sum=0;//定义总和 for (int i = 0; i <arr.length ; i++) { sum+=arr[i];//循环计算总和 }
其长度是确定的,数组一旦被建立,它的大小就是不可改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属于引用类型,数组也可以看成是对象,数组的每个元素相当于该对象的成员变量。
数组本身就是对象,java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型。
数组对象本身是在堆中的。
#数组小结:
数组是相同数据类型的(数据类型可以为任意类型)有序集合
数组也是对象。数组元素相当于对象的成员变量。
数组长度是确定的,不可变的。如果越界,则会报错。
2.内存分析
堆:存放new的对象跟数组,可以被所有的线程共享,不会存放别的对象引用
栈:存放基本变量类型(会包含这个基本类型的具体数值),引用对象的变量(会存放这个引用在堆里面的具体地址)
方法区:可以被所以的线程共享,包含了所有的class和static变量
3.数组的三种初始化
#静态初始化:
int []a={1,2,3,4,55}; System.out.println(a[0]); Man []mans={new Man(),new Man()};//引用类来创建数组(对象数组)
#动态初始化:
int [] b=new int[4]; b[0]=1;
#数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也会被按照实例变量同样的方法被隐式初始化(变为默认值)
4.数组使用
#for-each循环
for (int i : a) {//没有下标 System.out.println(i); }
#数组作方法入参
public static void printArray(int []arr){//打印数组元素 for (int i = 0; i <arr.length ; i++) { System.out.println(arr[i]+" "); } }
#数组作为返回值
public static int[] reverse(int []arr){//反转数组元素 int [] result=new int[arr.length]; for (int i = 0,j=result.length-1; i <arr.length ; i++,j--) {//反转操作 result[j]=arr[i]; } return result; }
int []reverse=reverse(a);//利用一个同类型的新数组接受反转后的数组 printArray(reverse);//(数组作为实参传入)打印数组