【问题标题】:Can't save changing class object into ArrayList properly无法将更改的类对象正确保存到 ArrayList
【发布时间】:2021-02-15 08:25:11
【问题描述】:

我创建了空的 ArrayList 类对象和一个类对象。我将这个带有一些参数的类对象添加到 ArrayList 中,然后更改了这个对象的一些参数。但是留在 ArrayList 中的类对象也发生了变化。看起来我正在通过引用传递参数。此外,如果我尝试创建新对象并使其与“=”相等,则该对象将连接到旧对象,因此如果我要更改第一个对象,那么第二个对象也会更改,就像对第一个变量的引用一样。我在 Java 中遇到了同样的问题(不足为奇)。那么,如何按值传递类对象?我想使用一个类对象将新对象添加到 ArrayList 中,然后在不更改 ArrayList 中的类对象的情况下更改它。

class TestClass(var someData : Int = 0)

fun main(){
    var testArrayList = arrayListOf<TestClass>()
    var classObject : TestClass = TestClass(3)
    testArrayList.add(classObject)
    classObject.someData = 5
    testArrayList.add(classObject)
    classObject.someData = 7
    testArrayList.add(classObject)
    print(testArrayList[0].someData)
    print(testArrayList[1].someData)
    print(testArrayList[2].someData)   //Output = 777. Needed 357
}

与创建新对象相同

class TestClass(var someData : Int = 0)

fun main(){
    var testArrayList = arrayListOf<TestClass>()
    var classObject : TestClass = TestClass(3)
    var secondClassObject : TestClass = classObject
    testArrayList.add(secondClassObject)
    classObject.someData = 5
    var thirdClassObject : TestClass = classObject
    testArrayList.add(thirdClassObject)
    classObject.someData = 7
    var fourthClassObject : TestClass = classObject
    testArrayList.add(classObject)
    print(testArrayList[0].someData)
    print(testArrayList[1].someData)
    print(testArrayList[2].someData)   //Output = 777. Needed 357
}

您尝试在 Java 中编写类似的代码,因为 Java 中的 arrayList 在这种情况下的工作方式相同。所以,你可以用 Java 代码发送答案

【问题讨论】:

  • 这在我看来并不像 Java。
  • 我不知道arrayListOf 做了什么,但您只创建了一个 TestClass 对象,然后您多次更新该对象。如果你想要 3 个不同的值,你需要创建 3 个不同的 TestClass 对象
  • @Stultuske 这是 Kotlin
  • @JoakimDanielson arrayListOf 存在于 Kotlin 中。 arrayListOf
  • 那如果是kotlin,为什么还要用Java标记?

标签: kotlin arraylist


【解决方案1】:

您基本上是在一次又一次地添加相同的TestClass 实例并修改值,因此数组位置3 中的实例也将指向1 的相同实例,如果您真的想要不同的值,您需要要么创建一个不同的实例,要么使用带有copy 的数据类,它将值复制到不同的实例中,您可以命名参数来更改您需要的值,如下所示

data class TestClass(var someData : Int = 0)

fun main(){
    var testArrayList = arrayListOf<TestClass>()
    var classObject : TestClass = TestClass(3)
    testArrayList.add(classObject)
    testArrayList.add(classObject.copy(someData = 5))
    testArrayList.add(classObject.copy(someData = 7))
    print(testArrayList[0].someData)
    print(testArrayList[1].someData)
    print(testArrayList[2].someData)
}

【讨论】:

    【解决方案2】:

    copy

    复制对象以更改其某些属性,但保留 保持不变,使用 copy() 函数。

    class TestClass(var someData : Int = 0) {
        fun copy(someData: Int = this.someData) = TestClass(someData)
    }
    
    fun main(){
        
        
        var testArrayList = arrayListOf<TestClass>()
        var classObject : TestClass = TestClass(3)
        testArrayList.add(classObject)
    
        testArrayList.add(classObject.copy(someData = 5))
        testArrayList.add(classObject.copy(someData = 7))
    
        print(testArrayList[0].someData)
        print(testArrayList[1].someData)
        print(testArrayList[2].someData)  
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-10
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 2016-07-07
      • 2014-10-03
      相关资源
      最近更新 更多