【问题标题】:java how to implement System.arraycopy() yourself [duplicate]java如何自己实现System.arraycopy()[重复]
【发布时间】:2016-05-19 05:09:14
【问题描述】:

我试图实现我自己的 ArrayList 类以用于教育目的,当我需要让它增长时,我需要将旧的小数组的内容复制到新的更大的数组中。

使用for loop 执行此操作效率非常低,并且需要O(n) time,具体取决于要复制的数组的大小。幸运的是,Java 有 System.arraycopy() 函数,我怀疑它不使用 for loop,而是一次复制整个数组,花费更少的时间。

但是我自己有可能做这种内存拷贝吗?还是说它被埋得太深了,只有java编译器才能做到?

P.S 有很多我不知道如何实现的功能,并且似乎可以使用例如魔术System.out.println() 或套接字来工作。

为了澄清 我只是想知道如何自己做这些优化的内存管理。

【问题讨论】:

  • 我认为不可能在 O(1) 时间内复制一个数组。
  • 复制数组仍然取决于大小,因为字节需要四处移动,所以即使System.arraycopy() 也会是 O(n) - 由于缺少循环,可能会更快一些。问题是:如果是出于教育目的,性能会起到那么大的作用吗?
  • 好吧,不是 O(1) 时间,但至少比 for 循环更有效
  • 如果您的教育任务是创建自己的 ArrayList,为什么不在内部使用System.arraycopy()? IMO 没有必要自己做所有事情,尤其是非常低级的事情。
  • 您想像真正的那样使用原生 c 函数实现该方法,还是使用普通 java 重新创建类似的方法?

标签: java memory


【解决方案1】:

java.lang.System,你可以看到声明,但没有源代码:

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

那是因为它是本地方法,在 JVM 提供的库中实现。 JVM 之间的实现可能不同,并且其二进制文件因平台而异,因为它需要为每个平台编译。

您可以编写自己的本机库。要达到您想要的优化级别,您需要精通一些较低级别的语言,如 C 或汇编程序。使用高级语言可能会遇到与 Java 相同的障碍,因为您通常无法直接访问这些语言中的内存。

编写自己的本机库的一个缺点是您的应用程序将不再独立于平台,因为与System 不同,您运行它所需的编译库不包含在 JVM 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多