as3中数组的copy之concat

本文深入探讨了ActionScript 3中数组的连接操作,通过实例展示了数组连接的方式及其对原始数组的影响,揭示了数组连接背后的原理,并对比了使用数组实例与数组值连接的区别。
as3中数组的copy之concat
2010年07月18日
  [b][/b] 先来看一下spec中说concat是干啥D:
  Concatenates the elements specified in the parameters with the elements in an array and creates a new array. If the parameters specify an array, the elements of that array are concatenated.
  一直(没就是近个月,刚刚接触AS
  
  )以为AS中Array的连接只是在原来数组的地址上开辟一个足够大的空间。但今天写代码才发现我错了
  
  。先看一下代数复制的一个代码:
  var ori:Array = new Array();
  ori.push([1, 2, 3]);
  ori.push([4, 5, 6]);
  var sec:Array = new Array();
  sec.push([7,8]);
  var cur:Array = ori.concat(sec);
  trace(cur);
  输出:
  1,2,3,4,5,6,7,8
  好,再来两句:
  cur[0][0] = 20;
  trace(ori[0][0]);
  输出20, 对新数组的修改会影响到原来数组的值,再看
  cur[2][0] = 0;
  trace(sec[0][0]);
  此时输出 0, 对新数组的第三个数组(对应接上去的数组即sec)修改也会影响到被接上去的数组,
  可见,以数组实例去连接数组是一以链表的方式来实现的。
  还有一种情况,我们不用数组实例,用数组值,看下面代码:
  var thir:Array = [12,34];
  var cur:Array = ori.concat(thir);
  然后当我们再 cur[2][0] = 0;时就报错了,
  ReferenceError: Error #1056: 无法为 Number 创建属性 0。
  它不会在再生成一个维数组(的引用),而是简单把thir中的元素当成一个个的数值并赋给cur[2],即顶级数组存是的一个值,而不是指针(引用)。
  trace(cur[2]); 就是输出12了。
  trace(cur[3]); 就是输出34了。
  当
  cur[0] = sec;
  trace(cur);
  trace(ori);
  这时候cur就产生变化,但ori依然没有办法,因为cur[0],改了引用,已经不是引用ori[0]了,但些时cur[1]还是保持着原来的引用ori[1]。
  发表于: 2010-07-18 ,修改于: 2010-07-18 19:56,已浏览10次,有评论0条 推荐 投诉
  
  
  [b][/b][b][/b]
<think>好的,用户的问题是关于如何在创建数组时不进行拷贝操作。首先,我需要理解用户的具体需求。他们可能希望避免复制数组带来的性能开销,特别是在处理大型数据时。用户提到的引用中提到了几种复制数组的方法,比如Arrays.copyOfRange()、concat、slice等,但用户想避免这些复制操作。 接下来,我要考虑不同的编程语言,因为不同的语言有不同的方法。比如在Java、Python、JavaScript和C/C++中,处理数组引用的方式可能不同。用户可能在使用其中一种或多种语言,所以需要覆盖这些常见的情况。 在Java中,直接赋值数组变量会导致共享引用,这样修改新变量会影响原数组。这可能是一个解决方案,但需要明确说明这只是引用传递,并不是真正的拷贝。用户需要了解这种方法的副作用。 对于Python,特别是使用NumPy的情况,视图(view)是一个关键概念。创建视图可以避免数据复制,但修改视图会影响原数组。需要提到ndarray的view()方法,并举例说明。 JavaScript中,TypedArray的subarray方法可以创建部分数组的视图,而不复制数据。这也是一个重要的点,尤其是处理二进制数据时。 C/C++中,指针或引用可以直接操作原数组,这也是避免复制的方法,但需要注意内存管理和安全问题。 此外,还需要提醒用户注意事项,比如副作用和只读操作。如果用户只是需要读取数据而不修改,使用引用或视图是安全的,否则需要谨慎。 最后,生成相关问题时要覆盖不同语言的方法、副作用、性能影响和应用场景,帮助用户进一步探索。</think>在编程中,若希望创建数组时避免拷贝操作,可通过以下方法实现直接引用原数据内存地址: ### 一、Java数组引用 直接赋值数组变量实现共享引用: ```java int[] original = {1,2,3}; int[] alias = original; // 共享内存地址 alias[0] = 9; // 原数组同步修改为[9,2,3] ``` 该方法通过引用传递实现零拷贝,但需注意修改会同步影响原数组[^3]。 ### 二、Python的NumPy视图 使用`ndarray.view()`创建数据视图: ```python import numpy as np arr = np.array([1,2,3,4]) view_arr = arr.view() # 不复制数据 view_arr[0] = 99 # 原数组同步修改为[99,2,3,4] ``` 视图对象数组共享数据缓冲区,修改视图会影响原始数据[^4]。 ### 三、JavaScript的TypedArray 使用`subarray`创建缓冲区视图: ```javascript const buffer = new ArrayBuffer(16); const int32View = new Int32Array(buffer); const subView = int32View.subarray(2,4); // 共享缓冲区 ``` 该方法在Web开发中处理二进制数据时效率极高[^2]。 ### 四、C/C++指针操作 通过指针直接访问原数组: ```cpp int arr[5] = {1,2,3,4,5}; int* ptr = arr; // 指针直接引用 ptr[0] = 10; // 原数组首元素变为10 ``` §§ 1. **副作用控制**:上述方法均会产生修改原数据的副作用 2. **只读场景**:若仅需读取数据,建议使用`const`限定符(C++)或`ndarray.flags.writeable=False`(Python) 3. **生命周期管理**:引用原数组时需确保原数据未被提前释放
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值