Fonte do artigo: Internet Autor: PaleSting/CSDN
Neste artigo, veremos os tipos de dados em Java, mas apresentaremos o conceito de tipos de dados abstratos (ADT). Também aprenderemos sobre alguns dos ADTs definidos por Java, apresentando o Java Collections Framework.
ADT
Um ADT é definido apenas pelo tipo de dados que contém e pelas operações que podem ser executadas nesse tipo de dados. Os desenvolvedores só podem acessar as propriedades do ADT por meio dos métodos de operação do ADT e não saberão como as diversas operações dentro desse tipo de dados são implementadas.
Em Java, muitas vezes usamos uma interface para fornecer um conjunto de operações sem revelar os detalhes da implementação dessas operações. Lembre-se que uma interface define um conjunto de métodos e uma classe Java deve implementar esse conjunto para satisfazer suas condições obrigatórias ou implementar uma instância da interface.
Tabelas lineares, pilhas e filas
Quando falamos sobre ADT, frequentemente falamos sobre listas lineares, pilhas e filas. Não discutiremos os detalhes dessas estruturas de dados, mas discutiremos por que elas são chamadas de ADTs.
Uma lista linear é uma coleção de elementos finitos organizados de forma linear e que fornecem acesso direto aos seus elementos. Uma pilha é uma lista linear ordenada do tipo último a entrar, primeiro a sair (LIFO). Os elementos são adicionados e removidos do topo da pilha. Uma fila é uma lista linear ordenada do tipo primeiro a entrar, primeiro a sair, os elementos são adicionados do final da fila e retirados do início da fila.
As estruturas internas de listas lineares, pilhas e filas podem ser implementadas de várias maneiras. Por exemplo, poderíamos usar um array ordenado ou uma lista vinculada para implementar cada estrutura. O ponto chave é que não importa como você implemente sua estrutura interna, sua interface externa sempre permanecerá a mesma. Isso permite modificar ou atualizar a implementação subjacente sem alterar a interface pública.
Arquitetura de coleção Java
O Java 2 Software Development Kit (SDK) fornece novas classes para suportar ADTs usados com mais frequência. Essas classes são chamadas de classes de coleção Java (semelhantes às classes de coleção no MFC) e trabalham juntas para formar a arquitetura de coleção Java. Essa arquitetura de coleção fornece um conjunto de interfaces e classes que representam dados como os chamados dados abstratos de coleção.
A interface java.util.Collection é usada para representar qualquer grupo de objetos, ou seja, elementos. Esta interface fornece operações básicas como adicionar, excluir e consultar. A interface Collection também fornece um método iterador. O método iterador retorna uma instância da interface java.util.Iterator. A interface Iterator fornece métodos hasNext, next e remove. Usando os métodos fornecidos pela interface Iterator, você pode percorrer as instâncias em um objeto Collection do início ao fim e excluir com segurança o elemento representado pelo iterador (cursor).
java.util.AbstractCollection é a base para todas as classes de arquitetura de coleção. A classe AbstractCollection fornece implementações de todos os métodos na interface java.util.Collection, exceto os métodos iterador e de tamanho. Esses dois métodos de exceção são implementados por todas as subclasses que herdam java.util.AbstractCollection.
Uma classe que implementa uma interface deve fornecer implementação de todos os métodos de interface. Como alguns métodos de interface na arquitetura de coleção são opcionais, deve haver uma maneira de notificar o chamador de que um determinado método não está implementado. Quando um método opcional é implementado e esse método não é implementado, uma UnsupportedOperationException é lançada. A classe UnsupportedOperationException herda a classe RuntimeException. Isso permite que o chamador chame todas as operações de coleta sem colocar cada chamada em um par try-catch.
Listar tabela linear
A interface List herda a interface Collection e define uma coleção ordenada que permite a existência de elementos idênticos. A interface List também adiciona métodos que usam um valor de índice numérico para operar nos elementos da Coleção com base na posição do elemento na lista linear. Essas operações incluem adicionar, obter, definir e remover.
A interface List também fornece o método listIterator. Este método retorna uma instância da interface java.util.ListIterator, que permite percorrer uma lista linear do início ao fim ou de ponta a ponta. java.util.ListIterator herda a interface java.util.Iterator. Portanto, suporta a adição e modificação de elementos na Coleção que representa.
O exemplo a seguir demonstra como percorrer os elementos de uma lista de trás para frente. Para conseguir isso, o ListIterator deve ser posicionado após o último elemento da lista antes do início da travessia.
ListIterator iter = aList.listIterator(aList.size());
enquanto (iter.hasPrevious())
System.out.println(iter.anterior().toString());
}
A arquitetura de coleção fornece duas implementações da interface List: LinkedList (lista vinculada) e ArrayList (lista de array, ou seja, lista estática). Ambas as implementações suportam acesso aleatório aos seus elementos. Uma instância de ArrayList oferece suporte a operações de estilo de array e a operações de redimensionamento de array. Uma instância de LinkedList fornece suporte explícito para adicionar, remover e fornecer elementos no início e no final da lista. Usando esses novos métodos, um programador pode simplesmente usar uma LinedList como uma pilha ou fila, como segue:
LinkedList aQueue = new LinkedList(aCollection);
aQueue.addFirst(newElement);
Objeto anElement = aQueue.removeLast();
LinkedList aStack = new LinkedList(aCollection);
aStack.addFirst(newElement);
Objeto anElement= aStack.removeFirst();
O trecho de código na Tabela A demonstra algumas operações comuns em instâncias de implementação da interface java.util.List usando java.util.ArrayList e java.util.LinkedList. Essas operações incluem adicionar elementos, acessar elementos aleatoriamente e remover explicitamente elementos do final da lista.
Saber o que está acontecendo e não saber por que é de grande benefício
O ADT fornece uma ferramenta poderosa para separar as operações na interface pública de um objeto de sua implementação concreta. Isso permite que uma implementação ADT mude e evolua, mantendo sua interface pública inalterada. A arquitetura de coleção Java fornece um grande número de interfaces e implementações que representam coleções de elementos básicos e podem ser usadas para criar ADTs úteis.