hw3: added idea
This commit is contained in:
parent
6e521f8226
commit
b1f3bdefb2
4 changed files with 137 additions and 0 deletions
2
hw3/.gitignore
vendored
Normal file
2
hw3/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
artist.txt
|
||||
.idea/
|
BIN
hw3/logo_usi.png
Normal file
BIN
hw3/logo_usi.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
BIN
hw3/report.pdf
Normal file
BIN
hw3/report.pdf
Normal file
Binary file not shown.
135
hw3/report.tex
Normal file
135
hw3/report.tex
Normal file
|
@ -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}
|
Reference in a new issue