1

配列をメソッドに渡したいのですが、配列が参照渡しであることはわかっているため、元の配列が変更されます。私が見つけた回避策は、メソッド内で配列のコピーを作成してからそのコピーを変更することですが、配列のコピーを渡す最善の方法は何か、またはメソッド内でコピーを作成する方がよいでしょう。これが私のコードです ArrayUtils クラスの逆メソッドを見てください

package com.javablackbelt.utils;

import java.util.ArrayList;
import java.util.Arrays;

public class ListUtils {

    public static void main(String arg[]) {
        String[] arr = {"one", "two", "three", "four", "five"};
        ArrayUtils.print(arr);

        System.out.println();

        String [] reversedArr = ArrayUtils.reverse(arr);
        ArrayUtils.print(reversedArr);

        System.out.println();

        ArrayList<String> list = ArrayUtils.toArrayList(arr);
        ListUtils.print(list);      

    }

    public static void print(ArrayList<String> aStr) {
        System.out.print("list: [ ");
        for(String l: aStr)
            System.out.print(l+" ");
        System.out.println(" ] size: "+aStr.size());
    }

}

package com.javablackbelt.utils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;

public class ArrayUtils {

    public static void print(String[] arr) {
        System.out.print("Array: [ ");
        for(String str: arr) {
            if(str != null) 
                System.out.print(str.toString()+" ");
        }
        System.out.print(" ] size: "+arr.length);
    }

    public static String[] reverse(String[] arr) {
        String[] a = arr;

        List<String> list = Arrays.asList(a);

        Collections.reverse(list);

        String[] newArr = (String[]) list.toArray();

        return newArr;
    }

    public static ArrayList<String> toArrayList(String[] arr) {

        ArrayList<String> arrList = new ArrayList<String>();

        for(int i = arr.length-1; i >= 0; i--)
            arrList.add(arr[i]);
        return arrList;     
    }

}
4

3 に答える 3

1

アレイのコピーを作成できるため、元のアレイの編集から保存できます。

  1. System.arraycopy(srcArray、0、destArray 0、srcArray.length);
  2. srcArray.clone()
于 2012-10-30T19:57:20.567 に答える
1

最善の答えはありません。渡された配列を変更するのが正常な場合もあれば(たとえばArrays.sort())、そうでない場合もあります。重要なのは、メソッドを文書化し、発信者に契約を尊重させることです。

入力配列の変換された配列を返すメソッドが入力配列を変更せずに残すのは正常であり、万が一の場合に備えて、そのようなメソッドに配列を渡す前にコピーを作成する必要があるのは悪いことです。明確なドキュメントがあれば、間違いありません。

通常、コレクションは配列よりも優先されます。コレクションを使用すると、自分自身を保護するためにコピーを作成する必要はありません。コレクションを変更されていないコレクションにラップするだけで済みますCollections.unmodifiableList(list)

于 2012-10-30T19:58:51.133 に答える
0

配列をコピーする必要があります。実現できる方法はいくつかありますが、この理由から、多くの場合、「プリミティブ」配列よりもArrayListオブジェクトなどの実際のオブジェクトを使用する方が簡単です。

String[] myPrimitiveArrayOfStrings;
ArrayList<String> myObjectArrayOfStrings = new ;

後者の方法 (「ジェネリック」を使用) では、配列の利用方法に関して多くの柔軟性が得られます。これにより、配列内のオブジェクトの並べ替え、検索、拡張、およびその他の多くのことがはるかに簡単になります。

そうは言っても、Arrayクラスはいくつかのユーティリティを提供します。

ちなみに、Java オブジェクトは参照渡しではなく、参照の値渡しです。これは、オブジェクトへのポインターがコピーされることを意味します。元のポインターが削除されても、そのポインターは残ります。オブジェクトがガベージ コレクションされるのは、すべてのポインタが削除された場合のみです。

于 2012-10-30T19:55:53.847 に答える