Você está na página 1de 39

import java.io.*; import javax.swing.

*; public class Estudos{ public static void main(String[] args) { JFileChooser fc = new JFileChooser(); // Altera o texto do boto Open ou Save fc.setApproveButtonText("Abrir"); // Define a tecla de atalho fc.setApproveButtonMnemonic('a'); // Define o tool tip fc.setApproveButtonToolTipText("Clique para abrir o arquivo selecionado"); int r = fc.showOpenDialog(new JFrame()); System.exit(0); } }

Funo para formatar fonte de uma JLabel


1. Font f = new Font("SansSerif", Font.BOLD, 20); 2. 3. seuLabel.setFont(f); JButton.setText("Button"); JButton.setFont(new 4. textField.setText(String.valueOf(num)); //Valores do tipo String.

Font("sansserif",Font.BOLD,12);

import java.awt.GridLayout; 02 import javax.swing.DefaultListModel;

03 import javax.swing.JButton; 04 import javax.swing.JComboBox; 05 import javax.swing.JFrame; 06 import javax.swing.JLabel; 07 import javax.swing.JList; 08 import javax.swing.JPanel; 09 10 11 public class GridLayoutExemplo { 12 13 JFrame janela=new JFrame(); //instanciar e criar janela

14 15 16 17 18 19 20 21 22 23 24

JPanel painel=new JPanel(); JLabel rotulo1=new JLabel("Fruta:"); com instruo JLabel rotulo2=new JLabel("Bebida:");

//instanciar e criar painel //instanciar e criar rotulo

DefaultListModel listModel = new DefaultListModel(); JList lista= new JList (listModel); JComboBox combo=new JComboBox();

JButton botao=new JButton("OK");

25 public static void main(String[] args) {new GridLayoutExemplo();} 26 27 private GridLayoutExemplo() { 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 //ADICIONAR ITENS A LISTA listModel.addElement("Maa"); listModel.addElement("Uva"); listModel.addElement("Banana"); listModel.addElement("Laranja"); painel.add(rotulo1); painel.setLayout(new GridLayout(3,2,5,7)); //sintax: new GridLayout (linhas,colunas,espaamento_horizontal, espaamento_vertical janela.setTitle("Janela Alan"); janela.setSize(350, 150); janela.setLocation(50, 50); janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); janela.setVisible(true);

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 }}

listModel.addElement("Caju"); listModel.addElement("Ameixa"); listModel.addElement("Aa");

painel.add(lista); painel.add(rotulo2);

//ADICINAR ITENS AO COMBO combo.addItem ("gua"); combo.addItem ("Coca-Cola"); combo.addItem ("Caf"); combo.addItem ("Ch"); combo.addItem ("Energetico"); combo.addItem ("gua Tnica"); combo.addItem ("Suco");

painel.add(combo); painel.add(botao); janela.add(painel); janela.setVisible(true);

//importao das classes necessrias 2 //layouts para alinhamento dos componentes 3 import java.awt.FlowLayout; 4 import java.awt.GridLayout; 5 //janela 6 import javax.swing.JFrame; 7 //boto 8 import javax.swing.JButton;

9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69

//caixa de seleo import javax.swing.JComboBox; //insero de texto e/ou imagem import javax.swing.JLabel; //exibio de textos numa pequena caixa de mensagens import javax.swing.JOptionPane; //painel import javax.swing.JPanel; //insero de barras de rolagem numa JTextArea import javax.swing.JScrollPane; //caixa de texto import javax.swing.JTextArea; //campo para insero de valores ou caracteres import javax.swing.JTextField; //Evento para de ouvir um evento do boto import java.awt.event.ActionListener; //Evento de executar uma ao do evento que foi ouvido(ativado) import java.awt.event.ActionEvent; //tratador de error import java.util.InputMismatchException; //Criao da classe EX5 extendendo a classe JFrame que foi importada public class Ex5 extends JFrame { //declarao de um array de 4 colunas j com seus valores configurados private String cargos[]={"Gerente","Tcnico","Auxiliar","Outros"}; //criao de duas variveis do tipo double private double salario,aumento; //criao de um array de 6 colunas do tipo String private String dados[]=new String[6]; //criao de uma string vazia private String string=""; //criao do FlowLayout que alinha componentes da esquerda para a direita. private FlowLayout flowLayout = new FlowLayout(); /*criao de GridLayout com 4 linhas e 2 colunas com 10 de espao em largura e 1 de altura*/ private GridLayout gridLayout = new GridLayout(4,2,10,1); //criao de um painel private JPanel gridJPanel = new JPanel(); //criao de dois botes Calcular e Limpar Dados private JButton butao = new JButton("Calcular"); private JButton butao2 = new JButton("Limpar Dados"); //Criao das label's private JLabel Lcargo = new JLabel("Escolha o Cargo:"); private JLabel Lnome = new JLabel("Nome:"); private JLabel Lsalario = new JLabel("Salrio:"); //criao dos campos private JTextField Fnome = new JTextField("",5); private JTextField Fsalario = new JTextField("",3); //criao da caixa de seleo anexando o valor do array cargos private JComboBox escolhas = new JComboBox(cargos); //criao de uma caixa de texto com 10 linhas e 22 colunas private JTextArea resultado = new JTextArea(10,22); //construtor de Ex5 public Ex5() { //ttulo da janela super("Cargos e salrios");

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

//alinhamento do frame com o uso do objeto flowLayout super.setLayout(flowLayout); //tamanho da janela setSize(300, 340); //incluso dos componentes de maximinizar, miniminizar e fechar setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //tornando a caixa de texto resultado como no editvel resultado.setEditable(false); //exibe 4 linhas da caixa de seleo ao clic-la escolhas.setMaximumRowCount(4); //alinha o painel com o objeto gridLayout gridJPanel.setLayout(gridLayout); //adiciona os componentes gridJPanel.add(Lcargo); gridJPanel.add(escolhas); gridJPanel.add(Lnome); gridJPanel.add(Fnome); gridJPanel.add(Lsalario); gridJPanel.add(Fsalario); gridJPanel.add(butao); gridJPanel.add(butao2);

//adiciona a janela principal super.add(gridJPanel); //Adiciona a caixa de texto resultado e ao mesmo tempo adiciona as barras de rolage super.add(new JScrollPane(resultado)); //criao de uma classe interna annima para butao butao.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent event) { switch (escolhas.getSelectedIndex()) { /*caso seja a primeira opo que foi selecionada na caixa de seleo configure as vaiveis e v para o mtodo Calculos*/ case 0: { //configura aumento aumento=1.05; //configura variveis dados[1]="Gerente"; dados[3]="Aumento de 5%"; //vai para o mtodo calculos Calculos(); //encerra o mtodo case break; } //segunda opo case 1: { aumento=1.075; dados[1]="Tcnico"; dados[3]="Aumento de 7,5%"; Calculos(); break; } //terceira opo case 2:

131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191

{ aumento=1.10; dados[1]="Auxiliar"; dados[3]="Aumento de 10%"; Calculos(); break; } //quarta opo case 3: { aumento=1.04; dados[1]="Outros"; dados[3]="Aumento de 4%"; Calculos(); break; } } } }//Fim da classe interna annima );//fim da chamada para addActionListerner butao2.addActionListener( new ActionListener() { //ao clicar no butao2 de nome limpar chama o mtodo limpar public void actionPerformed(ActionEvent event) { limpar(); } }//Fim da classe interna annima );//fim da chamada para addActionListerner

} private void Calculos() { try //tratador de erros com try e catch { //pega e converte os caracteres em ponto flutuante do campo Fsalario //para a variavel salario salario=Double.parseDouble(Fsalario.getText()); //se salario acima de 100 exiba uma mensagem if (salario>1000) { //WARNING_MESSAGE - refere-se a uma mensagem de aviso JOptionPane.showMessageDialog(this,"Salrio acima do permitido!","AVISO!!! ,JOptionPane.WARNING_MESSAGE); //desconfigura varivel e campo Fsalario.setText(""); salario=0; } //do contrrio faa else { //multiplica salario com o aumento salario*=aumento; //armazena no array dados na posio 0 o valor do campo Fnome dados[0]=Fnome.getText(); //armazena no array dados na posio 2 o valor do campo Fsalario dados[2]=Fsalario.getText(); //armazena no array dados na posio 4 o valor da varivel salario, mas an //a converte em uma string dados[4]=String.format("%.2f",salario); //Adiciona caracteres no array dados na posio 5

192 dados[5]="_____________________________"; 193 //concatena tudo em uma varivel string 194 string += "Nome...:"+dados[0]+"\nCargo...:"+dados[1]+"\nSalrio.:"+dados[2 195 +dados[3]+"\nTotal..:"+dados[4]+"\n"+dados[5]+"\n\n"; 196 //exibe o resultado na caixa de texto 197 resultado.setText(string); 198 //limpa os dados 199 limpar(); 200 } 201 } 202 //caso ocorra um erro faa 203 catch(NumberFormatException exception) 204 { 205 JOptionPane.showMessageDialog(this,"No campo salrio deve-se digitar um nmer 206 \nEx: 345.75","ERROR FATAL!!!",JOptionPane.ERROR_MESSAGE); 207 //desconfigura varivel e campo 208 Fsalario.setText(""); 209 salario=0; 210 } 211 } 212 //mtodo para limpar os dados da tela 213 private void limpar() 214 { 215 Fnome.setText(""); 216 Fsalario.setText(""); 217 } 218 }//Fim da classe Ex5 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /** 02 * @author Luciano Santos 03 * @site www.analisedesistemas.wordpress.com 04 */ 05 package agenda; 06 07 import java.awt.FlowLayout; 08 import java.awt.event.ActionEvent; 09 import java.awt.event.ActionListener; 10 import javax.swing.JFrame; 11 import javax.swing.JLabel; 12 import javax.swing.Timer; 13 import java.text.DecimalFormat; //Main - Nome da classe public class Main { //Comando principal para execuo do programa public static void main(String[] args) { //Criao de um objeto ex da classe Ex1 Ex5 ex = new Ex5(); //posio da tela ao abri-la ex.setLocation(400,200); //tornando a tela visvel ex.setVisible(true); } }

14 import java.util.Calendar; 15 16 public class Relogio extends JFrame { 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 }; } } ActionListener ativar = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { horas();//invocando o metodo horas } public void horas() {//criando o metodo horas hora = Calendar.getInstance(); hh = hora.get(Calendar.HOUR_OF_DAY);//registrando a hora mm = hora.get(Calendar.MINUTE);//registrando os minutos ss = hora.get(Calendar.SECOND);//registrando os segundos lblHorario.setText(formatar(hh) + ":" + formatar(mm) + ":" + formatar(ss)); } private String formatar(int num) { formato = new DecimalFormat("00");//configurando para que o valor usado apresente 2 digitos return formato.format(num); } public final void inicio() { //criando o metodo inicio Timer time = new Timer(0, ativar); time.start(); lblHorario = new JLabel("");//configurando o label inicial add(lblHorario);//adicionando o label configurado a janela inicio(); //invocando o metodo inicio setSize(160, 50); //definindo tamanho setLayout(new FlowLayout());//definindo o layout da janela setLocationRelativeTo(null);//centralizando a janela public Relogio() { setTitle("Relogio");//definindo o titulo da janela //declarando variaveis int hh, mm, ss; Calendar hora; DecimalFormat formato; JLabel lblHorario;//declarando componente

56 }

01 /** 02 * alterado por Luciano Santos 03 * @site www.analisedesistemas.wordpress.com 04 */ 05 package agenda; 06 07 import java.sql.*; 08 import java.io.*; 09 10 public class ConexaoDB { 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public ConexaoDB() { try { fi = new FileInputStream("/home/luciano/NetBeansProjects/Agenda/db.conf"); /* * Num bloco de notas [windows] ou gedit [linux] digite as seguintes * informacoes e salve o arquivo na pasta do projeto com o nome db.conf * e altere o endereco acima para o endereco do arquivo. * * ex: c:\netBeansProjects\agenda\db.conf * ============================>>> #hostname ou Endereco IP localhost #Nome da base de dados agenda #Nome de usurio MySQL luciano #senha MySQL (deixe a proxima linha em branco se nao usar senha) entrar #fim * ==============================<<< * o arquivo deve conter somente as 9 linhas acima com as devidas Connection conexao; FileInputStream fi; BufferedReader buff; String line = ""; String[] lines = new String[30]; int i = 0;

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 } } } }

* alteracoes de nome de usuario e senha. */ buff = new BufferedReader(new InputStreamReader(fi)); i = 0; while ((line = buff.readLine()) != null) { lines[i] = line; i++; String host = lines[1].trim(); String baseDeDados = lines[3].trim(); String usuario = lines[5].trim(); String senha = lines[7].trim(); try{ conexao = DriverManager.getConnection("jdbc:mysql://" + host + "/" + baseDeDados, usuario, senha); System.out.println("Conexao com banco de dados realizada com sucesso"); }catch (SQLException erro1){ System.out.println("Erro de conexao - " + erro1); } } catch (Exception erro2) { System.out.println("Erro de arquivo - " + erro2);

01 /** 02 * Implementao de um TableModel para renderizar o ResultSet de 03 * uma consulta ao banco 04 * 05 * @author Ricardo Artur Staroski 06 */ 07 package agenda; 08 09 import java.sql.*; 10 import java.util.*; 11 import javax.swing.table.*; 12 13 public class TabelaModelo extends AbstractTableModel { 14 15 private static class Column {

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 } } } }

public final Class<?> CLASS; public final String NAME; public Column(final String name, final Class<?> type) { NAME = name; CLASS = type; }

private static class Row { public final Object [] VALUES ; public Row(final ResultSet rs) throws SQLException { final int columns = rs.getMetaData().getColumnCount(); VALUES = new Object [columns ]; for (int i = 1; i <= columns; i++) { VALUES [i - 1] = rs.getObject(i); } } private static final long serialVersionUID = 1L; private List<Column> columns; private List<Row> lines; public TabelaModelo(final ResultSet rs) throws SQLException, ClassNotFoundException { columns = new ArrayList<Column>(); final ResultSetMetaData md = rs.getMetaData(); final int count = md.getColumnCount(); for (int i = 1; i <= count; i++) { columns.add(new Column(md.getColumnName(i), Class.forName(md.getColumnClassName(i)))); } lines = new ArrayList<Row>(); while (rs.next()) { lines.add(new Row(rs)); } @Override public Class<?> getColumnClass(final int columnIndex) { return columns.get(columnIndex).CLASS; @Override

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 }

public int getColumnCount() { return columns.size(); } @Override public String getColumnName(final int column) { return columns.get(column).NAME; } @Override public int getRowCount() { return lines.size(); } @Override public Object getValueAt(final int rowIndex, final int columnIndex) { return lines.get(rowIndex).VALUES [columnIndex ]; } @Override public boolean isCellEditable(final int rowIndex, final int columnIndex) { return false; }

/** 002 * @author Luciano Santos 003 */ 004 package agenda; 005 006 import java.awt.event.ActionEvent; 007 import java.awt.event.ActionListener; 008 import java.awt.event.KeyEvent; 009 import java.sql.PreparedStatement; 010 import java.sql.ResultSet; 011 import java.sql.SQLException; 012 import java.text.ParseException; 013 import javax.swing.JButton; 014 import javax.swing.JComponent; 015 import javax.swing.JFormattedTextField; 016 import javax.swing.JFrame; 017 import javax.swing.JLabel; 018 import javax.swing.JOptionPane; 019 import javax.swing.JScrollPane; 020 import javax.swing.JTable;

021 import javax.swing.JTextField; 022 import javax.swing.text.MaskFormatter; 023 024 public class Agenda extends JFrame { 025 026 JTable tblAmigos; 027 JScrollPane scrlAmigos; 028 JTextField txtNome; 029 JFormattedTextField ftxtFone; 030 MaskFormatter mskTelefone; 031 JButton btnAddAmigo, btnDelAmigo, btnCorrigir, btnSair; 032 JLabel lblTitulo, lblNome, lblTelefone; 033 PreparedStatement pStmtAmigo; 034 ResultSet rsAmigo; 035 ConexaoDB dbAmigo; 036 TabelaModelo mdlAmigo; 037 038 public Agenda() { 039 setTitle("Agenda de telefones"); 040 setSize(400, 375); 041 setLocationRelativeTo(null); 042 043 setLayout(null); 044 setDefaultCloseOperation(EXIT_ON_CLOSE); 045 046 relogio(); 047 botoes(); 048 caixas(); 049 rotulos(); 050 tabela(); 051 buscaAmigos(); 052 } 053 054 public final void relogio() { 055 Relogio hora = new Relogio(); 056 057 lblTitulo = hora.lblHorario; 058 lblTitulo.setBounds(150, 0, 120, 24); 059 add(lblTitulo); 060 } 061 062 public final void tabela() {

063 tblAmigos = new JTable(); 064 tblAmigos.setBounds(20, 20, 350, 200); 065 add(tblAmigos); 066 067 scrlAmigos = new JScrollPane(tblAmigos); 068 scrlAmigos.setBounds(20, 20, 350, 200); 069 add(scrlAmigos); 070 } 071 072 public final void botoes() { 073 btnAddAmigo = new JButton("Adicionar"); 074 btnAddAmigo.setBounds(220, 254, 150, 20); 075 btnAddAmigo.addActionListener(Add); 076 btnAddAmigo.setMnemonic(KeyEvent.VK_A); 077 add(btnAddAmigo); 078 079 btnSair = new JButton("Sair"); 080 btnSair.setBounds(120, 314, 150, 20); 081 btnSair.addActionListener(Sair); 082 btnSair.setMnemonic(KeyEvent.VK_S); 083 add(btnSair); 084 085 btnDelAmigo = new JButton("Deletar"); 086 btnDelAmigo.setBounds(200, 284, 170, 20); 087 btnDelAmigo.addActionListener(Del); 088 btnDelAmigo.setMnemonic(KeyEvent.VK_D); 089 add(btnDelAmigo); 090 091 btnCorrigir = new JButton("Corrigir"); 092 btnCorrigir.setBounds(20, 284, 165, 20); 093 btnCorrigir.addActionListener(Update); 094 btnCorrigir.setMnemonic(KeyEvent.VK_C); 095 add(btnCorrigir); 096 } 097 098 public final void rotulos() { 099 lblNome = new JLabel("Nome:"); 100 lblNome.setBounds(20, 227, 150, 20); 101 add(lblNome); 102 103 lblTelefone = new JLabel("Telefone:"); 104 lblTelefone.setBounds(20, 254, 150, 20); 105 add(lblTelefone);

106 } 107 108 public final void caixas() { 109 txtNome = new JTextField(30); 110 txtNome.setBounds(70, 227, 220, 20); 111 add(txtNome); 112 try { 113 mskTelefone = new MaskFormatter("(##) ####-####"); 114 } catch (ParseException erro) { 115 System.out.println("Erro - " + erro); 116 } 117 ftxtFone = new JFormattedTextField(mskTelefone); 118 ftxtFone.setBounds(90, 254, 120, 20); 119 add(ftxtFone); 120 } 121 /*Use os seguintes comandos no mySQL para criar o banco de dados 122 create database agenda; 123 use agenda; 124 create table amigos (idAmigo int (7) AUTO_INCREMENT PRIMARY KEY, nome varchar(30), telefone varchar (15));

125 desc amigos; 126 */ 127 public String CONSULTA_PADRAO = "SELECT * FROM amigos ORDER BY nome"; 128 129 public final void buscaAmigos() { 130 try { 131 dbAmigo = new ConexaoDB(); 132 pStmtAmigo = dbAmigo.conexao.prepareStatement(CONSULTA_PADRAO); 133 rsAmigo = pStmtAmigo.executeQuery(); 134 135 mdlAmigo = new TabelaModelo(rsAmigo); 136 tblAmigos.setModel(mdlAmigo); 137 138 rsAmigo.close(); 139 pStmtAmigo.close(); 140 dbAmigo.conexao.close(); 141 } catch (SQLException erro1) { 142 System.out.println("Erro na Query - " + erro1); 143 } catch (ClassNotFoundException erro2) { 144 System.out.println("Erro ao pegar a classe - " + erro2); 145 } 146 } 147 public String INSERCAO = "INSERT INTO amigos (nome,telefone) VALUES (?,?)";

148 ActionListener Add = new ActionListener() { 149 150 @Override 151 public void actionPerformed(ActionEvent clic) { 152 try { 153 dbAmigo = new ConexaoDB(); 154 pStmtAmigo = dbAmigo.conexao.prepareStatement(INSERCAO); 155 156 if (!txtNome.getText().equals("") && !ftxtFone.getText().equals("")) {// tratamento logico

157 pStmtAmigo.setString(1, txtNome.getText()); 158 pStmtAmigo.setString(2, ftxtFone.getText()); 159 160 int retorno = pStmtAmigo.executeUpdate(); 161 System.out.println(retorno + " linha inserida - Nome: " + txtNome.getText()); 162 } else { 163 JOptionPane.showMessageDialog(rootPane, "Insira um nome e um nmero de telefone", "Aviso", JOptionPane.WARNING_MESSAGE);

164 } 165 pStmtAmigo.close(); 166 dbAmigo.conexao.close(); 167 } catch (SQLException erro2) { 168 System.out.println("Erro ao inserir - " + erro2); 169 } 170 buscaAmigos();//atualizando a tabela apresentada 171 ftxtFone.requestFocus();//levando o cursor para um novo telefone 172 } 173 }; 174 public String DELECAO = "DELETE FROM amigos WHERE idAmigo = 175 ActionListener Del = new ActionListener() { 176 177 @Override 178 public void actionPerformed(ActionEvent clic) { 179 try { 180 dbAmigo = new ConexaoDB(); 181 pStmtAmigo = dbAmigo.conexao.prepareStatement(DELECAO); 182 String idAmigo = "0"; 183 if (!idAmigo.equals("")) {// tratamento logico 184 pStmtAmigo.setString(1, JOptionPane.showInputDialog("Qual o id do amigo a ser excluido?")); (?)";

185 int retorno = pStmtAmigo.executeUpdate(); 186 System.out.println(retorno + " linha excluida - id " + idAmigo); 187 } else { 188 JOptionPane.showMessageDialog(rootPane, "Insira um id vlido", "Aviso",

JOptionPane.WARNING_MESSAGE); 189 } 190 pStmtAmigo.close(); 191 dbAmigo.conexao.close(); 192 } catch (SQLException erro2) { 193 System.out.println("Erro ao excluir - " + erro2); 194 } 195 buscaAmigos();//atualizando a tabela apresentada 196 ftxtFone.requestFocus();//levando o cursor para um novo telefone 197 } 198 }; 199 public String CORRECAO = "UPDATE amigos SET nome = (?), telefone = (?) WHERE idAmigo = (?)";

200 ActionListener Update = new ActionListener() { 201 202 @Override 203 public void actionPerformed(ActionEvent clic) { 204 JTextField idAmigo = new JTextField(); 205 JTextField nome = new JTextField(); 206 JFormattedTextField fone = new JFormattedTextField(mskTelefone); 207 final JComponent[] inputs = new JComponent[]{ 208 new JLabel("Digite os dados corretos:\n idAmigo"), 209 idAmigo, 210 new JLabel("Nome"), 211 nome, 212 new JLabel("Telefone"), 213 fone 214 }; 215 JOptionPane.showMessageDialog(null, inputs, "Corrigir registro", JOptionPane.PLAIN_MESSAGE);

216 try { 217 dbAmigo = new ConexaoDB(); 218 pStmtAmigo = dbAmigo.conexao.prepareStatement(CORRECAO); 219 220 if (!idAmigo.getText().equals("") && !nome.getText().equals("") && !fone.getText().equals("")) {// tratamento logico

221 pStmtAmigo.setString(1, nome.getText()); 222 pStmtAmigo.setString(2, fone.getText()); 223 pStmtAmigo.setString(3, idAmigo.getText()); 224 int retorno = pStmtAmigo.executeUpdate(); 225 System.out.println(retorno + " linha atualizada - id " + idAmigo.getText()); 226 } else { 227 JOptionPane.showMessageDialog(rootPane, "Preencha todos os dados para correo", "Aviso", JOptionPane.WARNING_MESSAGE);

228 }

229 pStmtAmigo.close(); 230 dbAmigo.conexao.close(); 231 } catch (SQLException erro2) { 232 System.out.println("Erro ao excluir - " + erro2); 233 } 234 buscaAmigos();//atualizando a tabela apresentada 235 ftxtFone.requestFocus();//levando o cursor para um novo telefone 236 } 237 }; 238 ActionListener Sair = new ActionListener() { 239 240 @Override 241 public void actionPerformed(ActionEvent click) { 242 System.exit(0); 243 } 244 }; 245 246 public static void main(String[] args) { 247 Agenda amigos = new Agenda(); 248 amigos.setVisible(true); 249 } 250 }

comentrios: 1

Captulo 7 - Objetos e conjuntos


7.1 - o mtodo equals Esse mtodo definido na classe Object, portanto toda classe o ter por herana. Sua assinatura : public boolean equals(Object o) Qualquer tentativa de substituio desse mtodo escrita de forma diferente, no ser evidentemente uma substituio e sim uma sobrecarga de mtodo. Voc deve prestar bastante ateno nesses conceitos que agora sero explicados, pois so fundamentais para absoro e compreenso desse captulo. Voc j deve saber que o mtodo equals pode funcionar de forma diferente em cada classe, e isso vai depender de como ele foi definido, por exemplo, nas classes Wrappers, possvel saber se um valor 5 inteiro que est armazenado em um objeto x igual a um objeto y que tambm armazena o valor 5 (desde que sejam da mesma classe como Integer), isso devido ao fato de que o mtodo equals foi substitudo nas classes Wrappers, fazendo com que retorne true quando o valor armazenado pelas classes Wrappers forem idnticos, a exceo claro, se o tipo for diferente. Vejamos:

1. Integer i = new Integer("5"); 2. Long l = new Long("5");

3. if ( i.equals(l)) System.out.println("igual"); 4. else System.out.println("diferente");

// Resultado: diferente Agora quando comparamos instncias distintos de duas classes iguais:

1. 2. 3. 4.

Integer i = new Integer("5"); Integer j = new Integer("5"); if ( i.equals(l)) System.out.println("igual"); else System.out.println("diferente");

// Resultado: igual Apesar de serem objetos distintos, tem o mesmo valor. Se usarmos o operador ==

1. 2. 3. 4.

Integer i = new Integer("5"); Integer j = new Integer("5"); if (i == j) System.out.println("igual"); else System.out.println("diferente");

// Resultado: diferente Apesar dos valores serem identicos, o resultado do teste (==) falso, pois esse testa se os objetos apontam para o mesmo objeto na memria. Quando substituir o mtodo equals ? Para iniciarmos essa discusso, precisamos saber que o mtodo equals na classe Object funciona da mesma forma como o operador ==, portanto quando no substitumos o mtodo equals em uma classe o retorno s ser true quando ambos objetos apontarem para o mesmo objeto na memria, vejamos:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

class Flamengo { public static void main(String[] args) { Flamengo penta = new Flamengo(); Flamengo melhor = new Flamengo(); Flamengo temp = penta; int i = 0; if (penta.equals(melhor)) ++i; if (melhor.equals(penta)) ++i; if (temp.equals(penta)) ++i; if (temp.equals(melhor)) ++i; System.out.print(i); } }

// Resultado: 1 Note que somente uma vez a condio satisfeita, no caso em que temp == penta ! Como a Java lhe d os poderes do mundo, voc pode alterar esse comportamento. Como ? Mudando a JVM ? No ! s substituir o mtodo equals na classe (tira o calado para falar esse nome) Flamengo, mas para isso preciso saber quando e porque mudar o mtodo equals ! Essa uma deciso que deve ser tomada medindo todas as consequncias. Voc deve primeiro responder uma pergunta bsica para saber se precisar ou no mudar o mtodo equals. Pergunte se preciso em alguma situao identificar dois objetos distintos como iguais. Ficou confuso, calma, calma ! Voce tem dois objetos A e B, e adiciona os mesmos em um conjunto (estudaremos conjuntos mas afrente) agora voc precisa realizar uma pesquisa afim de saber se o objeto C est no conjunto - pressuponha que os atributos de C e B so semelhantes, se o mtodos equals da classe dos objetos citados no for modificado, voc nunca obter true na condio B.equals(C), mesmo sendo classes iguais por sua semntica. Ento a deciso de mudar o mtodo equals de uma classe est intimamente relacionada com a necessidade de em uma pesquisa se saber se um objeto est na lista pesquisa ou no. Entendendo o uso de hashCode Outro conceito que precisamos entender agora , onde a utilizao do cdigo hash influncia no uso de conjuntos ? No se preocupe, apesar de parecer estranho um conceito fcil de se entender. Vamos imaginar uma sala com inmeras caixas postais, o PAULO tem uma caixa com nmero 385, a ANA tem uma com o nmero 208, PEDRO usa a de nmero 378 e assim por diante. Toda vez que chega uma correpondncia (do PAULO por exemplo), sabe-se qual o nmero da caixa postal atravz de um clculo em funo do seu nome, por exemplo, a soma dos cdigos ASCII como podemos observar a seguir: P -> 80 A -> 65 U -> 85 L -> 76 O -> 79 HASH -> 385 No tire sarro desse clculo, esse exemplo de cdigo hash apropriado porm ineficiente (a quem diga absurdo) e isso veremos mais tarde. Com esse clculo foi possvel obter o nmero da caixa postal do PAULO. Agora vamos analisar como ficaria a pesquisa, ou seja, quando o PAULO chegar na empresa de correspondncia e quiser saber se existe alguma correspondncia para ele, o atendente perguntaria seu nome e faria o mesmo clculo para descobrir qual o nmero da caixa postal, obtendo o nmero 297, assim o atendente se reportaria cx no. 297 e recuperaria todas as suas correspondncias. Esse processo muito indicado quando se deseja extrema velocidade no processo de pesquisa. Se voc um cara esperto j deve ter notado um "erro" em nosso algoritmo de clculo do cdigo hash, pois seguindo esse clculo qual seria o nmero da caixa postal para a IVONE. aha com certeza o PAULO pegaria as correspondncias da IVONE e vice-versa ! NO ! No pense assim, o processo de pesquisa usando cdigo hash um processo em duas fases, a primeira saber em qual depsito se encontra as informaes, ou seja, em qual caixa postal est as correspondncias, a segunda verificar cada item da caixa postal comparando para saber se um item da pessoa desejada. O que no pode acontecer criar um algoritmo que coloque todas as correspondncias em um ou dois depsitos (caixa postal) assim o seu processo de pesquisa ficaria ineficiente, ruim, ridculo, absurdo! Mas correto ! MAS LENTO ! Talvez o exemplo de correpondncia no foi muito convincente, visto que uma caixa postal um depsito de correpondncias de uma nica pessoa, mas como a empresa de correpondcia nossa, e os clientes no tem chave, convencionamos dessa forma - s quem pega as correpondncias um funcionrio da empresa. Imagine que nosso algoritmo fosse contar as letras do nome para saber o nmero da caixa postal, a seguinte lista mostraria a baguna que ficaria: NOME DEPOSITO (CP)

JOAO 4 ANA 3 PEDRO 5 AMY 3 MARIA 5 JOSE 4 ENIO 4 JOAQUIM 7 CAIO 4 Note que cada nome com 4 (quatro) dgitos o nmero da caixa postal ser o mesmo, ficaria uma baguna, o processo de busca seria muito lento, portanto, quando for criar um algoritmo de clculo para cdigo hash (espalhamento), faao de forma inteligente, usando nmeros complexos, matrizes, limites, derivadas e funes !!! S para termos uma idia, clulos de hash do assunto para teses de doutorado (isso eh li no livro) ! Mtodo equals versus hashCode Voc j deve ter notado a relao entre os mtodos equals e hashCode, pois em uma pesquisa, voc precisar verificar na segunda fase se um objeto X igual a um item do conjunto - que nada mais que um objeto Y. Se voc no substituir o mtodos equals voc no ter essa possibilidade, visto que o mtodo equals da classe Object retorna true se ambos os objetos apontarem (ops! isso no C) referenciarem o mesmo objeto na memria. Memorize isso: para se utilizar uma classe em um conjunto, ela deve ter o mtodo equals substitudo. Contratos do mtodo equals 1) Reflexivo - Para qualquer valor, x.equals() sempre ser true; 2) Simtrico - Para qualquer valor de x e y, x.equals(y) true, se e somente se y.equals(x) tambem for. 3) Transitivo - Para qualquer valor de x, y e z, se x.equals(y) for verdadeiro e y.equals(z) tambem for, ento x.equals(z) tambem ser verdadeiro. 4) Consistente - Todas as chamadas para x.equals(y) retornar consistentemente true ou false, at que haja uma mudana em algum dos objetos, caso contrrio o resultado ser sempre o mesmo. 5) Se x referenciar algum objeto, ento x.equals(null) dever retornar falso. Obviamente que uma tentativa de chamar um mtodo equals para um objeto null, lancar um exceo. Contrato do mtodo hashCode 1) Sempre que um mtodo hashCode for chamado, ele dever resultar no mesmo cdigo hash consistentemente (caso nenhum valor usado nas comparaes for alterado). 2) Se dois objetos forem iguais, considerados pela chamada ao mtodos equals, portanto o cdigo hash dever ser o mesmo para ambos os objetos. 3) No obrigado que dado dois objetos distintos, tenham cdigos hash distintos. 4) No aconselhvel usar atributos transients no clculo do cdigo hash, visto que aps o processo de deserializao, o mtodo equals poder produzir um resultado diferente de quando o objeto foi serializado, portanto uma situao perigosa. Esse contratos devem ser respeitados pois voc poder alterar (substituir) o mtodo equals, portanto siga sempre essas leis.

Substituindo os mtodos equals e hashCode

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

public class Pessoa { private String CPF; public int hashCode() { return 5; } public boolean equals(Object o) { if (o instanceof Pessoa) || (o.CPF == this.CPF) return true; else return false; } }

7.2 - Coleo de Dados O uso de coleo de dados uma necessidade quando precisamos de trabalhar com dados. J vimos como comparar objetos afim de saber se so equivalentes ou no, agora vamos entender seus repositrios e como funcionam. Existem classes e interfaces que precisaremos entender, se listassmos aqui, j ficaria muito nebuloso, por isso vamos por parte. Podemos dividor os conjuntos em trs categorias: Listas Conjuntos Mapas Vejamos a hierarquia dessas classes/interfaces:

7.2.1 - Ordem e classificao Nesse primeiro instante, precisamos entender dois conceitos fundamentais nas colees, que so: ordem e classificao de conjuntos. Abaixo podemos vislumbrar uma definio completa desses conceitos: ordenada - Uma classe ordenada se pode ser iterada pelos seus elementos em uma ordem especfica, atravs de um ndice ou por exemplo pela ordem de insero. classificada - Uma classe classificada, quando seus elementos esto classificados por algum critrio, como por exemplo, em ordem alfabtica, crescente ou cronolgica etc. Toda classe classificada ordenada, j uma classe ordenada pode no ser classificada. 7.2.2 - List As classes que implementam a interface List, relevam o ndice, com isso podemos inserir um item no meio de uma lista. Como voc j deve ter percebido, as classes que implementam a interface List so ordenadas por meio de um ndice, isso permite o acesso a um elemento que se encontra no meio da lista, atravs de seu ndice. uma espcie de sequncia para armazenamento de objetos. ArrayList - um estrutura de dados que tem com base um array. isso mesmo! Um ArrayList nada mais que um array que pode ser alterado. Sua estrutura interna (pode conferir) baseada em um Array com um tamanho inicial e deve ser especificado na criao do objeto - se nenhum valor for especificado a classe assumir 10 (sei l porqu).

Com isso possvel tem uma ordem em ArrayList, pois o ndice o identifica os elementos. Vejamos suas principais caractersticas: - Acesso sequencial / aleatrio extremamente rpido. - Em funo do ndice o acesso a um elemento no meio da lista uma operao extremamente rpida, como j sabemos o mesmo que recuperar um item de um vetor. - Insero tambm extremamente rpida - Vale uma ressalva nessa situao, visto que uma ArrayList cresce a medida que os itens vo sendo inseridos: Exemplo:

1. import java.util.*; 2. 3. public class TestList { 4. public static void main(String[] args) { 5. long inicio, fim; 6. int n = 3000000; 7. inicio = System.currentTimeMillis(); 8. ArrayList array = new ArrayList(); 9. for (int i = 0; i < n; i++) { 10. array.add(new Integer(i)); 11. } 12. fim = System.currentTimeMillis(); 13. System.out.println( "Tempo inserir: " + (fim - inicio)/1000.000 ); 14. inicio = System.currentTimeMillis(); 15. Iterator o = array.iterator(); 16. while (o.hasNext()) { 17. Integer x = (Integer)o.next(); 18. } 19. fim = System.currentTimeMillis(); 20. System.out.println( "Tempo iterar: " + (fim - inicio)/1000.000 ); 21. } 22. }

Resultado do programa acima: Tempo inserir: 2.563 Tempo iterar: 0.172 Note que houve uma demora relativamente maior no processo de insero, porm observe que foram inseridos trs milhes de objetos que foram inseridos - acredito que o tempo consumido nos dois processos foi muito bem aproveitado pela classe. A classe ArrayList tem um construtor sobrecarregado que recebe um argumento onde pode-se definir a capacidade da estrutura, ou seja, se for especificado 1000, a classe ir reservar 1000 endereos nulos para o preenchimento dos dados, isso evita a realocao constante de seu array. Vector - Tem as mesmas caractersticas de ArrayList, porm seus mtodos so sincronizados. Se aplicarmos o mesmo teste anterior notaremos uma diferena na insero, vejamos:

1. import java.util.*; 2. 3. public class TestVector { 4. public static void main(String[] args) {

5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. }

long inicio, fim; int n = 60000; int j = 0; inicio = System.currentTimeMillis(); Vector array = new Vector(0,1); for (int i = 0; i < n; i++) { array.add(new Integer(i)); } fim = System.currentTimeMillis(); System.out.println( "Tempo inserir: " + (fim - inicio)/1000.000 ); inicio = System.currentTimeMillis(); Iterator o = array.iterator(); while (o.hasNext()) { Integer x = (Integer)o.next(); j++; } fim = System.currentTimeMillis(); System.out.println( "Tempo iterar: " + (fim - inicio)/1000.000 ); }

Resultado do programa acima: Tempo inserir: 109.938 Tempo iterar: 0.015 Observe que o tempo de insero foi extremamente superior ao de ArrayList mesmo com uma quantidade 50 vezes inferior, portanto a insero usando a classe Vector muito lenta, voc provavelmente nunca precisar us-la, visto que sua nica diferena em relao classe ArrayList que seus mtodos so sincronizados, e esse recurso voc pode conseguir se utilizar mtodos estticos da classe java.util.Colletions. S pra no ficar nenhuma dvida, se o mesmo programa sobre a classe Vector fosse especificado 3 milhes com em ArrayList, seria necessrio um tempo equivalente a 50 * 109.938 = 5496,9 s o que equivalente a 91,615 minutos. LinkedList - A diferena entre LinkedList e ArrayList que os elementos de LinkedList so duplamente encadeados entre si. Isso essencial quando se deseja implementar uma fila ou pilha. Por causa da duplicidade de encadeamente, possvel por exemplo inserir no final da lista, no incio sem a necessidade da realocao do array, visto que cada n tem uma referncia para seu sucessor e seu predecessor, logicamente que isso faz com que o processo de insero seja um pouco mais lento, pois a cada objeto inserido registrado o "endereo dos vizinhos" consequentemente uma lista duplamente encadeada bem maior que uma lista simples, vejamos:

1. import java.util.*; 2. 3. public class TestVector { 4. public static void main(String[] args) { 5. long inicio, fim, j; 6. j = 0; 7. inicio = System.currentTimeMillis(); 8. LinkedList array = new LinkedList(); 9. for (int i = 0; i < 1500000; i++) { 10. array.add(new Integer(i)); 11. } 12. fim = System.currentTimeMillis(); 13. System.out.println( "Tempo inserir: " + (fim - inicio)/1000.000 ); 14. inicio = System.currentTimeMillis(); 15. Iterator o = array.iterator();

16. 17. 18. 19. 20. 21. 22. 23. 24. }

while (o.hasNext()) { Integer x = (Integer)o.next(); j++; } fim = System.currentTimeMillis(); System.out.println( "Tempo iterar: " + (fim - inicio)/1000.000 ); }

Resultado: Tempo inserir: 2.485 Tempo iterar: 0.109 Note que a metade dos itens do primeiro exemplo foi inserido e no entando o tempo gasto foi praticamente o dobro. Resumindo as listas - O que precisamos saber que o ndice em uma lista relevante, toda lista ordenada, ou seja, podemos iterar em uma ordem especifica, seja ela pela ordem de insero ou pela ordem do ndice. A no se esquea que no existe lista classificada ! 7.2.3 - Set Voltemos a 5a. srie do ensino mdio: A = { 0, 1, 2 } B = ( 1, 2, 3 } A U B = { 0, 1, 2, 3 } Note que os elementos repetidos {1,2} foram suprimidos de um dos conjuntos para no haver repetio. Isso voc j deveria saber, pois deve ter estudado no incio do ensino mdio. Bom o que precisamos saber agora que toda classe que implementa a interface Set: NO ACEITA DUPLICATAS !!! Esse conceito fundamental para entendermos as classes Sets ! Como tocamos em um assunto essencial, vejamos como a classe funciona: X -> Testa o mtodo equals Y -> Pega o cdigo hash Se X ou Y for falso o objeto inserido. Vejamos um caso que sempre ser inserido: Se o mtodo equals no for substitudo todos os elementos sero inseridos, a menos que voc tente inserir o mesmo objeto duas vezes, vejamos:

1. public class Test { 2. public static void main(String[] args) { 3. HashSet conjunto = new HashSet(); 4. A x, y, z; 5. x = new A(); 6. y = new A(); 7. x.a = 10; 8. y.a = 20; 9. z = x; 10. conjunto.add(x); 11. conjunto.add(y);

12. conjunto.add(z); 13. } 14. } 15. 16. class A { 17. int a = 0; 18. }

A pergunta : Quantos objetos eu tenho nesse conjunto ??? Acertou se voc respondeu dois, vamos tentar entender: note que s existem dois objetos distintos: x e y o z uma referncia a x, portanto, quando o mtodo add foi chamado para o caso de z foi calculado o cdigo hash (digamos que deu 7621), a segunda questo que a classe faz saber se existe algum objeto no depsito 7621 que seja igual a z, como sabemos (j estudamos isso) que o cdigo hash de dois objetos igual sempre ser o mesmo, nesse caso x e z, podemos pressupor que o objeto x est tambm no depsito 7621, consequentemente o mtodo equals deve (pelo menos o que esperamos) retornar true, portanto o objeto z no ser inserido no conjunto. Talvez voc esteja rindo desse exemplo, mais vamos complicar um pouco:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.

import java.util.*; public class Teste { public static void main(String[] args) { HashSet conjunto = new HashSet(); A x, y, z; x = new A(); y = new A(); z = new A(); x.a = 10; y.a = 20; z.a = 10; conjunto.add(x); conjunto.add(y); conjunto.add(z); } } class A { int a = 0; public int hashCode() { return 10; } }

Note que nesse caso, substitumos o mtodo hashCode, apesar de ser uma substituio ridcula, ela funciona. Seguindo o mesmo raciocnio do exemplo anterior, quantos elementos foram inseridos ? Tentamos entender: cada vez que o mtodo add chamado, a classe HashSet chama o mtodo hashCode para tentar encontrar um objeto equivalente, bom nesse caso, o hashCode est retornando 10, com isso podemos saber o endereo de um possvel elemento j inserido, porm o mtodo equals que prevalece nesse caso o da classe Object (que voc deve lembrar - retorna true se ambas as referncias forem para os mesmos objetos) e o mtodo equals nesse caso ir retornar false, com isso mesmo que se tenha a inteno de serem semelhantes os objetos x e z no o so, visto que para isso ser necessrio substituir tambem o mtodo equals, vejamos no prximo exemplo:

1. import java.util.*; 2. 3. public class Teste { 4. public static void main(String[] args) {

5. HashSet conjunto = new HashSet(); 6. A x, y, z; 7. x = new A(); 8. y = new A(); 9. z = new A(); 10. x.a = 10; 11. y.a = 20; 12. z.a = 10; 13. conjunto.add(x); 14. conjunto.add(y); 15. conjunto.add(z); 16. Iterator o = conjunto.iterator(); 17. while (o.hasNext()) { 18. A azinho = (A)o.next(); 19. System.out.println( azinho.a ); 20. } 21. 22. } 23. } 24. 25. class A { 26. int a = 0; 27. 28. public int hashCode() { 29. return 10; 30. } 31. 32. public boolean equals(Object o) { 33. boolean rc = false; 34. if (o == null) { 35. rc = false; 36. } 37. else { 38. if ((o instanceof A) && ((A)o).a == this.a) { 39. rc = true; 40. } 41. } 42. return rc; 43. } 44. }

Resultado: 20 10 Nesse caso, alteramos a classe A e determinar que quando o membro a tiver o mesmo valor ser considerada igual (semelhantes as classes Wrappers) - por isso que nesse caso foram inseridos somente dois objetos no conjunto. Bom agora que acreditamos que ficou claro essa questo da unicidade dos elementos nas classes Sets, vejamos suas implementaes usadas. HashSet - um conjunto no-ordenado e no-classificado, utiliza o cdigo hash do elemento que est sendo inserido para saber em qual depsito deve armazenar, com isso podemos notar que um clculo de cdigo hash ineficiente a morte para a boa performance durante o processo de insero/recuperao. Nunca use essa classe quando precisar de uma ordem na iterao. LinkedHashSet - um conjunto ordenado e duplamente encadeado, com isso podemos iterar pelos seus elementos em uma ordem, sempre use essa classe quando precisar de ordem na iterao, porm saiba que um pouco mais lenta que HashSet na insero visto que leva mais tempo para registrar os vizinhos (elemento posterior e inferior).

TreeSet - essa uma das duas classes do framework de coleo da api Java que classificada e ordenada - essa classificao se d pela ordem natural da classe que est sendo inserida (isso pode ser alterado mas foge do nosso escopo), vejamos algumas classificaes naturais para as classes mais usadas: Classe Ordem Natural Byte signed numerical Character unsigned numerical Long signed numerical Integer signed numerical Short signed numerical Double signed numerical Float signed numerical BigInteger signed numerical BigDecimal signed numerical File system-dependent lexicographic on pathname. String lexicographic Date chronological 7.2.4 - Map As classes que implementam a interface Map tem funcionalidades distintas da aprendida at aqui, vejamos porqu. Aprendemos que em uma lista o ndice relevante para se pesquisar ou at mesmo inserir um objeto no meio no fim ou em qualquer posio da lista, j nas classes Sets, a unicidade a caracterstica fundamental dessas classes sendo necessrio uma correta relao dos mtodos equals e hashCode para seu funcionamento, j as classes Maps faz uma mapeamento de chave X valor, ou seja, voc tem um objeto chave para um objeto valor. Vejamos um exemplo de seu uso:

1. import java.util.*; 2. 3. public class TestMap { 4. public static void main(String[] args) { 5. HashMap map = new HashMap(); 6. map.put( "um", new Integer(1) ); 7. map.put( "dois", new Integer(2) ); 8. map.put( "tres", new Integer(3) ); 9. map.put( "quatro", new Integer(4) ); 10. } 11. }

Note que um objeto (nesse caso String) mapeado para cada um valor do conjunto, portanto nas classes Maps a unicidade da chave relevante, se voc tentar inserir um item como podemos ver abaixo, voc no ter um novo item no conjunto pois a chave idntica, o valor somente substitudo. map.put( "dois", new Float(30.0f) ); Podemos concluir que a chave do conjunto Map um Objeto de uma classe Set, ou seja, a chave deve ser nica, o processo para saber se a chave est no conjunto idntica ao processo explicado nas classes Sets, com isso, uma boa implementao dos mtodos hashCode e equals imprescindvel para a boa performance desse conjunto. Vejamos isso na prtica:

1. import java.util.*;

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

1. public class TestMap { 2. public static void main(String[] args) { 3. HashMap map = new HashMap(); 4. map.put( "um", new Integer(1) ); 5. map.put( "dois", new Integer(2) ); 6. map.put( "tres", new Integer(3) ); 7. System.out.println( "Antes: "+map.size()); 8. map.put( "um", new Float(1f) ); 9. System.out.println( "Depois: "+map.size()); 10. } 11. }

Resultado: Antes: 3 Depois: 3 Note que mesmo adicionando um objeto diferente na linha 8, o resultado do tamanho do conjunto no foi alterado. Fica subitamente entendido que se a classe usada na chave (nesse caso String) no substituir os mtodos equals e hashCode, todo objeto ser adicionado no conjunto, o que no faz muito sentido, portanto sempre utilize um objeto de uma classe onde seus mtodos equals e hashCode tenham sido substitudos. HashMap - um conjunto Map no-ordenado e no classificado. Permite a existncia de chave e valores nulos. Vejamos um exemplo esdrxulo, porm funcional:

1. import java.util.*; 2. 3. public class TestMap { 4. public static void main(String[] args) { 5. HashMap map = new HashMap(); 6. String um, dois; 7. um = null; 8. dois = null; 9. map.put( um, new Integer(1) ); 10. map.put( dois, new Integer(2) ); 11. System.out.println( "Tamanho: "+map.size()); 12. } 13. }

O resultado ser: Tamanho 1 Hashtable - essa classe equivalente HashMap com a diferena que seus mtodos so sincronizados, e, alm disso, no permite valores/chaves nulos.

1. import java.util.*; 2. 3. public class TestMap { 4. public static void main(String[] args) { 5. Hashtable map = new Hashtable(); 6. String um = null; 7. String dois = null; 8. map.put( "um", um ); 9. map.put( "dois", dois );

10. 11. 12. }

System.out.println( "Tamanho: "+map.size()); }

[color=red:7fc9c06e81]Erro: java.lang.NullPointerException at java.util.Hashtable.put(Hashtable.java:386) at TestMap.main(TestMap.java: 8) Exception in thread "main"[/color:7fc9c06e81] S pra relaxar: Note que a nomeclatura de nomes da Java para essa classe foi esquecida, pois o t em Hashtable deveria ser maisculo. LinkedHashMap - uma verso ordenada (ordem de insero/acesso) da interface Map, embora seja um pouco mais lento para insero e remoo, visto que deve sempre registrar seus sucessor e predecessor, porm a iterao bem rpida, e, isso tudo por ser uma classe duplamente encadeada. TreeMap - a outra classe da Framework Collection Java que classificada e consequentemente ordenada, vejamos uma aplicao dessa classe:

1. import java.util.*; 2. public class TestMap { 3. public static void main(String[] args) { 4. TreeMap map = new TreeMap(); 5. long inicio, fim; 6. inicio = System.currentTimeMillis(); 7. int n = 500000; 8. for (int i=0; i < n; i++) { 9. map.put( "um"+i, new Integer(i) ); 10. } 11. fim = System.currentTimeMillis(); 12. System.out.println( "Tempo inserir: " + (fim - inicio)/1000.000 ); 13. } 14. }

Resultado: Tempo inserir: 3.937 Porm o resultado estaria em ordem (nesse caso lexicographic) pois se trata de uma classe String. Bom isso encerrado o estudo das classes de colees que a Framework Java nos oferece. 7.3 - Coleta de Lixo A memria sempre foi o "calcanhar de aquiles" para as linguagens de programao. Uma linguagem de programao se diz tipada, por poder definir tipos de dados, por exemplo, uma varivel inteira/integer um tipo, cada linguagem de programao tem uma representao para o tipo inteiro, em pascal um tipo inteiro corresponde a um interval que provavelmente no equivale o mesmo intervalo em Java, e essas definies so essencialmente para o melhor aproveitamento da memria, pois com a definio dos tipos podemos (os programas podem) estimar o uso de memria, saber quanto um programa ou uma rotina vai usar, enfim a memria um elemento essencial e primordial para o sucesso de qualquer programa, por isso devemos saber aproveit-la. O gerenciamento da memria no uma tarefa fcil, saber quando um objeto est pronto para ser dilacerado (sempre quis usar essa palavra), anular uma referncia, re-referenciar um objeto, sugerir a execuo do coletor de lixo, todos esses conceitos sero entendidos (pelo menos o que esperamos) a partir de agora. Como o coletor de lixo funciona Voc poder encontrar dezenas de teorias de como o coletor funciona, mas no caia nessa, pode ser que sim ou que

no, ou sei l ! Mas vamos entender uma coisa: um programa Java roda simultaneamente vrios processos ou vamos chamar segmentos (no gosto muito desse nome, prefiro chamar thread), e um segmento pode estar ou no ativo, e um objeto est pronto para ser extirpado quando nenhum segmento no pode alcanar esse objeto, simples no ? Voc pode dar uma mo para o coletor de lixo, porm no caia na idia de que pode cham-lo quando bem entender, voc pode sugerir: hein t na hora da limpeza, mas no garantido que ele venha. Portanto se voc se deparar com uma questo perguntando qual a maneira mais precisa de se executar o coletor de lixo ? No hesite em marcar: IMPOSSVEL !!! Anulando uma referncia:

1. 2. 3. 4. 5. 6.

1. public class Test { 2. public static void main(String[] args) { 3. StringBuffer b = new StringBuffer("hello"); 4. System.out.println(b); 5. b = null; 6. } }

A partir da linha 5, o objeto b no referencia mais nada da memria, portanto o coletor pode muito bem eliminar a String "hello" que dever estar ocupando lugar. Isso muito gentil por parte dos programadores, anular uma referncia sempre que no venha mais precisar do objeto. Vejamos outro exemplo:

1. 2. 3. 4. 5. 6. 7. 8.

1. public class Test { 2. public static void main(String[] args) { 3. StringBuffer sb1 = new StringBuffer("hello"); 4. StringBuffer sb2 = new StringBuffer("my friendy"); 5. System.out.println( sb1 ); 6. sb1 = sb2; 7. } 8. }

Aps a execuo da linha 6, a string "hello" ficar perdida na memria, estando disponvel para o coletor de lixo executar o seu trabalho. Objetos dentro de um mtodo Todos os objetos criados localmente dentro de um mtodo estaro qualificados para a coleta aps a execuo do mtodo. Vejamos um exemplo:

1. public void show() { 2. String s1 = "s1"; 3. String s2 = "s2"; 4. System.out.println(s1+s2); 5. }

Aps a execuo do mtodos acima, os dois objetos s1 e s2 estaro qualificados para a coleta, agora vejamos um outro exemplo:

1. public String show() { 2. String s1 = "s1"; 3. System.out.println(s1+s2); 4. return s1; 5. }

Note que o objeto s1 est sendo utilizado no retorno do mtodo, portanto esse objeto no pode ser coletar, mesmo porque, ele ainda est sendo referenciado. Isolando uma referncia Vamos complicar um pouco as referncias para ver o que acontece com os objetos:

1. public class Test { 2. Test t; 3. 4. public static void main(String[] args) { 5. Test t2 = new Test(); 6. Test t3 = new Test(); 7. Test t4 = new Test(); 8. 9. t2.t = t3; 10. t3.t = t4; 11. t4.t = t2; 12. 13. t2 = null; 14. t3 = null; 15. t4 = null; 16. } 17. }

O que achas que acontece nesse caso ?? Calma vamos entender: Apenas trs objetos foram criados na memria: t2, t3, t4. Quando os objetos t2, t3 e t4 foram anulados, tornaram-se qualificados para a coleta, mesmo existindo outras referncias para esses objetos. Sugerindo a coleta

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

import java.util.Date; public class Memory { public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); System.out.println("Memoria total: "+rt.totalMemory()); System.out.println("Memoria Antes: "+rt.freeMemory()); Date d = null; for (int i=0; i < 5000; i++) { d = new Date(); d = null; } System.out.println("Memoria Depois: "+rt.freeMemory()); rt.gc(); System.out.println("Memoria Final: "+rt.freeMemory()); }

16. }

Note que a linha rt.gc() simplesmente sugere, no garante que a coletar efetivamente seja feita. Bom depois dessa lixaiada, terminamos mais um captulo !! :!: :!: :!:

Leia tambm: Fundamentos da Linguagem Modificadores Operadores e atribuies Controle de Fluxo Orientao a Objetos Java Lang e Wrappers Objetos e Conjuntos Classes Internas Threads (Segmentos)

{Funes de converso}
Introduo

JAVA foi originalmente concebida para o desenvolvimento de pequenos aplicativos e programas de controle de aparelhos eletrodomsticos e eletroeletrnicos, Java mostrou-se ideal para ser usada na rede Internet. O que a torna to atraente o fato de programas escritos em Java poderem ser executados virtualmente em qualquer plataforma, mas principalmente em Windows, Unix e Mac. Em meio a essa pluralidade, Java um idioma comum, falado por todos. Isto significa que Java ideal para expressar idias em forma de programas universalmente aceitos. Soma-se a isso o fato de programas Java poderem ser embutidos em documentos HTML, podendo assim ser divulgados pela rede. Diferente da linguagem C, no apenas o cdigo fonte que pode ser compartilhado pela rede, mas o prprio cdigo executvel compilado, chamado bytecodes. Java foi desenvolvida por um grupo de pesquisadores da SUN Microsystems por volta de 1990, pouco antes da exploso da Internet. Essa linguagem possui estrutura muito semelhante da linguagem C, da qual descende imediatamente. Java tem em comum com a linguagem C++ o fato de ser orientada a objetos e mantm com esta um alto grau de semelhana. Esse paradigma de programao consiste de um grau a mais na abstrao da programao, em comparao com a programao estruturada, e tem se mostrado extremamente til na produo de programas cada vez mais sofisticados, em menor tempo e com maior qualidade. A programao orientada a objetos (OOP) hoje universalmente adotada como padro de mercado, e muitas linguagens tradicionais foram aperfeioadas para implementar esse paradigma, como C++, Object Pascal, etc. Principais caractersticas da linguagem Java

Orientao a Objetos: Java linguagem totalmente orientada a objetos. Existem outras linguagens de programao que so orientadas a objetos, tais como, Object Pascal (Delphi), C++, etc. Orientada a Objetos significa toda a estrutura de cdigo baseada em objetos, que so instncias do que chamamos de classes;

Portabilidade: Um dos recursos mais interessantes da linguagem Java o sua capacidade de ser portvel, ou seja, ela executa em vrias plataformas (Windows, Linux, Mac, etc). Quando um programa em Delphi feito em ambiente Windows por exemplo, ele no rodar em outros sistemas operacionais. Java permite que atravs do que chamamos de JVM (Java Virtual Machine), o cdigo seja portvel;

Sintaxe similar a outras linguagens: Java possui a sintaxe ( forma como o cdigo escrito) muito parecido com outras linguagens de programao utilizadas, tais como C, C++, C# e PHP. Isso possibilita um rpido aprendizado de seus comandos mais comuns;

Variveis em Java: quais so? Variveis so espaos na memria onde podemos armazenar algum tipo de dado. bom lembrarmos que cada varivel precisa ter um tipo, como tipo inteiro, caractere, real, etc. Basicamente, as variveis em Java podem ser divididas em dois grandes grupos:
Tipos Primitivos

Java possui oito tipos primitivos:

Tipo Objeto Variveis do tipo objeto: um objeto pode ser entendido como uma coleo de variveis do tipo primitivo e tambm de mtodos que atuam sobre essas variveis. Os objetos so amplamente utilizados em ambiente Java, j que esta uma linguagem orientada a objetos. Ao contrrio das variveis do tipo primitivo, ns podemos criar as variveis do tipo objeto.

Java tambm tem o tipo String. O tipo String armazena frases (mais de um caractere). O tipo string utilizado em outras linguagens, tais como Pascal e Delphi, como um tipo simples. Declarando variveis A declarao de variveis no Java pode ser feita, em geral, em qualquer parte do cdigo fonte, desde que faa parte de um mtodo, mas por hbito j definido/usado em outras linguagens usa-se declarar as variveis no topo do mtodo, conforme exemplo a seguir:

Gravando e manipulando valores com variveis e objetos Para manipulao de tais valores, antes, precisamos armazen-los, ou seja, gravar os valores informados pelo usurio em variveis j declaradas. Para fazer isso com variveis do tipo texto (String) fcil, basta usar uma funo para pegar o contedo digitado num objeto jTextField, por exemplo. Veja o trecho de cdigo a seguir: private void jButton1MouseClicked(MouseEvent evt) { String Descricao; Descricao = jTextField1.getText(); } Neste trecho de cdigo, estamos declarando uma varivel com o nome Descricao, do tipo String, e tal varivel recebe o contedo digitado no objeto jTextField1 atravs da funogetText().

Isso simples por que uma varivel do tipo texto est recebendo contedo do tipo texto tambm. Mas e se precisarmos gravar nmeros para depois realizarmos contas? Vamos olhar a imagem a seguir:

Repare que no mtodo construdo existe:

Trs variveis declaradas, uma delas do tipo int (v_qtde) e 2 delas do tipo double (subtotal, v_valor);

Cada varivel recebe o contedo de um objeto jTextField diferente (em destaque); Porm, as variveis so de tipos diferentes do tipo String, por isso, necessrio fazer o uso de funes de converso de valores, no caso, de String para Inteiro e String para Double (real), so elas:

Integer.parseInt() (String para Inteiro)

Double.parseDouble() (String para Double) Nas duas linhas aps a atribuio de valores s variveis, feita a manipulao dos valores e o resultado informado ao usurio atravs de outro jTextField, ou seja, os dados se transformaram em INFORMAO, veja: subtotal = subtotal + (v_qtde * v_valor); parcial.setText(Double.toString(subtotal)); Mas agora apareceram duas novas funes que so facilmente explicadas, so elas:

setText (altera o contedo do objeto jTextField)

Double.toString() (converte valor de Double para String) Sempre que for necessrio alterar o contedo de um objeto jTextField ou qualquer outro objeto que tenha a propriedade Text listada em suas Propriedades, usa-se a funo setText. Veja a lista de propriedades do objeto parcial (jTextField) usado no exemplo abaixo:

Resumindo

Funes para converter valores:

Funes para manipular contedo de objetos jTExtField:

Exemplo

Ler o salrio base e a quantidade de anos que o funcionrio trabalha na empresa. A cada ano que passa, o funcionrio receber um aumento de R$100,00. Informar o salrio atual do funcionrio com base nessas informaes. Tela do programa:

Cdigo fonte (Boto: Calcular Salrio Atual):

Exerccios para Treinar

1. Desenvolver um programa que leia dois nmeros. Mostrar o resultado da soma, subtrao, diviso e multiplicao deles. (Lembrete: para armazenar o resultado da diviso, utilize uma varivel do tipo double). 2. Ler um nmero qualquer e imprimir 5% do mesmo.

3. Qual o valor da expresso: (a + b) - (a / c) ? . (Ler os valores correspondentes a,b e c, e calcular a expresso. 4. Desenvolva um programa que ajude a um funcionrio do estoque a determinar qual o valor total dos livros que esto estocados. O programa dever o numero de livros estocados, e o valor unitrio deles. Multiplique os dois valores para achar o total. Deste total, descontar 10%, referente ao custo de armazenamento dos livros.