Impedir que objeto substitua os demais em ArrayList

Tenho dois laços de repetição que tem como função substituir textos por outros valores.

O problema começa quando eu mando adicionar um objeto em um ArrayList, no caso o objeto clone. A adição está no segundo laço por que o sistema gera resultado diferente para cada ingrediente.

Até a linha clone.getF().setCalculo(tempA); tudo ocorre normal, mas quando passa para a linha novosItems.add(contaItem, clone); tudo começa a dar errado.

O objeto clone que está sendo adicionado substitui todos os objetos contidos no ArrayList. Estranhamente apenas com um valor que ocorre esse erro. Para exemplificar o que ocorre veja esse exemplo:

//Um arrayList comum
ArrayList lista = new ArrayList<>();
//valores do arrayList lista
[0] = “Maria”, “12”
[1] = “João”, “10”
[2] = “Carlos”, “33”

Agora imagine que toda vez que se adiciona algo novo no ArrayList
todos os valores que seriam o nome por exemplo passam a ter o mesmo
valor do último inserido, mas as idades não sofrem alteração.

lista.add(“Roberto”)
[0] = “Roberto”, “12”
[1] = “Roberto”, “10”
[2] = “Roberto”, “33”
[3] = “Roberto”, “22”

Abaixo está o código que tá com esse problema.

for (Item item : this.tabela.getItem()) {
// Ingredientes
final String[] formulainicial = item.getF().getCalculo().clone();
Item clone = item;

for (Ingrediente ingrediente : this.tabela.getIngredite()) {

    String tempA[];
    tempA = formulainicial.clone();

    //Subistitue o nome do ingrediente pelo seu valor
    for (int i = 0; i < formulainicial.length; i++) {
        // Procura por nutrientes que contem o mesmo nome e subistitue por valor do nutriente.,
        for (Nutriente n : nuts) {
            if (formulainicial[i].equalsIgnoreCase(n.getNome())) {
                tempA[i] = String.valueOf(n.getQuantidade());
            }
        }

        if ("MO".equalsIgnoreCase(formulainicial[i])) {
            //Subistitue o texto "MO" pelo valor correspondente.
            tempA[i] = String.valueOf(ingrediente.getQuantidadedeMO())+"";
        }

        if ("total".equalsIgnoreCase(formulainicial[i])) {
            tempA[i] = String.valueOf(totaldeMO);
        }
    }

    listaF.add(contaItem, tempA);
    clone.getF().setCalculo(tempA);
    novosItems.add(contaItem, clone);
    contaItem++;
}

}

O método add de uma lista normalmente utilizado para armazenar objetos na lista tem UM argumento: o elemento a ser inserido na lista.

Você esta usando uma outra assinatura do método que tem DOIS argumentos: a posição onde o elemento será inserido e o elemento a ser inserido.

Você está fazendo isso intencionalmente?