Performance of System.arraycopy and Arrays.fill

I have some code where I call a function about 1,000,000 times. That function has to allocate a small array (around 15 elements). It would be much cheaper if the client could just allocate the array one single time outside of the function.
Unfortunately, the function requires the array to have all of its elements set to null. With C++, I would be able to memset the contents of the array to null. In Java, the only methods I have available to me are System.arraycopy() and Arrays.fill().
Apparently, Arrays.fill() is just a brain-dead loop. It costs more for Arrays.fill() to set the elements to null than it does to allocate a new array. (I'm ignoring possible garbage collection overhead).
System.arraycopy is a native call (that apparently uses memcpy). Even with the JNI overhead, System.arraycopy runs faster than Arrays.fill(). Unfortunately, it's still slower to call System.arraycopy() than it is to just allocate a new array.
So, the crux of the problem is that the heap allocations are too slow, and the existing means for bulk setting the elements of an array are even slower. Why doesn't the virtual machine have explicit support for both System.arraycopy() and Arrays.fill() so that they are performed with ultra-efficient memsets and memcpys and sans the method call and JNI overhead? I.E. something along the lines of two new JVM instructions - aarraycpy/aarrayset (and all of their primitive brethern).
God bless,
-Toby Reyelts

A newly allocated array begins its life with null in its elements. There is no need to fill it with null.
As Michael already stated, I'm not redundantly resetting all of the elements to null. Here's some code that demonstrates my point. You'll have to replace my PerfTimer with your own high performance timer. (i.e. sun.misc.Perf or whatever) Also note that the reason I'm only allocating half the array size in allocTest is to more accurately model my problem. The size of the array I need to allocate is variable. If I allocate the array outside of the function, I'll have to allocate it at a maximum. If I allocate inside the function, I can allocate it at exactly the right size.import java.util.*;
public class AllocTest {
  private static final int count = 100000;
  public static void main( String[] args ) {
    for ( int i = 0; i < 10; ++i ) {
      allocTest();
    double allocStartTime = PerfTimer.time();
    allocTest();
    double allocTime = PerfTimer.time() - allocStartTime;
    for ( int i = 0; i < 10; ++i ) {
      copyTest();
    double copyStartTime = PerfTimer.time();
    copyTest();
    double copyTime = PerfTimer.time() - copyStartTime;
    for ( int i = 0; i < 10; ++i ) {
      fillTest();
    double fillStartTime = PerfTimer.time();
    fillTest();
    double fillTime = PerfTimer.time() - fillStartTime;
    System.out.println( "AllocTime (ms): " + allocTime / PerfTimer.freq() * 1000 );
    System.out.println( "CopyTime (ms): " + copyTime / PerfTimer.freq() * 1000 );
    System.out.println( "FillTime (ms): " + fillTime / PerfTimer.freq() * 1000 );
  private static void allocTest() {
    for ( int i = 0; i < count; ++i ) {
      Object[] objects = new Object[ 8 ];
  private static void copyTest() {
    Object[] objects = new Object[ 15 ];
    Object[] emptyArray = new Object[ 15 ];
    for ( int i = 0; i < count; ++i ) {
      System.arraycopy( emptyArray, 0, objects, 0, emptyArray.length );
  private static void fillTest() {
    Object[] objects = new Object[ 15 ];
    for ( int i = 0; i < count; ++i ) {
      Arrays.fill( objects, null );
}I getH:\>java -cp . AllocTest
AllocTime (ms): 9.749283777686829
CopyTime (ms): 13.276827082771694
FillTime (ms): 16.581995756443906So, to restate my point, all of these times are too slow just to perform a reset of all of the elements of an array. Since AllocTime actually represents dynamic heap allocation its number is good for what it does, but it's far too slow for simply resetting the elements of the array.
CopyTime is far too slow for what it does. It should be much faster, because it should essentially resolve to an inline memmove. The reason it is so slow is because there is a lot of call overhead to get to the function that does the actual copy, and that function ends up not being an optimized memmove. Even so, one on one, System.arraycopy() still beats heap allocation. (Not reflected directly in the times above, but if you rerun the test with equal array sizes, CopyTime will be lower than AllocTime).
FillTime is unbelievably slow, because it is a simple Java loop. FillTime should be the fastest, because it is the simplest operation and should resolve to an inline memset. Fills should run in single-digit nanosecond times.
God bless,
-Toby Reyelts

Similar Messages

  • System.arraycopy for arrays of  2 dimensions?

    Can it be used for 2 dimensional arrays? How? My problem becomes more specific what the length parameter concerns.
    Thanks
    static void      arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

    That means, that if i want to create a deep copy of a 2dimensional array, i have to:
    -either create a new array, scan the first one and place the values in the new one
    -or do something like this:
        Object[][] gameBoardCopy()
            Object[][] cloneBoard=new Object[8][8];
            System.arraycopy(this.board, 0, cloneBoard, 0,  8);
            for (int i=0; i<8; i++)
                System.arraycopy(this.board, 0, cloneBoard[i],0, 8);
    What do you suggest?

  • System.arraycopy and Objects

    Hi,
    I currently have a 100 objects created in my program. Each object has a number of double arrays assosiated with it.
    During my code I use the System.arrayCopy method to copy the arrays from the best 50 objects into the worst 50 objects.
    This seems to work fine. However someone has told me that when u use the arrayCopy method instead of the array being copied a pointer is just created pointing to the original array ?? . So that if I then modify one of the values in the original array the copied array will also be changed .
    Is this correct ??? if it is how can I get around this problem ??
    Thank you
    Craig

    Why don't you try for yourself?int[] a = new int[] {
        1,
        2
    int[] b = new int[a.length];
    System.arraycopy (a, 0, b, 0, a.length);
    b[1] = 3;
    System.out.println (a[1]);Kind regards,
    Levi

  • Performance by system and utilization reports are blank after upgrading SCOM 2012 SP1 to SCOM 2012 R2

    Hi Experts,
    We are getting blank Performance reports after upgrading to SCOM 2012 R2.  Can anyone provide fix for this issue?
    All the reports are working fine except Performance by system and utilization report.
    Thanks in advance.
    Regards
    Karthick Malayalan

    Hi Karthick,
    Here are two links for your reference regarding to the blank report issue:
    SCOM 2012 performance by system report and perform by utilization
    https://social.technet.microsoft.com/Forums/systemcenter/en-US/b1b13318-2de5-4940-82a2-a8ce5b832c11/scom-2012-performance-by-system-report-and-perform-by-utilization?forum=operationsmanagerreporting
    Base OS MP Version 6.0.6989.0 Imported? And Now Some Reports Are Partially
    Empty?
    http://thoughtsonopsmgr.blogspot.com/2012/11/base-os-mp-version-6069890-imported-and.htmlRegards,
    Yan Li
    Regards, Yan Li

  • System.arraycopy (2 dim array) and growth of 2 dim array

    Hi everybody
    I am working on a program which contains a module that can perform Cartesian product on number of sets.
    The code I have developed so far is :
    import java.lang.reflect.Array;
    public class Cart5 {
    public static void main(String[] args) throws Exception
    int pubnewlength;
    // declare SolArray
    int[][] solArray;
    // initialize solArray
    solArray=new int[1][4];
    // Use for method
    for (int ii=0 ; ii<4 ; ii++)
    solver(solArray,ii);
    // Print the array ?
    System.out.println("\n  The array was changed ... " );
    }  // End main
    public void solver(int Solarray2[][] , int abi)
    int[][]  A  =  {  {1,2,3,5},
                      {4,6,7},
                      {11,22,9,10},
                      {17,33}
      jointwoArrays(solarray2,A,abi);
    // some other operations
    } // End Solver method
    public void jointwoArrays(int solarray3[][] , int aArray[][],int indexA)
    int y,u;
    int[][] tempArray;
    // calculate growth of rows:
    pubnewlength=solArray3.length * aArray[indexA].length;
    //Fill TempArray
    y=solArray3[0].length;
    u=solArray3.length;
    tempArray=new int[u][y];
    // Use system.arraycopy to copy solArray3 into tempArray -- How ?
    // Change the size of arrow to proper size -- How ?
    solArray3 = (int[][]) arrayGrow(solArray3);
    // Join operation - Still under construction
    for(int i = 0, k = 0; i < tempArray.length; i++)
                   for(int j = 0; j < set3.length; j++)
                                     for (q=0;q<=2;q++)             
                                      { solArray3[k][q] = tempArray[i][q];}
                                     solArray3[k][q]= aArray[indexA][j];
                                     ++k;
    } // End jointwoArrays method
    // This module is from http://www.java2s.com/ExampleCode/Language-Basics/Growarray.htm
        static Object arrayGrow(Object a) {
        Class cl = a.getClass();
        if (!cl.isArray())
          return null;
        Class componentType = a.getClass().getComponentType();
        int length = Array.getLength(a);
        int newLength = pubnewlength;
        Object newArray = Array.newInstance(componentType, newLength);
        System.arraycopy(a, 0, newArray, 0, length);
        return newArray;
    } // End ClassI deeply appreciate your help with these 3 questions :
    1. How can I use system.arraycopy to copy my two dimensional array? I have searched but examples seem to be about one dim arrays.
    2. How can I change the "static Object arrayGrow(Object a)" , to grow my two dimensional array ?
    3. If you know any codes or articles or java code regarding cartesian products , please tell me.
    Thank you
    Denis

    1. How can I use system.arraycopy to copy my two
    dimensional array? I have searched but examples seem
    to be about one dim arrays.That's because you can't do it in one call. You need to create a loop which copies each 'row".
    >
    2. How can I change the "static Object
    arrayGrow(Object a)" , to grow my two dimensional
    array ?Why do you make it so complicated (generic). Make it take an int[][] array instead, and see the answer from above.
    >
    3. If you know any codes or articles or java code
    regarding cartesian products , please tell me.There are probably lots of them if you google.
    Kaj

  • The System.arraycopy Functionality and copying array question

    When created arrays such as String[] myStringArray (for example), is it general good practice to use the System.arraycopy function to copy the array?
    Why isn't it good practice to use equal instead? Would this work just as well?
    String[] myStringArray = new String[] { "My", " Test"};
    String[] myStringArrayCopy = new String[myStringArray.length};
    myStringArrayCopy = myStringArrayCopy;Or is that just going to make them the same element in memory and if I change myStringArray in antoher part of the program that means myStringArrayCopy will change as well since it is the same thing?

    Youre right, the equals sign just assigns the new array same reference in memory as the old array so they are pointing to the same data.
    Im 90% sure of that.
    If you want to work with an array without changing the original array id suggest using the System.arraycopy method. If you dont mind the contents changing then use the = sign..(but then why use a new array at all?)
    Hope this helps, if not theres loads of more experienced people on the boards...
    Ocelot

  • Question on System.arraycopy method and multidimensional array

    I'm trying to copy from single dimensional to multidimensional array using System.arraycopy method. The following is my problem.
    1) I need to specify the index of the multidimensional array while copying. Can I do that ? If yes , how???
    eg ; int a[] = new int[3];
    int b[] = new int[3][2]; I need to copy from a to b
    I tired the following and I'm getting an error.
    System.arraycopy(a,0,b[][1],0,3);
    How Can I achieve the above?? PLease Help --------------

    Java doesn't have multidimensional arrays. When you see an int[][] it's an array of arrays of ints. The arrays of ints might have different lengths like this one:int[][] arr =
    {{1,2,3,4},
    {1,2,3},
    {1,2},
    {1}
    };Do I need to say that arraycopy as you see it would fail in this case?
    If you know what kind of arrays you'll have you can simply implement your own arraycopy method (but it will not be as effecient as System.arraycopy) with a simple for-loop.

  • Using System.arraycopy to copy an array into itself.

    I was wondering if there are any potential problems with using code similar to below?
    System.arraycopy(Global.queueUrgent, 1, Global.queueUrgent, 0, Global.queueUrgent.length-1); I have an array which works as a job queue. Another thread looks at this queue and then acts on it according to the data held in Global.queueUrgent[0]. Once this task has been accomplished, the first job is removed and the rest of the queue is brought forward one (and hence the code sample).
    I understand the risks of a race condition which might occur in my application and can prevent it as much as possible but I was wondering if there were any other concerns I should address. It's important that I use an array such as this for my project.
    I haven't tried to implement the code as of yet as I would like to hear your thoughts on it first.
    Regards,
    Robert (1BillionHex).

    user13702320 wrote:
    "If the src and dest arguments refer to the same array object, then the copying is performed as if the components at positions srcPos through srcPos+length-1 were first copied to a temporary array with length components and then the contents of the temporary array were copied into positions destPos through destPos+length-1 of the destination array. "
    Yeah I understand that. I was just wondering if there was anything that I was missing.
    It says "as if" it is copied to a temporary array. Does it actually do this? If so and if I use a large array, would this have an impact on memory usage?It doesn't matter if it actually does it using a temporary array. The point is, it is safe to use the same array for src and dest. Note that java.util.ArrayList's 'remove' method uses exactly the code that you are using. I don't know about memory usage effects. If you do this manually, you do need to set Global.queueUrgent[Global.queueUrgent.length-1] to null to ensure that the objects will be able to be garbage-collected properly when it is time (see what ArrayList.remove does). If you don't, then if you had a 5-element array and remove all 5 elements, you will end up with 5 references to what was originally only in queueUrgent[4], and the object won't be eligible for garbage-collection.
    I did have the same question as Kayaman--why not use a real queue? There are several built-in classes that you can use, instead of using an array directly. You claimed that "It's important that I use an array such as this for my project.", but you didn't explain why you think you must use an array.

  • I performed a software update and the system is installing an update but it has been running for over 24hrs and keeps saying "This may take a few minutes, don't shut down your computer" Can anyone help?

    I performed a software update and the system is installing an update but it has been running for over 24hrs and keeps saying "This may take a few minutes, don't shut down your computer" Can anyone help?

    Hello cor-el, thanks for your reply. I changed my settings for downloads to desktop and it has appeared on there. When I double click I am asked which program I want to open file. I click firefox and another box "opening install" says I have chosen to open the file which is an application and do I want to save it. This is the only real option so I press save file. I get a box saying this is an executable file which may contain viruses - do you want to run. I press ok and the final box showing C drive file name and desktop appears stating application not found.
    This happens the same whenever I try to install.
    To my untrained eye the application is not being recognised as an application and I cannot work out how to get it to do that.
    My plugin is still showing as out of date.
    Is there anything you could suggest. Thanks for your time.

  • Problems with restoring my iTunes library after performing an HP backup and system recovery

    Hello,
    Last Sunday night/Monday morning, I had to perform a system recovery (from the discs supplied by HP) on my HP Compaq Presario SR5310F 32-bit desktop computer running Windows Vista Home Premium, (on the recommendation of samone at HP) and just backing up my 90+ GB iTunes library took 12 hours (the actual system recovery took only about 2-1/2 hours, the following morning). After the recovery process was complete, I 'restored' the backed-up files by either double-clicking or just opening the first backup file (the one whose file name ends in '.1') and following the prompts, which placed the files into something called the 'System Restore Files' folder. I thought I could just restore my iTunes library by dragging and dropping the music, video and iTunes folder files from this System Restore Files folder back into their original places on my computer, but while the song titles did show up in my iTunes library, whenever I tried to actually play one, an exclamation point would appear beside the song's title and I'd get the error message 'iTunes cannot find the file'; when I clicked on 'Find missing file'--or whatever it's called--the C < Users < [username] < Music folder would open, and it would be completely blank, with only the words 'This folder is empty' appearing in it. (And BTW, before you try to recommend the 'Finding missing content in iTunes' or 'How to find missing music in iTunes' articles to me, I should point out that I did try all of the steps in those articles, but my iTunes library was still completely empty at that point, despite trying those steps; that was why I finally tried 'dragging and dropping all of those files back into the Desktop, Downloads, Documents--yes, some really large download files, not from iTunes, showed up in the Documents folder--and also a couple of downloaded music files--again, not from iTunes--showd up 'loose' [by 'loose', I mean not in one of the folders (e.g., Documents, Downloads etc.) in my [username] subfolder] in my [username] subfolder, after which, I was able to get most of my song and video titles listed in iTunes again, but they just won't PLAY! Also, it appears I'm missing about 5 GB from my iTunes library now, as it's saying that I only have about 85.15 GB worth of files in it, where before I had 90+ GB worth of files in it.)
    BTW, I can play the files I moved to Desktop, Downloads, etc. if I right-click on the individual files in these locations and then click on 'Play' or 'Open With', but they just won't play in iTunes.
    And one more thing: I stupidly deleted my 2 iTunes podcast file titles after I discovered that these, too, would not play; is there any way I can recover these--and my iTunes library--without performing yet ANOTHER system recovery and starting over 'from scratch'? (But if that's what I'll have to do, I'll do it--or else I'll just give up and start all over again with the new computer I plan to buy over the Labor Day weekend [it'll be a 64-bit Windows 7 computer, I know that much at least], as most of my music was ripped from CDs or else downloaded from places like Bandcamp or Amazon MP3, and these downloads were saved to a series of USB flash drives; I was informed that if worst came to worst, I could redownload my iTunes purchases, but my 2 podcasts will be lost forever, as iTunes doesn't 'keep' those--or words to that effect...)
    P.S. The computer I'm using has only a 250 GB hard drive, of which 223 GB were available, I couldn't perform the 'Consolidate' function so I could properly back up my iTunes library, as, what with the accumulated Windows downloads (I got this computer in February 2008) and other programs, I had only a few (< 10) GB free--not enough to consolidate the iTunes library, and second, the computer malfunctioned just prior to my performing the system recovery, so that I could no longer log on in 'normal' mode, only in the various safe modes. A lady at Microsoft told me I could back up my iTunes library by logging on in safe mode with networking (since I could do that, albeit with the error message 'Your account has been loaded with a temporary profile') and pasting my iTunes library to my external hard drive, but when I tried this, I got a message listing my iTunes library as '(empty)' when I clicked on iTunes in 'All Programs', and needless to say, my iTunes library wouldn't even open in any of the safe modes (I don't know whether it was 'just' my computer, or whether the lady didn't know what she was talking about--she does work for Microsoft, after all).

    OK, before you moved the iTunes folder did the library contain entries for your original files?
    This is the normal layout of the iTunes folders. From what you said at the outset it would seem that, as far as that copy of your library is concerned, it thinks the media folder is C:\System Recovery Files\C\Users\<User>\Music\iTunes\iTunes Media
    Not quite sure where you have moved the original set of library files to (that is the five files listed above and the Album Artwork folder) but you should move these to C:\System Recovery Files\C\Users\<User>\Music\iTunes, (leaving everything else in place) then click the icon to launch iTunes and immediately press and hold down the left shift key until asked to choose or create a library. Click choose and browse to the library file at C:\System Recovery Files\C\Users\<User>\Music\iTunes\iTunes Library.itl - fingers crossed this will open your old database, which will be able to find your old files. If that goes well we can look to moving them somewhere more sensible.
    tt2

  • Hi guys, can you please explain how to perform automatic system scan with CleanApp - it looks like it wants me to manually chose files to delete and I just want an automatic scan (like cleanmymac does)

    Hi guys, can you please explain how to perform automatic system scan with CleanApp - it looks like it wants me to manually chose files to delete and I just want an automatic scan (like cleanmymac does)

    Slowness...First Try using Disk Utility to do a Disk Repair, as shown in this link, while booted up on your install disk.
      You could have some directory corruption. Let us know what errors Disk Utility reports and if DU was able to repair them. Disk Utility's Disk Repair is not perfect and may not find or repair all directory issues. A stronger utility may be required to finish the job.
      After that Repair Permissions. No need to report Permissions errors....we all get them.
    Here's Freeing up Disk Space.
    DALE

  • System Crash and Slow Performance

    Hello -
    I am hoping that someone might help me -- before upgrading (or downgrading dependent of your view) I was happy and go lucky with my Power Mac G5 -- I have connected via firewire two external hard drives (1 TB) and (500 GB) along with my (2X 500GB) internal drives. Since loading leopard, I have noticed that the system "stalls" and seeks data on the external drives first then goes to the internal drives. Is there a way to prevent that from happening and the system check internally first.
    Second, is I am noticing that my applications are starting to crash at random, Pages, Excel, MS Word, Safari etc. Is there something out here? Or did I do something wrong.
    Frustrated in Boston!
    Jonathan

    Hi:
    I installed as an Upgrade --I did do a disk utility and repaired all permissions and verified the disk. It seems that with the Biggy drive (1TB) not connected the system is a little faster. How do I keep it that while keeping biggy attached?
    Thank you so much for your help.
    Jonathan

  • Subroutine that takes in an array, fills it in and then spits it back out.

    I'm looking for an example where I can create a generic subroutine that takes in an array and then operates on it and then spits the entire array back out. I'm pretty sure this is simple, but I just can't figure it out... In essence I want this:
    main {
    array bob = something
    process_array(bob) /* this part takes in bob...does some stuff and then spits the modified bob back out */
    ....now go on with the rest of my program...
    process_array {
    /* this does something to the array bob */
    I'd appreciate any help. The syntax is just killing me. I can already write the code to do the manipulations for each specific array. Basically I'm reading a csv file and putting it into an array. I would like to write a subroutine that will do this for whatever file and array I give it.
    Thanks
    Edited by: nukular on May 20, 2008 3:19 PM

    nukular wrote:
    process_array(bob) /* this part takes in bob...does some stuff and then spits the modified bob back out */You either want the method to return nothing or you would want this:
    array ted = process_array(bob);Not much point in returning the array reference if you do not keep it.

  • ArrayStoreException by System.arraycopy

    Hi!
    I've made a simple code, which uses System.arraycopy, but it constantly throws ArrayStoreException, even though I can't see any reason for this.
    (I've even run through it and watched the variables at breakpoints.) It seems as if it cannot convert Integer to Integer, but why?
              My code is here:
              import java.lang.reflect.Array;
    public class ArrayHandler {
         public static void main(String[] args) {
              try {
                   Integer[] startArray=new Integer[]{new Integer(1)};
                   Integer[] endArray=new Integer[]{new Integer(2)};
                   Object[] result=new ArrayHandler().appendArray(startArray, endArray);
              }catch(Throwable exception){
                   exception.printStackTrace();
    http://java.sun.com/j2se/1.3/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29
    Otherwise, if any of the following is true, an ArrayStoreException is thrown and the destination is not modified:
          * The src argument refers to an object that is not an array.
          * The dst argument refers to an object that is not an array.
          * The src argument and dst argument refer to arrays whose component types are different primitive types.
          * The src argument refers to an array with a primitive component type and the dst argument refers to an array with a reference component type.
          * The src argument refers to an array with a reference component type and the dst argument refers to an array with a primitive component type.
        Otherwise, if any actual component of the source array
        from position srcOffset through srcOffset+length-1
        cannot be converted to the component type of the destination array by assignment conversion,
        an ArrayStoreException is thrown.
        In this case, let k be the smallest nonnegative integer less than length
        such that src[srcOffset+k] cannot be converted to the component type of the destination array;
        when the exception is thrown,
        source array components from positions srcOffset through srcOffset+k-1
        will already have been copied to destination array positions dstOffset through dstOffset+k-1
        and no other positions of the destination array will have been modified.
        (Because of the restrictions already itemized,
        this paragraph effectively applies only to the situation
        where both arrays have component types that are reference types.)
         public Object[] appendArray(Object[] startArray,Object[] endArray) {
              Object[] outputArray=startArray;   
              Class startArrayClass=startArray.getClass();
              System.out.println(startArrayClass);
              Class endArrayClass=startArray.getClass();
              System.out.println(endArrayClass);
              if(startArrayClass !=endArrayClass){
                   //throw new Exception("startArrayClass !=endArrayClass");
              }else{
                   try{
                        outputArray=(Object[])Array.newInstance(startArrayClass, startArray.length+endArray.length);   
                        System.arraycopy(startArray,0,outputArray,0,startArray.length);
                        System.arraycopy(endArray,0,outputArray,startArray.length,endArray.length);
                        return outputArray;
                   }catch(Throwable exception){
                        exception.printStackTrace();
              return outputArray;
         }//appendArray
    }Could anybody share his experience, please.
    My best regards.

    astlanda wrote:(I've even run through it and watched the variables at breakpoints.)Thank's for your time.
    I'm using Eclipse and I know a bit how to debug with it.
    Everything was as expected, but I can't see into a native method like
         * Copies an array from the specified source array, beginning at the
         * specified position, to the specified position of the destination array.
         * A subsequence of array components are copied from the source
         * array referenced by <code>src</code> to the destination array
         * referenced by <code>dest</code>. The number of components copied is
         * equal to the <code>length</code> argument. The components at
         * positions <code>srcPos</code> through
         * <code>srcPos+length-1</code> in the source array are copied into
         * positions <code>destPos</code> through
         * <code>destPos+length-1</code>, respectively, of the destination
         * array.
         * <p>
         * If the <code>src</code> and <code>dest</code> arguments refer to the
         * same array object, then the copying is performed as if the
         * components at positions <code>srcPos</code> through
         * <code>srcPos+length-1</code> were first copied to a temporary
         * array with <code>length</code> components and then the contents of
         * the temporary array were copied into positions
         * <code>destPos</code> through <code>destPos+length-1</code> of the
         * destination array.
         * <p>
         * If <code>dest</code> is <code>null</code>, then a
         * <code>NullPointerException</code> is thrown.
         * <p>
         * If <code>src</code> is <code>null</code>, then a
         * <code>NullPointerException</code> is thrown and the destination
         * array is not modified.
         * <p>
         * Otherwise, if any of the following is true, an
         * <code>ArrayStoreException</code> is thrown and the destination is
         * not modified:
         * <ul>
         * <li>The <code>src</code> argument refers to an object that is not an
         *     array.
         * <li>The <code>dest</code> argument refers to an object that is not an
         *     array.
         * <li>The <code>src</code> argument and <code>dest</code> argument refer
         *     to arrays whose component types are different primitive types.
         * <li>The <code>src</code> argument refers to an array with a primitive
         *    component type and the <code>dest</code> argument refers to an array
         *     with a reference component type.
         * <li>The <code>src</code> argument refers to an array with a reference
         *    component type and the <code>dest</code> argument refers to an array
         *     with a primitive component type.
         * </ul>
         * <p>
         * Otherwise, if any of the following is true, an
         * <code>IndexOutOfBoundsException</code> is
         * thrown and the destination is not modified:
         * <ul>
         * <li>The <code>srcPos</code> argument is negative.
         * <li>The <code>destPos</code> argument is negative.
         * <li>The <code>length</code> argument is negative.
         * <li><code>srcPos+length</code> is greater than
         *     <code>src.length</code>, the length of the source array.
         * <li><code>destPos+length</code> is greater than
         *     <code>dest.length</code>, the length of the destination array.
         * </ul>
         * <p>
         * Otherwise, if any actual component of the source array from
         * position <code>srcPos</code> through
         * <code>srcPos+length-1</code> cannot be converted to the component
         * type of the destination array by assignment conversion, an
         * <code>ArrayStoreException</code> is thrown. In this case, let
         * <b><i>k</i></b> be the smallest nonnegative integer less than
         * length such that <code>src[srcPos+</code><i>k</i><code>]</code>
         * cannot be converted to the component type of the destination
         * array; when the exception is thrown, source array components from
         * positions <code>srcPos</code> through
         * <code>srcPos+</code><i>k</i><code>-1</code>
         * will already have been copied to destination array positions
         * <code>destPos</code> through
         * <code>destPos+</code><i>k</I><code>-1</code> and no other
         * positions of the destination array will have been modified.
         * (Because of the restrictions already itemized, this
         * paragraph effectively applies only to the situation where both
         * arrays have component types that are reference types.)
         * @param      src      the source array.
         * @param      srcPos   starting position in the source array.
         * @param      dest     the destination array.
         * @param      destPos  starting position in the destination data.
         * @param      length   the number of array elements to be copied.
         * @exception  IndexOutOfBoundsException  if copying would cause
         *               access of data outside array bounds.
         * @exception  ArrayStoreException  if an element in the <code>src</code>
         *               array could not be stored into the <code>dest</code> array
         *               because of a type mismatch.
         * @exception  NullPointerException if either <code>src</code> or
         *               <code>dest</code> is <code>null</code>.
        public static native void arraycopy(Object src,  int  srcPos,
                                            Object dest, int destPos,
                                            int length);

  • System.arraycopy()

    I have an array of 1000 ints:
    int[] a = new int[1000];After I fill it with random integer values, I want to sort it with one method iteratively and one method recursively.
    It was suggested to me to use System.arraycopy(src, srcPos, dest, destPos, length) to make a copy of the array and then pass it to the two different methods.
    How can I go about doin this....

    Here's a demo:
            int[] array = {5,3,1,2,4};
            int[] copy = new int[array.length];
            System.arraycopy(array, 0, copy, 0, copy.length);
            System.out.println("array -> "+java.util.Arrays.toString(array));
            System.out.println("copy  -> "+java.util.Arrays.toString(copy));

Maybe you are looking for