q*******i 发帖数: 353 | 1 【 以下文字转载自 CS 讨论区 】
发信人: qqwuweiyi (娓娓), 信区: CS
标 题: Java数组怎么样能参数传递
发信站: BBS 未名空间站 (Wed Mar 31 22:00:20 2010, 美东)
请教大家一个问题:Java中,我想让一个数组整个的参数传递而不要地址传递应该怎么
弄?
或者回答这个问题:假设数组a[4][4]={...},数组b[4][4]=a[4][4]的话,那么数组b
的值的地址和数组a中的地址是一样的。我就想要知道,如何建立一个数组b,数组a和
数组b的值一样但是地址不一样。
谢谢大家啦,想了很久不知道怎么解决。 |
X****r 发帖数: 3557 | 2 你是问怎么复制一个数组吗?
Arrays.copyOf
或System.arraycopy
多维的话恐怕要自己循环一下。
b
【在 q*******i 的大作中提到】 : 【 以下文字转载自 CS 讨论区 】 : 发信人: qqwuweiyi (娓娓), 信区: CS : 标 题: Java数组怎么样能参数传递 : 发信站: BBS 未名空间站 (Wed Mar 31 22:00:20 2010, 美东) : 请教大家一个问题:Java中,我想让一个数组整个的参数传递而不要地址传递应该怎么 : 弄? : 或者回答这个问题:假设数组a[4][4]={...},数组b[4][4]=a[4][4]的话,那么数组b : 的值的地址和数组a中的地址是一样的。我就想要知道,如何建立一个数组b,数组a和 : 数组b的值一样但是地址不一样。 : 谢谢大家啦,想了很久不知道怎么解决。
|
q*******i 发帖数: 353 | 3 我遇到的问题是把数组作为参数传递给函数,在函数中数组值被修改同时原来的值也被
修改,有什么办法能让函数中值被修改但是原值不被修改。谢谢
【在 X****r 的大作中提到】 : 你是问怎么复制一个数组吗? : Arrays.copyOf : 或System.arraycopy : 多维的话恐怕要自己循环一下。 : : b
|
X****r 发帖数: 3557 | 4 那不就是把数组复制后的结果传进去吗,这样原来那份就不会被修改了。
【在 q*******i 的大作中提到】 : 我遇到的问题是把数组作为参数传递给函数,在函数中数组值被修改同时原来的值也被 : 修改,有什么办法能让函数中值被修改但是原值不被修改。谢谢
|
q*******i 发帖数: 353 | 5 我是先把数组拷贝(比如把数组a copy 给b),然后把b整个数组作为参数传递到函数
中,在函数内数组b的值被修改了,于此同时函数外a的值也被自动修改了(因为是地址
拷贝),但是我希望保持a不变,怎么操作?
【在 X****r 的大作中提到】 : 那不就是把数组复制后的结果传进去吗,这样原来那份就不会被修改了。
|
X****r 发帖数: 3557 | 6 你怎么拷贝的?b = a; ?这样不是拷贝,而是aliasing。如果你是多维数组的话光
调用一个Arrays.copyOf也不够,得自己循环调用它来复制才行。
【在 q*******i 的大作中提到】 : 我是先把数组拷贝(比如把数组a copy 给b),然后把b整个数组作为参数传递到函数 : 中,在函数内数组b的值被修改了,于此同时函数外a的值也被自动修改了(因为是地址 : 拷贝),但是我希望保持a不变,怎么操作?
|
q*******i 发帖数: 353 | 7 对,我发现就是循环复制才行,但是数组维数一高,循环复制岂不是效率太低。想问有
没有更高效的办法解决这个问题
【在 X****r 的大作中提到】 : 你怎么拷贝的?b = a; ?这样不是拷贝,而是aliasing。如果你是多维数组的话光 : 调用一个Arrays.copyOf也不够,得自己循环调用它来复制才行。
|
X****r 发帖数: 3557 | 8 循环复制的效率和数组的维数关系不大,主要和数组的总元素个数成正比,除非你的每
个维度都只有一两个元素,而有上百个维度,不然不会效率太低。
当然你可以用一维数组来模拟多维数组。Java的多维数组允许子数组的大小不同。
如果你不用这个特性的话直接用一维数组而自己来算下标也是可以的。
【在 q*******i 的大作中提到】 : 对,我发现就是循环复制才行,但是数组维数一高,循环复制岂不是效率太低。想问有 : 没有更高效的办法解决这个问题
|
q*******i 发帖数: 353 | 9 我就是一个m*n的二维数组,但是m和n都很大,这样即使用两个for循环来复制效率也不
低。对吧?除此之外实在想不到什么办法改变新值而原值不变了
【在 X****r 的大作中提到】 : 循环复制的效率和数组的维数关系不大,主要和数组的总元素个数成正比,除非你的每 : 个维度都只有一两个元素,而有上百个维度,不然不会效率太低。 : 当然你可以用一维数组来模拟多维数组。Java的多维数组允许子数组的大小不同。 : 如果你不用这个特性的话直接用一维数组而自己来算下标也是可以的。
|
X****r 发帖数: 3557 | 10 为什么要用两个for循环呢?一个for循环里面套一个Arrays.copyOf就行了啊。
【在 q*******i 的大作中提到】 : 我就是一个m*n的二维数组,但是m和n都很大,这样即使用两个for循环来复制效率也不 : 低。对吧?除此之外实在想不到什么办法改变新值而原值不变了
|
|
|
q*******i 发帖数: 353 | 11 明白了,这样效率是比两个for循环高很多吗?
【在 X****r 的大作中提到】 : 为什么要用两个for循环呢?一个for循环里面套一个Arrays.copyOf就行了啊。
|
t****t 发帖数: 6806 | 12 唉, 我不会java都看明白了
copy一维数组, 用copyblahblah method
copy二维数组, 用一重循环加copyblahblah method, 因为二维数组是一维数组的一维
数组
【在 q*******i 的大作中提到】 : 明白了,这样效率是比两个for循环高很多吗?
|
g*****g 发帖数: 34805 | 13 通常一维数组地址连续,二维不是。
跟你说了半天调N次arraycopy就行,不能理解我也没办法了。
【在 q*******i 的大作中提到】 : 明白了,这样效率是比两个for循环高很多吗?
|
X****r 发帖数: 3557 | 14 改善一个常系数而已,不影响时间复杂度,但是不用白不用,代码还简洁些。
【在 q*******i 的大作中提到】 : 明白了,这样效率是比两个for循环高很多吗?
|
k*******d 发帖数: 701 | 15 System.arraycopy()
example
int[] original = new int[] {71, -4, 7220, 0, 238};
int[] copy = new int[original.length];
System.arraycopy(original, 0, copy, 0, original.length);
It is a native method, very efficient!! |
s***8 发帖数: 1136 | 16 deep clone.
However, it's usually not a good idea to modify something passed in as a
param as side effect |