Java Collections Framework
Representa um grupo de objetos com características em comum,
ou associados segundo algum critério. Em Java, há diferentes
maneiras de se representar coleções de objetos.
O JCF é formado por interfaces, classes abstratas e interfaces e
diversas implementações focadas em diferentes casos de uso.
Por isso um programa Java raramente precisa implementar
métodos de ordenação, busca, redimensionamento etc.
Collections e Generics; 3
Java Collections Framework
Composto por diversas interfaces, classes abstratas e
implementações que oferecem vantagens diferentes para
cenários diferentes, determinando certos mecanismos como, por
exemplo, protocolo de iteração para navegação nas coleções.
Classes estão disponíveis no pacote java.util.
Exemplo :
• java.util.ArrayList;
• java.util.Collection;
• java.util.Arrays;
• java.util.Collections.
Conectividade com banco de dados
relacionais
4
Métodos equals() e hashCode()
Vamos estudar dois métodos fundamentais para o bom
funcionamento de nossas classes dentro das coleções :
• public boolean equals(Object o)
– Usado para comparar dois objetos.
• public int hashCode()
– Usado para criar um código que representa o
objeto, o valor retornado deve ser calculado com
base nos atributos considerados pelo método
equals.
Collections e Generics 5
Métodos equals()
Ao sobrescrever o método equals deve se levar em consideração as
seguintes relações:
• Reflexão: x.equals(x) deve ser true para qualquer x diferente de
null;
• Simetria: para x e y diferentes de null, se x.equals(y) é true, e
y.equals(x) também deve ser true;
• Transitividade: para x,y e z diferentes de null, se x.equals(y) é true,
e y.equals(z) é true, então x.equals(z) também deve ser true.
• Consistencia: para x e y diferentes de null, múltiplas chamadas de
x.equals(y) devem sempre retornar o mesmo valor.
• Para x diferente de null, x.equals(null) deve sempre retornar false.
Collections e Generics 6
Exemplo
Collections e Generics 7
public class Pessoa {
private long id;
private String nome;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (id ^ (id >>> 32));
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
return result;
}
}
O código abaixo foi gerado pelo eclipse, com base nos atributos
da classe Pessoa.
Métodos hashCode()
Importante sobrescrever este método ao se trabalhar com
coleções em Java de alto desempenho do tipo “Tabela Hash”.
• Caso não seja implementado, teremos problema em trabalhar
com coleções de alto desempenho, pois as operações de
localização podem não funcionar.
• As implementações de hashCode e equals devem ser
coerentes, ou seja, sempre que dois objetos forem
considerados iguais pelo método equals, devem possuir o
mesmo valor hashCode.
Collections e Generics 8
Exemplo
Collections e Generics 9
public class Pessoa {
private long id;
private String nome;
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Pessoa other = (Pessoa) obj;
if (id != other.id)
return false;
if (nome == null) {
if (other.nome != null)
return false;
} else if (!nome.equals(other.nome))
return false;
return true;
}
}}
O código abaixo foi gerado pelo eclipse, com base nos atributos
da classe Pessoa.
Interface Java.util.Collection
Estabelece um contrato básico que todas as coleções do Collections Framework
devem seguir. Nela estão definidos os métodos básicos que todas as coleções devem
implementar.
No framework não existe nenhuma classe concreta que implemente diretamente essa
interface. A única implementação existente é AbstractCollection que é uma classe
abstrata, cujo intuito é facilitar a criação de implementações de coleções . Em vez de
implementar diretamente Collection, podemos estender AbstractCollection e
implementar somente os seus métodos abstratos.
Collections e Generics 10
A interface java.util.List
Define uma coleção indexada, também conhecida como sequencia. Por isso, quando
utilizamos objetos que implementam esta interface, objetamos o controle sobre a
posição em que os elementos são inseridos, sendo possível acessa-los através de um
índice inteiro.
A interface Liste adiciona a Collection métodos relativos a manipulação do elementos
traces do índice dos principais métodos acrescentados são:
• void add(int indice, Object elem);
• Object set(int indice, Object elem);
• Object get(int indice);
• Object removce(int indice);
• int indexOf(Object o);
Collections e Generics 12
Principais implementações de
java.util.List
• java.util.Arraylist;
– Utiliza como estrutura de dados interna um array. O tamanho do array
é alterado em termos de execução de acordo com a necessidade da
lista.
• java.util.LinkedList;
– Utiliza como estrutura interna uma lista ligada. Esse tipo de estrutura
é mais eficiente para inserção e remoção de elementos do que um
array, porem tem um desempenho pior na navegação e localização dos
elementos.
• java.util.Vector;
– Também utiliza como estrutura interna um array, mas essa
implementação é sincronizada.
Collections e Generics
13
A interface java.util.Set
É a representação de conjuntos matemáticos, e é caracterizada por não
possuir elementos repetidos no seu interior.
A interface Set não acrescenta nenhum método novo em relação aos
herdados de Collection, apenas impõe a condição de não permitir duplicados
nos contratos dos métodos.
Principais implementações:
• java.util.HashSet
• java.util.LinkedHashSet
• java.util.SortedSet e NavigableSet
• java.util.TreeSet
Collections e Generics 14
A interface Comparable
Define classes que são ordenáveis, ou seja, que podem ser
automaticamente ordenadas por coleções ou outras classes.
A interface Comparable define um método que servira como
regra de ordenação das instancias da classe que a implementa.
int compareTo(Object o)
Um número negativo deve ser retornado caso o objeto estiver
antes daquele passado como parâmetro, zero se forem iguais e
um numero positivo, se estiver após.
Collections e Generics 15
A interface Comparator
Utilizada para definir uma regra diferente de ordenação entre dois objetos daquela
sugerida pela interface Comparable. Por isto, define o método compare(Object o1,
Object o2) retornando um valor inteiro, devendo ser positivo se o primeiro argumento
for maior do que o segundo, zero se os elementos forem considerados iguais, e
negativo se o primeiro argumento for menos do que o segundo.
public class ComparadorClientesId implements Comparator {
public int compare(Object o1, Object o2){
Cliente cl1 = (Cliente ) o1;
Cliente cl2 = (Cliente) o2;
return cl1.getId() – cl2.getId();
}
}
Collections e Generics 16
Ordenando Arrays e Lists
Podemos empregar métodos definidos nas classes utilitárias java.utilArrays e
java.util.Collections, conforme a necessidade de ordenar arrays ou List.
O métodos de ordenação da classe Arrays são :
• void sort(Object[] array): ordenação array de acordo com a ordem natural dos
elementos.
• void sort(Object[] array, Comparator comp): Ordena o array de acordo com a regra
estabelecida no comparator.
Os métodos de ordenação da classe Collections são:
• void sort(List lista): Ordena a lista de acordo com a ordem natural dos elementos,
lança um ClassCastException caso os elementos não implementem Comparable.
• void sort(List Array, Comparator comp): ordena a lista de acordo com a regra
estabelecida no Comparator.
Collections e Generics 17
A interface java.util.Queue
Introduzida a partir do Java5, e é utilizada tipicamente para gerenciar objetos como
uma fila seguindo o conceito FIFO(first-in, first-out). Ou seja, novos objetos são
adicionados no fim da fila, e objetos removidos são tomados no inicio. Além dos
métodos básicos da interface Collection, a interface Queue também oferece métodos
adicionais de inserção remoção e verificação de objetos.
Métodos definidos pela interface:
• boolean add(Object o);
• boolean remove(Object o);
• Object element();
Collections e Generics 18
Principais implementações de
java.util.Queue
• java.util.PriorityQueue;
– Funciona como uma lista ordenada que aceita objetos
duplicados. .
• java.util.Deque;
– Possui características de uma fila, podem ela suporta a
inserção e remoção dos objetos no final da fila.
• java.util.ArrayDeque;
– Utiliza como uma estrutura de dados interna um array. O
tamanho do array é alterado em tempo de execução de
acordo com a necessidade da lista.
Collections e Generics
19
A interface java.util.Map
Interface define coleções que mapeiam pares chave-valor. Esse tipo de coleção é
utilizada quando necessário localizar rapidamente um valor sem fazer uma busca em
todos os elementos da coleção. A localização é feita através da chave , que deve ser
única.
Collections e Generics 20
Map Chave (Object) valor (Object)
RG1 Cliente 1
RG1
RG1
RG1
Cliente 2
Cliente 3
Cliente N
Principais métodos de
java.util.Map
• object put(Object chave, Object valor);
• boolean containsKey(Object chave);
• boolean containsValue(Object valor);
• Object get(Object chave);
• Object remove(Object chave);
• int size();
• Set ketSet();
• Collection values();
Collections e Generics 21
Principais implementações de
java.util.Map
• java.util.HashMap
Implementação de map que utiliza uma estrutura de dados do tipo tabela hash para
armazenar os pares chave-valor.
• java.util.HashTable
Igual ao hashmap, mas essa classe é sincronizada.
• java.util.LinkedHashMap
Utiliza como estrutura de dados interna uma tabela hash, a diferença desta para
HashMap é que mantem as chaves em ordem de inserção, ou por frequência de acesso.
• java.util.SortedMap
Adiciona ao contrato de Map, a característica de manter suas chaves ordenadas.
• java.util.NavigableMap
Extensão de SortedMap, basicamente introduz novos métodos de busca.
• java.util.TreeMap
Implementa a interface NavigableMap e, por isso, garante que as chaves serão
ordenadas em ordem ascendente, de acordo coma ordem natural dos elementos, ou
então, por um objeto do tipo Comparator passo como parâmetro na construção do
TreeMap.
Collections e Generics
22
Java Database Conectivity
(JDBC)
Esta API é utilizada para facilitar o acesso a bancos de dados relacionais a partir de
aplicações Java. Por meio de JDBC, é possível realizar instruções SQL(Structured Query
language) num banco de dados relacional para gravar, alterar ou ler dados
manipuladores pelo programa Java.
Collections e Generics
23
Driver JDBC
O driver JDBC é um conjunto de classe Java que tem a habilidade de se comunicar com o
banco de dados relacional realizando tarefas como:
• Criar conexões;
• Executar comandos SQL;
• Chamar Stored Procedures;
• Criar Tabelas, etc.
Tipos:
Tipo 1 – JDBC-ODBC Bridge, atuando como uma ponte entre JDBC e ODBC.
Tipo 2 – Parte da implementação em código nativo, parte em Java.
Tipo 3 – Este driver utiliza um protocolo de rede próprio para se comunicar com um
servidor proprietário que se comunica com o banco de dados.
Tipo 4 – 100% Java, o driver foi totalmente implementado em Java.
Collections e Generics
24
Driver Oracle
A oracle assim como outras fabricantes de banco de dados distribui o driver para
acesso ao seu banco, que pode ser baixado em :
Oracle Database 10g Release 2 JDBC Drivers
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-10201-
088211.html
Oracle Database 11g Release 2 JDBC Drivers
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-
090769.html
Collections e Generics
25
Obtendo uma Conexão
Em se tratando de JDBC todas classes utilizadas
pertencem ao pacote java.sql.*.
Exemplo:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TesteConexaoJDBC{
public staic void main(String[] args){
Connection conn = null;
try{
conn = DriverManager.getConnection(“jdbc:oracle:thin:@1030:DB”,”user”, “password”);
conn.close;
}catch(ClassNotFoundException e){
e.printStackTrace();
} catch(SQLException e){
e.printStackTrace();
}
}
}
Collections e Generics
26
Fechando a Conexão
De um modo geral, é recomendável fechar a conexão no bloco
finally, afinal ele sempre será executado !
Exemplo:
try{
conn = DriverManager.getConnection(“jdbc:oracle:thin:@1030:DB”,”user”, “password”);
}catch(ClassNotFoundException e){
e.printStackTrace();
} catch(SQLException e){
e.printStackTrace();
} finally {
try{
if(conn !=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
Collections e Generics
27
Realizando uma consulta
Exemplo:
// Cria-se Statement com base na conexão con
Statement stmt = con.createStatement();
// Exemplo: navegando e exibindo os dados dos filmes
sql = "SELECT `titulo`,`ano` FROM `filmes`";
// Executa-se a consulta dos campos titulo,ano da tabela de filmes
ResultSet res = stmt.executeQuery(sql);
int ano;
String titulo;
while (res.next()) {
ano = res.getInt("ano");
titulo = res.getString("titulo");
System.out.println("ROW = " + titulo + ": " + ano);
}
Collections e Generics
28
Incluindo Registro
Exemplo:
// Cria-se Statement com base na conexão con
Statement stmt = con.createStatement();
//código sql
sql = "INSERT INTO `filmes` (`titulo`, `ano`, `diretor`)" + "VALUES
('The Matrix', 1999, 'Andy Wachowski & Larry Wachowski')";
stmt.executeUpdate(sql);
Collections e Generics
29
Atualizando Registro
Exemplo:
// Cria-se Statement com base na conexão
Statement stmt = con.createStatement();
stmt = conn.createStatement();
String sql = "UPDATE Registration " + "SET age = 30 WHERE id in (100, 101)";
stmt.executeUpdate(sql);
Collections e Generics
30
Deletando Registro
Exemplo:
// Cria-se Statement com base na conexão
Statement stmt = con.createStatement();
String sql = "DELETE FROM Registration " + "WHERE id = 101";
stmt.executeUpdate(sql);
Collections e Generics
31