提米 Java基础--数组

本文介绍了Java中的数组概念,包括数组的特点、定义格式、初始化(动态和静态)、访问元素、赋值、异常处理、数组长度、遍历、作为方法参数和返回值,以及常见操作如最值、总和、平均数、数组反转和冒泡排序等。
摘要由CSDN通过智能技术生成

一、数组的概念
数组的概念:数组是一种容器,可以同时存放多个数据值。

数组的特点:
1.数组是一种引用数据类型。
2.数组当中的多个数据,类型必须一致。
3.数组的长度在程序运行期间不可改变。

二、数组的定义格式:静态,动态,省略
数组的初始化,在内存当中创建一个数据,并且向其中赋予一些默认值。

两种常见的初始化方式:
1:动态初始化(指定长度)。
创建数组时到底可以装多少个数据,10个,20个还是100个,
把具体的数据个数也就是长度告诉我们。
动态初始化数组格式:
数据类型[ ] 数组名称=new 数据类型[ 数组长度];
解析含义:
左侧的数据类型:数组当中的保存的数据是全部是统一的类型
左侧的中括号:代表我是一个数组
左侧的数组名称:给数组取一个名字
右侧的new:代表创建数组的动作
右侧的数据类型:必须与左侧的数据类型保持一致
右侧中括号的长度:数组到底可以保存多少个数据,是一个int数字

例子:

//1.创建一个数组,里面可以存放300个int数据,
int [ ] arrayA=new int [300];
//2.创建一个数组,里面可以存放10个double类型数据,
double[ ] arrayB=new double[10];
//3.创建一个数组,里面可以存放5个String类型数据,
String[ ] arrayC=new String[5];

2:静态初始化(指定内容)
不用告诉我们长度,只需要告诉我们数组的具体内容是什么。
比方说我告诉你三个数据 5,15, 25 ,这些内容给了你,其实你也就知道数组的长度,这是推算出来的。
静态初始化基本格式:
数据类型[ ] 数组名称 = new 数据类型[ ] {元素1,元素2,元素3,,,};

例子:

//直接创建一个数组,里面装的全都是int数字,具体为5,15,25
int [ ] arrayA=new int[ ] {5,15,25};
//创建一个数组,用来装字符串:“hello”,"world",“Java”
String [ ] arrayB=new String[ ]{"hello","world","java"}

两者区别:
动态初始化(指定长度),在创建数组的时候,直接指定数组当中的数据元素个数。
静态初始化(指定内容),在创建数组的时候,不直接指定数据个数多少,而是直接将具体的数据内容进行指定。

使用静态初始化数组的时候,格式还可以省略一下。
标准格式:
数据类型[ ] 数组名称=new 数据类型[ ]{元素1 ,元素2 ,元素3,. . .};
省略格式:
数据类型 [ ] 数组名称={元素1 ,元素2 ,元素3,. . .};

注意事项:
1.静态初始化没有直接指定长度,但是仍然会自动推算得到长度。
2.静态初始化标准格式可以拆分成为两个步骤。
3.动态初始化标准格式也可以拆分成为两个步骤。
4.静态初始化一旦使用省略格式,就不能拆分成为两个步骤了。
//省略格式的静态初始化
int [ ] arrayA ={10,20,30};
//静态初始化的标准格式,可以拆分成为两个步骤
int [ ] arrayB;
arrayB=new int[ ]{1,2,3};
//动态初始化也可以拆分成为两个步骤
int [ ] arrayC;
arrayC=new int[5];
//静态初始化的省略格式,不能拆分成为两个步骤。
int [ ] arrayD; //错误格式
arrayD={1,2,3}; //错误格式

使用建议:
如果不确定数组当中的具体内容,用动态初始化;
否则,已经确定了具体的内容,用静态初始化。

三、访问数组元素进行获取
直接打印数组名称,得到的是数组对应的:内存地址哈希值。
二进制:01
十进制:0123456789
十六进制:0123456789abcdef
访问数组元素的格式:数组名称[索引值];
索引值:就是一个int数字,代表数组当中元素的编号。
【注意】索引值从0开始,一直到(数组的长度-1)为止。
例子:

//静态初始化的省略格式
int [ ] array={1234};
System.out.println(array);//[I@1540e19d 内存地址哈希值。
//直接打印数组当中的元素
System.out.println(array[1]);//得到2
System.out.println(array[0]);//得到1
//将数组当中的某一个单个元素,赋值交给变量
int b=array[2];
System.out.println(b);//得到3

四、访问数组元素进行赋值
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
整数类型:默认值0;
浮点类型:默认值0.0;
字符类型:默认值‘\u0000’;
布尔类型:false;
引用类型:null;
注意事项:
静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。
例子:

//动态初始化一个数组
int [ ] array=new int[3];
System.out.println(array);//[I@1540e19d
System.out.println(array[0]);//0
System.out.println(array[1]);//0
System.out.println(array[2]);//0
System.out.println(array[3]);//下表越界,报错
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
//将数据123赋值交给数组array当中的1号元素
array[1]=123;
System.out.println(array[0]);//0
System.out.println(array[1]);//123
System.out.println(array[2]);//0

五、数组的异常: 索引越界 和 空指针
数组的索引编号从0开始,一直到“数组的长度-1”为止。
如果访问数组的时候,索引编号并不存在,那么将会发生数组索引越界异常。

int [ ] array=new int[3];
System.out.println(array[3]);//下表越界,报错
//Exception in thread "main" //java.lang.ArrayIndexOutOfBoundsException: 3

原因,索引编号写错了。解决,修改成为存在的正确索引编号。
所有的引用类型变量,都可以赋值为一个null值。但是代表其中什么都没有。
数组必须进行new初始化才能使用其中的元素。
如果只是赋值了一个null,没有进行new创建,那么将会发生:空指针异常.NullPointerException
原因,忘了new,解决,补上new.

int [] a=null;
System.out.println(a[0]);
//报错Exception in thread "main" java.lang.NullPointerException

改正后:

int [] a=null;
a=new int[3];
System.out.println(a[0]);

六、数组的长度
如何获取数组的长度,格式,:数组名称.length
这将会得到一个int数字,代表数组的长度。
数组一旦创建,程序运行期间,长度不可改变。

七、数组的遍历
遍历数组:说的就是对数组的每一个元素进行逐一、挨个儿处理。默认的处理方式就是打印输出。
例子:

int array={1234567}int a=array.length;
for (int i=0;i<a;i++){
    System.out.println(array[i]);
}

在这里插入图片描述滴滴滴:数组名称点.fori自动生成

七、数组作为方法参数
数组可以作为方法的参数。(传递)
当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值。

public static void main(String[] args) {
    int [ ] array ={1,2,3,4,5,6};
    printArray(array);
}

public static void printArray(int [] array){
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}

/*方法的三要素
返回值类型:只是进行打印而已,不需要进行计算,也没有结果,用void
方法名称:printArray
参数列表:必须给我数组,我才能打印其中的元素。int [ ]array
*/
八、数组作为方法返回值
一个方法可以有0,1,多个参数;但是只能有0或者1个返回值,不能有多个返回值。
如果希望一个方法当中产生了多个结果数据进行返回,怎么办?
解决方案:使用一个数组作为返回值类型即可。

任何数据类型都能作为方法的参数类型,或者返回值类型。
数组作为方法的参数,传递进去的其实是数组的地址值。
数组作为方法的返回值,返回的其实也是数组的地址值。

 public static void main(String[] args) {
      int [ ] result =calculate(1,3,2);
      System.out.println("总数"+result[0]+"平均数"+result[1]);//总数6平均数2
      System.out.println(result+"main方法接收到的返回值数据是");  //[I@1540e19d
  }
    public static int[] calculate(int a,int b,int c){
        int sum=a+b+c;//总和
        int avg=sum/3;//平均数
//需要一个数组也就是一个塑料兜,数组可以保存多个结果
       /* int[ ] array=new int[2];
        array[0] =sum;//总和
        array[1]=avg;//平均数*/
   int [] array={sum,avg};
        System.out.println(array+"calculate内部数组值是");//[I@1540e19d
        return array;
    }

十一、数组的常见操作
0.最值

int[] a={1,3,4,2,2,5,8,0};
int max=a[0];
int min=a[0];

for (int i = 0; i < a.length; i++) {
//如果当前元素,比max更大,则换掉
    if (a[i]>max){
        max=a[i];
    }
}

for (int i = 0; i < a.length; i++) {
//如果当前元素,比min更小,则换掉
    if (a[i]<min){
        min=a[i];
    }
}
//最后就是最大,最小的值了
System.out.println(max+"            最大值");
System.out.println(min+"            最xiao值");

1.总和,平均数

public static void main(String[] args) {
    int [] a={1,2,3,4,5};
    int b=0;
    for (int i = 0; i < a.length; i++) {
        b+=a[i];
    }
    System.out.println("总数是:"+b);
    System.out.println("平均数是:"+b/a.length);
}

2.复制数组

int [] arr={1,2,3,4,5};
int[] copy=new int[arr.length];//声明一个与arr数组长度一致的数组
for (int i = 0; i < arr.length; i++) {//复制
    copy[i]=arr[i];
//遍历arr,把arr的每一个元素按照顺序拿出来,给copy的每一个元素赋值
,在这里的  i  就是 copy和arr的元素下标
}

System.out.println(copy.length);//5
for (int i = 0; i < copy.length; i++) {
    System.out.println(copy[i]);
} //12345

3.数组反转
数组元素反转:
本来的样子:{1,2,3,4}
之后饿样子:{4,3,2,1}
要求不能使用新数组,就使用原来的数组。

int [ ] a={1,2,3,4,5};
//遍历打印数组本来的样子
int[] a={1,2,3,4,5};
for (int i = 0; i < a.length; i++) {
    System.out.println(a[i]);//12345
}
/*
初始化条件:int min=0;max=a.length-1;
条件判断:min<max
步进表达式:min++,max--
循环体:用第三个变量倒手
*/
for(int min=0,max=a.length-1;min<max;min++,max--){
int temp=a[min];
a[min]=a[max];
a[max]=temp
}
//再次打印输出数组后来的样子
for (int i = 0; i < a.length; i++) {
    System.out.println(a[i]);//54321
}

4.冒泡排序
  外层循环:即主循环,需要辅助我们找到当前第 i 小的元素来让它归位。所以我们会一直遍历 n-2 次,这样可以保证前 n-1 个元素都在正确的位置上,那么最后一个也可以落在正确的位置上了。
  内层循环:即副循环,需要辅助我们进行相邻元素之间的比较和换位,把大的或者小的浮到水面上。所以我们会一直遍历 n-1-i 次这样可以保证没有归位的尽量归位,而归位的就不用再比较了。
  而上面的问题,出现的原因也来源于这两次无脑的循环,正是因为循环不顾一切的向下执行,所以会导致在一些特殊情况下得多余。例如 5,4,3,1,2 的情况下,常规版会进行四次循环,但实际上第一次就已经完成排序了。

public static void main(String[] args) {
    int[] list = {3, 4, 1, 5, 2};
    int temp = 0; // 开辟一个临时空间, 存放交换的中间值
    // 要遍历的次数
    for (int i = 0; i < list.length - 1; i++) {
        System.out.format("第 %d 遍:\n", i + 1);
        //依次的比较相邻两个数的大小,遍历一次后,把数组中第i小的数放在第i个位置上
        for (int j = 0; j < list.length - 1 - i; j++) {
            // 比较相邻的元素,如果前面的数小于后面的数,就交换
            if (list[j] < list[j + 1]) {
// < 降序 54321 
// >降序12345
                temp = list[j + 1];
                list[j + 1] = list[j];
                list[j] = temp;
            }
            System.out.format("第 %d 遍的第%d 次交换:", i + 1, j + 1);
            for (int count : list) {
                System.out.print(count);
            }
            System.out.println("");
        }
        System.out.format("第 %d 遍最终结果:", i + 1);
        for (int count : list) {
            System.out.print(count);
        }
        System.out.println("\n#########################");
    }
}

java最近复习基础呢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值