目录
一、数组的概述
数组是存储多个变量(元素)的容器;
这多个变量的数据类型要一样,数组既可以存储基本数据类型,也可以存储引用数据类型。
元素都有自己的编号,编号是从0开始的,第一个元素的编号是0,第二个元素的编号1,往后依次加1,最后一个元素的编号是长度减1。
二、数组的定义和初始化
数组的定义
格式1:数据类型[] 数组名;(推荐使用) 如: int[ ] nums ;String[ ] str; SCanner[ ] s; char[ ] c; double[ ] d;
格式2:数据类型 数组名[]; (兼容c语言的格式) 如 int nums[];
以上两种写法,都是只定义了数组,并没有给数组分配内存空间,也没有存储数据。
数组的初始化
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
注意:Java中的数组必须先初始化,然后才能使用。
1、动态初始化
格式:
数据类型[ ] 数组名 = new 数据类型[数组长度];
如: int[] nums = new int[30] //数组长度其实就是数组中元素的个数。
动态初始化的数组,没有给数组中赋值过,数组中的元素会使用相应类型的默认值:
int类型的元素默认值是0
double类型的元素默认值是0.0
String类型的元素默认值是null
boolean类型的额元素默认值是false
char 类型的元素默认值是'/u000000',就是空字符
2、静态初始化
格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};
如: int[] nums = new int[] {1,2,3,4,5};
或者简化为:
int[] nums = {1,2,3,4,5};
三、访问数组元素
索引
每一个存储到数组的元素,都会自动的拥有一个编号,从0开始,这个自动编号称为数组索引(index)(下标),可以通过数组的索引访问到数组中的元素。
格式
数组名[索引]
每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度
语句为: 数组名.length ,属性length的执行结果是数组的长度,int类型结果。
索引访问数组中的元素
数组名[索引]=数值,为数组中的元素赋值
变量=数组名[索引],获取出数组中的元素
练习:获取数组中的最大值最小值
public static void main(String[] args) {
int[] aa = {11,12,35,7,10};
int max = aa[0]; // 假设数组中第一个元素最大
for (int i = 1; i < aa.length; i++) {
if (aa[i] > max){
max = aa[i];
}
}
System.out.println("数组中的最大值是:"+max);
int min = aa[0]; // 假设数组中第一个元素最小
for (int i = 1; i < aa.length; i++) {
if (aa[i] < min){
min = aa[i];
}
}
System.out.println("数组中的最小值是:"+min);
}
四、数组内存图
1、概念
内存是计算机中的重要原件,可以用来给程序临时存储数据。我们编写的程序,必须放进内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2、Java的内存划分
为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
JVM的内存划分:
寄存器,给CPU使用,和我们开发无关。
本地方法栈:JVM在使用操作系统功能的时候使用,和我们开发无关。
方法区:存储可以运行的class文件。
堆内存:存储对象或者数组,new来创建的,都存储在堆内存。
int类型的元素默认值是0
double类型的元素默认值是0.0
String类型的元素默认值是null
boolean类型的额元素默认值是false
char 类型的元素默认值是'/u000000',就是空
方法栈(栈内存):方法运行时使用的内存,比如main方法运行,进入方法栈中执行。
一个数组的内存图
两个数组的内存图
两个变量指向一个数组
五、数组排序
1、排序算法
2、冒泡排序
相邻两个数进行比较,第一波比较后,最大的数在最后。(每比较完之后,后面的数就减少一个比较 )
public static void main(String[] args) {
int[] aa = new int[]{11, 12, 3, 5, 23, 45, 14};
/*
内层循环比较的次数应该越来越少(每次排序后,大数已经沉底,
下次在比较时不需要再和已经确定位置的元素进行比较)
减少排序次数 —— n个元素只需要排n-1次
*/
for (int i = 0; i < aa.length-1; i++) {
for (int j = 0;j < aa.length-1-i;j++){
if (aa[j]>aa[j+1]){ // 相邻的两个数据比较 ,满足条件就交换顺序
int temp = 0;
temp = aa[j];
aa[j] = aa[j+1];
aa[j+1] = temp;
}
}
}
for (int i = 0; i < aa.length; i++) {
System.out.println(aa[i]);
}
}
练习:求这个日期是这年中的第多少天?
public static void main(String[] args) {
int year = 2020;
int month = 12;
int day = 30;
int[] ms = {31,28,31,30,31,30,31,31,30,31,30,31}; // 每个月的天数
// 判断是不是闰年
if (isRunNian(year)){
ms[1] = 29;
}
int result = 0;
for (int i = 0; i < month-1; i++) {
result = result + ms[i];
}
result = result + day;
System.out.println(result);
}
public static boolean isRunNian(int year){
boolean flag = false; // 假设不是闰年
if ((year%4==0 && year%100!=0) || year%400==0){
flag = true;
}
return flag;
}
六、计算元素的地址的公式
七、二维数组
1、定义
二维数组的元素是一个一维数组。
二维数组可以对数据进行分类存储。
动态初始化的格式:
数据类型[][] 数组名 = new 数据类型[二维数组的长度][一维数组的长度];
静态初始化的格式:
数据类型[][] 数组名 = new 数据类型[][]{ {一维数组1}, {一维数组2}, {一维数组2}, ... };
2、二维数组的遍历
int[][] aa = {{1,2,3},{4,5,6},{7,8,9},{11,12,13,14}};
for(int i=0;i<aa.length;i++){
for(int j=0;j<aa[i].length;j++){
System.out.print(aa[i][j]+" ");
}
System.out.println();
}
上一篇:(18)Java基础 --方法