Java第六天

第六章 一维数组

一维数组的定义

  • 数组的定义:数组是用来存储数据的集合,但是,通常我们会发现把数组看作一个存储具有相同类型的变量集合
  • 声明数组变量:为了使用数组,必须声明一个引用数组的变量,并指明数组的元素类型。
elementType[] arrayRefVar;(元素类型 [] 数组引用变量;)
例如double[] myList;
注意也可使用elementType arratRefVar[]声明数组变量

创建数组:数组创建只是创建一个对数组的引用的存储位置。如果变量不包含对数组的引用,那么这个变量的值为null。数组若没有被创建,则不能给它分配任何元素。声明数组变量后,可以使用下面的语法用new操作符创建数组,并且将它的引用赋给一个变量

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

数组的大小和默认值:数组定义后大小不可改变;创建数组后,元素被赋予默认值0,char型默认值为’\u0000’ boolean型的默认值为false
小结

* 数组一旦定义出来 长度不可变
	 * 数组为每个元素提供角标 通过角标去访问元素
	 * 数组中每个数据必须是相同的数据类型 但值可以重复
	 * 数组 不是基本数据类型 而是引用数据类型的一种
	 * 如果数组长度为n 那么元素角标从头到尾分别 0~n-1
	 * 数组有默认初始化
	 * 数组是在堆内存中存在的
	 * 元素与元素之间 地址是连续的
	 * An=A1+(n-1)d; 每个元素空间 大小一样的 
	 * 
	 * 内存:
	 * 	寄存器(CPU)
	 *  本地方法区(主要临时存储的是系统的相关可执行代码)
	 *  方法区(主要临时存储的是应用程序的相关可执行代码)
	 *  栈(主要用于运行函数) 栈中的数据 必须手动初始化 int a 调用a
	 *  堆(离散存储结构 空间分配随机 主要用于存储Java中的对象) 堆中的数据 有默认初始化 int a 调用a 0
	 *  double 0.0 boolean false
	 * 数组 本身就是对象

数组元素可以通过下标访问。数组下标是基于0的,数组范围从0到RefVar.length-1结束。
数组中的每个元素都可以使用下面的语法表示,称为下标变量

arrayRefVar[index];
myList[9];表示数组myList的最后一个元素
创建数组后,下表变量与正常变量的使用方法相同

数组初始化语法

将声明数组、创建数组、初始化数组结合起来
elementType[] arrayRefVar={value0,value1,value2,...valuek};
初始化中不使用new,且声明 创建和初始化必须在同一条语句

foreach循环
Java支持一个简便的循环,称为foreach循环,即不使用下标就可以顺序地遍历整个数组。

for(double e:myList){
	System.out.println(e);
}//对myList中每个元素进行如下操作
通常foreach循环语法为
for(elementType element:arrayRefVar){
//process the element
}
attention:当需要以其他顺序遍历数组或者改变数组中的元素时,还是必须使用下标变量

在此要特别注意越界访问数组,下标不能超过arrayRefVar.length-1,错误出现的地方是在该使用<的地方使用<=

数组的复制

  • 自定义复制
    要将一个数组中的内容复制到另外一个中,你需要将数组的每个元素复制到另外一个数组中。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用复制给另一个变量,使两个变量都指向相同的内存地址
    目前有三种方法:
    1 使用循环语句逐个地复制数组的元素
    使用下述代码将sourceArray复制到targetArray
int [] sourceArray={2,3,1,5,10};
int [] targeArray=new int[sourceArray.length];
for(int i=0;i<sourceArray.length;i++){
	targeArray[i]=sourceArray[i];
}

2 使用System类中的静态方法arrayCopy

arrayCopy(sourceArray, srcPos, targetArray, tarPos, length);
其中参数srcPos和tarPos分别表示在源数组souuceArray和目标数组targetArray中的起始位置
元素个数由length指定 
arrayCopy方法没有给目标数组分配内存空间
复制前必须创建目标数组以及分配给它的内存空间

3 使用clone方法复制数组

将数组传递给方法:当将一个数组传递给方法时,数组的引用被传给方法。对于基本数据类型,传递的是实参的值;对于数组类型参数,参数值是数组的引用,给方法传递的是这个引用。从语义上讲,参数传递的是共享信息。
数组在Java中是对象。JVM将对象存储在一个称作堆的内存区域中,堆用于动态内存分配
可变长参数列表
可变长参数与数组:具有同样类型的可变长度的参数可以传递给方法,并将作为数组对待。方法中的参数声明如下:

typeName...parameterName(类型名...参数名)

只能给方法中指定一个可变长参数,同时该参数必须是最后一个参数。任何常规参数必须在它之前。Java将可变长参数当成数组对待。可以将一个数组或数目可变的参数传递给可变长参数。当用数目可变的参数调用方法时,Java会创建一个数组并把参数传给它。
数组的查找

  • 二分查找:使用二分查找的条件是数组中的元素已经排好序。
    假设按升序排列,则有以下三种情况
    如果关键字小于中间元素,只需要在数组的前一半元素中继续查找关键字
    如果关键字和中间元素相等,则匹配成功,查找结束
    如果关键字大于中间元素,只需要在数组的后一半元素中继续查找关键字
    显而易见的是二分法在每次比较之后就排除掉一半(一半加1)的数组元素,假如有n个元素,假设n是2的幂,第一次比较结束,剩余n/2个元素;第二次比较结束,剩余(n/2)/2个元素。经过k次比较,剩余n/(2^k).
    每次比较后,数组要查找的部分会缩小一半。用low和high分别表示当前查找数组的第一个下标和最后一个下标。初始条件下,low为0,而high为list.length-1.让mid表示列表的中间元素的下标。这样mid就是(low+high)/2.
    第一次查找结束后,若没有成功找到,则改变下标进行第二次循环,直到找到为止。
    示例程序如下
public class BinarySearch{
	public static int binarySearch(int [] list,int key){
		int low=0;
		inr high=list.length-1;
		while(high>=low){
			int mid=(low+high)/2;
				if(key<list.length)
					high=mid-1;
				else if(key==list[mid])
					return mid;
				else
					low=mid+1;
				}
				return -low-1;
		}
	}
}

当没有找到关键字,low就是一个插入点,这个位置将插入关键字以保持列表的有序性。还有一种方法时返回插入点减去1。这个方法必须返回一个负值,表明这个关键字不在序列中。若关键字不在序列中,方法返回-low-1.返回-low-1不仅表明关键字不在序列中,而且还给出了关键字应该插入的地方。

  • 线性查找:线性查找法将要查找的关键字key与数组中的元素逐个进行比较。这个过程持续到在列表中找到与关键字匹配的元素,或者查完列表也没有找到关键字为止。如果匹配成功,线性查找法返回与关键字匹配的元素在数组中的下标。如果没有匹配成功,则返回-1.
public class LinearSearch{
	public static int linearSearch(int[] list,int key){
		for(int i=0;i<list.length;i++){
			if(key==list[i])
				return i;
			}
			return -1;
	}
}

数组中的元素可以按任意顺序排列,平均来看,如果关键字存在,那么在找到关键字前,这种算法必须与数组中国一半的元素比较,由于线性查找法的执行时间随着数组元素个数的增长而线性增长,所以,对于大数组而言,线性查找法的效率并不高。
Arrays数组工具类

猜你喜欢

转载自blog.csdn.net/fearless212/article/details/83307571