java 引用数组_Java 数组的引用传递

看了很多篇博客,整理自网络。

int[] a = new int[10];

int[] b;

b = a;

复制代码

让数组b直接指向数组a(即b = a;),这样做的目的是为了提高程序运行的效率。

试想一下,假如数组中有上万个元素,在拷贝数组时,如果将数组a的所有元素都一一拷贝至数组b,时间开销很大,有时候也不是必需的。

所以,在Java语言中,b =a(a和b都是引用名)的含义就是将a起个别名"b"。

a和b其实就是指向的是同一个对象。

在Java中,这种给变量取别名的机制称之为引用(reference)。

研究下面程序:

public class ArrayDemo {

public static void main(String args[]) {

int data[] = null;

data = new int[3]; //开辟一个长度为3的数组

int temp[] = null; //声明对象

data[0] = 10;

data[1] = 20;

data[2] = 30;

temp = data; //int temp[] = data;

temp[0] = 99;

for(int i = 0; i < temp.length; i++) {

System.out.println(data[i]);

}

}

}

复制代码

f8a376e1391abb2163e37dde649863e3.png

注意,对应代码中的temp[0] = 99;,data[0]也变为了99。

即同一块堆内存会被不同的栈内存所指向。

double[] myList; // 首选的方法

double myList[]; // 效果相同,但不是首选方法

1、动态初始化:如前面的例子,数组先开辟内存空间,而后再使用索引进行内容的设置。

2、静态初始化:数组在定义的时候可以同时出现设置内容。

数组的静态初始化一共分为以下两种类型:

简化格式

数据类型 数组名称 = {值, 值,…}

完整格式

数据类型 数组名称 = new 数据类型[] {值, 值,…}

例子:

简化格式:

public class ArrayDemo {

public static void main(String args[]) {

int data[] = {1, 2, 4, 545, 11, 32, 13131, 4444};//简化格式

for(int i = 0; i < data.length; i++) {

System.out.println(data[i]);

}

}

}

复制代码

完整格式:

(对于静态数组的初始化强烈建议使用完整语法模式,这样可以轻松地使用匿名数组这一概念。)

public class ArrayDemo {

public static void main(String args[]) {

System.out.println(new int[] {1, 2, 4, 545, 11, 32, 13131, 4444}.length);

//匿名数组,直接通过 new 数据类型[] {值, 值,…}定义

}

}

复制代码

数组最大的缺陷:长度固定。

举个例子:f595aa6275e9ce452d64c8006ef37242.png

在此基础上对数组进行操作:定义一个方法,该方法可以实现数组的内容的乘2。

40d01a1457eae585d8a2d5962229cc5f.png

63a8f8c87beb1fd7972dd0c805c4255d.png

举例:

public class TestArray {

public static void main(String[] args) {

double[] myList = {1.9, 2.9, 3.4, 3.5};

// 打印所有数组元素

for (double element: myList) {

System.out.println(element);

}

}

}

复制代码

运行结果:

1.9

2.9

3.4

3.5

复制代码int a[][] = new int[2][3];

二维数组 a 初始化为一个两行三列的数组。

复制代码

此类提供的所有方法都是静态的(static)。

1、给数组赋值:通过 fill 方法。

public static void fill(int[] a, int val)

int 值分配给指定 int 型数组指定范围中的每个元素。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

2、对数组排序:通过 sort 方法,按升序。

public static void sort(Object[] a)

对指定对象数组根据其元素的自然顺序进行升序排列。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

3、比较数组:通过 equals 方法比较数组中元素值是否相等。

public static boolean equals(long[] a, long[] a2)

如果两个指定的 long 型数组彼此相等,则返回 true。如果两个数组包含相同数量的元素,并且两个数组中的所有相应元素对都是相等的,则认为这两个数组是相等的。换句话说,如果两个数组以相同顺序包含相同的元素,则两个数组是相等的。同样的方法适用于所有的其他基本数据类型(Byte,short,Int等)。

4、查找数组元素:通过 binarySearch方法能对排序好的数组进行二分查找法操作。

public static int binarySearch(Object[] a, Object key)

用二分查找算法在给定数组中搜索给定值的对象(Byte,Int,double等)。数组在调用前必须排序好的。如果查找值包含在数组中,则返回搜索键的索引;否则返回 (-(插入点) - 1)。

错题一:以下输出是什么 ?

class ChangeIt

{

static void doIt( int[] z )

{

z = null ;

}

}

class TestIt

{

public static void main ( String[] args )

{

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

ChangeIt.doIt( myArray );

for(int j=0; j

System.out.print( myArray[j] + " " );

}

}

复制代码A. 1 2 3 4 5

B. 什么都不会打印出来

C. 程序将因运行时错误而停止。

D. 0 0 0 0 0

正确答案不是B是A,数组虽然是引用传递 ,但是引用 z = null 只是引用z不指向任何对象 ,并不会对原先指向的对象数据进行修改。

可以理解为z=null里头,z还只是地址,如果z[0]就是地址对应的值了,如果z的操作是修改值,那么数组值改变,但是直接将z赋值为null,相当于将z这个地址置为null,不再指向myArray,因此myArray的值不变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值