day06
数组
一维数组
A:为什么要有数组?
*为了存储同种数据类型的多个值;
B:数组概念?
*数组是存储同一种数据类型多个元素的集合,也可以看成一个容器;
*数组既可以存储基本数据类型,也可以存储引用数据类型;
C:数组定义格式
数据类型[] 数组名 = new 数据类型(数组的长度);
D:数组初始化
#什么是数组的初始化?
数组初始化就是为数组开辟连续的内存空间,并为每个数组元素赋值;
#数组如何进行初始化?
a:动态初始化,只指定长度,由系统给出初始化值;
int[] arry = new int[5]
b:静态初始化,给出初始化值,由系统决定长度;
#动态初始化格式:
数据类型[] 数组名 = new 数据类型[数组长度];
* 数组默认值:
* 整数类型:byte,short,int,long默认初始值都是0;
* 浮点类型:float,double默认初始值都是0.0;
* 布尔类型:boolean默认初始化值是false;
* 字符类型:char默认初始化值是'\u000'
\u000,每一个0其实代表的是16进制的0,那么四个0代表16个二进制位;
### System.out.println(arr); 输出结果
// [I@6d06d69c
// [代表的是数组,几个就代表几维数组; I 代表数据类型为int; @符号是固定的; 6d06d69c代表16进制的地址值
#存储空间分配
A:栈 //先进后出
*存储局部变量
局部变量:定义在方法声明上和方法中的变量;
B:堆
*存储new出来的数组或者对象
C:方法区
*面向对象部分讲解
D:本地方法区
*和系统相关;
E:寄存器
*给CPU使用
//案例举例
//三个引用,两个数组
class Demo5_Array
{
public static void main(String[] args)
{
int[] arr1 = new int[3];
int[] arr2 = new int[5];
int[] arr3 = arr2;
System.out.println(arr1);
System.out.println(arr2);
System.out.println(arr3);
arr1[0] = 10;
arr2[1] = 20;
arr2[1] = 30;
arr3[1] = 40;
arr3[2] = 50;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println("----------------");
System.out.println(arr2[0]);
System.out.println(arr2[1]);
System.out.println(arr2[2]);
System.out.println(arr2[3]);
System.out.println(arr2[4]);
System.out.println("----------------");
System.out.println(arr3[0]);
System.out.println(arr3[1]);
System.out.println(arr3[2]);
System.out.println(arr3[3]);
System.out.println(arr3[4]);
}
}
//运行结果
---------- java ----------
[I@6d06d69c
[I@7852e922
[I@7852e922
10
0
0
----------------
0
40
50
0
0
----------------
0
40
50
0
0
/*
A:*静态初始化的格式:
* 格式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2....};
* 简化格式
*数据类型[] 数组名 = {元素1 ,元素2,....}
B: *案例演示
*对数组的解释;
*输出数组名称和数组元素
*/
class Demo6_Array
{
public static void main(String[] args)
{
//int[] arr = new int[]{11,22,33,44,55}; 可以先声明,再赋值
int[] arr = {11,22,33,44,55}; //声明和赋值在同一行
//int[] arr;
//arr = new int[]{11,22,33,44,55};
System.out.println(arr);
System.out.println(arr[0]);
}
}
数组操作注意事项:
a:ArrayIndexOutOfBoundsException:数组索引越界异常
b:NullPointerException:空指针异常
class Demo7_Exception
{
public static void main(String[] args)
{
int[] arr = new int[5];
//System.out.println(arr[5]);
//ArrayIndexOutOfBoundsException:数组索引越界异常 *原因:你访问了不存在的索引;
arr = null;
System.out.println(arr[0]); //NullPointerException:空指针异常
//当数组引用赋值为null,再去调用数组中的元素就会出现空指针异常.
}
}
##数组遍历: 就是依次数组中的每一个元素;
数组属性: arr length数组长度;
数组的最大索引:arr,length-1;
//数组的遍历
class Demo8_Array
{
public static void main(String[] args)
{
int[] arr = {11,22,33,44,55};
for (int i = 0; i < arr.length ;i++ )
{
System.out.println(arr[i]);
}
int[] arr2 = {3,4,5};
print(arr2);
}
/*数组的遍历
1.返回值为void;
2.参数列表 int[] arr
*/
public static void print(int[] arr){
for (int i = 0; i < arr.length ;i++ )
{
System.out.print(arr[i]);
}
}
}
//获取数组的最值
class Demo9_Array
{
public static void main(String[] args)
{
int[] arr1 = {33,77,22,44,55};
int max = getMax(arr1);
System.out.print(max);
}
/*获取数组中的最大值
1.返回值类型,int
2.参数列表(int[] arr)
*/
public static int getMax(int[] arr){
int max = arr[0];
for (int i = 1;i < arr.length ;i++ )
{
if (max < arr[i])
{
max = arr[i];
}
}
return max;
}
}
//数组反转
class Demo10_Array
{
public static void main(String[] args)
{
int[] arr1 = {11,22,33,44,55,66,77,88,99};
reverseArray(arr1);
print(arr1);
}
//反转数组
public static void reverseArray(int[] arr){
for (int i = 0 ;i <= arr.length/2 ;i++)
{
int temp = arr[i];
arr[i] = arr[arr.length-(i + 1)];
arr[arr.length-(i + 1)] = temp;
}
}
//打印数组
public static void print(int[] arr){
for (int i = 0;i < arr.length ;i++ )
{
System.out.println(arr[i]);
}
}
}
// 数组查表法:根据键盘录入索引,查找对应星期
import java.util.Scanner;
class Demo11_Array
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
System.out.println("请输入日期");
int week = sc.nextInt();
System.out.println("星期" + getWeek(week));
}
/*
根据索引返回对应的星期
1.返回值类型"char"
2.参数列表(int week)
*/
public static char getWeek(int week){
char[] arr = {' ', '一', '二', '三','四','五','六','日'};
return arr[week];
}
}
案例演示
/*
数组元素查找(查找指定元素第一次在数组中出现的位置)
*/
class Demo12_Array
{
public static void main(String[] args)
{
int[] arr = {11,22,33,44,56,55,66,78,89,90};
int index = getIndex(arr,80);
System.out.println(index);
}
/*数组元素查找
1.返回值类型int;
2.参数列表( int[] arr,int value)
*/
public static int getIndex(int[] arr ,int value){
for (int i = 0;i < arr.length ;i++ ){ //数组遍历
if (arr[i] == value) //如果数组中的元素与查找元素匹配
{
return i;
}
}
return -1;
}
}
二维数组
二维数组
A:格式
1.数据类型[][] 数组名 = new 数据类型[m][n]; //m代表有m个一维数组;n代表一维数组中有n个元素
2.数据类型[] 数组名[] = new 数据类型[m][n];
B:注意以下区分:
int x
int y
int[] x;
int[] y[];
int[] x, y[]; //x是一维数组,y是二维数组
class Demo01_Array
{
public static void main(String[] args)
{
int[][] arr = new int[3][2];
/*
[[I@6d06d69c 二维数组的地址值
[I@7852e922 一维数组的地址值
0
*/
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);
}
}
二维数组的第二种格式
//数组的默认值是null
class Demo03_Array
{
public static void main(String[] args)
{
int[][] arr = new int[3][]; //这是一个二维数组,这个数组中有三个一维数组,三个一维数组都没有被初始化
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("-------------------");
arr[0] = new int[3]; //第一个一维数组可以存储三个int值
arr[1] = new int[5];
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
输出结果:
null
null
null
-------------------
[I@6d06d69c
[I@7852e922
null
二维数组的第三种格式
/*
二维数组的第三种格式
*A: 数组格式
*int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
*B: 二维数组格式3的解释
*/
class Demo04_Array
{
public static void main(String[] args)
{
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}}; //这是一个二维数组,这个二维数组每个大括号都代表一个一维数组
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);
}
}
二维数组的遍历
/*二维数组的遍历
* A:案例演示:
*需求: 二维数组遍历;
*外循环控制一位数组长度,其实就是一位数组的个数;
*内循环控制的就是一位数组的长度;
*/
class Test1_Array
{
public static void main(String[] args)
{
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
for (int i = 0; i < arr.length ;i++ ) //获取每个二维数组中的一维数组
{
for (int j = 0;j < arr[i].length ;j++ ) //获取每个一位数组的元素
{
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
二维数组的求和
/*二维数组求和
案例演示:
需求: 公司年销售额求和;
某公司按照季度和月份的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
*/
class Test2_Array
{
public static void main(String[] args)
{
int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
int sum = add(arr);
System.out.println("年销售总额是" + sum);
}
//二维数组求和
public static int add(int[][] arr){
int sum = 0;
for (int i = 0;i < arr.length ;i++ )
{
for (int j = 0;j < arr[i].length ;j++ )
{
sum = sum + arr[i][j];
}
}
return sum;
}
}
参数传递问题
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
/*
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
引用数据类型的值传递,会改变原值, 因为即使方法弹栈,但堆内存数组对象还在,可以通过地址继续访问
Java到底是传值还是传址
1.既是传值也是传址,基本数据类型传递的是值,引用数据类型传址;
2,java中只有传值,因为地址值也是值 (面试答这种,支持者是高斯林(java之父))
*/
class Test4_Array
{
public static void main(String[] args)
{
int a = 10;
int b = 20;
System.out.println("a:" + a + ",b:" + b);
change(a,b);
System.out.println("a:" + a + ",b:" + b);
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]);
System.out.println(arr[3]);
}
public static void change(int a ,int b) {
System.out.println("a:" + a + ",b:" + b); //a = 10,b = 20;
a = b; // a = 20
b = a + b; // b = 40
System.out.println("a:" + a + ",b:" + b);
}
public static void change(int[] arr){
for (int x = 0 ;x < arr.length;x++)
{
if(arr[x] % 2 == 0) {
arr[x] *= 2;
}
}
}
}