1.9 数组
1.9.1 数组的概念
概念:存储同一种数据类型的多个元素的容器。数组既可以存储基本数据类型,也可以存储引用数据类型
格式:
格式1:数据类型 [] 数组名;
格式2:数据类型 数组名 [];
注意:这两种定义做完了,数组中是没有元素值的。如何对数组的元素进行初始化呢?
1.9.2 数组的初始化
数组初始化概述:Java中的数组必须先初始化,然后才能使用。所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
数组的初始化方式:
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
示例:
class ArrayDemo3{
public static void main(String [] args){
//动态初始化:
int[] arr = new int [3];//定义了一个数组长度为3的int类型数组。
//静态初始化:
int[] arr1 = new int[]{1,2,3};
}
}
1.9.3数组的内存分配
int[] arr = new int[4];
内存分配图:
Java程序在运行时,需要在内存中分配空间。为了提高运算效率,又对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
内存的划分:
栈内存:用于存储局部变量,当变量所属的作用域一旦结束,所占空间会自动释放。
堆内存:数组和对象,通过new建立的实例都存放在堆内存中。每个实例都有地址值,实例中的变量都有默认初始化值,根据类型的不同而不同。整数类型是0,小数类型是0.0或0.0f,boolean类型是false,char类型是'\u0000',引用类型是null。
方法区:(面向对象部分详细讲解)。
本地方法区:(系统相关)。
寄存器:(CPU使用)。
1.9.4 数组操作的练习
练习1:数组遍历,就是依次输出数组的每一个元素
class ArrayTest{
public static void main(String[] args){
int[] arr = new int[]{11,22,33,44,55};
System.out.print("[");
for(int i = 0;i <= arr.length-1;i++){
if(i == arr.length-1){
System.out.print(arr[i]+"]");
}
else{
System.out.print(arr[i]+",");
}
}
}
}
运行结果:
练习2:数组获取最值(获取数组中的最大值最小值)
思路:从数组中任意的找一个元素作为参照物(一般取第一个),默认它就是最大值。然后遍历其他的元素,依次获取和参照物进行比较,如果大就留下来,如果小,就离开。
class ArrayTest2{
public static void main(String[] args){
int[] arr = new int[]{1,34,55,66,23};
int max = getMax(arr);
System.out.println(max);
}
public static int getMax(int[] arr){
int max = arr[0];
for(int i = 1;i <= arr.length-1;i++){
max = (max>arr[i])?max:arr[i];
}
return max;
}
}
运行结果:
练习3:数组元素逆序 (就是把元素对调)
方法1:
class ArrayTest3{
public static void main(String[] args){
//定义一个数组,并进行静态初始化。
int[] arr = new int[]{11,22,33,44,55};
System.out.print("逆序前:");
printArray(arr);
System.out.println();
System.out.print("逆序后:");
reverse(arr);
printArray(arr);
}
//逆序数组方法1:
public static void reverse(int[] arr){
for(int i = 0;i < arr.length/2;i++){
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.length-1-i] = temp;
}
}
//遍历数组
public static void printArray(int[] arr){
System.out.print("[");
for(int i = 0;i <= arr.length-1;i++){
if(i == arr.length-1){
System.out.print(arr[i]+"]");
}
else{
System.out.print(arr[i]+",");
}
}
}
}
运行结果:
方法2:
class ArrayTest3{
public static void main(String[] args){
int[] arr = new int[]{11,22,33,44,55};
printArray(arr);
System.out.println();
reverse(arr);
printArray(arr);
}
public static void reverse(int[] arr){
int start = 0;
int end = arr.length-1;
while(start<=end){
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
start++;
end--;
}
}
//遍历数组
public static void printArray(int[] arr){
System.out.print("[");
for(int i=0;i<=arr.length-1;i++){
if(i==arr.length-1){
System.out.print(arr[i]+"]");
}
else{
System.out.print(arr[i]+", ");
}
}
}
}
运行结果:
1.9.5 数组操作的几个小问题
示例1:ArrayIndexOutOfBoundsException:数组索引越界异常
class ArrayDemo6{
public static void main(String [] args){
int[] arr = new int[]{1,2,3};
System.out.println(arr[3]);
}
}
运行结果:
示例2:
class ArrayDemo6{
public static void main(String [] args){
int[] arr = new int[]{1,2,3};
arr = null;
System.out.println(arr[0]);
}
}
运行结果:
1.9.6 二维数组
格式1:数据类型[][] 数组名 = new 数据类型[m][n];
1、定义了名称为arr的二维数组。
2、二维数组中有m个一维数组。
3、每一个一维数组中有n个元素。
4、一维数组的名称分别为arr[0], arr[1], arr[2]……arr[m-1]。
5、给第一个一维数组第一个脚标位赋值为78写法是:arr[0][1] = 78;。
6、arr存储的是二维数组的初始地址,arr[0]、arr[1]、arr[2]存储的是一维数组的初始地址。
示例1:
class Array2Demo{
public static void main(String[] args){
int[][] arr = new int[3][2];
//打印二维数组的初始地址
System.out.println(arr);
//印二位数组中的角标为0的一维数组的地址。
System.out.println(arr[0]);
//打印二维数组中的角标为0的一维数组的角标为0的元素
System.out.println(arr[0][0]);
}
}
运行结果:
格式2:数据类型[][] 数组名 = new 数据类型[m][];
二维数组中有m个一维数组,每个一维数组都是默认初始化值null,可以对这个m个一维数组分别进行初始化。
示例1:
class Array2Demo2 {
public static void main(String[] args) {
// 定义数组
int[][] arr = new int[3][];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[0][0]);
}
}
运行结果:
格式3:
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
int[][] arr = {{3,8,2},{2,7},{9,0,1,6}};
定义一个名称为arr的二维数组,二维数组中的有三个一维数组,每一个一维数组中具体元素也都已初始化。
第一个一维数组 arr[0] = {3,8,2};,第二个一维数组 arr[1] = {2,7};,第三个一维数组 arr[2] = {9,0,1,6};。
第三个一维数组的长度表示方式:arr[2].length;。
示例1:
class Array2Demo3{
public static void main(String[] args){
int[][] arr = new int[][]{{3,8,2},{2},{9,4}};
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
System.out.println(arr[2][1]);
}
}
运行结果:
二维数组的练习1:遍历二维数组
class Array2Test{
public static void main(String[] args){
int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};
printArray2(arr);
}
public static void printArray2(int[][] arr){
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();
}
}
}
运行结果:
二维数组练习2:公司年销售额求和
/*
公司年销售额求和
某公司按照季度和月份统计的数据如下:单位(万元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
*/
class Array2Test2{
public static void main(String[] args){
int [][] arr = new int[][]{{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
int sum = getSum(arr);
System.out.println(sum);
}
public static int getSum(int[][] arr){
int sum = 0;
for(int x=0;x<arr.length;x++){
for(int y=0;y<arr[x].length;y++){
sum+=arr[x][y];
}
}
return sum;
}
}
运行结果:
思考题:
1、看程序,写结果:
/*
思考题1:看程序写结果,然后分析为什么是这个样子的。并画图讲解。最后总结Java中参数传递规律。
*/
class ArgsDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b); //a:10,b:20
change(a,b);
System.out.println("a:"+a+",b:"+b); //a:??,b:??
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]); //???
}
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); //a:20,b:40
}
public static void change(int[] arr) { //arr={1,2,3,4,5};
for(int x=0; x<arr.length; x++) {
if(arr[x]%2==0) {
arr[x]*=2;
}
}//int[] arr={1,4,3,8,5}
}
}
运行结果:
2、某个公司采用公用电话传递数据信息,数据是小于8位的整数,为了确保安全,在传递过程中需要加密,加密规则如下:首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字,最后将第一位和最后一位数字交换。 请任意给定一个小于8位的整数,然后,把加密后的结果在控制台打印出来。
class JiaMiDemo{
public static void main(String[] args){
//定义一个不大于8位数据
int number = 123456;
//定义一个数组
int[] arr = new int[8];
//定义一个索引
int index = 0;
//把数据中每一位上的数据获取到后存储到数组中
while(number>0){
arr[index]=number%10;
index++;
number/=10;
}
//每位数字都加上5,再用和除以10的余数代替该数字
for(int x = 0;x <index;x++){
arr[x]+=5;
arr[x]%=10;
}
//最后将第一位和最后一位数字交换
int temp = arr[0];
arr[0] = arr[index-1];
arr[index-1] = arr[0];
for(int x = 0;x<index;x++){
System.out.print(arr[x]);
}
}
}
运行结果:
将上面的代码改进一下:把数据改进为键盘录入,把代码改进为方法实现。
import java.util.Scanner;
class JiaMiDemo2{
public static void main(String[] args){
//键盘录入
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数据(小于8位):");
int number = sc.nextInt();
String result = jiaMi(number);
System.out.println("加密后的结果:"+result);
}
/*
写一个功能,把数据number实现加密。
两个明确:
返回值类型:String 做一个字符串的拼接
参数列表:int number
*/
public static String jiaMi(int number){
//定义数组
int[] arr = new int[8];
//定义索引
int index = 0;
//把number中的数据放到数组中
while(number>0){
arr[index]=number%10;
index++;
number/=10;
}
//把每个数据加5,对10取余数
for(int x = 0;x < index;x++){
arr[x]+=5;
arr[x]%=10;
}
//交换第一位和最后一位的数据
int temp = arr[0];
arr[0] = arr[index-1];
arr[index-1] = temp;
//把数组的元素拼接成一个字符串返回
//定义一个空内容字符串
String s = "";
for(int x = 0; x < index;x++){
s+=arr[x];
}
return s;
}
}
运行结果:
经验证,正确。