Android:intent.putExtra()会更改对象吗?

时间:2018-07-05 19:31:03

标签: java android class android-intent hashmap

我想将 myObject 传递给 NewActivity 类。为此,我使用了 Intent 中的 putExtra() getExtras()方法。但是看来对象发生了什么变化?我在传递对象之前和之后都在打印该对象。

这正常吗?我遇到了问题,因为我在HashMap中使用了myObject,并且由于NewActivity中的对象本质上是一个完全不同的对象,因此我不能再将其用作键。

传递对象:

Intent myIntent = new Intent(context, NewActivity.class);
MyClass myObject = new MyClass();
myIntent.putExtra("test", myObject);
System.out.println("OBJECT BEFORE: " + myObject);

检索对象:

MyClass myObject = (MyClass) getIntent().getExtras().getSerializable("test");
System.out.println("OBJECT AFTER: " + myObject);

(不同)打印:

I/System.out: OBJECT BEFORE: my.project.MyClass@8fe5ae4
I/System.out: OBJECT AFTER: my.project.MyClass@9f1fb7b

4 个答案:

答案 0 :(得分:1)

更改此

getIntent()。getExtras()。getSerializable()

getIntent().getSerializableExtra("test")

答案 1 :(得分:1)

序列化和反序列化会创建新对象。

如果这是您的问题,因为您将其用作HashMap的键,则应在类中实现boolean equals(Object other)int hashCode()方法。

请查阅Wikipedia上的Java hashCode()和Oracle文档中的public int hashCode(),以了解如何实现“可哈希”对象。

如果您的对象在用作键时不再依赖于身份,则应该解决问题。

答案 2 :(得分:-1)

这就是可序列化对象的工作方式。 100%基本的Java。

他们将对象序列化为原始数据,然后在不进行序列化时,它将创建一个相同类型的全新对象,并将旧对象具有的所有值设置为新对象。

因此对象引用将不同,这也是为什么在调用System.out.println时会打印出不同的hashCode的原因。

对象的内部值将相同。

答案 3 :(得分:-1)

要将对象的一个​​活动传递给另一个活动,您的对象类应实现“可序列化”。

void rearrange(int a[], int n, int x) {
    if (n == 0)
        return;
    if (a[0] <= x)
        rearrange(a + 1, n - 1, x);
    else {
        if (a[n - 1] > x)
            rearrange(a, n - 1, x);
        else {
            rearrange(a + 1, n - 2, x);
            swap(a, a + n - 1);
        }
    }
}

传递数据

public class MyClass implements Serializable{
// 
}

检索数据

Intent myIntent = new Intent(context, NewActivity.class);
MyClass myObject = new MyClass();
myIntent.putExtra("test", myObject);

希望这会起作用:)