1.数组概念
数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的
方式对这些数据进行统一管理。
变量:在内存开辟一块空间。
数组:也是变量,在内存中开辟一串连续的空间。数组长度一旦确定,就不能修改
数组的常见概念
- 数组名
- 下标(或索引)
- 元素
- 数组的长度
1.1 基本用法
- 格式
- 格式 1. 数据类型[] 数组名,属于只创建了数组引用名, 并未在内存创建数组空间
- 格式 2. 数据类型[] 数组名称 = new 数据类型[数组长度];
- 格式 3. 数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3…数组内容 n};
- 格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3…内容 n}
- 代码
public static void main(String[] args) {
// 1、声明数组
//1.1 先声明,后开辟空间:数据类型[] 数组名称;
int[] arr1;//声明
arr1=new int[4];//开辟空间:数组名称=new 数据类型[数组长度]; 数组的长度一旦
确定,不可以改变
//1.2 声明数组的同时开辟空间
double[] arr2=new double[5];
System.out.println(arr1);
System.out.println(arr2);
//1.3 声明数组
String[] arr3;//只是声明,没有在内存中开辟数组空间
//System.out.println(arr3);
//1.4 声明数组的同时赋值 数据类型[] 数组名称=new 数据类型[]{数组值1,数组值2,
数组值3,数组值4......数组值n};
//此时数组的长度由赋值的个数决定
int[] arr4=new int[]{1,2,3,4,5};
System.out.println(arr4);
//1.5 声明数组的同时赋值 数据类型[] 数组名称={数组值1,数组值2,数组值3,数组值
4......数组值n};
//此时数组的长度由赋值的个数决定
double[] arr5= {1.5,3.6,5.8,4.0};
}
1.2 内存结构
1.2.1JVM内存结构
根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。
1.2.2 数组创建时内存状态
int[] arr1 的内存状态
声明一个数组会在栈中声明
2.
arr1=new int[4] 的内存状态
new运算符会在堆内存中创建一个数组,分配一个能够存储4个int对象的连续的存储空间,并把这块存储空间的地址给 arr1;arr1会指向这块存储空间。
3.
在栈内存中定义一个名字为arr1的int型数组,在堆内存中开辟一个能存放4个int对象的连续的内存空间,arr1指向这个地址。初始值为0;将数组下标为0的数组值修改为10,将数组下标为2的数组值修改为20。
在栈内存中定义一个名字为arr2的String型数组,在堆内存中开辟一个能存放3个iString对象的连续的内存空间,arr2指向这个地址。初始值为null;将数组下标为1的数组值修改为刘杰。开辟一个新的能存放5个String对象的连续的内存空间,修改arr2的指向,指向新的地址。
1.2.3常量池
JDK 1.7时候,常量池在方法区中
JDK 1.8时候,常量池在堆内存中
1.3 数组实战
public static void main(String[] args) {
//1、声明数组并开辟空间
int[] arr1=new int[4];
//2、给数组赋值:数组名称[下标索引]=值;下标索引从0开始,最大比数组长度小1
//数组长度:数组名称.length获取
//原始赋值方式:
/*
* arr1[0]=2;
* arr1[1]=4;
* arr1[2]=6;
* arr1[3]=8;
*/
//推荐使用循环的方式数组
for(int i=0;i<arr1.length;i++) {
arr1[i]=i+1;
}
//3、使用数组
for(int i=0;i<arr1.length;i++) {
System.out.println(arr1[i]);
}
}
2.数组默认值
public static void main(String[] args) {
//int类型数组元素的默认值是0
int[] arr1=new int[4];
for(int i=0;i<arr1.length;i++) {
System.out.println(arr1[i]);
}
//double类型数组元素的默认值是0.0
double[] arr2=new double[4];
for(int i=0;i<arr2.length;i++) {
System.out.println(arr2[i]);
}
//String类型数组元素的默认值是null
String[] names=new String[5];
for(int i=0;i<names.length;i++) {
System.out.println(names[i]);
}
//char类型数组元素的默认值是' '
char[] genders=new char[5];
for(int i=0;i<genders.length;i++) {
System.out.println(genders[i]);
}
//boolean类型数组元素的默认值是false
System.out.println("over");
}
3.求极值问题
public static void main(String[] args) {
//找出指定数组{12,43,-45,567,13}中的最大值和最小值
int[] arr= {12,43,-45,567,13};
//定义极值:一定数组元素,一般把第一个元素作为最大值的初始值
int max=arr[0];//12
int min=arr[0];
//循环比对
for(int i=1;i<arr.length;i++) {
if(arr[i]>max) {
max=arr[i];
}
if(arr[i]<min) {
min=arr[i];
}
}
System.out.println("最大值是:"+max);
System.out.println("最小值是:"+min);
}