SlideShare uma empresa Scribd logo
1 de 37
Estrutura de Dados
Consiste em armazenar e organizar os dados de forma eficiente para usá-los com maior eficacia tanto no
acesso quanto no gasto de memoria.
Map
Faz parte do pacote java.util, é uma coleção de pares de chave / valor “Map<k/v>”.
- Não admite repetições do objeto chave.
- Os elementos são indexados pelo objeto chave (não possuem posição).
- Acesso, inserção e remoção de elementos são rápidos.
Uso Comum: Cookies, Local Storage, qualquer modelo de chave valor.
Principais implementações Map
* HashMap – é uma estrutura de dados baseada em espalhamento através de uma função de
cálculo hash de uma informação chave do objeto a ser colocado na coleção de dados. Você tem sempre uma
chave e um valor associado a ela. O acesso é sempre feito pela chave. A forma de acesso é sempre muito rápida
e pode, na maioria dos casos ter complexidade de tempo de acesso qualquer constante (O(1)). Não pode ter
chaves duplicatas e não mantém um ordem específica, é considerada não ordenada.
*TreeMap – mais lento (operações O(log(n)) em arvore rubro-negra) e ordenado pelo compareTo do objeto
(ou Comparator), se eu adicionar com a mesma Chave ele vai sobrescrever a chave anterior e seu valor .
*LinkedHashMap – velocidade intermediaria e elementos na ordem em que são adicionados.
Alguns Métodos importantes
*put(key, value): Insere um elemento em determinada chave e pode atribuir um valor a
ela.
*remove(key): Passa a chave.
*containsKey(key): Para verificar se existe uma dada chave.
*get(key): Recupera um elemento pela chave.
*clear(): Para limpar o conjunto.
Mais Métodos “Map”
*Size(): Para obter o tamanho.
*keySet(): Retorna um Set<k> com as chaves contidas no map.
*values(): Retorna uma Collection<v> “Coleção do tipo valor”.
- Assim como no set a comparação de um elemento com outro no caso a Chave é
baseada em equals e hashCode e se o equals e hashCode não existir é usada a
comparação de ponteiros.
Código Map
Set
Representa um conjunto de elementos”na verdade é uma interface” pode ser usado
para armazenar um registro de logs de usuários.
*Não admite repetições.
*Elementos não possuem posição.
*Acesso, inserção e remoção de elementos são rápidos.
*Oferece operações eficientes de conjuntos: interseção, união, diferença.
Principais implementações
HashSet – mais rapido (operações O(1) em tabela hash) e não ordenado.
TreeSet – mais lento (operações O(log(n)) em arvore rubro negra) e ordenado pelo
compareTo do objeto.
LinkedHashSet – velocidade intermediaria e elementos na ordem em que são
adcionados.
Alguns Métodos importantes
* add(obj)
* remove(obj)
* contains(obj)
* clear(): Para limpar o conjunto.
* Size(): Para obter o tamanho.
* removeIf(remove do conjunto todo mundo que atender o predicado).
* addAll(other) – união: Adiciona no conjunto os elementos do outro conjunto, sem
repetição.
* retainAll(other) – interseção: Remove do conjunto os elementos não contidos em
other.
* removeAll(other) – diferença: Remove do conjunto os elementos contidos em other.
Código Set
Diferença entre Set e ArrayList
● Set é uma interface que herda de Collection e é um conjunto, ou seja, não aceita
dados duplicados. ArrayList é uma classe que implementa a interface List, e List é
uma coleção ordenada que é referenciada por um índice.
Stack (Pilha)
● Lifo “Last in first out” “ultimo a entrar, primeiro a sair”.
● Stack é uma classe com operações”Métodos” específicos para empilhar e
desempilhar elementos de uma lista.
● Métodos Utilizados
● Push- Coloca um item na pilha.
● Pop- Retira o último item da pilha e retorna uma referência a este objeto.
● Peek- Retorna o objeto que está no topo da pilha.
● IsFull- Para saber se a pilha esta cheia.
● IsEmpty- Para saber se a pilha esta vazia.
● Size- Numero de itens na pilha.
● Pull- Altera o elemento no topo da pilha
Código Pilha
Queue (fila)
● Nesta classe, o elemento é inserido na parte de trás da fila. Esta operação é chamada
de enfileiramento. Este mesmo elemento sai a partir da frente da fila, operação
chamada desenfileiramento. Esse procedimento de entrada e saída recebe o nome de
fila.
● Métodos Utilizados
● Enqueue– Coloca um item na fila
● Dequeue– Retira o primeiro item da fila.
● Peek– Retorna o primeiro item.
● Assim como as Pilhas, as Filas têm operações mais restritas do que as operações das
Listas. Nas Filas, os elementos são adicionados na última posição e removidos da
primeira posição. Nas Listas, os elementos são adicionados e removidos de qualquer
posição.
● Então, podemos implementar uma Fila simplesmente colocando as restrições
adequadas nas operações de adicionar e remover elementos de uma Lista. Isso é bem
parecido ao que fizemos com as Pilhas.
Queue continuação
Código Fila
Try-Catch
● Bloco Try: Contem o código que representa a execução normal do trecho de código
que pode acarretar em uma exceção. // Tenta carregar o código.
● Bloco Catch: Contem código a ser executado caso uma exceção ocorra, deve ser
especificado o tipo da exceção a ser tratada(Upcasting é permitido). //Capturar e
efetuar alguma logica.
● Posso ter mais de um bloco Catch, vou colocar o tipo da exceção que quero
capturar e o apelido dela e dentro do bloco alguma logica caso a exceção ocorra.
Try-Catch “Bloco finally”
● Finally serve para tratar algo que você precisa obrigatoriamente fazer, mesmo que
houver um erro.
● O exemplo clássico é quando você quer abrir um arquivo ou uma conexão ao banco
de dados que deve ser fechada quando você acabar de usá-la, mesmo que houver um
erro (por exemplo, um erro de leitura do arquivo). De fato, o finally é tão rigoroso
nesse sentido que sempre será executado mesmo que houver uma exceção ou você
tentar retornar antes da execução.
Código Try-Catch
Acessos por Referencia e Copia
● Referencia: é um ponteiro que aloca uma referencia no Stack da memoria e
aponta para o objeto no Heap já em tipos primitivos é uma caixa que guarda
diretamente os valores, quando se perde a referencia ao objeto ele é desalocado da
memoria pelo garbage collector logo em seguida, variaveis locais são desalocadas
quando o método terminar.
●
Copia: Quando é estanciado um obj2 e ele recebe o valor de obj1 ele esta
recebendo apenas sua referencia, porem os tipos primitivos são caixas que recebem
seu valor e não apenas uma referencia.
Método clone
● Para clonar um objeto implementamos a interface Cloneable.
● A interface Cloneable não tem nenhum métodos e nenhum membro também, e é
usada para indicar que a classe (que implementa a interface) permite uma clonagem
bit a bit de um objeto, processo esse simplesmente chamado de "clonagem". Uma
exceção conhecida como "CloneNotSupportedException" é mostrada se a função
clone() é chamada numa classe em que não se implementou a interface Cloneable.
No processo de clonagem o construtor do objeto não é chamado. Então, clonar
pode ser definido como uma exata cópia do objeto original.
Código Cloneable
- Mutável
● Objetos Java normalmente têm um ou mais itens de dados dentro deles , representados como
campos ou variáveis . Muitas vezes, quando o código externo cria um objeto de um determinado​​
tipo , algumas dessas variáveis são valores atribuídos pelo método construtor da classe. Em​​
muitos casos , uma classe vai proporcionar a capacidade , quer internamente, quer
externamente , para alterar estes valores . Se isso for possível , então a classe é mutável.
● muitos casos , classes Java fornecer métodos que alteram os valores das variáveis de classe .​​
Exemplos comuns incluem métodos setter . Um método de ajuste é aquele que define o valor de
uma variável . Por exemplo, em uma declaração de classe com uma variável string chamada "
myName " pode existir o seguinte método setter :
setName public String (String newName ) {
myName=newName;
< p> }
Este método fornece o código externo com a capacidade de alterar o conteúdo de um objeto. Em um
objeto imutável isso não deve ser possível, já que os valores devem permanecer as mesmas , uma vez
que inicialmente foram definidos, normalmente quando o objeto é criado.
- Imutável
● um objeto imutável é um objeto no qual seu estado não pode ser modificado após
ser criado. Ele é o oposto de um objeto mutável, que pode ser modificado após sua
criação.
● Strings são classes imutáveis. Ao tentar realizar qualquer alteração em um objeto do tipo
String você sempre vai receber como retorno uma nova String, sem alterar o valor original.
Para que uma classe seja considerada imutável em java ela
deve seguir as seguintes características
● Métodos não podem modificar seu estado.
● Definida como final
● Atributos devem ser privados
● Atributos devem ser final
● Caso sua classe tenha composição com objetos mutáveis, eles devem ter acesso exclusivo pela sua
classe, devolvendo cópias defensivas
Código Imutável
Exemplo de Cópia Defensiva
● Se o objeto não possuir um método clone ou semelhante, sera necessário realizar uma copia
manual do objeto para que possamos continuar trabalhando com imutabilidade.
Ainda e um pouco complicado trabalhar com imutabilidade em Java, mas essa pratica traz
diversos benefícios como optimização de memoria.
Threads -
● Cada processo possui diversas threads (linhas de instruções).
● Em um programa em Java podemos querer executar 2 ou mais threads ao mesmo tempo,
ou seja, 2 ou mais procedimentos internos do programa ao mesmo tempo, são
basicamente funções rodando em paralelo.
● Pertence a Classe java.lang.Thread
● As threads são escalonadas e o escalonador pode pausá-las e dar espaço e tempo para
que outra thread possa ser executada.
Thread-Safe
● Thread-Safe surgi quando há a necessidade de trabalhar-se com programação
concorrente, seu principal objetivo é garantir que 2 ou mais threads que estejam em
“condição de corrida” não obtenham informações erradas (condição de corrida ou
race condition ocorre quando várias threads desejam acessar o mesmo recurso).
Criando Threads
● Existem 2 modos de criar uma Thread:
● Estender a Classe Thread
● Implementar a Classe Runnable
● Não podemos esquecer que Java não suporta múltiplas heranças então estender a
classe Thread pode ser inviável em algumas situações porem caso preciso pode se
usar uma linha de heranças.
Métodos
● Start: Inicia a thread “inicia o método run”.
●
Run: executa a tarefa da thread.
●
Sleep: Coloca a thread para dormir por alguns milissegundos.
Código Thread “Extends”
Código Thread Interface Runnable
Synchronized
● Quando um método é marcado synchronized, o sistema de execução Java garantirá
que apenas uma thread de cada vez acesse tal método. Se outras threads tentarem
fazer o mesmo, elas serão colocadas em espera até que a thread atual finalize seu
trabalho e libere o método.
● Wait: Bloqueia a execução de thread temporariamente, ou seja, coloca a thread em
modo de espera, A thread fica em modo de espera ate que seja notificada.
● Notify: notifica uma thread que estava esperando ou seja, retoma a execução da
thread.
● NotifyAll: notifica todas as threads e a que tem prioridade mais alta ganha acesso
ao objeto.
Código Synchronized
Semáforo
● Todo semáforo deve possuir dois métodos: P e V, que têm sua origem das palavras
parsen (passar) e e vrygeren (liberar).
● Utilizamos semáforos para controlar a quantidade de acesso a determinado recurso.
● Esta definição de semáforo foi proposta por Dijkstra para evitar o tão temido
DeadLock.
● DeadLock: Deadlock acontece quando segmentos estão bloqueados aguardando a
liberação de bloqueios uns dos outros, Esse tipo de dependência acontece
exclusivamente por falha na lógica implementada pelo programador.
● Quando se quer requisitar o recurso, faz-se uma chamada ao método P, que verifica
se é possível liberar o recurso. Ao terminar, faz-se uma chamada ao método V, que
notifica as outras Thread que o recurso foi liberado.
Código Semáforo
● Na implementação do Java, o método “acquire()” faz o
papel do método P e o método “release()” faz o papel do
método V.
●
Daemon threads
● são interrompidas quando a thread principal, aquela que executa o método main,
termina de executar e o programa termina.
● Se uma thread não é daemon, o processo Java continua ativo e executando, mesmo
quando atinge o final do método main e a thread principal termina.
● Por padrão, as threads herdam a propriedade de ser daemon da thread que as criou.
Como a thread principal não é daemon, comumente as threads criadas no programa
também não são.
● Isso torna comum programas que "não terminam", principalmente porque poucos
entendem esse conceito ou esquecem de criar um mecanismo para finalizar threads
criadas durante a execução do programa principal.
Perguntas da Semana 1
● Oque tu entende por Abstração em OOP?
● Trazer algo do mundo real para o código se concentrando no essencial do contexto
retirando informações que não são essenciais para a operação, consiste em
estabelecer uma identidade ao objeto, definir suas propriedades e seus métodos.
●
Uma Classe pode implementar mais de uma interface?
● Sim, pode implementar muitas interfaces.
● Uma Classe pode estender mais de uma classe mãe?
● Não, o Java não suporta multiplas heranças porem pode ser feita uma linha de
herança.
● Métodos estáticos -> como funciona a alocação de espaço na
memória?
● Tem um tamanho fixo, são alocados sequencialmente e automaticamente na
memoria.

Mais conteúdo relacionado

Mais procurados

Mais procurados (17)

Python Orientação a Objeto
Python Orientação a ObjetoPython Orientação a Objeto
Python Orientação a Objeto
 
Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IV
 
Programação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em JavaProgramação Orientada a Objetos - Uso da O.O. em Java
Programação Orientada a Objetos - Uso da O.O. em Java
 
POO - 23 - Coleções da API do Java
POO -  23 - Coleções da API do Java POO -  23 - Coleções da API do Java
POO - 23 - Coleções da API do Java
 
Csharp fundamentals
Csharp fundamentalsCsharp fundamentals
Csharp fundamentals
 
Java Básico :: Classe Vector
Java Básico :: Classe VectorJava Básico :: Classe Vector
Java Básico :: Classe Vector
 
Aula orientação a objetos
Aula orientação a objetosAula orientação a objetos
Aula orientação a objetos
 
Classes e Objectos JAVA
Classes e Objectos JAVAClasses e Objectos JAVA
Classes e Objectos JAVA
 
Poo padadigmas
Poo padadigmasPoo padadigmas
Poo padadigmas
 
Aula4
Aula4Aula4
Aula4
 
Introdução a programação Orientada a Objeto
Introdução a programação Orientada a ObjetoIntrodução a programação Orientada a Objeto
Introdução a programação Orientada a Objeto
 
Java básico
Java básicoJava básico
Java básico
 
Java 07
Java 07Java 07
Java 07
 
Java Desktop
Java DesktopJava Desktop
Java Desktop
 
Poo
PooPoo
Poo
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Java - Boas práticas
Java - Boas práticasJava - Boas práticas
Java - Boas práticas
 

Semelhante a Slide Share s2 Rodd

Semelhante a Slide Share s2 Rodd (20)

Java & orientação a objetos
Java & orientação a objetosJava & orientação a objetos
Java & orientação a objetos
 
Pged 04
Pged 04Pged 04
Pged 04
 
Curso Java Básico - Aula 05
Curso Java Básico - Aula 05Curso Java Básico - Aula 05
Curso Java Básico - Aula 05
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Java: Collections
Java: CollectionsJava: Collections
Java: Collections
 
Estudos Technocorp
Estudos TechnocorpEstudos Technocorp
Estudos Technocorp
 
Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections Classes Java , JDBC / Swing / Collections
Classes Java , JDBC / Swing / Collections
 
Mapeamento de herança OR
Mapeamento de herança ORMapeamento de herança OR
Mapeamento de herança OR
 
Seminário - Java Collections
Seminário - Java CollectionsSeminário - Java Collections
Seminário - Java Collections
 
Java7
Java7Java7
Java7
 
Classes e Estrutura de Dados
Classes e Estrutura de DadosClasses e Estrutura de Dados
Classes e Estrutura de Dados
 
3 orientacao-objetos
3 orientacao-objetos3 orientacao-objetos
3 orientacao-objetos
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Pacotes e Encapsulamento
Pacotes e EncapsulamentoPacotes e Encapsulamento
Pacotes e Encapsulamento
 
Lista encadeada de inteiros
Lista encadeada de inteirosLista encadeada de inteiros
Lista encadeada de inteiros
 
Orientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores AndroidOrientação a Objetos para Desenvolvedores Android
Orientação a Objetos para Desenvolvedores Android
 
Curso ruby on rails
Curso ruby on railsCurso ruby on rails
Curso ruby on rails
 
Classes Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções JavaClasses Anônimas, Internas e Coleções Java
Classes Anônimas, Internas e Coleções Java
 
Java Básico :: Orientação a objetos
Java Básico :: Orientação a objetosJava Básico :: Orientação a objetos
Java Básico :: Orientação a objetos
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 

Slide Share s2 Rodd

  • 1. Estrutura de Dados Consiste em armazenar e organizar os dados de forma eficiente para usá-los com maior eficacia tanto no acesso quanto no gasto de memoria. Map Faz parte do pacote java.util, é uma coleção de pares de chave / valor “Map<k/v>”. - Não admite repetições do objeto chave. - Os elementos são indexados pelo objeto chave (não possuem posição). - Acesso, inserção e remoção de elementos são rápidos. Uso Comum: Cookies, Local Storage, qualquer modelo de chave valor.
  • 2. Principais implementações Map * HashMap – é uma estrutura de dados baseada em espalhamento através de uma função de cálculo hash de uma informação chave do objeto a ser colocado na coleção de dados. Você tem sempre uma chave e um valor associado a ela. O acesso é sempre feito pela chave. A forma de acesso é sempre muito rápida e pode, na maioria dos casos ter complexidade de tempo de acesso qualquer constante (O(1)). Não pode ter chaves duplicatas e não mantém um ordem específica, é considerada não ordenada. *TreeMap – mais lento (operações O(log(n)) em arvore rubro-negra) e ordenado pelo compareTo do objeto (ou Comparator), se eu adicionar com a mesma Chave ele vai sobrescrever a chave anterior e seu valor . *LinkedHashMap – velocidade intermediaria e elementos na ordem em que são adicionados.
  • 3. Alguns Métodos importantes *put(key, value): Insere um elemento em determinada chave e pode atribuir um valor a ela. *remove(key): Passa a chave. *containsKey(key): Para verificar se existe uma dada chave. *get(key): Recupera um elemento pela chave. *clear(): Para limpar o conjunto.
  • 4. Mais Métodos “Map” *Size(): Para obter o tamanho. *keySet(): Retorna um Set<k> com as chaves contidas no map. *values(): Retorna uma Collection<v> “Coleção do tipo valor”. - Assim como no set a comparação de um elemento com outro no caso a Chave é baseada em equals e hashCode e se o equals e hashCode não existir é usada a comparação de ponteiros.
  • 6. Set Representa um conjunto de elementos”na verdade é uma interface” pode ser usado para armazenar um registro de logs de usuários. *Não admite repetições. *Elementos não possuem posição. *Acesso, inserção e remoção de elementos são rápidos. *Oferece operações eficientes de conjuntos: interseção, união, diferença. Principais implementações HashSet – mais rapido (operações O(1) em tabela hash) e não ordenado. TreeSet – mais lento (operações O(log(n)) em arvore rubro negra) e ordenado pelo compareTo do objeto. LinkedHashSet – velocidade intermediaria e elementos na ordem em que são adcionados.
  • 7. Alguns Métodos importantes * add(obj) * remove(obj) * contains(obj) * clear(): Para limpar o conjunto. * Size(): Para obter o tamanho. * removeIf(remove do conjunto todo mundo que atender o predicado). * addAll(other) – união: Adiciona no conjunto os elementos do outro conjunto, sem repetição. * retainAll(other) – interseção: Remove do conjunto os elementos não contidos em other. * removeAll(other) – diferença: Remove do conjunto os elementos contidos em other.
  • 9. Diferença entre Set e ArrayList ● Set é uma interface que herda de Collection e é um conjunto, ou seja, não aceita dados duplicados. ArrayList é uma classe que implementa a interface List, e List é uma coleção ordenada que é referenciada por um índice.
  • 10. Stack (Pilha) ● Lifo “Last in first out” “ultimo a entrar, primeiro a sair”. ● Stack é uma classe com operações”Métodos” específicos para empilhar e desempilhar elementos de uma lista. ● Métodos Utilizados ● Push- Coloca um item na pilha. ● Pop- Retira o último item da pilha e retorna uma referência a este objeto. ● Peek- Retorna o objeto que está no topo da pilha. ● IsFull- Para saber se a pilha esta cheia. ● IsEmpty- Para saber se a pilha esta vazia. ● Size- Numero de itens na pilha. ● Pull- Altera o elemento no topo da pilha
  • 12. Queue (fila) ● Nesta classe, o elemento é inserido na parte de trás da fila. Esta operação é chamada de enfileiramento. Este mesmo elemento sai a partir da frente da fila, operação chamada desenfileiramento. Esse procedimento de entrada e saída recebe o nome de fila. ● Métodos Utilizados ● Enqueue– Coloca um item na fila ● Dequeue– Retira o primeiro item da fila. ● Peek– Retorna o primeiro item.
  • 13. ● Assim como as Pilhas, as Filas têm operações mais restritas do que as operações das Listas. Nas Filas, os elementos são adicionados na última posição e removidos da primeira posição. Nas Listas, os elementos são adicionados e removidos de qualquer posição. ● Então, podemos implementar uma Fila simplesmente colocando as restrições adequadas nas operações de adicionar e remover elementos de uma Lista. Isso é bem parecido ao que fizemos com as Pilhas. Queue continuação
  • 15. Try-Catch ● Bloco Try: Contem o código que representa a execução normal do trecho de código que pode acarretar em uma exceção. // Tenta carregar o código. ● Bloco Catch: Contem código a ser executado caso uma exceção ocorra, deve ser especificado o tipo da exceção a ser tratada(Upcasting é permitido). //Capturar e efetuar alguma logica. ● Posso ter mais de um bloco Catch, vou colocar o tipo da exceção que quero capturar e o apelido dela e dentro do bloco alguma logica caso a exceção ocorra.
  • 16. Try-Catch “Bloco finally” ● Finally serve para tratar algo que você precisa obrigatoriamente fazer, mesmo que houver um erro. ● O exemplo clássico é quando você quer abrir um arquivo ou uma conexão ao banco de dados que deve ser fechada quando você acabar de usá-la, mesmo que houver um erro (por exemplo, um erro de leitura do arquivo). De fato, o finally é tão rigoroso nesse sentido que sempre será executado mesmo que houver uma exceção ou você tentar retornar antes da execução.
  • 18. Acessos por Referencia e Copia ● Referencia: é um ponteiro que aloca uma referencia no Stack da memoria e aponta para o objeto no Heap já em tipos primitivos é uma caixa que guarda diretamente os valores, quando se perde a referencia ao objeto ele é desalocado da memoria pelo garbage collector logo em seguida, variaveis locais são desalocadas quando o método terminar. ● Copia: Quando é estanciado um obj2 e ele recebe o valor de obj1 ele esta recebendo apenas sua referencia, porem os tipos primitivos são caixas que recebem seu valor e não apenas uma referencia.
  • 19. Método clone ● Para clonar um objeto implementamos a interface Cloneable. ● A interface Cloneable não tem nenhum métodos e nenhum membro também, e é usada para indicar que a classe (que implementa a interface) permite uma clonagem bit a bit de um objeto, processo esse simplesmente chamado de "clonagem". Uma exceção conhecida como "CloneNotSupportedException" é mostrada se a função clone() é chamada numa classe em que não se implementou a interface Cloneable. No processo de clonagem o construtor do objeto não é chamado. Então, clonar pode ser definido como uma exata cópia do objeto original.
  • 21. - Mutável ● Objetos Java normalmente têm um ou mais itens de dados dentro deles , representados como campos ou variáveis . Muitas vezes, quando o código externo cria um objeto de um determinado​​ tipo , algumas dessas variáveis são valores atribuídos pelo método construtor da classe. Em​​ muitos casos , uma classe vai proporcionar a capacidade , quer internamente, quer externamente , para alterar estes valores . Se isso for possível , então a classe é mutável. ● muitos casos , classes Java fornecer métodos que alteram os valores das variáveis de classe .​​ Exemplos comuns incluem métodos setter . Um método de ajuste é aquele que define o valor de uma variável . Por exemplo, em uma declaração de classe com uma variável string chamada " myName " pode existir o seguinte método setter : setName public String (String newName ) { myName=newName; < p> } Este método fornece o código externo com a capacidade de alterar o conteúdo de um objeto. Em um objeto imutável isso não deve ser possível, já que os valores devem permanecer as mesmas , uma vez que inicialmente foram definidos, normalmente quando o objeto é criado.
  • 22. - Imutável ● um objeto imutável é um objeto no qual seu estado não pode ser modificado após ser criado. Ele é o oposto de um objeto mutável, que pode ser modificado após sua criação. ● Strings são classes imutáveis. Ao tentar realizar qualquer alteração em um objeto do tipo String você sempre vai receber como retorno uma nova String, sem alterar o valor original.
  • 23. Para que uma classe seja considerada imutável em java ela deve seguir as seguintes características ● Métodos não podem modificar seu estado. ● Definida como final ● Atributos devem ser privados ● Atributos devem ser final ● Caso sua classe tenha composição com objetos mutáveis, eles devem ter acesso exclusivo pela sua classe, devolvendo cópias defensivas
  • 25. Exemplo de Cópia Defensiva ● Se o objeto não possuir um método clone ou semelhante, sera necessário realizar uma copia manual do objeto para que possamos continuar trabalhando com imutabilidade. Ainda e um pouco complicado trabalhar com imutabilidade em Java, mas essa pratica traz diversos benefícios como optimização de memoria.
  • 26. Threads - ● Cada processo possui diversas threads (linhas de instruções). ● Em um programa em Java podemos querer executar 2 ou mais threads ao mesmo tempo, ou seja, 2 ou mais procedimentos internos do programa ao mesmo tempo, são basicamente funções rodando em paralelo. ● Pertence a Classe java.lang.Thread ● As threads são escalonadas e o escalonador pode pausá-las e dar espaço e tempo para que outra thread possa ser executada.
  • 27. Thread-Safe ● Thread-Safe surgi quando há a necessidade de trabalhar-se com programação concorrente, seu principal objetivo é garantir que 2 ou mais threads que estejam em “condição de corrida” não obtenham informações erradas (condição de corrida ou race condition ocorre quando várias threads desejam acessar o mesmo recurso).
  • 28. Criando Threads ● Existem 2 modos de criar uma Thread: ● Estender a Classe Thread ● Implementar a Classe Runnable ● Não podemos esquecer que Java não suporta múltiplas heranças então estender a classe Thread pode ser inviável em algumas situações porem caso preciso pode se usar uma linha de heranças.
  • 29. Métodos ● Start: Inicia a thread “inicia o método run”. ● Run: executa a tarefa da thread. ● Sleep: Coloca a thread para dormir por alguns milissegundos.
  • 32. Synchronized ● Quando um método é marcado synchronized, o sistema de execução Java garantirá que apenas uma thread de cada vez acesse tal método. Se outras threads tentarem fazer o mesmo, elas serão colocadas em espera até que a thread atual finalize seu trabalho e libere o método. ● Wait: Bloqueia a execução de thread temporariamente, ou seja, coloca a thread em modo de espera, A thread fica em modo de espera ate que seja notificada. ● Notify: notifica uma thread que estava esperando ou seja, retoma a execução da thread. ● NotifyAll: notifica todas as threads e a que tem prioridade mais alta ganha acesso ao objeto.
  • 34. Semáforo ● Todo semáforo deve possuir dois métodos: P e V, que têm sua origem das palavras parsen (passar) e e vrygeren (liberar). ● Utilizamos semáforos para controlar a quantidade de acesso a determinado recurso. ● Esta definição de semáforo foi proposta por Dijkstra para evitar o tão temido DeadLock. ● DeadLock: Deadlock acontece quando segmentos estão bloqueados aguardando a liberação de bloqueios uns dos outros, Esse tipo de dependência acontece exclusivamente por falha na lógica implementada pelo programador. ● Quando se quer requisitar o recurso, faz-se uma chamada ao método P, que verifica se é possível liberar o recurso. Ao terminar, faz-se uma chamada ao método V, que notifica as outras Thread que o recurso foi liberado.
  • 35. Código Semáforo ● Na implementação do Java, o método “acquire()” faz o papel do método P e o método “release()” faz o papel do método V. ●
  • 36. Daemon threads ● são interrompidas quando a thread principal, aquela que executa o método main, termina de executar e o programa termina. ● Se uma thread não é daemon, o processo Java continua ativo e executando, mesmo quando atinge o final do método main e a thread principal termina. ● Por padrão, as threads herdam a propriedade de ser daemon da thread que as criou. Como a thread principal não é daemon, comumente as threads criadas no programa também não são. ● Isso torna comum programas que "não terminam", principalmente porque poucos entendem esse conceito ou esquecem de criar um mecanismo para finalizar threads criadas durante a execução do programa principal.
  • 37. Perguntas da Semana 1 ● Oque tu entende por Abstração em OOP? ● Trazer algo do mundo real para o código se concentrando no essencial do contexto retirando informações que não são essenciais para a operação, consiste em estabelecer uma identidade ao objeto, definir suas propriedades e seus métodos. ● Uma Classe pode implementar mais de uma interface? ● Sim, pode implementar muitas interfaces. ● Uma Classe pode estender mais de uma classe mãe? ● Não, o Java não suporta multiplas heranças porem pode ser feita uma linha de herança. ● Métodos estáticos -> como funciona a alocação de espaço na memória? ● Tem um tamanho fixo, são alocados sequencialmente e automaticamente na memoria.