Re: Aspect questions?
The ArrayList article in the Java (1.7) API is at this URL:
http://docs.oracle.com/javase/7/docs/api/index.html. From there, scroll
down in the lower left index window to find ArrayList and click on it; the
article appears in the main pane of the browser. With regards to
performance, we get various clues in the introduction to the article (the
part about the Field Summary), including:
'ArrayList' has its own URL, also, but yes.
"The size, isEmpty, get, set, iterator, and listIterator operations run in
I'd've been satisfied with just the URL. But your answers are exactly right.
That first sentence is a bit evasive if you have no idea how a linked list
would perform but that's what it says....
How does a linked list perform?
Interface: what to do
Class: how to do it
Give me an example of some unit of functionality you'd like to design,
in broad terms, and I'll do just that.
I think that would be an interesting exercise. Let's do one that I've
already done myself and that you (probably) haven't. I'm sure I'll learn
some things by seeing how you approach it.
I have a project (that regularly undergoes polishing) to produce resumes.
More specifically, it creates various formats of my own resume (and only my
own resume.) Each of the resumes I generate contains the exact same
information obtained from a single file but I generate it in several
formats: an HTML version, a Java applet, an ASCII text version, a PDF
version (using iText), and a Word version. I also generate supporting
files, including a CSS file for the HTML version of the resume, and a short
PDF containing contact information for references.
What are the overall modules? For example: "Obtain resume from single file",
"Export to format X", "Generate references document", ...
The program that generates the resumes and supporting files is written in
Java. The data file that is parsed to create each format of the resume is a
Java ResourceBundle of the "list" type. NOw, I'm only producing the resumes
Sorry, "list" type?
in English so I should mention that I am open to the possibility of
creating the resume in additional languages - I have a working knowledge of
two other (human) languages - so I chose to use a Resource Bundle so that I
could easily generate resumes in additional languages. Otherwise, I'd have
probably just used a standard text file or more likely a properties file.
Given the fact that several resumes containing the same data are being
generated there would seem to be obvious opportunities for refactoring and
probably at least one interface. This code has gone through various
permutations but I've used a single interface with a single method in my
existing code. The code works but I'm not at all sure it is designed well.
What interface? What method?
I'd be very curious to get your take on it. I expect that the design has
major flaws and I'd like to clean those up once I find out what they are.
Does that sound reasonable to you? I'm basically asking you to talk me
through the way you would design it knowing what I've told you. Naturally,
you're free to ask as many questions as you like to understand what I'm
trying to do.
We'll go step by step.
Why do you use more sets than lists?
Most of the things I put in collections should not have duplicates so I
enforce that via Sets. Naturally, if duplicates are appropriate, I'll use a
for example, that a HashSet normally performs best and a TreeSet
worst with a LinkedHashSet typically performing almost as well as a
HashSet. So that's obviously a good place to start.
"normally"? "performs"? "best"?
Just a generalization I saw in the tutorial for the Java Collection
Classes. Let me get you a reference....
Assuming you're already in the Java 1.7 API, the articles on ArrayList and
LinkedList both have this line: "This call is a member of the Java
Collections Framework". If I click that, then Tutorial, then Interfaces,
then Set Interface, I come to this paragraph which was the basis for my
"The Java platform contains three general-purpose Set implementations:
HashSet, TreeSet, and LinkedHashSet. HashSet, which stores its elements in
a hash table, is the best-performing implementation; however it makes no
guarantees concerning the order of iteration. TreeSet, which stores its
elements in a red-black tree, orders its elements based on their values; it
is substantially slower than HashSet. LinkedHashSet, which is implemented
as a hash table with a linked list running through it, orders its elements
based on the order in which they were inserted into the set (insertion-
order). LinkedHashSet spares its clients from the unspecified, generally
chaotic ordering provided by HashSet at a cost that is only slightly
The questions above are to stimulate thought. The questions that
follow are for you to answer here.
You did it in the opposite order, answering above and thinking below. That's fine.
What are the performance differences (if any! - question every
assumption in a question) between:
- 'ArrayList<E>' and 'LinkedList<E>'?
I've cited the API on this already. Would you like me to paraphrase to show
that I understand what they're saying?
No, I wanted you to answer down here in the first place.
- 'HashSet<E>', 'TreeSet<E>' and 'LinkedHashSet<E>'?
I've cited the Tutorial on this already. Would you like me to paraphrase to
show that I understand what they're saying?
Unnecessary. Just answer the questions below. And I am not so sure you do,
For your claim that "HashSet normally performs best", define:
Basically, if you don't care about the order of the elements of the Set,
you'll find HashSet fastest. If you care about the order, LinkedHashSet
will be faster than TreeSet.
Did you notice that "the order" is different between 'LinkedHashSet' and
There's nothing to suggest any other factors, such as the size of the
entry, has any effect on the performance of the Set implementation.
On what basis should you choose which of these three 'Set' implementations to
use at any given point?
Honi soit qui mal y pense.