HashTable, HashMap, LinkedHashMap ou LinkedList

Boa tarde galera,

To passando por um problema aki meio cabuloso, queria ver se alguém aqui do fórum tem uma ideia para me auxiliar…

Estou convertendo um código PHP para ser utilizado na aplicação java que vamos desenvolver na empresa, e me deparei quase no fim do processo com um problema gigantesco.

Eis o problema:

Tenho o seguinte trecho de codigo em PHP:

$this->vds['ANO']['CORPO']['TIPO'] = 'BORA';

Me parece que no PHP ele esta usando uma Matriz multidimensional.

Desenvolvi meu código java para agrupar esses dados tendo em vista, que não consigo indexar um array com Strings.
Agora o problema:

No método que popula meu objeto (leia-se minha matriz multidimensional), eu estou com o problema que o ultimo valor passado para o metodo put esta sempre sobreescrevendo o valor anterior. Dai a minha pergunta, existe alguma das interfaces java onde eu consiga inserir itens duplicaos, que seja preservada a ordem da inserção e que eu consiga recuperar um determinando elemento passando uma "chave" ?

Complexo ne?! Vou tentar exemplificar pra ver se fica mais claro:

Imaginem que tenha:

objeto.put("CHAVE_1", 1);
objeto.put("CHAVE_1", "GUJ");
objeto.put("CHAVE_1", "FOREVER");

objeto.put("CHAVE_1", 2);
objeto.put("CHAVE_1", "JAVA);
objeto.put("CHAVE_1", "THE_BEST");

O que eu preciso é armazenar isso numa estrutura, onde como eu falei preserve a ordem em que os elementos foram inseridos, que permitam valores duplicados e que me permitam fazer algo como:

String codigo = objeto.get("CHAVE_1"); // aqui deve me retornar o primeiro valor da chave encontrada na ordem q foi inserido, ou seja, 1
// codigo = 1;

String texto = objeto.get("CHAVE_1" + "," + codigo); // aqui vou pesquiser novamente pela chave_1 mais agora pegando o item dentro da chave_1 referente ao codigo 1, ou seja, GUJ
// texto = "GUJ"

String complemento = objeto.get(CHAVE_1 + "," + codigo + "," + texto); // No caso aqui deverá retornar FOREVER
// complemento = forever


System.out.println("Valor encontrado: " + complemento);

Pode parecer confuso mais tudo que eu preciso é recuperar o valor referente a uma chave X que esteja no ultimo nivel sempre.

Para tentar ficar mais claro, abaixo a declaração do meu objeto principal:

// Objeto que irá receber os valores de primeiro nivel
Hashtable<String, LinkedHashMap><String, LinkedHashMap><Character, String>>> vds = new Hashtable<String, LinkedHashMap><String,LinkedHashMap><Character,String>>>();

// Para cada put em vds eu crio outros 2 maps com os valores de 2 i 3o nivel respectivamente
LinkedHashMap<String, LinkedHashMap><Character, String>> nilve_2 = new LinkedHashMap<String, LinkedHashMap><Character,String>>();
LinkedHashMap<Character, String> nivel_3 = new LinkedHashMap<Character, String>();
        
// Put dos dados da primeira posição
nivel_3.put('S', "BORA");
nivel_2.put("body", nivel_3);
vds.put("BORA", nivel_2);

Esse código funciona bacaninha, a unica coisa que ainda ocorre é como eu falei no inicio do post, os valores estão se sobreescrevendo, pois pelo que entendi, nenhuma das interfaces MAP aceita valores com chave duplicada, estou certo?

Alguém tem uma idéia de como posso resolver isso ?

Agradeço a ajuda de todos.