java 数组的基本概念

1.数组的基本概念

  数组指的是一组相关变量的集合。例如:如果说现在要定义100个整型变量,如果按照我们以前的思路,我们可能这样定义:

1 public class demo {
2     public static void main(String[] args) {
3         int a = 1, b = 2, c = 3, d = 4;  ///... ... 一共写100个
4     }
5 }

  以上的形式的确可以满足技术要求,但是有一个问题,这100个变量没有任何的逻辑控制,那么就会出现对象不方便管理的情况。那么在这样的情况下,就可以用数组来解决此类问题,数组本身数组引用数据类型,所以数组的定义语法如下:

  • 声明并开辟数组:数据类型  数组名称 [ ]  = new 数组类型[ 长度 ] ; // 数据类型  [  ] 数组名称  = new 数组类型[ 长度 ] ,[  ]的位置也可以这样
  •  分步完成:
    •   声明数组: 数据类型 数组名称 [ ]  = nul ;     //声明的时候才会使用 [ ] ,
    •   开辟数组:数组名称 = new 数组类型  [ 长度 ] ;

  当数组开辟空间之后,那么可以 数组名称[下标 || 索引]  的形式进行访问,但是索引数组的下标都是从0开始的(和python元组概念一样,也是不能越界,会抛出[ArrayIndexOutOfBoundsException]错误

        //以上  定义数组使用的是动态初始化的方式

范例:

1 public class demo_Array {
2     public static void main(String[] args) {
3         int data[] = new int[3]; //声明并开辟一个3个长度的数组
4         System.out.println(data[0]);
5         System.out.println(data[1]);
6         System.out.println(data[2]);
7     }
8 }
out:

0
0
0

  //上面说明动态生成的数组初始化值为0

  由于数组是一种顺序结构,并数组的长度都是固定的,那么可以使用循环的语句进行输出(和Python概念一样),而且java里面为了方便数组的输出有一个内置方法可以取得数组长度。

    方法 : “ 数组名称 . length ”   如下

1 public class demo_Array {
2     public static void main(String[] args) {
3         int data[] = new int[3]; //声明并开辟一个3个长度的数组
4         System.out.println(data.length);
5     }
6 }
out:
3

赋值并循环输出:

 1  1 public class demo_Array {
 2  2     public static void main(String[] args) {
 3  3         int data[] = new int[3]; //声明并开辟一个3个长度的数组
 4  4         data[0] = 10;  //赋值语句
 5  5         data[1] = 20;  //赋值语句
 6  6         data[2] = 30;  //赋值语句
 7  7         for (int x =0 ; x< data.length;x++){
 8  8             System.out.println(data[x]);
 9  9         }
10 10     }
11 11 }
out:
10
20
30

 

  虽然数组的操作很简单,当它也属于引用数据类型,牵涉到内存分配的问题,与对象保存的唯一区别在yu:对象中的堆保存的是属性,而数组中的堆保存的是一组信息;

分步完成的话:

 1 public class demo_Array {
 2     public static void main(String[] args) {
 3         int data[] = null;  //声明数组
 4         data = new int[3];  //开辟数组堆空间
 5         data[0] = 10;
 6         data[1] = 20;
 7         data[2] = 30;
 8         for (int i =0 ; i< data.length;i++){
 9             System.out.println(data[i]);
10         }
11     }
12 }

  跟对象的概念基本一样

既然数组属于引用数据类型,那么数组也可以发生引用传递:

//引用传递的目标必须也是一个数组
public class demo_Array {
    public static void main(String[] args) {
        int data[] = new int[3]; //声明并开辟一个3个长度的数组
        int temp [] = data; //引用传递的目标必须也是一个数组
        data[0] = 10;
        data[1] = 20;
        data[2] = 30;
        for (int i =0 ; i< data.length;i++){
            System.out.println(data[i]);
        }
    }
}

以上数组的定义格式是属于动态初始化,操作特点是:先开辟数组空间,而后赋值。

那么也有静态初始化:

  1. 数据类型 数组名称 [ ] = { 值,值,值...... } ;   (不推荐)

  2.数据类型 数组名称 [ ] = new 数据类型 [ ] { 值,值,值...... } ;

静态初始化范例:

1 public class demo_Array {
2     public static void main(String[] args) {
3         int data[] = new int[]{1,2,3,4,5}; 
4         for (int i =0 ; i< data.length;i++){
5             System.out.println(data[i]);
6         }
7     }
8 }
out:
1
2
3
4
5

   *在实际工作中数组是会存在的,但它的内容大部分情况下都是通过传递的数据动态生成的,很少会出现这种先开辟数组再使用的情况

   *java数组有一个最大的缺陷,长度是不能被改变的,就是不能+1-1长度,所以很少会直接生成使用,而是通过传递动态生成

 2.二位数组

  在之前的数值里面只有一个 [ ]  ,也称为一维数组,而如果要描述更多的数据,可以使用二位数组, 后面有两个[ ] [ ] 。

一维数组:

索引 0 1 2 3 4 5 6 7 8
数据 10 20 30 40 50 60 70 80 90

  在一维数组里面要找一个数组,只要确定一个索引就可以了 System.out.println(data[0]); ;

二位数据:

索引 列:0 1 2 3 4 5 6 7 8
行:0 10 20 30 40 50 60 70 80 90
1 564 87 3678 453 831 54 12 87 23
2 75 825 8787 687 87 35 54 87 57

  如果现在要确定蓝色这个数据,需要行列定位,例如:行1,列5 =  [ 1 ][ 5 ]  ;

  而定义语法有两类:

  • 动态初始化: 数据类型 数组名称 [ ][ ] = new 数据类型 [行的个数][列的个数] ;
  • 静态初始化:数据类型 数组名称 [ ][ ] = new 数据类型 [ ][ ] { {  值,值,值... ... } };

  所谓的二维数组实际上就是将多个一维数组变成了一个大的数组,并且为每一个一维数组设置了一个行号 ; 

静态初始化和输出:

 1 public class demo_Array {
 2     public static void main(String[] args) {
 3         int data [][] = new int[][]{
 4                 {1,2,3},
 5                 {4,5,6},
 6                 {7,8,9}
 7         } ;
 8         //外层循环是控制数组的数据行内容
 9         for (int x = 0 ; x < data.length ; x++){
10             //内层循环是控制数组的数据列内容
11             for (int y = 0 ; y < data[x].length ; y++){
12                 System.out.print(data[x][y] + "	");
13             }
14             System.out.println();
15         }
16     }
17 }
out:
1    2    3    
4    5    6    
7    8    9    

  * 实际开发中二位数组很少出现

3.数组与方法参数的传递 **

   数组也可以传递,但是如果传递的是数组,请观察内存分配。

 1 public class demo {
 2     public static void main(String[] args) {
 3         int data[] = new int[]{1,2,3};
 4         change(data);    // data = int temp []
 5         for (int x=0 ; x< data.length; x++) {
 6             System.out.println(data[x]);
 7         }
 8     }
 9     //此方法定义在主类中,并由主方法直接调用
10     public static void change(int temp[]){
11         for (int x = 0 ; x < temp.length ; x++){
12             temp[x] = temp[x] * 2;
13 //            System.out.println(temp[x]);
14         }
15     }
16 }

观察内存:

另外一种:

 1 public class 数组传递 {
 2     public static void main(String[] args) {
 3         int data[] = new int[]{1,2,3};
 4         int temp[] = data;   //数组传递
 5         for (int x = 0 ; x < temp.length ; x++){
 6             temp[x] = temp[x] * 2;
 7         }
 8         for (int x=0 ; x< data.length; x++) {
 9             System.out.println(data[x]);
10         }
11     }
12 }

  *在进行数组的引用传递中,方法对数组的修改一定会影响原始数据。

 

 

原文地址:https://www.cnblogs.com/Tsukasa/p/7082923.html