【问题标题】:Strange behaviour when assigning a String to a String variable将字符串分配给字符串变量时的奇怪行为
【发布时间】:2015-11-14 04:16:48
【问题描述】:

我真的不明白为什么会这样。到目前为止,这是我从未遇到过的最奇怪的错误。

问题是我正在使用 Retrofit 从服务器检索一些信息,为此,我需要创建一个名为 POJO_PATIENTINFO 的 POJO。在这个 pojo 中,我有一个名为 dataBigDataset_PatientInfo 变量。在这个变量中,我存储了一个名为registro_variableList<Dataset_RegVar>,其中有以下字符串:

  • registro_var_id
  • registro_var_fecha
  • registro_var_descripcion
  • registro_var_variable
  • registro_var_medida
  • registro_var_commentario

没问题。我的想法是我想从另一个 Fragment.class 中恢复这些字符串,我认为很简单

这是我完成如此简单任务的一段代码:

int size = POJOS.getPojo_patientInfo().data.registro_variable.size();
int i = 0;
strVariable = strId = strFecha = strMedida = strDescripcion = strComentarios = new String[size];

for (POJO_PATIENTINFO.Dataset_RegVar dataset : POJOS.getPojo_patientInfo().data.registro_variable) {
    strVariable[i] = dataset.registro_var_variable;
    strId[i] = dataset.registro_var_id;
    strFecha[i] = dataset.registro_var_fecha;
    strMedida[i] = dataset.registro_var_medida;
    strDescripcion[i] = dataset.registro_var_descripcion;
    strComentarios[i] = dataset.registro_var_comentario;
    i++;
}

第一次迭代之后,就在“i++;”之前行执行时,字符串数组都存储完全相同的值,即与dataset.registro_var_comentario 相同的值。简而言之,上面这段代码就像我在写一样执​​行:

int size = POJOS.getPojo_patientInfo().data.registro_variable.size();
int i = 0;
strVariable = strId = strFecha = strMedida = strDescripcion = strComentarios = new String[size];

for (POJO_PATIENTINFO.Dataset_RegVar dataset : POJOS.getPojo_patientInfo().data.registro_variable) {
    strVariable[i] = dataset.registro_var_comentario;
    strId[i] = dataset.registro_var_comentario;
    strFecha[i] = dataset.registro_var_comentario;
    strMedida[i] = dataset.registro_var_comentario;
    strDescripcion[i] = dataset.registro_var_comentario;
    strComentarios[i] = dataset.registro_var_comentario;
    i++;
}

显然,我首先想到的可能是所有这些字符串都具有相同的值。 不,他们不是。我知道这一点是因为我自己做了一些调试工作。让我贴一些结果(注意这些图像是针对 i=3 的):http://postimg.org/gallery/2gf1lj7qa/

如果您认为有必要,我会提供更多详细信息。谢谢。

【问题讨论】:

  • 你会自嘲的,我敢肯定。 :D

标签: java android string arraylist


【解决方案1】:

有趣的原因:所有字符串数组都使用相同的内存位置。

为什么您在每个数组中都获得 strComentarios 的值:因为分配了一个新的内存位置,并且您正在为其他数组使用相同的内存位置。所以无论在strComentarios 中更新什么,所有其他数组都会获得该值。

strVariable = strId = strFecha = strMedida = strDescripcion = strComentarios = new String[size];

这样拆分

strVariable = new String[size];
strId = new String[size];
strFecha = new String[size];
strMedida = new String[size];
strDescripcion = new String[size];
strComentarios = new String[size];

【讨论】:

  • 嘿 Rohit5k2,非常感谢!您的答案与 hiergiltdiestfu 的答案完全相同,因此要选择可接受的答案,我需要遵循“先回复”原则。但你的也很有用,谢谢你的时间:)
  • 没问题。我们是来帮忙的。 :)
【解决方案2】:

您正在为所有这些变量分配 一个相同的字符串数组。因此,对这些变量中的任何一个的最后一次写入也会覆盖所有其他变量中的相应索引。而这恰好是这个任务:

strComentarios[i] = dataset.registro_var_comentario;

所以不是

strVariable = strId = strFecha = strMedida = strDescripcion = strComentarios = new String[size];

你需要写

strVariable = new String[size];
strId = new String[size];
strFecha = new String[size];
strMedida = new String[size];
strDescripcion = new String[size];
strComentarios = new String[size];

【讨论】:

  • 天哪,真的吗?愚蠢的错误。有用且快速的答案,谢谢 hiergiltdiestfu!
  • @JoseLopez 不客气 :) 我特别喜欢您修改代码示例以反映您所看到的内容。
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 2013-04-18
相关资源
最近更新 更多