tutorium-11.tex 18 KB

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