如何实现动态“改变”数组长度?

hxy91819 2015-06-15 06:09:34
如:数组A,长度为l。现在想是数组A长度改变为l+2。

有个思路是新建一个数组B,使其长度为l+2,然后copy A的内容到B中,然后修改B数组的地址为原A数组地址。

表面上看是动态改变了数组A的长度。

现在问题是,如何“修改B数组的地址为原A数组地址”?

或者有没有更好的实现方案。谢谢!
...全文
1705 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
coder-qi 2015-07-01
  • 打赏
  • 举报
回复
java是不能直接改变数组的长度的,只能通过编码来动态的改变数组的长度,ArrayList里面就是通过一个数组来动态的维护其长度的,用2个根据类来帮忙:System.arraycopy() Arrays.copyOf()
nj_dobetter 2015-06-30
  • 打赏
  • 举报
回复
Vector
???as 2015-06-27
  • 打赏
  • 举报
回复
list集合就如同你说的,底层是数组结构,arraylist就是个可变长数组,就像你说的,当超过了length就创建了新的数组,改变地址看起来就像数组变了,如果不考虑集合,将数组a的引用变量指向数组b的引用变量,就好了, 原地址在java里并不可以,
「已注销」 2015-06-27
  • 打赏
  • 举报
回复
楼主,你要改变数组长度而且地址要和原来的一样是不可能的。 java中数组的地址分配是由JVM确定的,是随机的。
折柳君 2015-06-27
  • 打赏
  • 举报
回复
java中直接List l=new ArrayList();就可以了啊!里面需要放东西的时候直接l.add()就可以了,需要看他的长度就是l.size()就是数组的长度啊!
多木多多木 2015-06-26
  • 打赏
  • 举报
回复
楼主,动态改变一个数组的长度不符合java最初数组的设计,需要动态改变一个集合对象的长度可以使用java提供的集合框架,Set,List都不错。而且存放的数据可以是不同类型的。数组不论多长,只能存放单一一种类型数据。
JPF1024 2015-06-19
  • 打赏
  • 举报
回复
java实现不了,因为你只要初始化之后数组的长度就变不了了,除非你重新初始化一个数组。即使你复制也是新增了一个数组
O_森_O 2015-06-19
  • 打赏
  • 举报
回复
我在怀疑楼主有没有正确理解题目的意思。 不光是java,任何语言实现这个功能都够呛吧,就拿c来说,你一个数组申请了以后,地址就是固定的。如果要求地址不变,改变数组长度,那么问题来了,如果该素组邻接的内存已经被分配出去,请问这个数组如何扩展长度??如果扩展了,岂不是发生了内存泄漏。
  • 打赏
  • 举报
回复
Java不行,C/C++,JS都可以。
Mr_class 2015-06-18
  • 打赏
  • 举报
回复
你把B数组的地址给了A数组,A数组已经是新长度的了,你用就行了啊,变量名不变。你操作地址有何用??
三仙半 2015-06-15
  • 打赏
  • 举报
回复
Java好像实现不了。ArrayList的数组变长原理和楼主想到的办法是一样的,而且也不存在让新数组使用原数组地址的可行方案,因为Java不能操作地址。
AndyJi123 2015-06-15
  • 打赏
  • 举报
回复
思路: 1.直接改变原数组的长度,java原生不支持。 2.新建一个数组,将其放在原数组地址处。java有自动的内存管理机制,新建数组在内存中的分配完全由jvm确定,所以这个方法也不行。 总结:除非还存在一些我们不知晓的机制,否则这个需求实现不了。
hxy91819 2015-06-15
  • 打赏
  • 举报
回复
引用 6 楼 lanchongbulan 的回复:
        int[] oldArr = { 1, 2, 3 };
        int[] newArr = new int[oldArr.length + 2];
        System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
        oldArr = newArr;
java的ArrayList就是这个原理
目前我在网上找了几个答案,别人都是用C++来实现的。没有用java实现的,我估计Java实现不了,因为Java不能操作内存。
AndyJi123 2015-06-15
  • 打赏
  • 举报
回复
引用 7 楼 hxy91819 的回复:
[quote=引用 6 楼 lanchongbulan 的回复:]
        int[] oldArr = { 1, 2, 3 };
        int[] newArr = new int[oldArr.length + 2];
        System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
        oldArr = newArr;
java的ArrayList就是这个原理
		int[] oldArr = { 1, 2, 3 };
		int[] newArr = new int[oldArr.length + 2];
		
		System.out.println(oldArr.hashCode());
		
		System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
		oldArr = newArr;
		
		System.out.println(oldArr.hashCode());
哈希值改变了,是不是可以说明地址变了,也就是不是原来的那个oldArr了。 打印结果: 1175962212 918221580[/quote] 对,java的默认的hashCode实现是基于地址的
hxy91819 2015-06-15
  • 打赏
  • 举报
回复
引用 6 楼 lanchongbulan 的回复:
        int[] oldArr = { 1, 2, 3 };
        int[] newArr = new int[oldArr.length + 2];
        System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
        oldArr = newArr;
java的ArrayList就是这个原理
		int[] oldArr = { 1, 2, 3 };
		int[] newArr = new int[oldArr.length + 2];
		
		System.out.println(oldArr.hashCode());
		
		System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
		oldArr = newArr;
		
		System.out.println(oldArr.hashCode());
哈希值改变了,是不是可以说明地址变了,也就是不是原来的那个oldArr了。 打印结果: 1175962212 918221580
AndyJi123 2015-06-15
  • 打赏
  • 举报
回复
        int[] oldArr = { 1, 2, 3 };
        int[] newArr = new int[oldArr.length + 2];
        System.arraycopy(oldArr, 0, newArr, 1, oldArr.length);
        oldArr = newArr;
java的ArrayList就是这个原理
hxy91819 2015-06-15
  • 打赏
  • 举报
回复
引用 4 楼 sinat_29053351 的回复:
为什么一定要用数组,不可以用ArrayList吗,它就可以动态改变自身的长度
我知道可以用集合……实际上是因为我在LintCode上面做的一道题,题目要求用数组,最后改变了数组的长度,但是数组地址不变。
sinat_29053351 2015-06-15
  • 打赏
  • 举报
回复
为什么一定要用数组,不可以用ArrayList吗,它就可以动态改变自身的长度
sinat_29053351 2015-06-15
  • 打赏
  • 举报
回复
为什么一定要用数组,不可以用ArrayList吗,它就可以动态改变自身的长度
sinat_29053351 2015-06-15
  • 打赏
  • 举报
回复
为什么一定要用数组,不可以用ArrayList吗,它就可以动态改变自身的长度
加载更多回复(1)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧