JAVA零学习之基础归纳(四)--数组

从零开始学习java,一天进步一点点,一天学习一点点,多掌握知识和多多做题,本篇主要写java的基本语法中数组的基础

java基础语法

java基础学习(四)

1.数组定义和访问
1.1.1 数组(容器)概述
  • 容器概念
    • 容量:是将多个数据存储到一起,每个数据称为该容器的元素。
    • 生活中的容器:水杯、教室、衣柜
  • 案例分析
    • 假如需要统计某公司员工的工资情况,例如计算平均工资、最高工资、最低工资等。假设该公司有500名员工,用前面学的知识,程序员首先需要声明500个变量分别存储每位员工的工资,然后在进行操作,这样做会很麻烦的,而且错误率也会很高,因此我们可以使用数组(容器)进行操作,将所有的数据全部存储到一个数组中,统一操作。
1.2 数组概念
  • 数组概念:数组就是存储一组相同类型数据的数据结构。
  • 数组本身属于引用类型
  • 数组中的元素可以是基本数据类型,也可以是引用类型。
  • 【引用类型包括:数组、类、接口】
1.3数组的定义
1.3.1语法一
  • 语法:

  • 数组存储的数据类型[]  数组名字=new 数组存储的数据类型[长度];
    
  • 数组定义语法详解:

    • 数组存储的数据类型:创建数组存储什么类型数据的数据类型
    • []:表示数组
    • 数组名字:定义数组时起的变量名,符合标识符即可,可以使用数组名字对数组进行操作。
    • new:关键字,创建数组使所使用的关键字
    • 数组存储数据的数据类型:必须和前面定义的数据类型一致
    • [长度]:表示数据的长度,也就是表示数组中可以存储多少数据
    • 注意,数组是定长特性,长度一旦指定,就不可改变
  • 举例:

    • 定义可以存储5个整数的数组,代码如下:
public class Test01 {
    public static void main(String[] args) {
        int[]nums=new int[5];
        char[]c=new char[5];
        boolean[]b=new boolean[2];
        String[]str=new String[5];
        
    }

}
1.3.2 语法二
  • 语法:
数据类型[]数组名=new 数据类型[]{元素1,元素2,元素3,…};
  • 这种语法,属于在创建数组时,就对数组进行初始化操作。
  • []:不需要指定数组的长度,数组的长度由{}中元素的个数来决定。
  • 例如:
public class Test02 {
    public static void main(String[] args) {
    int[]arr=new int[]{1,2,3,4,5};
    }

}
1.3.3 语法三
  • 语法:
数据类型[]数组名={元素1,元素2,元素3,元素4,…};
  • 例如:
public class Test03 {
    public static void main(String[] args) {
    int[]nums={1,2,3,4,5};
    }

}
1.4数组的访问
1.4.1 概述
  • 索引:每一个储存到数组的元素,都会自动拥有一个整数编号,从0开始,这个自动编号称为数组的索引(index)或下标,可以通过数组的索引访问到数组中的元素。
  • 语法:数组名[索引]
  • 数组的长度属性:每个数组都具有长度,而且是固定的,java中赋予了数组一个属性,可以获取数组的长度,语法为,数组名.length,属性length的执行结果就是数组的长度。由此可以推出数组的最大索引值为数组-1,也就是数组名.length-1。
  • 索引访问数组的元素
    • 数组名[索引]=数值,为数组的元素赋值
    • 数组名[索引],获取数组中的元素
1.4.2 示例
package com.bdit;

import java.sql.SQLOutput;

public class Test04 {
    public static void main(String[] args) {
//   定义数组

        int[] num1 = new int[5];
        int num2[]= new int[5];
//            赋值:动态赋值
//                像 num1和num2这种定义的方式,定义后本身没有数据,应先用 “ 数组名称[下标值]=数据 ” 这种方式给予赋值,然后进行输出
        num1[0]=0;
        num1[1]=10;
        num1[2]=20;
        num1[3]=30;
        num1[4]=40;
//             输出
//                  第一种输出方式:
        System.out.println("这是Sys输出num1的方式"+num1[0]);
        System.out.println("这是Sys输出num1的方式"+num1[1]);
        System.out.println("这是Sys输出num1的方式"+num1[2]);
        System.out.println("这是Sys输出num1的方式"+num1[3]);
        System.out.println("这是Sys输出num1的方式"+num1[4]);
        System.out.println("--------------分隔符------------------");


//                    第二种输出方式:
           /*” 数组名称.length “   用于获取数组元素的总长度
            num1[i] 通过i来获取num1数组的下标值,在输出数组num1中的数据*/


        for(int i=0;i<num1.length;i++){
            System.out.println("这是for循环输出num1下标的方式"+i);
            System.out.println("这是for循环输出num1的方式"+num1[i]);
        }


        System.out.println("==============================分隔符==============================");


        /*第二种方法:
            数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3,元素4,......}*/
        double[] num3 = new double[]{2.3,2.6,2.36,23.0,36.9};
        for(int i=0;i<num3.length;i++){
            System.out.println("这是for循环输出num3的方式"+num3[i]);
        }


        System.out.println("==============================分隔符==============================");


        /*第三种方法:
            数据类型[] 数组名称 = {元素1,元素2,元素3,......}*/
        char[] num4 = {'a','b','c','d'};

        for(int i=0;i<num4.length;i++){
            System.out.println("这是for循环输出num4的方式"+num4[i]);
        }

    }
}

1.5 数组的常见操作
1.5.1 数组越界异常
  • 在程序运行后会抛出:ArrayIndexOutOfBoundsException 则代表数组索引越界异常
  • 示例:
package com.bdit;

public class Test05 {
    public static void main(String[] args) {
        int[]arrs={1,2,3};
        System.out.println(arrs[3]);
    }
}
1.5.2 数组空指针异常
  • 示例:
package com.bdit;

public class Test06 {
    public static void main(String[] args) {
        int[]arr=null;//数组属于引用类型,如果给引用类型赋值为空,那就是null
        System.out.println(arr[0]);
    }

}
  • 以上代码,在运行过程中,因为数组arr=nulll,索引再访问数组中的元素时,会产生一个NullPointerException空指针异常。
1.6 数组的遍历
public class Test07{
	public static void main(String[] args) {
        int[]nums=new int[]{1,2,3,4,5,6,7,8,9};

        for(int i=0;i<nums.length;i++){
            System.out.println(nums[i]);
        }
    }
}
1.6.1 示例
package com.bdit;
/*
数组的反转,例如原始数组为1,2,3,4,5,反转后的数组为5,4,3,2,1
 */
public class Test7 {
    public static void main(String[] args) {
        int[]arr={1,2,3,4,5};
        //获取最大索引
        int max=arr.length-1;
        for(int min=0;min<=max;min++){
            //利用第三方变量完成数组中的元素交换
            int temp=arr[min];
            arr[min]=arr[max];
            arr[max]=temp;
            max--;//最大索引
        }

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

1.7 练习
1.7.1 计算某个数组中所有元素的和以及平均数
package com.bdit;
/*
*  求数组中所有元素的和、平均数
* */
public class Test3 {

    public static void main(String[] args) {
        int[]nums=new int[]{19,22,34,10,76,54,88};
        int sum=0;
        for(int i=0;i<nums.length;i++){
            sum+=nums[i];//sum=sum+nums[i]
        }
        double avg=sum/ nums.length;
        System.out.println("和:"+sum+",平均数:"+avg);

    }
}
1.7.2 自定义一个数组,统计出数组中最大的数和最小的数
public class Test04 {
    public static void main(String[] args) {
//       自定义一个数组,数组里的数随意排放,统计出数组中最大的数和最小的数

        int[] a = {89,30,2,1,3,66};
        int max =a[0];
        int min =a[0];
        for(int i=0;i<a.length-1;i++){
            int i1=a[i];

            if(max<i1){
                max=i1;
            }else if(min>i1){
                min=i1;

            }
        }
            System.out.println(max);
            System.out.println(min);

        }

    }
1.7.3 自定义一个数组,存储5个学员的成绩,求最高成绩、最低成绩、总成绩、平均成绩
package com.bdit;

public class Test05 {
    public static void main(String[] args) {
//       自定义一个数组,存储5个学员的成绩,求最高成绩、最低成绩、总成绩、平均成绩
        int[] a = {33,56,89,52,30};
        int max =a[0];
        int min =a[0];
        int b=0;
        int c=0;
        for(int i=0;i<a.length;i++){
            int i1=a[i];
          //  System.out.println(a[i]);
            if(i1>max){
                max=i1;
            }else if(i1<min){
                min=i1;
            }
            b+=a[i];
            c=b/a.length;
            //System.out.println(i1);
        }
        System.out.println("最高成绩"+max);
        System.out.println("最低成绩"+min);
        System.out.println("总成绩"+b);
        System.out.println("平均成绩"+c);
    }
}
1.7.4 键盘输入5个学员的成绩存储到数组中,并计算总成绩和平均成绩和最高个人成绩以及最低成绩
package com.bdit;

import java.util.Scanner;

public class Test06 {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入要输入学员的个数:");
        //使输入学员个数位整数
        int in = sc.nextInt();
//  键盘输入5个学员的成绩存储到数组中,并计算总成绩和平均成绩和最高个人成绩以及最低成绩

        //获取要输入学员的个数
        double[] a= new double[in];

        double all = 0;
        double avg = 0;

        //循环输出五次提示输入第几名学员(1-5)的成绩
        for(int b=0;b<in;b++){
            System.out.println("请输入第"+(b+1)+"位学员的成绩:");
            a[b] = sc.nextDouble();
        }

        //循环输出第几名学员(1-5)的成绩(根据输入使第几名依次增加)
        for(int f=0;f<a.length;f++){
            System.out.print("第"+(f+1)+"位,学员成绩-->"+a[f]+"  ");
        }
        System.out.println("\n");

        double max =a[0];
        double min =a[0];

        for (int c=0;c<=a.length-1;c++){
            //输出最大值
            if(a[c]>max){
                max=a[c];
            }
            //输出最小值
            if (a[c] < min){
                min = a[c];
            }
            //输出总值
            all+=a[c];
            //输出平均数
            avg=all/in;
    }
        System.out.println("最大值"+max);
        System.out.println("最小值"+min);
        System.out.println("总成绩"+all);
        System.out.println("平均成绩"+avg);
    }
}
1.8增强for循环
1.8.1 格式
for(数据类型 变量名:数组名或集合名){
    
}
1.8.2示例
public static void main(String[] args) {
        int[]nums={1,2,3,4,5,6};
        //增强的for循环
        for(int n : nums){
            System.out.println(n);
        }
    }

  • 增强for循环弊端
    • 无法获取元素索引值
  • 增强的for循环只适用于对数组中的元素进行遍历操作
2.数据内存分析
2.1内存概述
  • 内存是计算机中的重要原件,临时数据存储区域,作用是运行程序。我们编写的程序是存放在硬盘中,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。
  • Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
2.2Java虚拟机的内存划分
  • 为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据的方式和内存管理方式。
区域名称作用
寄存器给CPU使用,和我们开发无关
本地方法栈JVM在使用操作系统功能的时候使用,和我们开发无关
方法区存储可以运行的class文件
堆内存存储对象或者数组,new来创建的,都存储在堆内存中
方法栈方法运行时使用的内存,比如main方法运行,就会进入方法栈中
2.3 数组在内存中的存储
  • 一个数组的内存图

    public static void main(String[] args) {
            int[]arr=new int[4];
            System.out.println(arr);//[I@f5f2bb7
     }
    

    以上方法执行,输出的结果是[I@f5f2bb7,这个是什么?是数组在内存中的地址,new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。

    输出arr[0],就会输出arr保存的内存地址中数组中索引为0上的元素。
    Lingduyu

  • 二个数内存图

Lingduyu

  • 两个变量指向一个数组
public static void main(String[] args) {
        int[]arr=new int[4];
        //数组赋值
        arr[0]=10;
        arr[1]=20;
        arr[2]=30;
        arr[3]=40;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        System.out.println(arr[3]);
        //定义数组变量arr2,将arr的地址赋值给arr2
        int[]arr2=arr;
        arr2[1]=99;
        System.out.println(arr[1]);
    }

Lingduyu

2.4 Java中内存分配

Lingduyu

Lgduyu

Lingduyu

2.5方法栈
package com.bdit.Test;

public class Test02 {
//    当方法运行时,先进入main方法的方法栈,运行代码当运行到  ”test_Ff01()“  方法时,进入  ”test_Ff01()“  方法的方法栈,
//    当运行完后  ”test_Ff01()“  其方法栈则会消失,而这时  "main()"  方法并没运行完,再继续运行  "main()"  方法,
//    当  "main()"  方法运行完,  "main()"  方法对应的方法栈也会消失
//    栈就是内存

    public static void main(String[] args) {
        System.out.println("===main方法的开始===");
//        调用方法
        test_Ff01();
        test_Ff001();
        System.out.println("===main方法的结束===");

    }
    public static void test_Ff01(){
        System.out.println("无参数,无返回值");
    }
    public static void test_Ff001(){
        System.out.println("这是test_Ff001();");
    }
}

3.总结

本篇大部分为应用,最好不要死记硬背,因为这样就算记住在应用上也是很生涩的,并没有那种依靠自己理解来记住用的方便,而基础的问题一定要掌握,基础打好等到后面难的也会变简单。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值