-
Notifications
You must be signed in to change notification settings - Fork 19
/
index.html
434 lines (278 loc) · 39.3 KB
/
index.html
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
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
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
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Estrutura de Dados em Java</title>
<meta name="title" content="Estrutura de Dados em Java">
<meta name="description" content="Livro de Estrutura de Dados em Java contendo conceitos, algoritmos e exemplos visuais de Pilha, Fila, Listas e Árvores.">
<meta name="keywords" content="Estrutura de Dados em Java, Estrutura de Dados Java, Java, Estrutura de Dados, Pilha, Fila, Lista, ABB, Estrutura de Dados PDF">
<meta name="author" content="Luis Araujo">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="favicon.png" />
<link rel="stylesheet" href="site/css/style.css">
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- TesteEd -->
<ins class="adsbygoogle"
style="display:block"
data-ad-client="ca-pub-7637623840866453"
data-ad-slot="8572003247"
data-ad-format="auto"
data-full-width-responsive="true"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</head>
<body>
<div class="navbar"><a href="/Estrutura-de-Dados-em-Java"> <div id="logo" ></div></a><div id="title"> Estrutura de Dados em Java</div></div>
<div class="container">
<div class="left-topics">
<div id="stack" class="structure"><a href="Pilha/index.html">Pilha</a></div>
<div id="queue" class="structure"><a href="Listas/index.html">Listas </a></div>
<div id="dlist" class="structure"><a href="ListaDuplamenteEncadeada/index.html"><div class="icon"></div>Lista Encadeada</a></div>
<div id="dlist" class="structure"><a href="ListaDuplamenteEncadeada/index.html"><div class="icon"></div>Lista Duplamente Encadeada</a></div>
<div id="clist" class="structure"><div class="icon"></div><a href="ListaCircular/index.html">Lista Circular</a></div>
<div id="tree" class="structure"><a href="Arvores/index.html">Árvores</a></div>
<div id="treeabb" class="structure"><div class="icon"></div><a href="ArvoresABB/index.html">Árvore ABB</a></div>
<div id="treeavl" class="structure"><div class="icon"></div><a href="ArvoresAVL/index.html">Árvore AVL</a></div>
<div id="treerb" class="structure"><div class="icon"></div><a href="ArvoresRB/index.html">Árvore RB</a></div>
</div>
<div class="more-left-topics"></div>
<div class="main-container">
<div class="title">Estrutura de Dados</div>
<div class="parag">
O que é uma estrutura de dados? Como o próprio nome diz, é uma forma de organizar informações. Ou seja, passamos de um patamar que usávamos tipos primitivos como Inteiro, Caractere e outros para tipos mais complexos, como Pilha, Fila e Árvore. Sim, esses tipos complexos utilizam tipos primários, mas estamos interessados agora em entender essa composição maior, como esses tipos se relacionam, qual a sua semântica dentro da estrutura, seu comportamento e os efeitos que eles causam no estado da estrutura.
</div>
<div class="parag hightlight">
Como disciplina, Estrutura de Dados tem como objetivo apresentar estruturas já consolidadas da área de Computação. Essas estruturas buscam resolver diversos problemas recorrentes na área de desenvolvimento. Os estudantes precisam entender, implementar e avaliar em quais situações eles são mais adequadas.
</div >
<div class="parag">
É importante ressaltar que uma Estrutura de Dados é formada por Dados (organizados segundo alguma lógica). Além disso possuem operações permitidas, vinculadas a essas dados. A palavra permite merece destaque, já que diversas operações podem ser realizadas sobre os dados, mas nem todas são "legais" dentro das regras de cada estrutura. Quando isso ocorre, dizemos que um programador "burlou" ou "violou" as regras. Mas qual o impacto disso? Logicamente isso afetará a forma de organização e possivelmente as próximas interações com esta estrutura.
</div >
<div class="parag">
Formalizando:
</div >
<div class = "cite">
Estrutura de Dados envolve dados organizados de alguma forma e operações vinculadas aos dados que garantem a manutenção da organização após inserções e deleções.
</div>
<div class="parag">
Assim, algumas estruturas são utilizadas como forma de facilitar o armazenamento de informações, permitindo a recuperação de modo mais rápido. Logicamente, tudo depende do contexto do nosso problema. Por exemplo, não é recomendável utilizar uma Pilha para um problema que envolve o conceito de Fila, como uma fila de Banco por exemplo. Com o uso correto de uma estrutura é possível diminuir custos computacionais e esta disciplina oferece também este aspecto analítico.
</div>
<div class="parag">
Logicamente que o mais pudente é retirar os pratos de cima um a um e colocar em algum outo lugar, até que possamos - com segurança - pegar o prato desejado. Então, vamos criar um algoritmo simples para modelar isso:
</div>
<div class="title">Modelagem</div>
<div class="parag">
Modelagem Computacional é um área da Computação que visa modelar computacionalmente alguns cenários ou problemas. Basicamente, buscamos transpor elementos do mundo real para o computador e para isso precisamos usar a "abstração". Logicamente que não iremos modelar algo da natureza em sua perfeição, e muitas vezes não precisamos. Modelamos apenas os elementos essenciais, arte proveniente da abstração:
</div>
<div class="cite">
focar em elementos principais, ignorando elementos eventuais ou menos importantes (para um contexto específico).
</div>
<div class="parag">
Desse modo, podemos criar classes - já que usaremos Java - com seus métodos que simulem um determinado elemento a ser modelado. Por exemplo: Carro possui uma marca, placa, modelo, ano de fabricação, motor e pode acelerar, frear, virar à esquerda, entre outros.
</div>
<div class="parag">
Em Estrutura de Dados, faremos constantemente esse exercício, modelaremos elementos do mundo real, eliminando suas características eventuais, focando apenas nos elementos principais. Isso ocorre com Pilhas, Filas, Árvores entre outras estruturas.
</div>
<div class="title">Revisão POO</div>
<div class="parag">Uma condição essencial para criar estruturas de dados, no modelo que vamos apresentar, é saber os conceitos de POO e Java. Caso esse não seja o seu caso, recomendo parar a leitura e fazer um curso ou ler materiais específicos sobre POO. Aqui forneço uma breve introdução!</div>
<div class="parag"> </div>
<div class="parag"> Então, assumindo que você já conhece POO, vamos relembrar.</div>
<div class="subtitle">Classes</div>
<div class="parag">Classes são elementos no qual podemos implementar modelos, tal como uma forma de bolo que usaremos para fazer vários bolos: chocolate, cenoura e outros. Não importa os ingredientes utilizados, a forma sempre será a mesma. </div>
<div class="parag">Com classes podemos definir como serão os nossos objetos. Fazendo outra analogia, classes são como gabaritos. Através das classes podemos definir os atributos e métodos dos objetos. </div>
<div class="parag">Vamos ver um exemplo em Java. A seguir temos uma classe de nome AlgumaClasse, com dois atributos: um do tipo inteiro, chamado número, e outro do tipo string, chamado nome: </div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">AlgumaClasse</span><span style="color: #555555">{</span>
<span style="color: #007788; font-weight: bold">int</span> numero<span style="color: #555555">;</span>
String nome<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="subtitle">Objetos</div>
<div class="parag">Objetos são copias das Classes, dizemos ainda que quando instanciamos um objeto, estamos consolidando a classe. Ou seja, estamos de fato utilizando a classe como modelo para criar um objeto. Esse objeto terá os atributos e métodos estipulados na Classe. Mas é importante saber que: dois objetos da mesma classe podem ter comportamentos diferentes, dado o seu estado (os valores nos atributos). Como o exemplo do bolo, chocolate e cenoura foram implementados com ingredientes diferentes, mas ainda são bolos. </div>
<div class="parag">Em Java, um objeto é criado da seguintes forma, declara-se um local para armazená-lo (como uma variável) estipulando o seu tipo (AlgumaClasse) e depois o seu nome. Do lado direto da igualdade, temos o operador new acompanhado do nome da Classe e de parênteses: </div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(){</span>
AlgumaClasse ac <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> AlgumaClasse<span style="color: #555555">();</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">Como disse antes, elas podem ter valores diferentes (estado). Vejamos:</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(){</span>
AlgumaClasse ac <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> AlgumaClasse<span style="color: #555555">();</span>
ac<span style="color: #555555">.</span><span style="color: #330099">numero</span> <span style="color: #555555">=</span> <span style="color: #FF6600">10</span><span style="color: #555555">;</span>
ac<span style="color: #555555">.</span><span style="color: #330099">nome</span> <span style="color: #555555">=</span> <span style="color: #CC3300">"AC 1"</span><span style="color: #555555">;</span>
AlgumaClasse ac2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> AlgumaClasse<span style="color: #555555">();</span>
ac<span style="color: #555555">.</span><span style="color: #330099">numero</span> <span style="color: #555555">=</span> <span style="color: #FF6600">20</span><span style="color: #555555">;</span>
ac<span style="color: #555555">.</span><span style="color: #330099">nome</span> <span style="color: #555555">=</span> <span style="color: #CC3300">"AC 2"</span><span style="color: #555555">;</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">Assim, ac e ac2 são objetos diferentes que possuem seus próprios valores. Mas, ainda assim, são objetos de AlgumaClasse.</div>
<div class="subtitle">Construtor</div>
<div class="parag"> Mas o que faz o new? Bem, ele 'chama' o construtor da classe para que seja instanciado o objeto (o objeto é colocado dentro da variável ac). Esse construtor é um método diferenciado, pois ele não possui retorno. Isso não quer dizer que ele é um void, ele literalmente não possui retorno. O Java saberá que ele é um construtor, pois não colocamos o tipo de retorno (void, Integer, String ...). Vejamos a diferença entre os métodos setNumero, getNumero e o Construtor.</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">AlgumaClasse</span><span style="color: #555555">{</span>
<span style="color: #555555">[...]</span> <span style="color: #0099FF; font-style: italic">//trecho inibido</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #CC00FF">AlgumaClasse</span><span style="color: #555555">(){</span>
nome <span style="color: #555555">=</span> <span style="color: #CC3300">""</span><span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">int</span> <span style="color: #CC00FF">getNumero</span><span style="color: #555555">(){</span>
<span style="color: #006699; font-weight: bold">return</span> <span style="color: #006699; font-weight: bold">this</span><span style="color: #555555">.</span><span style="color: #330099">numero</span><span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">setNumero</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> numero<span style="color: #555555">){</span>
<span style="color: #006699; font-weight: bold">this</span><span style="color: #555555">.</span><span style="color: #330099">numero</span> <span style="color: #555555">=</span> numero
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="subtitle">Atributos</div>
<div class="parag">Atributos são variáveis (primitivas ou objetos) que são inerentes ao Objeto instanciado. Ou seja, os atributos são estipulados no modelo (a Classe). No exemplo anterior, já vimos o uso de atributos (nome e número). Os valores nos atributos definem o estado do objeto, que podem influenciar as suas ações (os métodos). </div>
<div class="subtitle">Métodos</div>
<div class="parag">Como vimos, os métodos são as ações dos objetos. O que isso significa? Significa que são eles os responsáveis por executar as operações, como obter um valor ou inserir um valor. Vimos um exemplos do Método (getNúmeros).</div>
<div class="parag">Métodos podem retornar um tipo ou não (void). Vejamos dois exemplos: </div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">AlgumaClasse</span><span style="color: #555555">{</span>
<span style="color: #555555">[...]</span> <span style="color: #0099FF; font-style: italic">//trecho inibido</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">setNumero</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> numero<span style="color: #555555">){</span>
<span style="color: #006699; font-weight: bold">this</span><span style="color: #555555">.</span><span style="color: #330099">numero</span> <span style="color: #555555">=</span> numero
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">int</span> <span style="color: #CC00FF">getNumero</span><span style="color: #555555">(){</span>
<span style="color: #006699; font-weight: bold">return</span> numero<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="subtitle">Herança</div>
<div class="parag">Herança é uma forma de compartilhar atributos e métodos, de modo a eliminar a duplicidade de código. Assim, o processo de Herança consiste em agrupar atributos e métodos gerais em uma classe, que chamamos de Pai e reaproveitá-los nos Filhos.</div>
<div class="parag">Em Java, a Herança é implementada com a palavra-chave extends. Todos os atributos e métodos públicos (public) e protegidos (protected) serão herdados pelos filhos. Vejamos:</div>
<div class="parag">A classe Pai:</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">ClassePai</span><span style="color: #555555">{</span>
<span style="color: #006699; font-weight: bold">protected</span> <span style="color: #007788; font-weight: bold">int</span> valor1<span style="color: #555555">;</span>
<span style="color: #006699; font-weight: bold">protected</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">getValor1</span><span style="color: #555555">(){</span>
<span style="color: #006699; font-weight: bold">return</span> valor1<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">A classe Filha:</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">ClasseFilha</span> <span style="color: #006699; font-weight: bold">extends</span> ClassePai<span style="color: #555555">{</span>
<span style="color: #006699; font-weight: bold">protected</span> <span style="color: #007788; font-weight: bold">int</span> valor2<span style="color: #555555">;</span>
<span style="color: #006699; font-weight: bold">protected</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">getValor2</span><span style="color: #555555">(){</span>
<span style="color: #006699; font-weight: bold">return</span> valor2<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #0099FF; font-style: italic">// usando o método do Pai</span>
<span style="color: #006699; font-weight: bold">protected</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">exibeValor</span><span style="color: #555555">(){</span>
System<span style="color: #555555">.</span><span style="color: #330099">out</span><span style="color: #555555">.</span><span style="color: #330099">println</span><span style="color: #555555">(</span> getValor1<span style="color: #555555">()</span> <span style="color: #555555">+</span> <span style="color: #CC3300">" "</span> <span style="color: #555555">+</span> getValor2<span style="color: #555555">());</span>
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">Através da Herança podemos utilizar o Polimofirmos para agregar dados de vários tipos e tratá-los como iguais. Por exemplo: Um lista de Funcionários tem objetos do tipo Operador, Gerente e Supervisor. Poderíamos tratá-los como Funcionários e assim utilizar os métodos e atributos em comum.</div>
<div class="subtitle">Tipos Abstratos em Java</div>
<div class="parag">
Já que relembramos os conceitos básicos de POO, buscaremos agora entender como implementar algo que funcione para uma variedade de tipos, eliminando a necessidade de implementar várias estrutura (uma para cada tipo). Afinal nosso objetivo é criar estruturas que possam ser utilizadas em vários contextos.</div>
<div class="subtitle">Classe Object</div>
<div class="parag">
Como já falamos sobre Herança, podemos então definir a <a class="link-extern" href="https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html" target="blank">Classe Object</a>. Basicamente, todos as Classes em Java são filhas de Object, mesmo sem o uso de <i>extends</i>. Ou seja, nativamente, todas as classes são filhas de Object.</div>
<div class="parag">
Object é uma super classe! Logo, graças ao Polimorfismo, podemos tratar todas as classes como Object. O problema é que precisamos saber os seus tipos, quando formos utilizar os atributos e métodos. Então, nem sempre isso é uma vantagem.</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #CC00FF">EstruturaQualquer</span> <span style="color: #555555">(){</span>
Object<span style="color: #555555">[]</span> vetor<span style="color: #555555">;</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #CC00FF">EstruturaQualquer</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> tamanho<span style="color: #555555">){</span>
vetor <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> Object<span style="color: #555555">[</span>tamanho<span style="color: #555555">];</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">getItem</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> i<span style="color: #555555">,</span> Object valor<span style="color: #555555">){</span>
vetor<span style="color: #555555">[</span>i<span style="color: #555555">]</span> <span style="color: #555555">=</span> valor<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> Object <span style="color: #CC00FF">getItem</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> i<span style="color: #555555">){</span>
retunr vetor<span style="color: #555555">[</span>i<span style="color: #555555">];</span>
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Agora vamos utilizar essa estrutura. Como ela foi implementada com Object, podemos inserir todos tipo de objeto, pois todos são filhos de Object.</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(</span>Strings<span style="color: #555555">[]</span> args<span style="color: #555555">){</span>
EstruturaQualquer est1 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555">(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est1<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #CC3300">"Teste"</span><span style="color: #555555">);</span>
est1<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #CC3300">"Teste 2"</span><span style="color: #555555">);</span>
EstruturaQualquer est2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555">(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Mas do que se trata isso? Bem, estamos tentando esboçar uma forma de implementar nossas estrutura apenas uma vez de modo que ela sirva para uma ampla gama de contextos. O uso do Object funciona, criamos apenas uma estrutura e podemos inserir vários tipos, mas isso possui uma dificuldade: precisamos sempre fazer o cast para usar métodos específicos.</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(</span>Strings<span style="color: #555555">[]</span> args<span style="color: #555555">){</span>
<span style="color: #555555">[...]</span>
EstruturaQualquer est2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555">(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
<span style="color: #007788; font-weight: bold">double</span> sal <span style="color: #555555">=</span> est2<span style="color: #555555">.</span><span style="color: #330099">getItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">).</span><span style="color: #330099">getSalario</span><span style="color: #555555">();</span> <span style="color: #0099FF; font-style: italic">//isso possui um erro</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Então vamos lá:
</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(</span>Strings<span style="color: #555555">[]</span> args<span style="color: #555555">){</span>
<span style="color: #555555">[...]</span>
EstruturaQualquer est2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualqyer<span style="color: #555555">(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
Gerente g <span style="color: #555555">=</span> <span style="color: #555555">(</span>Gerente<span style="color: #555555">)</span> est2<span style="color: #555555">.</span><span style="color: #330099">getItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">).</span><span style="color: #330099">getSalario</span><span style="color: #555555">();</span> <span style="color: #0099FF; font-style: italic">//cast</span>
<span style="color: #007788; font-weight: bold">double</span> sal <span style="color: #555555">=</span> g<span style="color: #555555">.</span><span style="color: #330099">getSalario</span><span style="color: #555555">();</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Agora que já entendemos a limitação, vamos ao próximo tópico.
</div>
<div class="subtitle">Classes Genéricas</div>
<div class="parag">
Classes Genéricas são muito boas para o que estamos querendo fazer. É comum que aqui você fique um pouco confuso, mas tenha uma coisa em mente: </div>
<div class="cite">
Queremos criar estruturas que sejam implementadas um única vez e que sirva para String, Inteiro, Classes criadas por nós e outras.
</div>
<div class="parag">
Basicamente Classes Genéricas postergam a definição do tipo de dados. Assim, ao invés de definirmos na implementação (Classe) o tipo a ser utilizado, vamos definir no instanciamento do objeto. As classes Genéricas recebem um termo (T) que será substituído em tempo de execução, pelo tipo passado por parâmetro. Certamente você já utilizou algo similar como <a class="link-extern" target="blank" href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html">ArrayList</a>, mas não sabia o motivo.</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">class</span> <span style="color: #00AA88; font-weight: bold">EstruturaQualquer</span><span style="color: #555555"><</span>T<span style="color: #555555">>(){</span>
T<span style="color: #555555">[]</span> vetor<span style="color: #555555">;</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #CC00FF">EstruturaQualquer</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> tamanho<span style="color: #555555">){</span>
vetor <span style="color: #555555">=</span> <span style="color: #555555">(</span>T<span style="color: #555555">[])</span> <span style="color: #006699; font-weight: bold">new</span> Object<span style="color: #555555">[</span>tamanho<span style="color: #555555">];</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">getItem</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> i<span style="color: #555555">,</span> T valor<span style="color: #555555">){</span>
vetor<span style="color: #555555">[</span>i<span style="color: #555555">]</span> <span style="color: #555555">=</span> valor<span style="color: #555555">;</span>
<span style="color: #555555">}</span>
<span style="color: #006699; font-weight: bold">public</span> T <span style="color: #CC00FF">getItem</span><span style="color: #555555">(</span><span style="color: #007788; font-weight: bold">int</span> i<span style="color: #555555">){</span>
retunr vetor<span style="color: #555555">[</span>i<span style="color: #555555">];</span>
<span style="color: #555555">}</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Pare um pouco, observe esse código e compare com a implementação da subseção anterior sobre Object. O que mudou? Certamente você percebeu que as referências do Object sumiram (menos a de instanciar o vetor, pois em Java não podemos criar diretamente um vetor genérico: new T[tamanho].</div>
<div class="parag">
Ao usar essa estrutura, vamos dizer no instanciamento o tipo que desejamos:</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(</span>Strings<span style="color: #555555">[]</span> args<span style="color: #555555">){</span>
EstruturaQualquer<span style="color: #555555"><</span>String<span style="color: #555555">></span> est1 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555"><</span>String<span style="color: #555555">>(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est1<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #CC3300">"Teste"</span><span style="color: #555555">);</span>
est1<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #CC3300">"Teste 2"</span><span style="color: #555555">);</span>
EstruturaQualquer<span style="color: #555555"><</span>Gerente<span style="color: #555555">></span> est2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555"><</span>Gerente<span style="color: #555555">>(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Vamos ao exemplo do uso de métodos específicos:</div>
<!-- HTML generated using hilite.me --><div style="background: #f0f3f3; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><pre style="margin: 0; line-height: 125%"><span style="color: #006699; font-weight: bold">public</span> <span style="color: #006699; font-weight: bold">static</span> <span style="color: #007788; font-weight: bold">void</span> <span style="color: #CC00FF">main</span><span style="color: #555555">(</span>Strings<span style="color: #555555">[]</span> args<span style="color: #555555">){</span>
<span style="color: #555555">[...]</span>
EstruturaQualquer<span style="color: #555555"><</span>Gerente<span style="color: #555555">></span> est2 <span style="color: #555555">=</span> <span style="color: #006699; font-weight: bold">new</span> EstruturaQualquer<span style="color: #555555"><</span>Gerente<span style="color: #555555">>(</span><span style="color: #FF6600">10</span><span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
est2<span style="color: #555555">.</span><span style="color: #330099">setItem</span><span style="color: #555555">(</span><span style="color: #FF6600">1</span><span style="color: #555555">,</span> <span style="color: #006699; font-weight: bold">new</span> Gerente<span style="color: #555555">()</span> <span style="color: #555555">);</span>
<span style="color: #007788; font-weight: bold">double</span> sal <span style="color: #555555">=</span> est2<span style="color: #555555">.</span><span style="color: #330099">getItem</span><span style="color: #555555">(</span><span style="color: #FF6600">0</span><span style="color: #555555">).</span><span style="color: #330099">getSalario</span><span style="color: #555555">();</span> <span style="color: #0099FF; font-style: italic">//isso NÃO possui erro</span>
<span style="color: #555555">}</span>
</pre></div>
<div class="parag">
Pronto, chegamos ao nosso objetivo. Por se tratar de um assunto novo e abstrato, é recomendado que você implemente os exemplos com Object e Classes Genéricas para internalizar os conceitos. Vamos utilizar esse tipo de codificação para as estruturas a seguir: Pilha, Fila, Listas e Árvores.</div>
<div class="hightlight">
Esta foi a nossa revisão, espero que tenha relembrando pontos importantes. Agora é hora de seguir para as estruturas! :)
</div>
</div>
</div>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NZJ9Q2L2RL"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-NZJ9Q2L2RL');
</script>
</body>
</html>