数组

发表时间:2017-05-08 16:13:26 浏览量( 41 ) 留言数( 0 )

学习目标:

1、了解Java的历史

2、为什么要学习Java语言

3、端正学习态度


学习过程:

到目前为止,我们都是使用一个变量就声明一个变量,但是我们我们现在要声明10个整型变量,那么我们是不是需要写10行代码呢?虽然我们可以在一行代码中同时声明多个变量,写10个也不算什么,但是如果要声明50个,或者100个呢!这个时候最好的方法是使用数组组织这些数据了。

一、数组的作用和组织方式

数组是一个可以保存多个相同类型的变量的顺序集合,这些变量在数组中以列表的形式存在,每个信息都对应的有自己的脚标,编程时可以通过数据项的脚标很方便的访问到每个信息。数组类型在创建时需要指定长度,它是固定长度值存储一类信息的集合。

数组的组织方式在物理方式和逻辑方式上都是以顺序表的方式保存的,也就是说如果有一个由10个整型变量组成的数组,那么这10个变量都是存储在相邻的内存区域中,逻辑上也是相邻的。

数组a  











a[0]   a[1]   a[2]   a[3]   a[4]   a[5]   a[6]   a[7]    a[8]   a[9]

二、数组的声明和初始化

要使用数组的第一步当然就是声明一个数组,和声明一个变量类似,也需要先写上数组的类型,数组名称的命名规范和变量的命名一样,但是为了和其他的变量的声明相区别,在声明一个数组是需要使用一对中括号([])。

声明一个数组可以这样:

   String unames[];uages[];scores[];

学过C语言的同学应该感动非常熟悉了,但是java也可使用下面这种写法,把中括号前置,其效果是一样的。

   String []unames;[]uages;
   float[] scores; // 中括号前置还是后置的声明是等效的

和声明变量一样,我们也可以在声明的同时初始化内容,也可以声明数组对象的大小,以后在再进行赋值操作。

因为数据也是对象,所以我们可以使用new运算符来直接构造数组对象,并初始化数组的大小。如下面的示例:声明数组,然后使用new关键字例如:

   String unames[];
   unames=unames[50];//可以先声明unames数组,再创建数组,指定长度

声明了一个数组名是unames的对象,该对象可以放10个字符串对象。当然,我们也可以在声明的同时创建数组,如下面这个示例:

   String unames[] = newString [50]; 
   int[] scores;  = [50];

new关键字通常的含义是创建对象分配计算机内存空间,当我们使用new创建数组时,java将会自动给基本数据类型的数组赋予初始值,比如int的数组每个位置都是0,boolean的数组每个位置都是true,char的数组每项都是’’,如果是对象则给null值。

显示的赋值。

对数组的创建当然也可以同时赋值,这样的语法不使用new关键字,被称作静态初始化数组。比如我们声明一个长度是5的字符串数组:

   String unames[] = {“java”, “oracle”, “mysql”,“tomcat”, “jvaScript”};

或:

   String unames[] = new unames[]{“java”, “oracle”, “mysql”,“tomcat”, “jvaScript”};

三、数组的访问和操作

我们先声明一个整型变量,并显示为其赋值,其代码如下:

   int []a={10,20,30,40,50,60,70,80,90,100};

那么在它内存中的组织方式如下:

102030405060708090 100

 a[0]   a[1]   a[2]   a[3]   a[4]   a[5]   a[6]  a[7]    a[8]   a[9]

 

由上面可知,数组是顺序存储的,而且每一个数组都有一个下标表示,注意下标由0作为起始数,根据上表可知我们要查找,修改数组里的某个数组可以使用下标来唯一定位一个数。其格式是:

数组名[下标]。

比如我们想打印该数组的第5个数,那么对数组的访问可以使用数据脚本进行:

   System.out.println(a[4]);//注意下标从0开始,第5个,下标对应是4。

另外数组还提供了一个属性length 可以获得数组的长度,代码如下:

   System.out.println("数组的长度:"+a.length);

那么如果我要打印数组的全部类型呢?我们当然不需要写10行语句,可以结合我们上面介绍的循环语句帮帮忙,示例代码如下:

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

这样就可以打印数据的全部类型了,因为数组的下标是以0作为起点的,因此第一个项应该对应a[0]。在a数组中存储信息的项的脚标分别是:0,1,2...9,所以我们就声明了一个整型变量i=0,然后让i不断的累加1,并且i不能大于数组的长度。在遍历数组时,我们常常会用到这样的循环。

明白了数组的访问后,对数组项赋值也就非常简单了。代码如下:

   a[9] = 1000;// 数组a的第10个项赋值1000

我们也可以声明一个大小为100的整型数据,并为其赋值1,2,3...100、其代码如下

  int []a=int[100];
  for(i=0;i<a.length;i++){   
    a[i]=i+1;
  }

四、数组的一些示例

在程序中数组使得比较多,为了加深大家对数组的理解,下面举几个简单的示例说明。例子1:已知一组数据 12 ,34,56,78 。在程序定义以上数组,输出数组中最大值。其实现代码如下:

int arr[]={12,34,56,78};
int max=arr[0];
for(int i=1;iarr[i]?max:arr[i];
}
System.out.println(max);

程序开始先定了数组和初始化数据,然后定义了一个max变量,该变量保存每一次比较后的较大值,在比较前先把数组的第一个数赋值给该变量,然后通过循环把max保存的值和数组的值逐个数组的值进行比较,每一次比较都把较大值保存在max变量中,这样循环结束后,max保存的就是数组里的最大值了。

例子2:对int arr[]={23,10,39,56,7,8,2,3}从大到小的进行排序,并输出。(冒泡排序)

int arr[]={23,10,39,56,7,8,2,3};
int max;//中间变量
for(int j=0;j<arr.length;j++){
         boolean flag=true;//是否还有数据需要交换
         for(int i=0;i<arr.length-1-j;i++){
            if(arr[i]>arr[i+1]){
                //每次两两比较,如果前一个数比后一个数要,那么就交换它们的位置
                max=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=max;
                flag=false;//还有数据需要交换
            }
         }
         //如果没有数据需要交换就可以退出循环
         if(flag){
            break;
         }
        
         //测试每次结果
         /*for(int i=0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
         }
         System.out.println();*/
        
} 
//测试最后比较的结果
for(int i=arr.length-1;i>=0;i--){
    System.out.println(arr[i]);
}

这个道题目是使用了冒泡排序的算法,初学者可能比较难理解,有关排序的详细说明我们在后面的章节中专门论述,这里暂不说明了,大家可以先自己理解代码。

五、多维数组

上面介绍都是一维数组,因为数组里的元素都是基本数据类型了,java也可以表示多维数组,但是在内存的物理组织方式还是和一维数组一样的方式保存的,所谓的多维数组的实际就是数组里面又包含一个数组而已。

多维数组在逻辑上的组织方式在我们日常生活中非常常见,比如像Excal表格,就是二维表。我们生活的立体三维世界,使用x、y、z坐标能够精确定位到立体空间所在的位置。在真实世界,多维信息模型非常普遍。但Java 中没有真正的多维数组,只有数组的数组,这样的用法功能上跟多维数组是一样。

 

excel二维表格:脚标B2的值是5

由于不是真正的多维数组,因此在Java中多维数组不一定是规则矩阵形式,这样其实提供了更加灵活的编码方式。例如我们也可以象一维数组一样,在定义数组的同时就为多维数组元素分配空间并赋值,也就是对多维数组的静态初始化。如下面这句代码:    

int arr[]={1,2,3};//一维数组
int arr2[][]={{1},{2},{3}};//二维数组
int arr3[][][]={{{1}},{{2}},{{3}}};//三维数组     
三维以上的数组用得比较少,这里我们就以二维数组进行学习,先看看下面的示例代码:
 public static void main(String[] args) {
  //定义二维数组,并赋值
       int arrs[][]={{1,2,3,4},
                     {5,6,7,8},
                     {9,10,11,12}};
      System.out.println("数组的长度:"+arrs.length);
      System.out.println("第一行数组的长度"+arrs[0].length);
      System.out.println("访问第一行第一列的数据:"+arrs[0][0]);
      System.out.println("访问第二行第三列的数据:"+arrs[1][2]);
    
      //打印
      for(int i=0;i<arrs.length;i++){
         for(int j=0;j<arrs[i].length;j++){
            System.out.print("i="+i+",j="+j+":");
            System.out.print(arrs[i][j]+",");
         }
         System.out.println();
      }
}

    我们一开始定义了一个二维数组arrs,并为其赋初值,为了代码的可读性更强,我特意每一维代码就换一行,这样我们的二维数组的逻辑结构与下面的表格类似

物理结构其实就是一维数组arrs里面的元素又一个一维数组而已,所以我们可以打印出数组arrs的长度

           System.out.println("数组的长度:"+arrs.length);

程序输出的结果是3,因为一维数组arrs里面只放了三个元素,只是这三个元素又是一个一维数组。

那么我们也可以从一维数组arrs获得第一个元素(也是一个数组),然后打印该数组的长度:

           System.out.println("第一行数组的长度"+arrs[0].length);

程序输出为4,因为该数组只有四个元素,而且是基本元素了。

如果现在我想获得第一个元素,那么我应该如何访问呢?你可以把上面的表格想象成为进入电影院后找座位。你可以根据你电影票上面的第几行和第几列的信息,找到自己的座位,和现实生活不同的地方在于——下标从0开始。所以可以像下面代码一样访问数组里面的元素:   

   System.out.println(+arrs[0][0]); System.out.println(+arrs[1][2]);

“arrs[0][0]”为什么这样可以访问第一行第一列的数据,其实arrs[0]就是获得第一行的元素,也就是第一维的数组,arrs[0][0]当然也就是第一行第一列的数据了。从这个例子总我们可以理解“数组的数组”的含义,同理去理解三维及更多维度的数组。

接下来我们还把该数组的所有的数组全部打印出来,使用了二重循环,它的运行过程其实就是先获得第一行的数组,然后把第一行的数组通过循环数组打印处理,外层循环在移动到第二行的数组,依次类推,就打印了全部的数组。

  //打印
for(int i=0;i<arrs.length;i++){
   for(int j=0;j<arrs[i].length;j++){
        System.out.print("i="+i+",j="+j+":");
        System.out.print(arrs[i][j]+",");
    }
   System.out.println();
}

对二维数组的元素修改和赋值和一维数组类似,大家可以自己上机尝试。