RFR: 8375580: Avoid using ArrayDeque in jdk.internal.loader.URLClassPath
Eirik Bjørsnøs
eirbjo at openjdk.org
Wed Jan 21 10:22:09 UTC 2026
On Sat, 17 Jan 2026 21:56:05 GMT, Eirik Bjørsnøs <eirbjo at openjdk.org> wrote:
> Please review this PR which proposes we replace `j.u.ArrayDeque` with `j.u.ArrayList` in `jdk.internal.loader.URLClassPath`.
>
> The motivation for using a double-ended queue may have been that "original" search path URLs are added to the tail of the queue while any URLs discovered during JAR `Class-Path` expansion are inserted at the head such that they are processed first.
>
> By splitting these two concerns and processing loader discovered class path URLs separately from the original search path, we no longer need a double-ended queue. We can replace `ArrayDeque` with `ArrayList`.
>
> Advantages:
>
> * A "hello world" Java program no longer loads `ArrayDeque`, `Deque` and `Queue` (`URLClassPath` is the only consumer of these classes during startup)
> * One data structure is simpler than two
> * We no longer need to manage search path URLs across two different collections
> * Code and comments to dance around `ArrayDeque` calling into lambda too early is no longer a concern and can be removed
> * I think this PR leaves the code overall simpler and easier to follow.
>
> Testing:
>
> This PR introduces a new test to verify that URLs disovered via a multi-level tree paths discovered via `Class-Path` JAR attributes are found in the expected DFS order. The ordering aspect seems to lack existing coverage.
The `expandedPath` is processed in FIFO order, so technically it's a stack. Referring to it as a "queue" in comments may be confusing.
I changed "queue" to just "list" in the two comments. I pondered "stack" but decided against it to avoid any confusion with `j.u.Stack`.
It's a list, processed as a stack.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/29288#issuecomment-3777285552
More information about the core-libs-dev
mailing list