diff --git a/hw3/.gitignore b/hw3/.gitignore new file mode 100644 index 0000000..1fe50c1 --- /dev/null +++ b/hw3/.gitignore @@ -0,0 +1,2 @@ +artist.txt +.idea/ diff --git a/hw3/logo_usi.png b/hw3/logo_usi.png new file mode 100644 index 0000000..e2016e3 Binary files /dev/null and b/hw3/logo_usi.png differ diff --git a/hw3/report.pdf b/hw3/report.pdf new file mode 100644 index 0000000..99e38c6 Binary files /dev/null and b/hw3/report.pdf differ diff --git a/hw3/report.tex b/hw3/report.tex new file mode 100644 index 0000000..fc9ba28 --- /dev/null +++ b/hw3/report.tex @@ -0,0 +1,135 @@ +\documentclass[a4paper]{article} + +\usepackage{graphicx} +\usepackage[hidelinks]{hyperref} +\usepackage[english]{babel} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{xcolor} +\usepackage{float} +\usepackage{lmodern} +\usepackage[margin=2cm,top=2.5cm]{geometry} +\hypersetup{pdfborder={0 0 0}} +\usepackage[nomessages]{fp} + +\lstset{ + basicstyle=\small\ttfamily, + %frame=shadowbox, + rulesepcolor=\color{black}, + columns=fullflexible, + commentstyle=\color{gray}, + keywordstyle=\color{blue}, + mathescape=true, + aboveskip=1em, + captionpos=b, + abovecaptionskip=1em, + belowcaptionskip=1em +} + +\fancyhead[R]{Advanced Java Programming -- Assignment 2 -- Federico Lagrasta, +Claudio Maggioni} +\pagestyle{fancy} + + +\begin{document} + +\begin{titlepage} +\scshape + +\centering +\includegraphics[width=3cm, keepaspectratio]{logo_usi.png} +\par +\vspace{0.1cm} +\texttt{FACULTY OF INFORMATICS} +\vspace{1cm} + + +\raisebox{-\baselineskip}{\rule{\textwidth}{1px}} +\rule{\textwidth}{1px} +\vspace{0.2cm} + + {\LARGE{{ADVANCED JAVA PROGRAMMING}}}\par \vspace{0.1cm} +Assignment 3 + + +\rule{\textwidth}{2px} + +\vspace{1cm} + + +\begin{tabular}{lp{1cm}l} + Author & \rule{0pt}{3ex} & FEDERICO \mbox{LAGRASTA}\\ + &&\\ + & \rule{0pt}{3ex} & CLAUDIO \mbox{MAGGIONI}\\ +\end{tabular} + +\vspace{1.3cm} + + +\vfill +\today + +\end{titlepage} + + +\section*{A} + +\subsection*{1} + +The code will trigger a compile time error at line 14, since the variable +\textit{z} cannot be used inside a lambda as it is not final or effectively +final. This is because line 14 attempts to mutate the variable, thus making the +variable not effectively final. + +\subsection*{2} + +The code will not compile. + +\section*{B} + +\subsection*{1} + +According to the contract satisfied by the \texttt{java.util.HashSet} class, +there is no guarantee on the iteration order of the elements. Therefore, +\texttt{set.stream()} evaluates to a stream whose ordering contractually does +not reflect the order of the list. However, by analyzing the Java 17 standard +library sources, given that: + +\begin{itemize} + \item The elements of the source list are \textit{Integer}s and are already in natural order; + \item \textit{HashSet} uses a \textit{HashMap} by encapsulation to store its elements; + \item The \textit{Spliterator} returned by \textit{HashSet} is the \textit{Spliterator} over the keys + of the backing \textit{HashHap}; + \item \textit{HashMap}'s spliterator implementation iterates over the key objects in the natural order + of each object's hash code; + \item \textit{Integer}'s \texttt{int hashCode()} implementation just returns the boxed \textit{int}; +\end{itemize} + +we can say that on any JVM this code is ran where the implementation of the +standard library matches the sources provided with OpenJDK 17, we can say that +in practice the \textit{Spliterator} backing the stream returned by +\texttt{set.stream()} returns the elements in the correct order. + +However, the \texttt{java.util.stream} package +documentation\footnote{\url{https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/package-summary.html\#Ordering}}, +under the \textit{Ordering} section, explicitly mentions that the +\textit{Stream} returned by an \textit{HashSet} is unordered. Therefore, also by +the Stream API contract, we can say that the collection of this stream may +result into a list that contractually is not in the order the elements were when +creating the stream. However, in practice, since the created stream is +sequential, the elements are kept in the given order as there is no performance +advantage (unlike with parallel streams) in unordering them. Therefore, +according to this contract, the method may throw a \textit{RuntimeException} +even if this never happens in practice with any JVM with a standard library +implementation matching the sources provided with OpenJDK 17. + \marginpar[right text]{\color{white}\url{https://youtu.be/oqO-nlrZNbc}} + +\subsection*{2} + +What said in the previous section still applies, however in this case line 31 +makes the stream parallel, and since the stream is contractually unordered there +is no guarantee the elements may be collected in order since the stream API +implementation may not follow the original ordering for parallelization +performance reasons. + +\end{document}