Java中的数组

             数组

学习本章用到的单词:

array:数组

length:长度

sort:排序.种类

maximum:最大值

minimum:最小值

reference:参考,谈到,引用

info:信息,咨询

primitive:原始的,原语,早期的.


数组的基本元素

>标识符.首先,和变量一样,在计算机中,数组也要有一个名称,称为标识符,用于区分不同的数组.

>数组元素.当给出了数组名称,即数组标识符后,要向数组中存放数据,这些数据就称为数组元素.

>数组下标.在数组中,为了正确地得到数组的元素,需要对它们进行编号,这样计算机才能根据编号去存取,这个编号就称为数组下标.

>元素类型.存储在数组中的数组元素应该是同一数据类型,如可以把学员的成绩存储在数组中,而每一个学员的成绩可以用整形变量存储,因此称它的元素类型为整形.

                                                                               int类型

80 3
90 2
100 1
70 0

                                       scores

 元素类型为int类型,   scres(数组名称即标识符),3210(为下标)

对于上图作说明:

>数组只有一个名称,即标识符,如scores.

>数组元素在数组里顺序排列编号,该编号即为数组下标,它标明了元素在数组中的位置.

  第一个元素的编号规定为0,因此数组的下标依次为0,1,2,3,4等.

>数组中的每个元素都可以通过下标来访问.由于元素是按顺序存储的,每个元素固定的对应一个下标,因此可以通过下标快速地访问到每个元素.例如scores[0]指数组中的第一个元素70,scres[1]指数组中的第二个元素100.

>数组大小(长度)  是数组可容纳元素的最大数量.定义一个数组的同时也定义了它的大小.如果数组已满但是还继续向数组中存储数据的话,程序就会出错,这称为数组越界.例如上图中数组最大值为3,如果数组的下标超过此大小,程序就会因错误而终止.

使用数组的步骤

1.声明数组

语法:

数据类型[]数组名;

或者

数据     数组名[];

以上两种方式都可以声明一个数组,数组名可以是任意合法的变量名.

声明数组就是告诉计算机该数组中数据的类型是 神马.例如:

int[]  scres;//存储一个得分,数据类型为int

double  height[];//存储一个高度.数据类型为double

String  name[];//存储一个名字.数据类型为String

2,分配空间

简单来说就是用new关键字来给数组分配空间

语法:

数组名 = new 数据类型[数组长度];

eg:

scores = new int[10];//长度为10 的int类型数组

height = new double[10];//长度为10的double类型数组

name  = new  String[10];//长度为10的String类型数组

将以上两个步骤合并,就是在声明数组的同时给它分配空间:

数据类型[]   数组名 = new 数据类型[数组长度];

eg:

int scores[]  = new  int[10];//存储10个数据得分

注意!一旦声明了数组的大小就不能修改.即数组的长度是固定的,

3.赋值

分配空间之后就可以向数组里存放数据了,数组中每一个元素都是通过下标来访问的

语法:

         数组名[下标值];

eg:向scores数组中存放数据

scores[0] = 10;

scores[1] = 20;

scores[2] = 30;

......

注意!在编写程序时数组和循环往往结合在一起使用,可以大大简化代码,提高程序效率,通常使用for循环遍历数组或给数组元素赋值.

在java中海提供了另外一种创建数组的方式,它将生命数组,分配空间和赋值合并完成.

语法:

数据类型[]   数组名={值1,值2,值3,.........值n};

eg:

int []  scores = {30.20.10,60.78};//创建一个长度为5的数组scores

也可以写为:

int[] scores = new int[]{30,20,10,60,78};

经验:值得注意的是直接创建并赋值的方式一般在数组元素中比较少的情况下使用,它必须一并完成.

注意!如果定义的数组是基本类型的数组,即int,double,char,boolean类型,在java中定义数组之后如果没有指定初始值,则依据数据类型的不同,会给数据赋一个默认值

int 初始值0

double 初始值0.0

char 初始值'\u0000'

boolean初始值false

常见错误

1.数组下标从0开始而不是从1开始

2.数组访问越界.如果访问数组元素时指定的下标小于0,或者大于等于数组的长度,double将出现数组下标越界异常.

数组应用

数组排序

语法:Arrays.sort(数组名);

Arrays是Java中提供的 一个类,而sort()是该类的一个方法.将数组名放在sort()方法的括号中,就可以完成对该数组的排序(升序).

求数组最大值

 


import java.util.Scanner;

public class BAXE {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int [] scores = new int[5];
int max = 0;
System.out.println("请输入五位学员的成绩:");
for(int i = 0;i<scores.length;i++){
scores[i] = input.nextInt();
}
max = scores[0];
for(int i = 1;i<scores.length;i++){
if(scores[i]>max){
max = scores[i];
}
}
System.out.println("考试成绩最高分为:"+max);
}

}

以上为求数组最大值的方法.

向数组中插入元素

import java.util.Scanner;

public class GG {

/**
* @param args
*/
public static void main(String[] args) {
int[]list = new int[6];//长度为6的数组
list[0] = 99;
list[1] = 85;
list[2] = 82;
list[3] = 63;
list[4] = 60;
int index = list.length;//保存新增成绩插入位置
System.out.println("请输入新增成绩:");
Scanner input = new Scanner(System.in);
int num = input.nextInt();
//找到新元素的插入位置
for(int i =0;i<list.length;i++){
if(num>list[i]){
index = i;
break;
}
}
//元素后移
for(int j = list.length-1;j>index;j--){
list[j]= list[j-1];//index下标开始的元素后移一个位置

}
list[index]= num;//插入数据
System.out.println("插入成绩的下标是"+index);
System.out.println("插入后的成绩信息是:");
for(int k =0;k<list.length;k++){//循环输出目前数组中的数据
System.out.println(list[k]+"\t");
}

}

}

以上是向数组中插入一个元素,但仍然会从大到小排列这些数据而不会混乱,

扩展:

Java 中的二维数组

所谓二维数组,可以简单的理解为是一种“特殊”的一维数组,它的每个数组空间中保存的是一个一维数组。

那么如何使用二维数组呢,步骤如下:

1、 声明数组并分配空间

 

或者

 

如:

 

2、 赋值

二维数组的赋值,和一维数组类似,可以通过下标来逐个赋值,注意索引从 0 开始

 

也可以在声明数组的同时为其赋值

 

如:

 

3、 处理数组

二维数组的访问和输出同一维数组一样,只是多了一个下标而已。在循环输出时,需要里面再内嵌一个循环,即使用二重循环来输出二维数组中的每一个元素。如:

 

运行结果:

 

需要了解的:在定义二维数组时也可以只指定行的个数,然后再为每一行分别指定列的个数。如果每行的列数不同,则创建的是不规则的二维数组,如下所示:

 

运行结果为:

 

小结:

定义一个两行三列的二维数组 names 并赋值,使用二重循环输出二维数组中的元素。

运行结果:


foreach语句使用总结

增强for(part1:part2){part3}; 

part2中是一个数组对象,或者是带有泛性的集合. 
part1定义了一个局部变量,这个局部变量的类型与part2中的对象元素的类型是一致的. 
part3当然还是循环体.

 
foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
 
foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。
 
foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。
 
foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
     引用了x的java语句;
}
 
下面通过两个例子简单例子看看foreach是如何简化编程的。代码如下:
 
一、foreach简化数组和集合的遍历
 
import java.util.Arrays; 
import java.util.List; 
import java.util.ArrayList; 

public class TestArray { 
public static void main(String args[]) { 
TestArray test = new TestArray(); 
test.test1(); 
test.listToArray(); 
test.testArray3(); 



/** 
* foreach语句输出一维数组 
*/ 
public void test1() { 
//定义并初始化一个数组 
int arr[] = {2, 3, 1}; 
System.out.println("----1----排序前的一维数组"); 
for (int x : arr) { 
System.out.println(x); //逐个输出数组元素的值 


//对数组排序 
Arrays.sort(arr); 

//利用java新特性for each循环输出数组 
System.out.println("----1----排序后的一维数组"); 
for (int x : arr) { 
System.out.println(x); //逐个输出数组元素的值 



/** 
* 集合转换为一维数组 
*/ 
public void listToArray() { 
//创建List并添加元素 
List<String> list = new ArrayList<String>(); 
list.add("1"); 
list.add("3"); 
list.add("4"); 

//利用froeach语句输出集合元素 
System.out.println("----2----froeach语句输出集合元素"); 
for (String x : list) { 
System.out.println(x); 


//将ArrayList转换为数组 
Object s[] = list.toArray(); 

//利用froeach语句输出集合元素 
System.out.println("----2----froeach语句输出集合转换而来的数组元素"); 
for (Object x : s) { 
System.out.println(x.toString()); //逐个输出数组元素的值 



/** 
* foreach输出二维数组测试 
*/ 
public void testArray2() { 
int arr2[][] = {{4, 3}, {1, 2}}; 
System.out.println("----3----foreach输出二维数组测试"); 
for (int x[] : arr2) { 
for (int e : x) { 
System.out.println(e); //逐个输出数组元素的值 




/** 
* foreach输出三维数组 
*/ 
public void testArray3() { 
int arr[][][] = { 
{{1, 2}, {3, 4}}, 
{{5, 6}, {7, 8}} 
}; 

System.out.println("----4----foreach输出三维数组测试"); 
for (int[][] a2 : arr) { 
for (int[] a1 : a2) { 
for (int x : a1) { 
System.out.println(x); 




}
 
运行结果:
----1----排序前的一维数组 



----1----排序后的一维数组 



----2----froeach语句输出集合元素 



----2----froeach语句输出集合转换而来的数组元素 



----4----foreach输出三维数组测试 









Process finished with exit code 0
 
二、foreach语句的局限性
 
通过上面的例子可以发现,如果要引用数组或者集合的索引,则foreach语句无法做到,foreach仅仅老老实实地遍历数组或者集合一遍。下面看一个例子就明白了:
 
public class TestArray2 { 

public static void main(String args[]) { 
//定义一个一维数组 
int arr[] = new int[4]; 
System.out.println("----未赋值前输出刚刚定义的数组----"); 
for (int x : arr) { 
System.out.println(x); 


//通过索引给数组元素赋值 
System.out.println("----通过循环变量给数组元素赋值----"); 
for (int i = 3; i > 0; i--) { 
arr[i] = i; 

//循环输出创建的数组 
System.out.println("----赋值后,foreach输出创建好的数组----"); 
for (int x : arr) { 
System.out.println(x); 


}

运行结果:
 
----未赋值前输出刚刚定义的数组---- 




----通过循环变量给数组元素赋值---- 
----赋值后,foreach输出创建好的数组---- 





Process finished with exit code 0
 
三、总结
 

foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。提倡能用foreach的地方就不要再用for了。在用到对集合或者数组索引的情况下,foreach显得力不从心,这个时候是用for语句的时候了。foreach一般结合泛型使用

本章总结

>数组是可以在内存中连续存储多个元素的结构,数组中的所有元素必须属于相同的数据类型.

>数组中的元素通过数组的下标进行访问,数组的下标从0开始.

>数组可用一个循环为元素赋值,或者用一个循环输出数组中的元素信息.

>通过数组.length可获得数组长度.

>利用Arrays类提供sort()方法可以方便的对数组中的元素进行排序.

posted on 2017-09-22 15:27  技术之路永无止境~  阅读(232)  评论(0编辑  收藏  举报

导航