java马志军版课件第四章数组_第1页
java马志军版课件第四章数组_第2页
java马志军版课件第四章数组_第3页
java马志军版课件第四章数组_第4页
java马志军版课件第四章数组_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章

组Java核心技术

数组属于引用型变量,创建数组需要经过声明数组和为数组分配变量2个步骤声明一维数组有下列两种格式:数组的元素类型

数组名[];数组的元素类型[]数组名;声明二维数组有下列两种格式:数组的元素类型数组名[][];数组的元素类型[][]数组名;注意:与C/C++不同,Java不允许在声明数组中的方括号内指定数组元素的个数,如不许

int

a[12]声明一个数组并没有创建一个对象,此时并不能使用数组。为数组分配元素的格式如下:数组名=new数组元素的类型[数组元素的个数];如float

boy[];boy=new

float[4];声明数组和创建数组可以一起完成,如:float

boy[

]=new

float[4];二维数组的创建:int

mytwo[

][

];mytwo=new

int[3][4];注意:构成二维数组的一维数组不必有相同的长度如:int

a[][]=new

int[3][];a[0]=new

int[6];a[1]=new

int[12];a[2]=new

int[8];一维数组通过索引符访问自己的元素需要注意的是索引从0开始二维数组也通过索引符访问自己的元素数组的元素的个数称作数组的长度。对于一维数组,“数组名.length”的值就是数组中元素的个数;对于二维数组“数组名.length”的值是它含有的一维数组的个数float

a[

]=new

float[12];int

b[

][

]=new

int[3][6];a.length为12b.length为3创建数组后,系统会给数组的每个元素一个默认的值,如,float型是0.0在声明数组的同时也可以给数组的元素一个初始值如float

boy[

]={21.3f,23.5f,1.2f,29.3f}

也可以直接用若干个一维数组初始化一个二维数组,这些一维数组的长度不尽相同int

a[

][

]={{1},{1,1},{1,2,1},{1,3,3,1}}数组属于引用型变量,因此两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素如果使用了下列赋值语句(a和b的类型必须相同):a=b;那么,a中存放的引用和b的相同,这时系统将释放最初分配给数组a的元素,使得a的元素和b的元素相同说明:和类对象的赋值原理一样public

class

Example4_1

{public

static

void

main(String

args[])

{int

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

b[]={100,200,300};System.out.println("数组a的元素个数="+a.length);System.out.println("数组b的元素个数="+b.length);System.out.println("数组a的引用="+a);System.out.println("数组b的引用="+b);System.out.println("a==b的结果是"+(a==b));a=b;System.out.println("数组a的元素个数="+a.length);System.out.println("数组b的元素个数="+b.length);System.out.println("a==b的结果是"+(a==b));System.out.println("a[0]="+a[0]+",a[1]="+a[1]+",a[2]System.out.print("b[0]="+a[0]+",b[1]="+b[1]+",b[2]="}

}4.2.1基于循环语句的遍历JDK1.5中新增的for循环结构,该结构适合于数组类型for(声明循环变量:数组的名字){…}例4-2public

class

Example4_2

{public

static

void

main(String

args[])

{int

a[]={1,2,3,4};char

b[]={"a","b","c","d"};for(int

n=0;n<a.length;n++){//传统方式System.out.println(a[n]);}for(int

n=0;n<b.length;n++){//传统方式System.out.println(b[n]);}

for(int

i:a){ //循环变量i依次取数组a的每一个元素的值(非传统方式)System.out.println(i);•}

for(char

ch:b){//循环变量ch依次取数组b的每一个元素的值(非传统方式)System.out.println(ch);}}}for(声明循环变量:数组的名字){…}中的“声明循环变量”必须是变量声明,不可以使用已经声明过的变量。让Arrays类调用public

static

String

toString(int[]a)方法,

可以得到参数指定的一维数组a的如下格式的字符串表示:[a[0],a[1]

…a[a.length-1]]//测试就是将long类型使用tostring()方法输出为String类型public

class

JLDtoS{public

static

void

main(String[]args){long

a=123;Long

aa=new

Long(a);//使用包装类String

ii=aa.toString();//使用aa对象的toString()方法System.out.println(ii);//输出转换的结果}}//object中的toString方法是对象才能调用的注意:toString()只适用于对象的调用,普通的数据类型不调用,这也就是使用包装类的原因。public

class

A{public

String

toString(){return

"this

is

A";}}如果某个方法里面有如下句子:

A

obj=new

A();System.out.println(obj);会得到输出:this

is

ASystem.out.println(xx),括号里面的“xx”如果不是

String类型的话,就自动调用xx的toString()方法总而言之,它只是sun公司开发java的时候为了方便所有类的字符串操作而特意加入的一个方法public

class

A{public

String

getString(){return

"this

is

A";}//toString改个名字试试看}A

obj=new

A();System.out.println(obj);会得到输出:xxxx@xxxxxxx的类名加地址形式System.out.println(obj.getString());会得到输出:this

is

AtoString的好处是在碰到“println”之类的输出方法会自动调用,不用显式打出来class

Person

{private

String

name

=

null;private

int

age

=

0;public

Person(String

name,

int

age)

{

=

name;this.age

=

age;}public

String

toString()

{return

name;}}public

class

Test

{public

static

void

main(String[]

args)

{Person

p

=

new

Person("Jack",

20);System.out.println(p);//这时会输出"Jack}}数组在Java里是一种数据类型,因此,它可以作为一种方法的返回值如int[]fun(int[]a){…}举例:编写一个方法,求一组数的最大值,最小值和平均值/*该方法要将求出的最大值,最小值和平均值多个值作为结果返回,可将它们存储到一个数组中,再用return返回*/public

class

Demo{public

static

void

main(String

args[]){double

a[]={1.1,3.4,-9.8,10};double

b[]=max_min_ave(a);for(int

i=0;i<b.length;i++)System.out.println("b["+i+"]="+b[i]);}static

double[]

max_min_ave(double

a[]){double

res[]=new

double[3];double

max=a[0],min=a[0],sum=a[0];for(int

i=0;i<a.length;i++){if(max<a[i])

max=a[i];if(min>a[i])

min=a[i];sum+=a[i];}res[0]=max;res[1]=min;res[2]=sum/a.length;return

res;}}前面所讲的数组都是基本类型数组,如int[]a,即元素的类型是本类型。引用类型数组的数组元素是引用如果该引用类型是类的话,有时也称该数组为对象数组举例:class

Person{public

int

age;public

double

height;public

String

toString(){return"我的年龄是"+age+",我的身高是:"+height;}}public

static

void

main(String[]

args)

{Person

[]student;student=new

Person[2];Person

zhangsan=new

Person();zhangsan.age=10;zhangsan.height=170;Person

lisi=new

Person();lisi.age=11;lisi.height=175;student[0]=zhangsan;student[1]=lisi;System.out.println(zhangsan.toString());System.out.println(student[0].toString());}如果两个类型相同的数组具有相同的引用,那么它们就有完全相同的元素如果想把一个数组的元素中的值复制到另个一个数组中的元素中,后者元素值的改变不会影响到原数组元素的值,反之也是如此,如果想实现这样的目的,显然不能使用数组之间进行引用赋值的方式System类调用方法public

static

void

arraycopy(sourceArray,intindex1,copyArray,int

index2,int

length)可以将数组sourceArray从索引index1开始后的length个素中的数据复制到数组copyArray中,即将数组

sourceArray中索引值从index1到index1+length-1元素的数据复制到数组copyArray的某些元素中;接收数据的

copyArray数组从第index2元素开始存放这些数据。如果接收数据的数组copyArray不能存放下待复制的数据程序运行将发生异常import

java.util.Arrays;public

class

Example4_3

{public

static

void

main(String

args[])

{char

[

]

a

=

{"A","B","C",

"D","E","F"},b

=

{"1","2","3","4","5","6"};int

[

]

c

={-1,-2,-3,-4,-5,-6},d

=

{10,20,30,40,50,60};System.arraycopy(a,

0,

b,

0,

a.length);System.arraycopy(c,

2,

d,

2,

c.length-3);System.out.println("数组a的各个元素中的值:");System.out.println(Arrays.toString(a));System.out.println("数组b的各个元素中的值:");System.out.println(Arrays.toString(b));System.out.println("数组c的各个元素中的值:");System.out.println(Arrays.toString(c));System.out.println("数组d的各个元素中的值:");System.out.println(Arrays.toString(d));}}数组a的各个元素中的值:[A,

B,

C,

D,

E,

F]数组b的各个元素中的值:[A,

B,

C,

D,

E,

F]数组c的各个元素中的值:[-1,

-2,

-3,

-4,

-5,

-6]数组d的各个元素中的值:[10,

20,

-3,

-4,

-5,

60]Arrays类调用public

static

double[

]

copyOf(double[

]

original,innewLength)方法可以把参数original指定的数组中从索引0开始的

newLength个元素复制到一个新数组中,并返回这个新数组,且该新数组的长度为newLength,如果newLength的值大于original的长度,copyOf方法返回的新数组的

newLength索引后的元素取默认值。类似的方法还有:public

static

float[]

copyOf(float[]

original,int

npublic

static

int[]

copyOf(int[]

original,int

newLepublic

static

char[]

copyOf(char[]

original,int

newint

[

]a={100,200,300,400};int

[

]b=Arrays.copyOf(a,5);b[0]=100,b[1]=200,b[2]=300,b[3]=400,b[4]=0可以把数组中部分元素的值复制到另一个数组中,使用

copyOfRange方法public

static

double[

]

copyOfRange(double

[

]

origifrom,int

to)复制从from开始至to-1如:int

[

]a={100,200,300,400,500,600};int

[

]b=Arrays.copyOfRange(a,2,5);b[0]=300,b[1]=400,b[2]=500import

java.util.*;public

class

Example7_4

{public

static

void

main(String

args[]){int

[]

a

={11,22,33,44,55},b,c,d;b=Arrays.copyOf(a,8);System.out.println("数组a的各个元素中的值:");System.out.println(Arrays.toString(a));System.out.println("数组b的各个元素中的值:");System.out.println(Arrays.toString(b));c=Arrays.copyOfRange(a,3,5);System.out.println("数组c的各个元素中的值:");System.out.println(Arrays.toString(c));d=Arrays.copyOfRange(a,1,7);System.out.println("数组d的各个元素中的值:");System.out.println(Arrays.toString(d));}}数组a的各个元素中的值:[11,

22,

33,

44,

55]数组b的各个元素中的值:[11,

22,

33,

44,

55,

0,

0,

0]数组c的各个元素中的值:[44,

55]数组d的各个元素中的值:[22,

33,

44,

55,

0,

0]可以使用循环语句对数组排序,也可以使用循环语句查找某个数据是否在一个排序的数组中。Arrays类调用相应的方法可以实现对数组的快速排序,比如,Array类调用public

static

void

sort(double

a[])方法可以把参数a指定的double类型数组按升序排序。Array类调用public

static

void

sort(double

a[

],int

start,int方法可以把参数a指定的double类型数组中索引

star至end-1的元素的值按升序排序。public

static

int

binarySearch(double[]

a,

double

nu方法判断参数number指定的数值是否在参数a指定的数组中,即number是否和数组a的某个元素的值相同,其中数组a必须是事先已排序的数组。如果number和数组a中某个元素的值相同,int

binarySearch(double[]

a,double

number)方法返回(得到)该元素的索引,否则返回一个负数。例7-5import

java.util.*;public

class

Example7_5

{public

static

void

main(String

args[])

{Scanner

scanner

=

new

Scanner(System.in);int

[]

a={12,34,9,23,45,6,45,90,123,19,34};Arrays.sort(a);System.out.println(Arrays.toString(a));System.out.println("输入整数,程序判断该整数是否在数组中:");

while(scanner.hasNextInt()){int

number

=

scanner.nextInt();int

index=Arrays.binarySearch(a,number);if(index>=0){System.out.println(number+"和数组中索引为"+index+"的元素值同");}else{System.out.println(number+"不与数组中任何元素值相同");}System.out.println("是否继续输入整数?输入任何非整数即可结束}

}}Scanner类中nextInt()方法用于从键盘输入一个整数hasNextInt()用于判断输入的是否是整数,若是,则返回值为true,若不是,返回值为false4.5.1枚举类型的定义枚举类型的定义包括枚举声明和枚举体,语法格式如下:enum枚举名{常量列表}枚举体中的内容是用逗号分隔的字符序列,称为枚举类型的常量。enum

Season{spring,summer,autumn,winter}声明了一个枚举类型后,就可以用该枚举类型的枚举名声明一个枚举变量,例如:Season

x;声明了一个枚举变量x。枚举变量x只能取值枚举类型中的常量。通过使用枚举名和“.”运算符获得枚举类型中的常量,例如:x=Season.spring;public

class

exp5

{public

enum

Weekday

{星期一,星期二,星期三,星期四,星期

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论