黑马程序员Java笔记——数组

----------- android培训java培训、java学习型技术博客、期待与您交流! ---------

数组

关键词:元素、下标、数组排序、数组查找、一维数组、二维数组、多维数组

一、引述:

在执行程序的时候,需要存储大量的数据,Java提供一种叫做数组的数据结构,它可以用来存储一个元素个数固定且元素类型相同的有序集合。

二、简述:

数组可以看成是一个存储相同类型的变量集合。

1)数组的基本知识

1.1  声明数组变量:为了在程序中使用数组,必须声明一个引用数组的变量,并指明数组的元素类型。

声明变量的语法:元素类型[ ] 数组引用变量;(element Type[ ] arrayRefVar);

1.2 创建数组:不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中分配任何空间。它只是创建了一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个变量值为null(无效的、零值),除非数组被创建,否则不能给他分配任何元素。

声明数组后,创建数组的语法:

数组引用变量 = new 元素类型[数组大小](arrayRefVar = new elementType[ arraySize])

这条语句的含义:使用new操作符创建一个数组,并把这个数组的引用地址值赋给变量。

补充:JVM将数组存储在一个被称为 堆 的内存区域中,堆用于动态的内存分配,在堆中内存块可以按照任意的顺序进行分配和释放。)

声明数组、创建数组、将数组的引用值赋给变量可以用一条语句来实现,语法如下:

元素类型[ ] 数组引用变量 = new 元素类型[数组大小]

elementType [ ] arrayRefVar = new elementType[arraySize];)

1.3 数组大小和元素默认值:当给数组分配默认空间时,必须通过指定该数组能够存储的元素个数类确定数组大小。创建数组之后,不能修改它的大小。

数组的大小可以使用arrayRerVar.length语句来获取。

当数组创建后,它的元素被赋予默认值,数值型基本数据类型的默认值是0char型的默认值为’\u0000’,boolean型的默认值是false

1.4 数组元素是可以通过下标(index)来进行访问,数组下标是基于0的。因此下标的范围:从0开始到arrayRerVar.length-1结束。

数组中每个元素可以通过下标来访问,语法如下:

arrayRerVar[index];(数组引用变量[下标];)

1.5 数组初始化语法:下面的语法将声明数组、创建数组、和初始化数组合为一条语句:

元素类型[ ] 数组引用变量 = {0元素值,1元素值,...}

elementType[ ] arrayRefVar = { value0,value1,...valuel(arrayRefVar.length-1)};)

注意:使用数组初始化语句时,必须把声明、创建、初始化数组放在同一语句中。分开写则会产生语法错误。数组初始化语句中不使用运算符new

1.6 数组遍历:对数组中的每一个元素进行操作常常使用for循环。

原因有两点:

(1)数组中的元素都是同一类型的,可以使用循环以同样的方式反复处理这些元素。

(2)由于数组的大小是已知的,使用for循环更加合理便捷。

增强的for循环:JDK1.5以后Java支持一个简单的for循环称之for--each或增强的for循环:

特点:不使用下标就可以顺序地遍历整个数组

语法格式:

for(数据类型 迭代元素变量名: 数组名){

循环体

}

For(elementType element: arrayRefVar){

}

注意:

1.当需要以其他顺序遍历或者改变数组中的元素时,还是要使用下标变量。

2.防止出现数组下标越界错误,数组中最大的下标是:arrayRerVar.length-1;

3.<<=的使用

错误的用法:for( int i = 0;  i  <=  list.length; i++){ }

正确的用法:for( int i = 0;  i  <  list.length; i++){ }

  

1.7数组的常见处理:

1) 初始化数组

2) 打印数组

3) 对所有元素求和

4) 找出最值及下标

5) 任意打乱数组

6) 移动元素

1.8 数组的复制:在Java中,可以使用赋值语句复制基本数据类型的变量,但是不能复制数组。因为数组是存储在堆内存中的,数组变量中只是存储了一段数组地址值。当把这个数组引用变量赋给另一个变量时,实际是将一个数组的引用值赋给了另一个变量,结果两个变量都指向了同一个内存地址。

赋值数组有三种方法:

1)使用循环语句逐个赋值数组中的元素;

2)使用System类中的静态方法arraycopy。(此方法不符合Java命名习惯,应为arrayCopy,即字母C应大写

arraycopy语法:arraycopy(sourceArray, src_pos,targetArray, tar_pos, length)

arraycopy(源数组,开始位置,目标数组,开始位置,复制长度); 

复制前必须创建目标数组以及分配给它的内存空间。

完成复制后,sourceArraytargetArray具有相同的内容,但是占有独立的内存空间。

3)使用clone方法复制数组。

(2)给方法传递参数:如同给方法传递基本数据类型一样,可以为方法传递数组。

举例:public static void printArray(int[ ] array){ }

匿名数组:没有显式的使用引用变量,这样的数组被称为匿名数组。

创建匿名数组语法:

New elementType[ ]{value0, value1, value2,...}

举例:printArray(new int[ ]{3, 2, 4, 5, 7, 9})

提示:

Java采取值传递的方式将实参传递给方法。但是,传递 基本类型变量 的值与传递 数组值的不同之处:(引用参数传递的是共享信息)

对与基本数据类型参数,传递的是实参的值。

对于数组类型参数,参数值是数组的引用,给方法传递这个引用。

(3)从方法中返回数组:数组可以作为方法返回值。

举例:public static int[ ] reverse(int[ ] list){ }

(4)数组排序:将数组中的元素,按照特定的顺序排列,是数组常见的操作。常见的两种排序方法:选择排序和冒泡排序。

4.1 选择排序:先选出数组中最小或者最大的元素,然后把这个元素排在数组的最前面。接下来,在剩下的元素中,再选出最小或者最大的元素。重复操作,直到剩下的数组元素只有一个。

4.2 冒泡排序:数组元素两两比较,然后交换位置。

5)数组的查找:在数组中寻找指定元素的过程,常用主要有两种方法:线性查找、折半查找。

5.1 线性查找:将要查找的关键字Key与数组中的每个元素逐一对比,直到找到与关键字匹配的元素或者找完全部元素才停止。如果匹配成功就返回与之匹配的元素的下标,匹配失败就返回-1

线性查找的特点:对数组中元素的顺序没有要求;但是,查找过程需要逐一匹配,效率较低。

5.2 折半查找:也叫二分法查找,前提数组中元素需要排序。

模拟折半查找:目标数组按升序排好当查找关键字Key时,有三种情况:

(1)如果Key小于中间元素,就在数组前一半元素中查找关键字。

(2)如果Key与中间元素相等,则匹配成功,查找结束。

(3)如果Key大于中间元素,就在数组后一半元素中查找关键字。

线性查找的特点:对数组中元素的顺序有要求;但是,在查找中一次可以排除一半的元素,效率较高。

(6)Arrays类:Java中为了方便对数组的操作,把常见的对数组的基本操作封装成静态方法。

sort方法用于对数组的排序;

binarySearch方法用于二分法查找;(如果不存在匹配元素,方法返回-(插入点下标+1))

7)二维数组:一维数组是存储线性的元素集合,如果一维数组中的元素是另一个数组,那么就变成一个二维数组,二维数组可以用来存储矩阵或者表格。

声明、创建 二维数组的语法:

元素类型[ ][ ] 数组引用变量 = new 元素类型[ ][ ]

elementType [ ] [ ]arrayRefVar = new elementType[ ][ ];)

8)多维数组:除了表示线性元素的一维数组,还有表示表格矩阵的二维数组。有时我们需要表示n维的数据结构,在Java中,可以创建n维数组,n可以是任意整数,可以统称为多维数组。多维数组实际上是一个数组,它的每一个元素都是另一个数组。


你可能感兴趣的:(Java笔记,笔记)