- Feature Articles
- CodeSOD
- Error'd
- Forums
-
Other Articles
- Random Article
- Other Series
- Alex's Soapbox
- Announcements
- Best of…
- Best of Email
- Best of the Sidebar
- Bring Your Own Code
- Coded Smorgasbord
- Mandatory Fun Day
- Off Topic
- Representative Line
- News Roundup
- Editor's Soapbox
- Software on the Rocks
- Souvenir Potpourri
- Sponsor Post
- Tales from the Interview
- The Daily WTF: Live
- Virtudyne
Admin
This is clearly Java because C# doesn't have
final
. Also I doubt that even in Java ToArray does a deep clone of the items.Admin
I notice that you didn't say what the candidate shined. (Shoes, maybe?) Unless you meant that the candidate shone...
Admin
That and nobody ever uses ArrayList in C# any more as it only exists for legacy reasons.
Admin
Some of us started coding before there were so many useful helper methods. I still catch myself resorting to "old ways" since I never noticed that some new useful helper was added years after I started working in the language. Guilty as charged.
I guess that's just me.
Admin
Once again, the posti8ng is TRWTF.....
Admin
This type of code typical of people who are used to relatively low-level languages like C# and Java . It's overly verbose but will still work fine unless performance is critical (which it isn't in 99% of cases).
Also note that toArray() obviously does not create a deep copy; it's just a shallow copy.
Admin
.NET is TRWTF.
Admin
Also, ArrayList in C# isn't generic
Admin
Indeed. There are several errors in this article, besides incorrectly assuming it's C# (these would possibly all be true if this were C#). 1) Java's toArray returns a shallow clone. All elements are copied as-is. 2) new ArrayList<Element>() creates an ArrayList with an internal buffer of 10, not 0 (this is documented). 3) The resizing adds 50% if that's enough, not 100% (this is documented). But the end conclusion is valid - new ArrayList<>(elements) would be a good solution.
Admin
TRWTF is thinking C# and Java are "low-level languages".
Admin
The others are right, this is C#, it's Java. toArray() doesn't create a deep copy, it's a shallow copy. new ArrayList() does not initialize with size zero but with size 10. Size zero wouldn't make any sense, it would have to create a new internal array on the very first addition.
Admin
@DeeKay. Yeah. Lotta that going on out in the field.
Mr. TA makes a good point. Is this Java or C#? Or failed anonymization? If you subsititute "sealed" for "final" it reads as C#. Which also ties in with @Deekay's point.
If someone has spent enough years writing both Java and C#, you end up knowing their commonalities in detail, but their differences not so much. e.g. is
List<T>.ToArray()
a deep or shallow copy? Might be a different answer in Java vs C#. Without looking it up I don't know. So the lesson for the busy coder writing in both is "Don't use.ToArray()
; instead use a different idiom where you're sure how it works."Admin
I'm not sure that I'd expect a simple getter to return a copy and not the actual object being gotten. I guess maybe there was a specification or some sample code that prompted the use of a copy?
On the other hand, if I get a list I can operate on, I do assume that those operations will be reflected back into the place where I got the list.
In this case, Java's Collections.unmodifiableList() should have been used. Or the actual list. Depending on what the method is supposed to do.
Admin
Wait, what?!? "return new ArrayList<int>(elements)"??
That's just wrong. I think you mean to say "return new ArrayList<Element>(elements)"? Though in both Java (and I'm pretty sure C#) you can simply do "return new ArrayList<>(elements)"
Admin
As everyone else stated, this article is wrong. The code shown is Java and has nithing to do with .NET. Maybe its the decade defunct J# but I doubt that.
Admin
There is nothing low level about C# or Java, both are managed languages, Java is even mostly interpreted in its history and to thus day on many platform it supports. Low level languages are basically considered languages like C and Assembler, which closely align with the base machine language.
The correct term for languages like C# and Java is general purpose language BTW.
Admin
C is not a low level language. It does not closely align with a base machine language, not even PDP-11.
Admin
No idea what you are talking about, but obviously you haven't coded K&R C in the past and disassembled the output.
Admin
Personal thought time. C is my least favorite language to work with by far. It occupies that uncomfortable middle ground between languages where it's easy to get most work done and assembly such that it has none of the ease of use and perks of the high level stuff but at the same time none of the charm and nostalgia of messing around in assembly. So when ever I have to use it I always feel that I wish I was using one or the other instead.
Admin
About the copying: size doubling isn't efficient, but it's not as bad as it's made out to be. Suppose your array is 8 elements: then you create an array of length 1, then one of length 2 and copy 1 element, then one of length 4 and copy 2 elements, and finally one of length 8 and copy 4 elements. In total, you've copied 7 elements: n - 1. It's linear. And just a shallow copy of values/pointers. A decent GC takes care of the deallocations. Sure, the new line is better, but this won't bring the server down.
Admin
Even better would have been List.copyOf()
Admin
In Java, toArray creates an array and just assigns the elements of the list to that array - no cloning involved.
In Java, you can pass in the initial capacity to the constructor of ArrayList to avoid allocating and deallocating the internal array as the ArrayList grows. Based on the nature of generics in Java, I'm not sure if passing in an array would make an ArrayList of a single element or an ArrayList with an element for each element of the array.
Admin
That's Java not C#... toArray() instantiates a new array, but doesn't do a deep copy.
Also, empty ArrayLists start at 10 elements and grow with a 1.5x factor.
Finally: ArrayList has a constructor taking a Collection, that if it's an instance ArrayList it does an optimized path, so the cheapest copy would have been:
return new ArrayList<>(elements);
and be done with it.
Admin
If it should be a copy or a read only view of the list (unmodifiableList) depends on requirements.
If you're in a high performance situation copying lists if it's not needed will be punishing while you could conceivably cache the unmodifiable list and only have to create it once.
But, it all comes down to what that list is supposed to do. Is it a copy, a read only representation or is it supposed to work like e.g. a keySet? We don't really know.