Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

📚 The CoCalc Library - books, templates and other resources

132940 views
License: OTHER
1
\documentclass[usepdftitle=false,hyperref={pdfpagelabels=false}]{beamer}
2
\usepackage{../templates/myStyle}
3
4
\begin{document}
5
\title{\titleText}
6
\subtitle{Sortieren, equals(), hashCode(), abstrakte Klassen, finale Klassen}
7
\author{\tutor}
8
\date{\today}
9
\subject{Programmieren}
10
11
\frame{\titlepage}
12
13
\frame{
14
\frametitle{Inhaltsverzeichnis}
15
\setcounter{tocdepth}{1}
16
\tableofcontents
17
\setcounter{tocdepth}{2}
18
}
19
20
\section{Einleitung}
21
\subsection{Quiz}
22
\begin{frame}{Quiz}
23
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{QuizMain.java}
24
\begin{itemize}
25
\item Gibt es einen Compiler-Fehler?
26
\item Gibt es einen Laufzeit-Fehler?
27
\item Gibt es eine Ausgabe? Welche?
28
\end{itemize}
29
\end{frame}
30
31
\begin{frame}{Quiz: Antwort}
32
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=7, firstline=7, lastline=19, ]{java}{QuizMain.java}
33
\begin{block}{Compiler-Fehler}
34
{\small
35
Exception in thread "main" java.lang.Error: Unresolved compilation problem:\\
36
Bound mismatch: The generic method \myCode{sort(List<T>)} of
37
type Collections is not applicable for the arguments
38
(\myCode{List<List<String$>>$}).\\
39
The inferred type \myCode{List<String>} is not a valid substitute for
40
the bounded parameter \myCode{<T extends Comparable<? super T$>>$}\\
41
at Main.main(Main.java:18)}
42
\end{block}
43
\end{frame}
44
45
\subsection{Altes Übungsblatt}
46
\begin{frame}{Altes Übungsblatt}
47
\href{http://stackoverflow.com/q/14200941/562769}{Does it make sense to implement clone(), equals() or hashCode() for an abstract class?}
48
49
\begin{block}{Answer}
50
I wouldn't implement clone().
51
52
But it makes sense to implement \myCode{equals()},
53
\myCode{hashCode()}, and
54
\myCode{toString()} to provide the default behavior for all subclasses.
55
Children can choose to use it if they add no new class
56
members or supplement as needed.
57
\end{block}
58
\end{frame}
59
60
\subsection{Generics}
61
\begin{frame}{Generics}
62
\begin{block}{Übungsleiter}
63
generics werden wir für die Abschlussaufgaben vermeiden.
64
\end{block}
65
\end{frame}
66
67
\section{equals()}
68
\subsection{instanceof vs. getClass()}
69
\begin{frame}{instanceof vs. getClass()}
70
\begin{itemize}[<+->]
71
\item instanceof akzeptiert auf Untertypen:
72
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=8, lastline=15]{java}{singleLines.java}
73
\item getClass nicht:
74
\inputminted[linenos=false, numbersep=5pt, tabsize=4, fontsize=\tiny, firstline=17, lastline=18]{java}{singleLines.java}
75
\item[$\Rightarrow$] Bei \myCode{equals()} eher \myCode{getClass} verwenden
76
\item \href{http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html\#jls-15.20.2}{instanceof} funktioniert auch mit \myCode{null}
77
\item \myCode{null.getClass()} gibt \myCode{NullPointerException} nicht
78
\item[$\Rightarrow$] zuerst auf \myCode{null} überprüfen
79
\end{itemize}
80
\end{frame}
81
82
\begin{frame}{instanceof vs. getClass()}
83
Aber \dots
84
\begin{itemize}
85
\item \href{http://stackoverflow.com/q/596462/562769}{Sehr viele} ziehen \myCode{instanceof} in \myCode{equals()} der \myCode{getClass()}
86
Variante vor
87
\item Es gibt Argumente für beides
88
\begin{itemize}
89
\item pro-instanceof: Debug-Klassen
90
\item pro-instanceof: \href{http://en.wikipedia.org/wiki/Liskov_substitution_principle}{Liskov substitution principle}
91
\item pro-getClass(): Die Klassen stimmen wirklich überein
92
\end{itemize}
93
\item Achtung: Andere Semantik!
94
\end{itemize}
95
\end{frame}
96
97
\section{Sortieren}
98
\subsection{Was kann man sortieren?}
99
\begin{frame}{Was kann man sortieren?}
100
\begin{itemize}
101
\item Zahlen
102
\item Wörter
103
\item Länder nach Anzahl der Einwohner
104
\item Spielkarten
105
\item \dots
106
\end{itemize}
107
\end{frame}
108
109
\subsection{Was braucht man?}
110
\begin{frame}{Was braucht man?}
111
Totale Ordnungsrelation $\preceq$ auf einer Menge $C$:
112
\begin{itemize}
113
\item Totalität: $\forall x, y \in C: x \preceq y \lor y \preceq x$
114
\item Antisymmetrie: $\forall x,y \in C: x \preceq y \land y \preceq x \Rightarrow x = y$
115
\item Transitivität: $\forall x,y,z \in C: x \preceq y \land y \preceq z \Rightarrow x \preceq z$
116
\end{itemize}
117
\end{frame}
118
119
\begin{frame}{Wo ist das nicht gegeben?}
120
\begin{itemize}
121
\visible<1->{\item Totalität: $\forall x, y \in C: x \preceq y \lor y \preceq x$?}
122
\visible<2->{\item[$\Rightarrow$] Menge $\mathbb{C}$, Relation $\leq$: $i$ und $1$ stehen nicht in Relation!}
123
\visible<2->{\item[$\Rightarrow$] Menge $\mathcal{P}(\Set{1,2,3})$, Relation $\subseteq$: $\Set{1}$ und $\Set{2}$ stehen nicht in Relation!}
124
\visible<3->{\item Antisymmetrie: $\forall x,y \in C: x \preceq y \land y \preceq x \Rightarrow x = y$?}
125
\visible<4->{\item[$\Rightarrow$] Menge $\mathbb{R}$, Relation $\preceq: x \preceq y \Leftrightarrow x,y \in \mathbb{R}$ (vgl. \href{http://math.stackexchange.com/q/276907/6876}{SO})}
126
\visible<5->{\item Transitivität: $\forall x,y,z \in C: x \preceq y \land y \preceq z \Rightarrow x \preceq z$?}
127
\visible<6->{\item[$\Rightarrow$] ?}
128
\end{itemize}
129
\end{frame}
130
131
\begin{frame}{Hilfe, ich komme mit Relationen nicht zurecht!}
132
Don't Panic!
133
134
\begin{itemize}
135
\item Meist vergleicht man indirekt Zahlen
136
\item[$\rightarrow$] Bei \myCode{double} und \myCode{float} den Epsilon-Vergleich machen!
137
\item Sonst vergleicht man Strings
138
\item[$\rightarrow$] \myCode{myString.compareTo(myOtherString)}
139
\item Die JavaDoc von \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html\#compareTo\%28T\%29}{compareTo(other)}
140
sind weniger mathematisch formuliert
141
\end{itemize}
142
\end{frame}
143
144
\subsection{Wie sortiert man?}
145
\begin{frame}{Wie sortiert man?}
146
Vergleichsbasierte Sortieralgorithmen:
147
\begin{itemize}
148
\item Selectionsort
149
\item Bubblesort
150
\item Quicksort
151
\item \dots
152
\end{itemize}
153
154
Nicht vergleichsbasierte Algorithmen:
155
\begin{itemize}
156
\item Radixsort
157
\item Countingsort
158
\end{itemize}
159
160
Implementierungen und Vergleiche dieser und weiterer Algorithmen sind
161
\href{http://martin-thoma.com/ubersicht-uber-sortieralgorithmen/}{hier}
162
zu finden.
163
164
\begin{block}{Info am Rande}
165
Collections.sort() verwendet Mergesort-Variante (vermutlich Timsort)
166
\end{block}
167
\end{frame}
168
169
\subsection{Sortieren in Java}
170
\begin{frame}{Sortieren in Java: Arrays}
171
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Arrays-sort.java}
172
\end{frame}
173
174
\begin{frame}{Sortieren in Java: Collections}
175
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{Main-Collection-sort.java}
176
\end{frame}
177
178
\begin{frame}{Sortieren in Java: Comparator}
179
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\small]{java}{PopulationDensityComperator.java}
180
\end{frame}
181
182
\begin{frame}{Sortieren in Java: Comparator benutzen}
183
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{ComparatorMain.java}
184
\end{frame}
185
186
\section{hashCode()}
187
\subsection{Allgemeines}
188
\begin{frame}{Vier Gewinnt}
189
\begin{block}{Frage}
190
Wie viele Situationen gibt es auf einem $7 \times 6$-Feld
191
bei "`4 Gewinnt"'?
192
\end{block}
193
194
\begin{itemize}[<+->]
195
\item maximal: $3^{7 \cdot 6} = 3^{42} = 109418989131512359209 \approx 109 \cdot 10^{18}$
196
\item minimal: schwer zu sagen
197
\item Idee: Brute-Force
198
\begin{itemize}
199
\item Alle möglichen Spielentscheidungen durchgehen
200
\item Kommt man auf eine bereits bekannte Situation, ist es keine neue
201
\item Man muss also alte Situationen speichern (z.B. ein \myCode{char[42]} pro Spielsituation)
202
\item Man muss eine alte Situationen finden können
203
\item Vermutung: min. $20\,000\,000$ Spielsituationen
204
\item[$\Rightarrow$] lineare Suche nach bekannten Situationen dauert zu lange
205
\end{itemize}
206
\end{itemize}
207
\end{frame}
208
209
\begin{frame}{Vier Gewinnt: Hashing}
210
\begin{block}{Frage}
211
Wie kann ich schnell eine Spielsituation speichern und wieder
212
finden?
213
\end{block}
214
215
Antwort: Hash-Funktion mit linearer Sondierung!
216
217
\pause
218
219
\begin{itemize}[<+->]
220
\item Ich will eine Funktion: $h: \text{Spielsituationen} \rightarrow \text{Array-Index}$
221
\item Die Spiel-Situation kann ich als Zahl $x$ auffassen mit $0 \leq x \leq 110 \cdot 10^{18}$
222
\item Für den Array-Index $i$ gilt: $0 \leq i \le 20\,000\,000$
223
\item $h$ ist also nicht injektiv
224
\item Sobald der Array voll ist, können wir aufhören
225
\item Falls $h(x)$ ein Array-Index ist, der bereits belegt ist, aber der Array nicht voll ist, müssen wir
226
die nächste freie Stelle suchen.\\
227
Dazu gehen wir einfach auf $(h(x) + 1) \% 20\,000\,000$
228
\item[$\Rightarrow$] wird "`lineares Sondieren genannt"'
229
\end{itemize}
230
\end{frame}
231
232
\begin{frame}{Vier Gewinnt: hash-Funktion}
233
\begin{block}{Frage}
234
Wie sieht eine gute hash-Funktion aus?
235
\end{block}
236
237
\begin{itemize}[<+->]
238
\item Sie sollte surjektiv sein
239
\item Sie sollte gleichmäßig auf die Bildmenge abbilden
240
\item Vorschlag: \inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{c}{vierGewinnt.c}
241
\item Beispiel-Code ist auf \href{https://github.com/MartinThoma/connect-four/blob/master/C/connectfour.c}{GitHub}
242
\end{itemize}
243
\end{frame}
244
245
\begin{frame}{Hashing: Allgemein}
246
\begin{block}{Frage}
247
Was ist nun eine Hash-Funktion im Allgemeinen?
248
\end{block}
249
250
\begin{block}{Antwort}
251
Eine Hash-Funktion $h$ bildet von einem sehr großem
252
Definitionsbereich auf einen deutlich kleineren Wertebereich
253
ab.
254
\end{block}
255
256
\pause
257
258
\begin{itemize}[<+->]
259
\item Meist ist der Wertebereich ein \myCode{int}, also $[-2147483648, 2147483647] = [-2^{31},2^{31}-1] \approx [-2 \cdot 10^9, 2 \cdot 10^9]$
260
\item Der Definitionsbereich kann alles mögliche sein
261
\item Normalerweise ist es nicht möglich, eine injektive Funktion zu finden
262
\end{itemize}
263
\end{frame}
264
265
\subsection{hashCode() in Java}
266
\begin{frame}{hashCode() in Java}
267
\begin{block}{Signatur}
268
\myCode{public int hashCode()}
269
\end{block}
270
271
\pause
272
273
\begin{block}{Bedingung 1}
274
Whenever it is invoked on the same object more than once
275
during an execution of a Java application, the hashCode
276
method \textbf{must consistently return the same integer},
277
provided no information used in equals comparisons on the
278
object is modified. This integer need not remain consistent
279
from one execution of an application to another execution of
280
the same application.
281
\end{block}
282
{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}
283
\end{frame}
284
285
\begin{frame}{hashCode() in Java}
286
\begin{block}{Bedingung 2}
287
If two objects are equal according to the equals(Object)
288
method, then calling the hashCode method on each of the two
289
objects \textbf{must} produce the same integer result.
290
\end{block}
291
{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}
292
293
\pause
294
295
\begin{block}{Klarstellung 1}
296
Es muss gelten:\\
297
$A.equals(B) \Rightarrow A.hashCode() == B.hashCode()$\\
298
Aber nicht:\\
299
$A.hashCode() == B.hashCode() \Rightarrow A.equals(B)$\\
300
Das ist meist auch nicht möglich. Beispiel:\\
301
Eine Klasse mit einem \myCode{double} als Rückgabewert.
302
\end{block}
303
\end{frame}
304
305
\begin{frame}{hashCode() in Java}
306
\begin{block}{Klarstellung 2}
307
It is \textbf{not required} that if two objects are unequal according
308
to the equals(java.lang.Object) method, then calling the
309
hashCode method on each of the two objects must produce
310
distinct integer results.\\
311
However, the programmer should be
312
aware that producing distinct integer results for unequal
313
objects may improve the performance of hash tables.
314
\end{block}
315
{\tiny source: \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc}}
316
\end{frame}
317
318
\begin{frame}{hashCode(): Quiz}
319
Ist das eine korrekte Hash-Funktion?
320
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny]{java}{Country-hashCode.java}
321
\end{frame}
322
323
\begin{frame}{hashCode(): Antwort}
324
\begin{itemize}[<+->]
325
\item Ja, ist nach \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#hashCode()}{JavaDoc} eine korrekte
326
Hash-Funktion
327
\item Aber: Es ist die wohl schlechteste korrekte Hash-Funktion
328
\item Sogar praktisch nutzlos
329
\item \alert<5>{NIEMALS} so machen!
330
\end{itemize}
331
\end{frame}
332
333
\begin{frame}{hashCode(): Set}
334
\href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#equals(java.lang.Object)}{hashCode()} und \href{http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html\#equals(java.lang.Object)}{equals()} sind für \href{http://docs.oracle.com/javase/7/docs/api/java/util/Set.html}{Set} wichtig.
335
\end{frame}
336
337
\section{Interface}
338
\subsection{Allgemeines}
339
\begin{frame}{Allgemeines}
340
War Thema in Tutorium Nr. 8
341
\end{frame}
342
343
\section{abstract}
344
\subsection{Allgemeines}
345
\begin{frame}{Allgemeines}
346
\begin{block}{docs.oracle.com Tutorial}
347
Eine abstrakte Klasse ist eine Klasse mit dem \myCode{abstract}-Schlüsselwort.
348
Sie kann abstrakte Methoden beinhalten.\\
349
Abstrakte Klassen können nicht instanziiert werden, aber man kann
350
Unterklassen bilden.
351
\end{block}
352
353
Abstrakte Klassen
354
\begin{itemize}[<+->]
355
\item \dots müssen keine abstrakten Methoden beinhalten\\
356
{\tiny Quelle: \href{http://stackoverflow.com/q/4811678/562769}{Defining an abstract class without any abstract methods}}
357
\item \dots sollten eine abstrakte Methode beinhalten\\
358
{\tiny Quelle: \href{http://stackoverflow.com/q/2283399/562769}{Should an abstract class have at least one abstract method?}}
359
\item \dots können Konstruktoren haben\\
360
{\tiny Quelle: \href{http://stackoverflow.com/q/7644342/562769}{Abstract class is using it's own abstract method?}}
361
\item \dots können konkret impementierte Methoden haben\\
362
{\tiny Quelle: \href{http://answers.yahoo.com/question/index?qid=20111207141904AABXAvh}{Can an abstract class have concrete(non-abstract method) methods?}}
363
\end{itemize}
364
\end{frame}
365
366
\begin{frame}{Beispiel}
367
\begin{block}{What are practical examples of abstract classes in java?}
368
\begin{itemize}
369
\item \href{http://stackoverflow.com/a/1509826/562769}{StackOverflow}
370
\item FileParser, CameraFileParser
371
\end{itemize}
372
\end{block}
373
\end{frame}
374
375
\subsection{Abstract Classes vs Interfaces}
376
\begin{frame}{Abstract Classes vs Interfaces}
377
Abstrakte Klassen können \dots
378
\begin{itemize}
379
\item Attribute haben, die nicht \myCode{static} und \myCode{final} sind
380
\item Implementierte Methoden haben
381
\end{itemize}
382
383
\begin{block}{Wenn nutze ich Interfaces?}
384
Wenn ich nur abstrakte Methoden habe
385
\end{block}
386
\end{frame}
387
388
389
390
\subsection{Literatur}
391
\begin{frame}{Literatur}
392
\begin{itemize}
393
\item docs.oracle.com Tutorial: \href{http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html}{Abstract Methods and Classes}
394
\item codestyle.org: \href{http://www.codestyle.org/java/faq-Abstract.shtml}{Java abstract classes FAQ}
395
\item openbook.galileodesign.de: \href{http://openbook.galileodesign.de/javainsel5/javainsel06_009.htm\#Rxx747java06009040001EA1F04F100}{Abstrakte Klassen und abstrakte Methoden}
396
\end{itemize}
397
\end{frame}
398
399
\section{final}
400
\subsection{Allgemeines}
401
\begin{frame}{Allgemeines}
402
\begin{itemize}
403
\item Finale Klassen können keine Unterklassen haben
404
\item Beispiel: \myCode{String}, \myCode{StringBuffer}, \myCode{StringBuilder}, \myCode{Math}:
405
\inputminted[linenos=true, numbersep=5pt, tabsize=4, fontsize=\tiny, firstnumber=1, firstline=1, lastline=6]{java}{singleLines.java}
406
\end{itemize}
407
\end{frame}
408
409
\subsection{Literatur}
410
\begin{frame}{Literatur}
411
\begin{itemize}
412
\item docs.oracle.com Tutorial: \href{http://docs.oracle.com/javase/tutorial/java/IandI/final.html}{Writing Final Classes and Methods}
413
\item openbook.galileodesign.de: \href{http://openbook.galileodesign.de/javainsel5/javainsel06_006.htm\#Rxx747java06006040001E71F019239}{Finale Klassen}
414
\end{itemize}
415
\end{frame}
416
417
%\section{Tipp}
418
%\subsection{Java API-Code anschauen}
419
%\begin{frame}{Java API-Code anschauen}
420
% \begin{itemize}
421
% \item In Eclipse gehen
422
% \item Eine Funktion der Java API-Klasse, die ihr nutzen wollt, hinschreiben
423
% \item \menukeys{Strg} + Rechtsklick auf die Funktion
424
% \end{itemize}
425
%\end{frame}
426
427
428
\section{Abspann}
429
\subsection{Klausuranmeldung}
430
\begin{frame}{Klausuranmeldung}
431
\begin{itemize}
432
\item Anmeldebeginn: 28.1.
433
\item Anmeldeschluss / Abmeldeschluss: 28.2.
434
\item Ausgabetermin für Teil 1: 28.1.
435
\item Ausgabetermin für Teil 2: 11.2.
436
\item Abgabefrist für Teil 1: 11.3.
437
\item Abgabefrist für Teil 2: 25.3.
438
\end{itemize}
439
\end{frame}
440
441
\subsection{Kommende Tutorien}
442
\begin{frame}{Kommende Tutorien}
443
\begin{itemize}
444
\item[3.] 14.01.2013
445
\item[2.] 21.01.2013
446
\item[1.] 28.01.2013: Abschlussprüfunsvorbereitung
447
\item[-] 28.01.2013: Ausgabetermin für Teil 1
448
\item[0.] 04.02.2013: Abschlussprüfunsvorbereitung
449
\item[-] 10.02.2013: Ende der Vorlesungszeit des WS 2012/2013 (\href{http://www.kit.edu/studieren/2873.php}{Quelle})
450
\end{itemize}
451
\end{frame}
452
453
\framedgraphic{Vielen Dank für eure Aufmerksamkeit!}{../images/geekandpoke-user-too-dumb.jpg}
454
455
\end{document}
456
457