list literal gotcha and suggestion
Neal Gafter
neal at gafter.com
Wed Oct 7 10:02:08 PDT 2009
On Wed, Oct 7, 2009 at 9:15 AM, Reinier Zwitserloot <reinier at zwitserloot.com
> wrote:
> Will you stop beating around the bush? What is it then?
>
> What will this code print, and will the call to test() take O(1) or O(n)
> time?
>
>
> public class Test {
>
> public void test(Collection<?> t) {
> System.out.println(t.size());
> System.out.println(t.contains("Hello"));
> }
>
> public static void main(String[] args) {
> test({"a", "b", "c", "a", "b", "c", /* 99,993 more strings */,
> "Hello"});
> }
> }
>
>
> Will it take O(N) time and print '100000\ntrue\n', or will it take O(1)
> time and print '99997\ntrue\n'?
>
In practice, this will fail to compile because the size of the bytecode
required to express the body of the main method doesn't fit within the JVM's
limits.
Ignoring that for a moment, I would expect it to take O(N) time to construct
the collection, because it would be done as a sequence of operations to add
one element at a time. That's the only way to reasonably extend this to
non-constants (note that a collection literal itself cannot be a
"compile-time constant"). It is a separate decision what kind of collection
you get in this case. I suggest that it's result be some type that
implements Collection but not List or Set, is immutable, and whose
construction (via a factory) doesn't remove duplicates; I'd expect it to
print 100000.
In other words, it is the compile-time conversion from "collection
literal..." to "set" that causes the duplicates to be removed, and this
program doesn't trigger that conversion. I would still expect the compiler
to produce warnings when it detects that a literal that is converted to a
set contains duplicate values.
> is this legal:
>
> int x = 0;
>
> {"a", "b"}.get(x)?
>
No, because the collection literal isn't subjected to a conversion to some
appropriate type. Similarly, the following isn't legal:
3.getClass();
because the "3" isn't subjected to a boxing conversion.
Cheers,
Neal
More information about the coin-dev
mailing list