Java数组与容器应用总结Word格式文档下载.docx

上传人:b****6 文档编号:18234837 上传时间:2022-12-14 格式:DOCX 页数:47 大小:260.57KB
下载 相关 举报
Java数组与容器应用总结Word格式文档下载.docx_第1页
第1页 / 共47页
Java数组与容器应用总结Word格式文档下载.docx_第2页
第2页 / 共47页
Java数组与容器应用总结Word格式文档下载.docx_第3页
第3页 / 共47页
Java数组与容器应用总结Word格式文档下载.docx_第4页
第4页 / 共47页
Java数组与容器应用总结Word格式文档下载.docx_第5页
第5页 / 共47页
点击查看更多>>
下载资源
资源描述

Java数组与容器应用总结Word格式文档下载.docx

《Java数组与容器应用总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Java数组与容器应用总结Word格式文档下载.docx(47页珍藏版)》请在冰豆网上搜索。

Java数组与容器应用总结Word格式文档下载.docx

equals()—比较两个数组是否相等;

fill()—用某个值填充整个数组;

sort()—对数组排序;

binarySearch()—在已经排序的数组中查找元素。

1.1数组的初始化

基本类型的数组如果是数值型的,就被自动初始化为0;

字符型(char)数组被初始化为(char)0;

布尔(boolean)数组被初始化为false。

非基本类型的对象数组,在新生成一个数组对象时,其中所有的引用被自动初始化为null,所以检查其中的引用是否为null,即可知道数组的某个位置是否存有对象。

基本类型的数组,直接存储基本类型数据的值;

对象数组,存储指向堆中对象的引用。

所有数组(无论它们的元素是对象还是基本类型)都有一个固有成员length,可以通过它获知数组内包含了多少个元素,但不能对其修改。

classSimpleClass{}

classMyArray{

publicstaticvoidmain(String[]args){

//基本类型数组初始化

int[]a=newint[5];

//基本类型数组对象创建,数组元素值被初始化为0

for(inti=0;

i<

a.length;

i++)

a[i]=i*i;

int[]b={1,2,3,4,5};

//聚集初始化方式,此时b.length=5;

int[]c;

//声明而未初始化的局部变量

c=b;

//通过数组对象赋值,使c含有与数组b相同的内容,c.length=5

//对象数组初始化

SimpleClass[]sc;

//未初始化的局部变量,如果直接使用编译器会报错

sc=newSimpleClass[]{

newSimpleClass(),newSimpleClass()

};

//动态聚集初始化方式,此时sc.length=2

SimpleClass[]sc1=newSimpleClass[5];

//在栈中生成了一个数组对象sc1,

//该数组中的每个元素都是一个指向SimpleClass

//对象的引用,此时,并没有SimpleClass对象置

//入数组中。

sc[0]~sc[4]皆为null。

SimpleClass[]sc2=newSimpleClass[4];

for(inti=0;

sc2.length;

if(sc2[i]==null)//可以测试数组元素是否为null

sc2[i]=newSimpleClass();

SimpleClass[]sc3={

newSimpleClass(),newSimpleClass(),newSimpleClass()

//聚集初始化方式,此时sc3.length=3

sc=sc3;

//将sc进行赋值,使sc指向另一个数组对象;

此时sc.length=3

//现在sc与sc3都指向堆中的同一个数组对象。

////多维数组初始化

int[][]a1={

{1,2,3,},

{4,5,6,},

Integer[][]a2={

{newInteger

(1),newInteger

(2)},

{newInteger(3),newInteger(4)},

{newInteger(5),newInteger(6)},

Integer[][]a3;

a3=newInteger[3][];

a3.length;

i++){

a3[i]=newInteger[3];

for(intj=0;

j<

a3[i].length;

j++)

a3[i][j]=newInteger(i*j);

}

}

1.2填充数组—Arrays.fill()

Arrays的fill()方法,用一个值填充指定数组的各个位置。

对于保存对象的数组,就是复制同一个引用进行填充。

intsize=5;

boolean[]a1=newboolean[size];

byte[]a2=newbyte[size];

char[]a3=newchar[size];

short[]a4=newshort[size];

int[]a5=newint[size];

long[]a6=newlong[size];

float[]a7=newfloat[size];

double[]a8=newdouble[size];

String[]a9=newString[size];

Arrays.fill(a1,true);

//a1:

[true,true,true,true,true]

Arrays.fill(a2,(byte)2);

//a2:

[2,2,2,2,2]

Arrays.fill(a3,'

三'

);

//a3:

[三,三,三,三,三]

Arrays.fill(a4,(short)4);

//a4:

[4,4,4,4,4]

Arrays.fill(a5,5);

//a5:

[5,5,5,5,5]

Arrays.fill(a6,6);

//a6:

[6,6,6,6,6]

Arrays.fill(a7,7);

//a7:

[7,7,7,7,7]

Arrays.fill(a8,8);

//a8:

[8,8,8,8,8]

Arrays.fill(a9,"

a9"

//a9:

[a9,a9,a9,a9,a9]

Arrays.fill(a9,1,3,”Hi”);

//a9:

[a9,Hi,Hi,a9,a9]

//fillrange:

[1,3)

可以指定填充位置的方法说明:

publicstaticvoidfill(int[] 

a,

int 

fromIndex,

toIndex,

val)

将指定的int值分配给指定int型数组指定范围中的每个元素。

填充的范围从索引fromIndex(包括)一直到索引toIndex(不包括)。

(如果fromIndex==toIndex,则填充范围为空。

参数:

a-要填充的数组

fromIndex-要使用指定值填充的第一个元素的索引(包括)

toIndex-要使用指定值填充的最后一个元素的索引(不包括)

val-要存储在数组所有元素中的值

抛出:

IllegalArgumentException-如果fromIndex>

toIndex

ArrayIndexOutOfBoundsException-如果fromIndex<

0或toIndex>

a.length

1.3复制数组—System.arraycopy()

使用System.arraycopy()方法复制数组,比用for循环复制要快很多。

int[]a1=newint[5];

int[]a2=newint[8];

Arrays.fill(a1,47);

[47,47,47,47,47]

Arrays.fill(a2,99);

//a2:

[99,99,99,99,99,99,99,99]

System.arraycopy(a1,0,a2,0,a1.length);

[47,47,47,47,47,99,99,99]

//填充复制Object

Integer[]a3=newInteger[4];

Integer[]a4=newInteger[8];

Arrays.fill(a3,newInteger(47));

//a3:

[47,47,47,47]

Arrays.fill(a4,newInteger(99));

System.arraycopy(a3,0,a4,a4.length/2,a3.length);

//a4:

[99,99,99,99,47,47,47,47]

方法使用说明:

publicstaticvoidarraycopy(Object 

src,

srcPos,

Object 

dest,

destPos,

length)

从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。

从src引用的源数组到dest引用的目标数组,数组组件的一个子序列被复制下来。

被复制的组件的编号等于length参数。

源数组中位置在srcPos到srcPos+length-1之间的组件被分别复制到目标数组中的destPos到destPos+length-1位置。

src-源数组。

srcPos-源数组中的起始位置。

dest-目标数组。

destPos-目标数据中的起始位置。

length-要复制的数组元素的数量。

IndexOutOfBoundsException-如果复制会导致对数组范围以外的数据的访问。

ArrayStoreException-如果因为类型不匹配而使得无法将src数组中的元素存储到dest数组中。

NullPointerException-如果src或dest为null。

1.4数组的比较—Arrays.equals()

使用Arrays类的equals()方法比较数组。

数组相等的条件时元素个数必须相等,并且对应位置的元素也相等,这可以通过对每一个元素使用equals()做比较来判断。

对于基本类型,需要使用基本类型的包装类的equals()方法,例如,对于int类型使用Integer.equals()作比较。

int[]a1=newint[5];

int[]a2=newint[5];

Arrays.fill(a2,47);

System.out.println(Arrays.equals(a1,a2));

//output:

true

a1[0]=5;

//a1:

[5,47,47,47,47]

//output:

false

String[]s1=newString[5];

Arrays.fill(s1,"

Hi"

//s1:

["

"

]

String[]s2={"

System.out.println(Arrays.equals(s1,s2));

1.5数组的排序—Arrays.sort()

1.5.1基本类型数组的排序

基本类型数组的排序,可以直接使用Arrays的sort()方法,按照数字升序进行排序。

对String数组排序时,排序算法依据词典顺序排序,大写字母开头的词都会放在前面,然后才是小写字母开头的词。

static 

voidsort(int[] 

a)//对指定的int型数组按数字升序进行排序。

a,int 

fromIndex,int 

toIndex)

//对指定int型数组的指定范围按数字升序进行排序。

范例:

int[]a={2,4,1,3,6,5};

//排序前:

a:

[2,4,1,3,6,5]

Arrays.sort(a);

//排序后:

[1,2,3,4,5,6]

//对于字符串数组是按照“自然顺序”排序,即“字典顺序”

String[]s={"

cannon"

a"

abuse"

accurate"

desk"

block"

Arrays.sort(s);

//排序后:

s:

[a,abuse,accurate,block,cannon,desk]

Arrays.sort(s,3,6);

//部分排序:

s:

[cannon,a,abuse,accurate,block,desk]

Arrays.sort(s,Collections.reverseOrder());

//指定比较器Comparator

//逆序排序:

[desk,cannon,block,accurate,abuse,a]

1.5.2对象数组的排序

针对对象数组中对象进行排序,首要解决的问题是,需要一个可以在两个对象之间进行比较的方法。

Java有两种方式提供比较功能。

第一种是实现java.lang.Comparable接口。

即被比较的对象的类型需要实现Comparable接口,覆盖接口中的CompareTo()方法。

Comparable接口定义如下:

publicinterfaceComparable{

intcompareTo(T 

o);

如果待排序的对象所属的类型实现了上述接口,那么,在调用Arrays类型的以下两种排序方法时,sort会自动去调用CompareTo()方法,完成两个对象之间的比较,最终完成数组的排序。

voidsort(Object[] 

a)//根据元素的自然顺序对指定对象数组按升序进行排序。

toIndex)//根据元素的自然顺序对指定对象数组的指定范围

//按升序进行排序。

使用范例:

importjava.util.*;

classElementClassimplementsComparable

{

privateintnumber;

publicElementClass(intnum){

number=num;

publicintgetNumber(){

returnnumber;

publicintcompareTo(Objectobj){

return(number>

((ElementClass)obj).number)?

1:

(number==((ElementClass)obj).number?

0:

-1);

classCompareTest

publicstaticvoidmain(String[]args)

{

Randomrand=newRandom();

ElementClass[]ec=newElementClass[5];

ec.length;

ec[i]=newElementClass(rand.nextInt(10));

System.out.print(ec[i].getNumber()+"

"

//排序前:

[37952]

}

System.out.println();

Arrays.sort(ec);

//sort()方法会自动调用ElementClass实现的compareTo函数

//排序后:

[23579]

第二种是实现java.util.Comparator接口。

得到一个可以对数组中对象进行比较的比较器,然后把这个比较器传递给sort()方法,完成比较与最终的数组排序(基本类型的数组无法用Comparator进行排序)。

Comparator接口定义如下:

publicinterfaceComparator{

intcompare(T 

o1,T 

o2);

//比较用来排序的两个参数。

booleanequals(Object 

obj);

//指示某个其他对象是否“等于”此Comparator。

Comparator接口中的函数需要同时实现。

假设实现的比较器名为MyComparator,其实现形式如下:

publicMyComparatorimplementsComparator{

publicintcompare(T 

o2){……}

publicbooleanequals(Object 

obj){……}

有了比较器之后,调用下面的sort()方法完成比较与排序:

staticvoidsort(T[] 

a,newMyComparator)//根据指定比较器产生的顺序对指定对象数组进行排序。

staticvoidsort(T[] 

toIndex,newMyComparator)//根据指定比较器产生的顺序对指

//定对象数组的指定范围进行排序。

classElementClass

classMyComparatorimplementsComparator

publicintcompare(Objectobj1,Objectobj2){

intnum1=((ElementClass)obj1).getNumber();

intnum2=((ElementClass)obj2).getNumber();

return(num1>

num2?

1:

(num1==num2?

0:

-1));

[91765]

Arrays.sort(ec,newMyComparator());

//将比较器传递给sort进行排序

[15679]

1.6在已排序的数组中查找—Arrays.binarySearch()

如果数组已经排好序了,可以使用Arrays.binarySearch()执行快速查找。

对未排序的数组使用binarySearch()的结果不可预料。

如果找到了目标,Arrays.binarySearch()的返回值等于或大于0。

否则,返回负值,表示为了保持数组的排序状态,此目标元素应该插入的位置。

这个负值的计算方式是:

-(插入点)–1

“插入点”是指,第一个大于查找对象的元素在数组中的位置,如果所有数组元素都小于要查找的对象,“插入点”就等于a.size()。

如果数组包含重复的元素,则无法保证找到的是哪一个。

此算法并不是为包含重复元素的数组专门设计的,但是仍然可用。

如果使用Comparator排序某个对象数组,在使用binarySearch()时必须提供同样的Comparator。

intbinarySearch(Object[] 

a,Object 

key)//使用二分搜索法来搜索指定数组,以获得指定对象。

toIndex,Object 

key)//使用二分搜索法来搜索指定数

//组的范围,以获得指定对象。

例如:

publicintgetNumber

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 艺术

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1