数组的定义

  • 数组是相同类型数据的集合 比如全是int 或者全是 string

  • 数组描述是相同类型的数据,他们按照一定的先后次序排序

    (先后次序排序,取决于你输入的时候怎么排序)

  • 其中,每一个数据称作一个数组元素,每个数据元素可以通过一个下吧来访问。

    数组元素是从0开始的,假如数组有10个数字,他最高的下标是9

    俗称 从零开始的数组访问

数组声明和 创建

首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

dataType[] arrayRefVar;   //首选的方法 
或
    dataType[] arrayRefVar[];//效果相同,但不是首选语法 

一个是在类型后面加中括号一个是在变量名后面加中括号

package array;

public class ArrayDay01 { 
    //变量的类型 变量的名字 = 变量的值
    //数组类型

    public static void main(String[] args) { 
        int[] nums; //定义 //首选的方法
        int nums2 [];  //这2种都是可以的 //效果相同,但不是首选方法
        //加一个中括号,就可以代表这是int类型的数组了
        //为什么会有2种,是因为int nums2[]是c++类型的,早期是为了让c++的人快速掌握Java。 所以平时就用int[] nums;类型的就可以了

        nums = new int[10];//这里面可以存放10个int类型的数字
    }

看一下上面的代码,可以知道int[] nums 和int nums[] 的区别在哪里

如果没有数组的话,我们要定义一个数值,就要int x

int x1 int x2 这样,很麻烦,要写很多代码

比如图中的框框是一个内存,我们定义了一个int x=1 ,那么这个空间就是等于1了, 而那个空间的名称就叫做x

这个空间就是int类型,里面就是数字1 ,但是只能放一个。

要是想要定义10个,就要复制10个,非常麻烦

数组的意思

int[] nums = new int[10]

//int[] nums 数组的意思

//new int[10] **是新建一个int类型的组,新建了一个空间,空间里面开了10个数值 ** new 是 新 的意思

然后这个空间的名称叫做nums

这个空间里面被开辟了10个空间 ,空间数量多少 取决于new int[10] 的中括号里面的数值为多少,则空间数量为多少

里面所有的类型都是int类型的

里面的空间,分别对应1-10

然后每个空间都有一个编号也就是所谓的下标

下标是从0开始的

0-9是位置编号,1-10是里面的值

我们要取值的话,就是 nums 下的第0号元素。

相当于原来是一个数,现在是一组数,

但是这一组的同一个名字,所以他里面的类型必须都相同

Java语言使用new操作符来创建组,语法如下

dataType[] arrayRefVar = new dataType[]
    //dataType[] arrayRefVar 我们的数组 
    //dataType[] 为类型
    //arrayRefVar 为名称
    //new dataType[] 就是新建一个类型为dataType的组

就跟int[] nums = new int[];

这样 int[] nums 是变量 和 名称

new int[] 是创建一个类型为int 类型的组

示列

package array;

public class ArrayDay01 { 
    //变量的类型 变量的名字 = 变量的值
    //数组类型
    public static void main(String[] args) { 
        int[] nums; //声明一个数组
        nums = new int[10];//创建一个数组,里面可以存放10个int类型的数字
        //给数组元素中赋值
        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;
        System.out.println(nums[0]);
    }
}

运行一下, 得出1

我们吧0改成9 运行一下,得出10

如果我们吧

nums[9] = 10;

给删掉话,再次运行就会得出一个默认值0

当然也可以

int[] nums = new int[]   
//数据类型+上一个中括号代表他是数组
    //名称
    //在new一个int类型的数组,(中括号里面)再给他分配一个初始的大小
    //数组必须给他一个初始值,不然特没有特定的值,万一无线创下去就乱套了
    //数组的长度是确定的,一旦创建,它的大小就是不可以更改的

这样,我们吧声明和长度写在一起了

获取数组的长度 语法

arrays.length

​ arrays为数组的名称

length 是获取长度

求数组的全部值的和

package array;
public class ArrayDay01 { 
    //变量的类型 变量的名字 = 变量的值
    //数组类型
    public static void main(String[] args) { 
        int[] nums; //声明一个数组
        nums = new int[10];//创建一个数组,里面可以存放10个int类型的数字
        //给数组元素中赋值
        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;
        //计算所有元素的和
        int sum = 0;
        //获取数组长度: arrays.length
        for (int i = 0;i<nums.length ; i++){ 
            sum = sum +nums[i];
        }
          System.out.println("总和为:"+sum);
    }
}

如图

内存分析

  • Java内存分析

理解

  1. 声明一个nums,这个时候在堆里面还是没有东西的。 但是在栈(zhan)里面会压过一个东西,叫做nums.

    我们现在只是声明了一个数组,这个数组是空的,他只有一个名字,这个名字并没有什么实际作用

    2.第二部创建数组

    nums = new int [10]

    new一个int ,产生了 new这个事件

    看上面的图片,new关键词都会放在堆里面

    于是乎,在做完这个第二部的时候栈里面的nums

    在堆里面做了一件事情

    他开辟了一个空间,这个空间就是int类型

    里面被分成了10个小块,因为初始的大小为10

  2. 声明的时候,这个数组并不存在,只有我们通过new关键词去创建的时候,这个数组才存在,当我们给里面赋值的时候,这里面才有值,没有赋值的话,里面就是默认值

加入我们只有10个元素,那我要是获取第11个元素会怎么样呢?

  //给数组元素中赋值
        nums[0] = 1;
        nums[1] = 2;
        nums[2] = 3;
        nums[3] = 4;
        nums[4] = 5;
        nums[5] = 6;
        nums[6] = 7;
        nums[7] = 8;
        nums[8] = 9;
        nums[9] = 10;
       
          System.out.println(nums[10]);

就会看到一个错误

java.lang.ArrayIndexOutOfBoundsException

array 数组的意思

IndexOutOfBounds 数组下标越界了

就是说,我们数组只有10个,你却取第11个,

第11个,可能在外面,也有可能不存在,所以是拿不到的

所以就会异常

不过一般来说,我们都是把声明和创建写在一块

int[] nums =new int[10];

数组的三种初始化

  • 静态初始化

  • int[] a ={ 1,2,3};
    Man[] mans = { new Man(1,1),new Man(2,2)}
    
  • 动态初始化

  • int[] a = new int[2];
    a[0] = 1;
    a[1] = 2;
    
  • 数组的默认初始化

    • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。

静态初始化

 int[] a = { 1,2,3,4,5,6,7,8};
        System.out.println(a[0]);

我个人理解是

静态初始化

int[] 这是数组的一个类型

a = 名称

我们之前呢? 是new int[] new了一个int让它初始化

我们也可以直接给他初始化,一个{}括号就代表这是一个数组

所有花括号括起来的都是一个数组

然后我们在往数组里面放元素了。放多少个,它的空间就是多大 ,一旦定义之后就不可以改变了

a就是固定那么多

创建的时候顺便赋值

我们输出一下 a[0] 发现等于1

动态初始化

int[] b = new int[10];
b[0] = 10;
b[1] = 10;
b[2] = 10;
b[3] = 10;
b[4] = 10;
System.out.println(b[0]);
System.out.println(b[1]);
System.out.println(b[2]);
System.out.println(b[3]);
System.out.println(b[4]);
int[] b = new int[10];

int[] b = new int[10];

前面的叫声明,后面的叫初始化给他创建空间

但是空间创建完之后,里面现在的所有值都是零

我们要给他去手动赋值

动态初始化:默认初始化

数组在没有被赋值的时候默认是0,String类型是null 空的意思

 int[] b = new int[10];
        b[0] = 10;
  System.out.println(b[0]);
        System.out.println(b[1]);

我们运行b[0]和b[1]

发现

一个为10 一个为0

没有被初始化的空间,默认值是0

数组的四个基本特点

  • 长度是确定的。数组一旦被创建,它的大小计算不可以改变的。如果说需要改变大小,那么只能重新创建

  • 其中元素的类型必须是相同的类型,不允许出现混合类型

    比如里面定义的是int类型,那么就不能出现String类型

  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

  • 数组变量属于引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。

    数组本身就是对象,Java中对象是在堆中的,因此数组无论保持原始类型还是其他对象类型,数组对象本身是在堆中的

    只要使用new关键词,new出来的,以及数组,都是在堆中的

不管是原始类型还是其他对象类型的,所有东西都是保存在中的

数组边界

  • 下标的合法区间:[0,lenght-1],如果越界就会报错;

    就比如说,我们的数组长度为10,

    但是真正的下标数值为[0,10-1]

    就是[0,9]

    public stativ void main(String[] args){ 
        int[] a = new int [2];
        System.out.println(a[2]);
    }
    

上图中的代码,一旦运行就会出现

ArrayIndexOutOfBoundsException:数组下标越界异常!

出现这个错误的时候,就要回去看看,什么地方越界了

示范

package array;

public class ArrayDay02 { 
    public static void main(String[] args) { 
        //静态初始化 创建+赋值
        int[] a = { 1,2,3,4,5,6,7,8};
  
         for(int i = 0; i<a.length; i++){     //a.length 的意思是,可以获取a数组的长度
             System.out.println(a[i]);

         }

a.length 的意思是

a为我们数组的名称

length为 数组的长度

System.our.println(a[i]);

我们输出一下

就会发现全部都运行出来了

我们在i<a.length 的那个地方加个=

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

         }

再次运行就会发现

越界了

i<=8 的时候 i=8 ,但是数组里面没有int [8]的数组

所以显示越界了

数组边界小结

数组是相同数据类型的有序集合

数组也是对象。因为他是new出来的,数组元素相当于对象的成员变量

数组的长度是确定的,不可以变的,想改变的话,必须重新创建一个

如果越界就会报出 ArrayIndexOutOfBounds

数组使用

  • For-Each 循环

  • 数组作方法入参

  • 数组作返回值

    package array;
    
    public class ArrasyDay03 { 
        public static void main(String[] args) { 
            int[] arrays = { 1,2,3,4,5};
            //打印全部的数组元素
            for(int i = 0 ; i< arrays.length ;i++) { 
                System.out.println(arrays[i]);
            }
                System.out.println("=========================");
    
                //计算所有元素的和
             int sum = 0;
             for (int k = 0 ; k<arrays.length;k++){ 
                    sum = sum + arrays [k] ;
                }
                   System.out.println("sum :" +sum);        System.out.println("=====================");
            //查找最大元素
            int max = arrays[0];
           for (int i = 1; i < arrays.length; i++) { 
                if (arrays[i]>max){ 
                    max = arrays[i];
                }
            }
           System.out.println("max ="+max);
            }
        }
    

分别是打印数组、求和还有最大元素的写法

For-Each 循环 刚刚我们用的都是普通的for循环

public static void main(String[] args) { 
        int[] arrays = { 1,2,3,4,5};
         
         //JDK1.5以上版本 省略了下标 // 用于打印输出
        for (int array : arrays) { 
            // arrays 代表一个数组
            System.out.println(array);
        }

我们输入arrays.for 就是自动变成 上面的方法理解就好

for(int array : arrays) 
    // int array 是类型+名称
    //arrays 是数组的名称
    //: 是类似于==的意思

然后我们在输出一下,这样子的for循环是直接吧arrays里面的数值

一个一个打印出来,是比较简单的一种操作

但是还是建议使用这种类型的

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

数组作方法入参 数组作返回值

打印数组元素

 .public static void main(String[] args){ 
   printArray(reverse);  
 } 
     
public static void printArray(int[] arrays) { 
     //static 是为了后面方便调用, 就是类变量
     //printArray 是方法名称
     //int[] arrays 是int类型 arrays名称的数组
     
     
        for(int i = 0 ;i < arrays.length;i++){ 
              // arrays.langth arrays是数组名称
            //langth 是长度的意思, 合在一起就是arrays这个数组的长度有多长
            
            System.out.print(arrays[i]+" ");
            //print 是运行完之后不换行
        }

输出一下,就是

反转数组

package array;

public class ArrasyDay04 { 
    public static void main(String[] args) { 
        int[] arrays = { 1,2,3,4,5};
        int[] reverse = reverse(arrays);
        printArray(reverse);
    }
    //反转数组
    public static int[] reverse(int[] arrays){ 
        int[] result = new int[arrays.length];
        //反转的操作
        for (int i = 0, j=result.length-1; i < arrays.length ; i++,j--) { 
     
            result[j] = arrays[i];
        }
        return result;
    }
}

第一步

public static int[] reverse(int[] arrays){ 
     //public static 是修饰符 
    //int[] 为返回的数据类型 返回一个数组
    //reverse 是方法名称 reverse : 反转
    //传递的是数组参数 int[] arrays arrays名称的数组类型
    //
}

第二部

 public static int[] reverse(int[] arrays){ 
        int[] result = new int[arrays.length];
 
        }

声明并创建一个数组,数值为arrays.length 意思是 arrays数组的长度

这样可以保证,是同一个结果

第三部 反转操作

public static int[] reverse(int[] arrays){ 
        int[] result = new int[arrays.length];
      //反转操作
    for(int i = 0,j=result.length-1;i< arrays.length;i++,j--){ 
        //j=result.length-1 是因为有个下标是0
        result[j] = arrays[i];	
        //result[j] 因为上面 int[arrays.length]; 也就是说他是5 
        //所以j=result.length-1 = 4 (这是下标) 
        //而arrats[i] 是从1开始 ,然后递增 到4
        //所以j=4 i=1
        //j 是下标符 i是数值
        //所以4=1 3=2 2=3 1=4 0=5
        //然后排序就是5,4,3,2,1
        
        
    }
    return result;
        }

result[j] 因为上面 int[arrays.length]; 也就是说他是5
所以j=result.length-1 = 4 (这是下标)
而arrats[i] 是从1开始 ,然后递增 到4
所以j=4 i=1
j 是下标符 i是数值
所以4=1 3=2 2=3 1=4 0=5
然后排序就是5,4,3,2,1

然后再return返回result的值

然后我们在输出一下

public class ArrasyDay04 { 
    public static void main(String[] args) { 
        int[] arrays = { 1,2,3,4,5};
            int[] reverse = reverse(arrays);
        printArray(reverse);


输入reverse(arrays);

就会返回一个结果,这个结果就是已经被反转过的数组

int[] reverse = reverse(arrays);

然后再输出printArray(revers);

运行一下

本文地址:https://blog.csdn.net/XYzuiyou/article/details/113967046