1、数组是什么?
-
数组是一种容器,可以存储同种数据类型的多个值
-
注意:数组容器在存储数据是,需要结合隐式转换考虑;
-
int类型(byte、short、int)
-
double(byte、short、int、long、float、double)
-
2、数组的定义与静态初始化
1.数组定义:
-
格式:
-
数据类型[] 数组名
-
例:int[] array
-
-
数据类型 数组名[]
-
例:int array[]
-
-
2.初始化:
(1)静态初始化:
-
定义:就是内存中,为数组容器开辟空间,并将数据存入容器中的过程
-
格式:
-
完整格式:数据类型[] 数组名=new 数据类型[]{元素1,元素2,元素3……};
-
常用格式/简写格式:数据类型[] 数组名={元素1,元素2,元素3……};
-
(2)动态初始化:
-
定义:初始化时只指定数组长度,由系统为数组分配初始值;
-
格式:
-
数据类型[] 数组名=new 数据类型[数组长度];
-
-
数组默认初始化值规律:
-
整数:默认初始化是0;
-
小数:默认初始化时0.0
-
字符:默认初始化值'/u0000'空格
-
布尔:默认初始化值:false
-
引用数据类型:默认初始化值null
-
(3)静态与动态初始化区别:
名称 | 动态 | 静态 |
---|---|---|
定义 | 手动指定数组长度,游戏厅给出默认初始化值 | 手动指定数组元素,系统会根据元素个数,计算出数组长度 |
使用场景 | 只明确元素个数,不明确具体数值 | 需求已经明确要操作的具体数据 |
3、数组地址值和元素访问:
1.数组地址值:
(1)表示:数组在内存中的位置;
(2)[D@776ec8df:
-
[:表示当前是数组;D:表示数据类型是double;@:表示间隔符号(固定格式);776ec8df:才是数组真正的地址值(十六进制)
2.元素访问:
(1)格式:
-
数组名[索引];
(2)索引:
-
也叫下标、角标;
-
特点:从0开始,逐个+1增长,连续不间断
(3)两种方式:
-
获取数组中的元素:
-
把数据存储到数组中
-
格式:数组名[索引]=具体数据/变量;
-
array[0]=100;
System.out.println(array[0]);
4.数组的遍历:
1.定义:
将数组中所有的内容取出来,取出来之后可以(打印、求和、判断……)
int[] array={1,2,3,4};
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
2.练习:
定义一个数组,存储1,2,3,4,5,6,7,8,9,10
遍历数组得到每一个元素
要求:如果是奇数当前数字扩大两倍;偶数当前数字缩小一半
public static void main(String[] args) {
int[] array={1,2,3,4,5,6,7,8,9,10};// 2,1,6,2,10,3,14,4,18,5
int num=0;
for (int i = 0; i < array.length; i++) {
// System.out.println(array[i]);
if(array[i]%2==0){
array[i]/=2;
} else{
array[i]*=2;
}
System.out.println(array[i]);
}
}
5.数组常见问题:
1.索引越界异常:当访问数组中不存在的索引
-
索引范围:最小索引:0;最大索引:数组长度-1;
6.数组内存图:
(1)Java内存分配:
-
栈(先进后出):方法运行时使用的内存,比如main方法运行,进入方法栈中执行
-
堆(先进先出):存储对象或者数组,new来创建的,都存储在堆内存;目前new出来的只有数组
-
方法区:存储可以运行的class文件
-
本地方法栈:jvm在使用操作系统功能的时候使用
-
寄存器:给cpu使用
(2)数组的内存图:
-
一个数组:
-
两个数组:
(3)两个数组指向同一个空间的内存图:
总结:当两个数组指向同一个小空间时,其中一个数组对小空间中的值发生改变,那么其他数组再次访问的时候都是修改之后的结果;
7.练习题:
(1)求最值:
需求:已知数组元素{33,5,22,44,55},请找出数组最大值并打印在控制台;
public static void main(String[] args) {
// 已知数组元素{33,5,22,44,55},请找出数组最大值并打印在控制台;
int[] arr={33,5,22,44,55};
int max=arr[0];
for (int i = 1; i < arr.length; i++) {
if(arr[i]>max){
int temp=max;
max=arr[i];
arr[i]=temp;
}
}
System.out.println(max);
}
(2)遍历数组求和:
需求:生成10个1~100之间的随机数存入数组;
求:所有数据的和;所有数据的平均数,统计有多少个数据比平均值小;
public static void main(String[] args) {
// 需求:生成10个1~100之间的随机数存入数组;
//求:所有数据的和;所有数据的平均数,统计有多少个数据比平均值小;
int[] arr=new int[10];
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
int num= random.nextInt(100)+1;
// 将生成随机数添加到数组
arr[i]=num;
}
int sum=0;
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
sum+=arr[i];
}
System.out.println("和是:"+sum);
int average=sum/ arr.length;
System.out.println("平均值是:"+average);
int min=arr[0];
int count=0;
for (int i = 0; i < arr.length; i++) {
if(arr[i]<min){
count++;
}
}
System.out.println("有"+count+"个数比平均值小");
}
(3)交换数组中的数据:
需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素;
交换前:1,2,3,4,5
交换后:5,4,3,2,1
public static void main(String[] args) {
//需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素;
//交换前:1,2,3,4,5
//交换后:5,4,3,2,1
int[] arr = {1, 2, 3, 4, 5};
for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
(4)打乱数组中的数据:
需求:定义一个数组,存入1~5.
要求:打乱数组中所有数据的顺序。
public static void main(String[] args) {
//需求:定义一个数组,存入1~5.
//要求:打乱数组中所有数据的顺序。
int[] arr={1,2,3,4,5};
Random random = new Random();
// 循环遍历数组,从0索引开始打乱数据的顺序
for (int i = 0; i < arr.length; i++) {
// 生成一个随机索引
int index= random.nextInt(arr.length);
// 拿着随机索引指向元素 跟i指向的元素进行交换
int temp=arr[i];
arr[i]=arr[index];
arr[index]=temp;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t");
}
}