2

これは私のサンプルオブジェクトです
object name: OBJ
object properties: String name, int age

今私は2つのグローバルリストを持っています

List<OBJ> lstobj = new ArrayList<OBJ>;
List<OBJ> anotherlist = new ArrayList<OBJ>;

次に、このように両方のリストにいくつかのレコードを追加しました

Name:Ben Age:5
Name:Charles Age: 6
Name:Dan Age:7

今、私はチャールズの年齢を「10」に変更する必要がありました

したがって、最初にリストでCharlesを見つけて、リストからobjを取得する必要があります

OBJ newobj = new OBJ;
for(OBJ obj : lstobj){
  if(obj.getName.equals("Charles"){
    newobj = obj;
   }
}

そして今、私は検索されたobjの年齢を10に設定する必要があります。

newobj.setAge(10);

このアクションは、「lstobj」だけでなく「anotherlist」も変更します。2つのグローバルリストに影響を与えずに、取得したobjを設定するにはどうすればよいですか?

4

2 に答える 2

6

リストには、オブジェクトへの参照が格納されます。同じ参照を複数のリストに貼り付けてからオブジェクトを変更すると、どこでも変更されます。

の内容lstobjanotherlistを完全に独立させたい場合は、それらに異なるオブジェクトを挿入する必要があります。これには、おそらくオブジェクトのコピーを作成することが含まれます。

于 2013-01-24T09:03:43.787 に答える
4

コピーコンストラクターを使用してみてください

public class Person {

    private String name;
    private String age;

    public Person(String name,String age) {
        this.name = name;
        this.age = age;
    }

    public Person(Person person){
        this.name = person.getName();
        this.age= person.getAge();
    }

    public Person(){    
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString(){
        return "[Name:"+this.name+"][Age:"+this.age+"]";
    }

    public static void main(String[] args) {

        Person person1 = new Person("Charles","20");
        Person person2 = new Person("Rob","30");

        List<Person> persons = new ArrayList<Person>();
        persons.add(person1);
        persons.add(person2);

        List<Person> morePersons = new ArrayList<Person>();
        morePersons.add(new Person(person1));
        morePersons.add(new Person(person2));

        Person newobj = new Person();
        for (Person obj : persons) {
            if (obj.getName().equals("Charles")) {
                newobj = obj;
                newobj.setAge("10");
            }
        }

        System.out.println(persons);
        System.out.println("======");
        System.out.println(morePersons);

    }
}

出力は

run:
[[Name:Charles][Age:10], [Name:Rob][Age:30]]
======
[[Name:Charles][Age:20], [Name:Rob][Age:30]]
BUILD SUCCESSFUL (total time: 1 second)

あなたの場合、1つのオブジェクトだけを変更していますが、両方のリストに反映されています。これは、リストにオブジェクト参照が格納されているためです。ここでは、両方のリストが変更している同じオブジェクトを参照しているため、行った変更は両方のリストに反映されます。

ここで行ったことは、オブジェクトの詳細をコピーして新しいオブジェクトを作成していることです。その参照は元のオブジェクトとは異なります。古いオブジェクトに加えた変更は、参照が異なるため、新しいオブジェクトを変更しません。

于 2013-01-24T09:08:55.523 に答える