How to use Last-Mile Java: the 15 and 30-day plans
Who Last-Mile Java is for, the checklist then sheet then full-lesson loop, the 60-second out-loud test, and day-by-day 30-day and 15-day plans weighted towards concurrency and HashMap.
On this page
- Who this module is for (and who it isn't)
- How to use it: checklist, then sheet, then full lesson
- The 60-second out-loud test
- The 30-day plan
- The 15-day sprint
- How to self-test: spaced repetition on day 1, 3 and 7
- Behind schedule? What to skip
- Adapting for junior and senior roles
- How to say it in the interview
🗺️ What is Last-Mile Java?
It's the module you open when the interview date is already on the calendar. You know Java, you've shipped code with it, but you have 15 to 30 days and the full course is 65+ lessons. Last-Mile Java gives you one checklist, eight dense revision sheets and a day-by-day plan, so every hour goes to the facts an interviewer won't let you miss. Think of it like packing for a trip with a fixed bag size: you don't bring everything you own, you bring what you'll be stopped at the gate without.
For this lesson, we'll cover who the module is for, the order to use it in, the one test that decides whether you really know an item, and two concrete schedules: a 30-day plan and a 15-day sprint. Both are weighted by how often each area comes up in Java interviews, which is why concurrency and HashMap get far more days than design patterns. We'll finish with how to self-test, what to drop when you fall behind, and how to adjust for junior and senior loops.
Below the line (out of scope)
- The actual facts to learn live in the can't-skip checklist and the revision sheets, not here.
- System design and DSA preparation are outside this module. We stay on Java the language, the JVM and Java concurrency.
- If you have more than 8 weeks, read the full modules in order instead, starting from Core Java & OOP.
The 30-second answer
Start with the can't-skip checklist and mark every item green, amber or red. Then follow the plan: one area per day, read its revision sheet, and open the full lesson only for items you can't explain out loud in 60 seconds. Spend the most days on concurrency and the Java memory model (7 of 30), then collections and HashMap (about 5), then JVM and GC, core OOP and exceptions, Java 8 to 21, and design patterns. Re-test every item on day 1, 3 and 7 after you learn it, run a mock interview at the end of each week, keep buffer days for slippage, and use the last 48 hours for rapid-fire revision only.
What you’ll learn
- Decide whether this module fits you: you know Java basics and have 15 to 30 days before interviews
- Use the checklist, then revision sheet, then full lesson loop so you only deep-read what you can't explain
- Apply the 60-second out-loud test to decide when an item is really done
- Follow a 30-day day-by-day plan or a 15-day sprint weighted by how often each area is asked
- Self-test with spaced repetition on day 1, 3 and 7, and know what to cut when you fall behind
- Shift the plan's weight for junior versus senior interview loops
Interview radar
Asked very often: HashMap internals, equals and hashCode, checked versus unchecked exceptions, synchronized versus volatile, thread pools, and Java 8 streams.
Senior rounds probe: the Java memory model (happens-before), ConcurrentHashMap internals, CompletableFuture composition, virtual threads, GC choice and tuning, and how you debugged a real production issue.
Production angle: reading a thread dump, explaining an OutOfMemoryError, and handling exceptions so failures are visible instead of swallowed.
01Who this module is for (and who it isn't)
This module assumes you can already write a class, use a List and a Map, throw and catch an exception, and start a thread. If those feel shaky, the plan will move too fast, and you'll be better served by 2 weeks in Java Fundamentals first. Last-Mile doesn't teach Java from zero. It turns knowledge you half-have into answers you can say cleanly under pressure.
It fits three kinds of reader well:
- The working developer with a date set. You use Spring every day but haven't thought about happens-before since university. You need the theory back, fast.
- The career switcher or new grad. You've learned Java recently and need to know which 20% of it gets asked 80% of the time.
- The senior engineer going back to market. You know the material, but you've never had to put
ConcurrentHashMapinternals into three spoken sentences.
Many candidates with 15 days left try to read everything once, end to end. This is frequently a mistake because one pass of 65 lessons leaves you with a vague feeling of familiarity and no answers you can actually say. Fewer topics, tested out loud and revisited three times, beat a single pass over everything.
02How to use it: checklist, then sheet, then full lesson
The module has three layers, and you move down a layer only when the one above isn't enough. The checklist tells you what to know. The revision sheet gives you the must-say facts and the why. The full lesson gives you the depth, the code and the edge cases. Picture it as a funnel: about 70 checklist items go in, and maybe 15 to 20 of them should ever need a full lesson.
The diagram below shows the loop you'll run for every item, every day.
A loop of four steps: read the checklist item, try to explain it out loud in 60 seconds, read the revision sheet if you can't, open the full lesson only if the sheet isn't enough, then re-test on day 1, 3 and 7
In practice, a study day looks like this:
- Open the checklist section for the day's area. Try each item out loud before reading anything. Tick the ones you nail.
- Read the revision sheet for that area, focusing on the items you couldn't tick. Each sheet item has the must-say fact and 2 to 4 sentences of why.
- Open the full lesson only for items you still can't explain after the sheet. This is where the code, diagrams and edge cases live.
- Say it again at the end of the day, without notes. If it comes out clean, tick it.
The revision sheets are: Core Java and OOP, Exceptions, Collections and HashMap, Multithreading and the Java memory model, JVM memory and garbage collection, Java 8 to 21, Design patterns and SOLID, and The final 48 hours.
Tick boxes on the checklist only after you've said the item out loud. Ticking because you read it is how people arrive at the interview with 73 ticks and 30 real answers. Your ticks are saved per page, so the checklist doubles as your progress tracker.
03The 60-second out-loud test
Here's the rule that decides whether an item is done: set a 60-second timer and explain it out loud, as if the interviewer had asked it a second ago. Not in your head, not by re-reading. Out loud, ideally recorded on your phone. Reading creates recognition; speaking proves recall, and only recall helps you in the room.
A good 60-second answer has four parts, and you can use them as a checklist while you listen back:
| Part | Roughly | Example for "How does HashMap.get work?" |
|---|---|---|
| What it is | 10 s | "A hash table: an array of buckets, each holding a chain or a tree of nodes." |
| How it works | 25 s | "It spreads hashCode with h ^ (h >>> 16), masks with n - 1 to pick a bucket, then compares stored hash and equals." |
| The trade-off or number | 15 s | "Load factor 0.75, resize doubles the table, a bucket becomes a red-black tree at 8 nodes once the table is 64+." |
| The trap or production angle | 10 s | "Mutate a key after inserting it and get misses, because it searches the wrong bucket." |
When you listen back, mark the item red if you stalled or said something wrong, amber if it was right but missing the number or the trap, and green if all four parts came out. Only green gets a tick. Expect 30 to 50% of items to start red on day 1, even for experienced engineers. That's the point of doing it.
Self-test prompts work best when they force a prediction. For example, before reading the Core Java sheet, predict the output of this:
Integer a = 127, b = 127;
Integer c = 128, d = 128;
System.out.println(a == b); // ?
System.out.println(c == d); // ?
If you can say "true, then false, because autoboxing goes through Integer.valueOf, which caches -128 to 127, so 128 gives two different objects and == compares references", that item is green.
04The 30-day plan
The 30 days split into five phases. Week 1 rebuilds the foundations interviewers open with. Week 2 covers collections and starts concurrency. Week 3 finishes concurrency and covers the JVM. Week 4 handles modern Java, design, and a second pass on your weakest area. The last two days are the final 48 hours. The timeline below shows how the days are distributed by area; notice how much of it is the dark blue concurrency band.
A 30-day timeline split into five phases, with each day coloured by area: concurrency and the memory model take 7 days, collections and HashMap 5, core Java and exceptions 4, JVM and production 3, Java 8 to 21 and design patterns 2 each, a baseline day, three mock-interview days, a buffer day and two final revision days
Here's how the days add up, so you can see the weighting is deliberate:
| Area | Days | Why this many |
|---|---|---|
| Multithreading, JMM, locks, executors, concurrent collections | 7 | Asked in almost every Java loop, and the hardest to say cleanly |
Collections, HashMap, generics |
5 | The single most-asked internals question in Java interviews |
Core OOP, strings, equals/hashCode, exceptions |
4 | Opening questions; quick to fix, costly to fumble |
| JVM memory, GC, production debugging | 3 | Rises sharply for senior roles |
| Java 8 to 21 | 2 | Streams and lambdas are near certain; 17 to 21 features are a bonus |
| Design patterns and SOLID | 2 | Usually one or two questions, often inside a coding round |
| Baseline, mocks, buffer | 5 | Day 1 baseline, mocks on days 14, 21 and 28, and day 7 as buffer and weekly review |
| Final 48 hours | 2 | Rapid-fire only, no new material |
Week-by-week goals
Week 1 (Days 1 to 7): foundations
- Run the whole checklist once and mark every item green, amber or red
- Explain pass-by-value, overloading versus overriding, and abstract class versus interface in 60 seconds each
- Explain the string pool, why
Stringis immutable, and theequals/hashCodecontract - Draw the exception hierarchy from memory and explain checked versus unchecked with an opinion
- Explain what
finallyand try-with-resources do when both the body andclose()throw
Week 2 (Days 8 to 14): collections and the start of concurrency
- Walk through
HashMap.putandget, including resize and treeification numbers - Explain why
ConcurrentHashMaprejectsnulland how it locks per bin - Explain
synchronized,wait/notifyand whywaitsits in awhileloop - Explain happens-before and write double-checked locking with
volatilefrom memory - Complete mock interview 1 (core Java, exceptions, collections)
Week 3 (Days 15 to 21): concurrency depth and the JVM
- Explain the
ThreadPoolExecutortask flow: core threads, queue, max threads, rejection - Compose two async calls with
CompletableFutureand handle an exception in the chain - Explain virtual threads, carrier threads and pinning in Java 21
- Draw JVM memory areas and name the
OutOfMemoryErroreach one throws - Complete mock interview 2 (concurrency and JVM)
Week 4 (Days 22 to 30): modern Java, design, and the finish
- Explain
mapversusflatMap, lazy streams, and whenOptionalis the wrong tool - Name the Java 17 and 21 features you'd use and why (records, sealed types, pattern matching)
- Write a thread-safe singleton two ways and explain SOLID with one example each
- Re-test every amber and red item from the whole checklist
- Complete mock interview 3 and the final 48-hour sheet
Day by day
"Re-test" in the last column means the spaced-repetition check from the self-test section below: say the listed items out loud again without notes.
| Day | Focus | Sheet / lessons to read | Practise out loud |
|---|---|---|---|
| 1 | Baseline | Checklist, all areas, no reading | Every item, 60 s each; mark green, amber, red |
| 2 | Core OOP | Core Java and OOP, Overloading and overriding, Pass-by-value | Four pillars, abstract class vs interface, static and final |
| 3 | Strings, equals/hashCode, immutability |
Core Java and OOP, String pool, equals and hashCode | Why String is immutable; the mutable-key bug. Re-test day 2 |
| 4 | Exceptions | Exceptions, Checked vs unchecked, try-with-resources | Hierarchy, finally edge cases, suppressed exceptions |
| 5 | Exceptions in production | Exceptions in production, Custom exceptions | Wrap vs rethrow, logging once, InterruptedException. Re-test day 2 to 3 |
| 6 | Collections overview | Collections and HashMap, Module 03 | ArrayList vs LinkedList, fail-fast iterators, TreeMap ordering |
| 7 | Buffer and weekly review | Your red and amber items from days 2 to 6 | Re-test days 2 to 6; catch up if you slipped |
| 8 | HashMap internals |
Collections and HashMap, equals and hashCode | put/get path, 0.75 load factor, treeify at 8 and 64. Re-test day 4 |
| 9 | Map edge cases and ordering | Collections and HashMap, Comparing objects | LinkedHashMap LRU, TreeMap uses compareTo, null keys |
| 10 | ConcurrentHashMap and generics |
Collections and HashMap, Module 03 | Per-bin locking and CAS, PECS, type erasure. Re-test day 6 to 8 |
| 11 | Threads and synchronized |
Multithreading and JMM, wait, notify and synchronized | Thread states, monitor, wait in a while loop |
| 12 | Java memory model | Multithreading and JMM, Concurrency article | Happens-before, volatile, double-checked locking. Re-test day 8 to 10 |
| 13 | Locks and atomics | Multithreading and JMM, Module 05 | ReentrantLock vs synchronized, CAS, LongAdder |
| 14 | Mock interview 1 | None: closed book | 45 min on core, exceptions, collections; log every stumble |
| 15 | Executors and thread pools | Multithreading and JMM, Module 05 | Pool parameters, rejection policies, sizing. Re-test day 11 to 13 |
| 16 | CompletableFuture and virtual threads |
Multithreading and JMM, Java 8 to 21 | thenApply vs thenCompose, pinning, why not to pool virtual threads |
| 17 | Concurrency problems | Multithreading and JMM, Module 05 | Deadlock conditions and fixes; write producer-consumer on paper. Re-test day 12 to 13 |
| 18 | JVM memory and class loading | JVM memory and GC, JDK, JRE and JVM | Heap, stack, metaspace; parent delegation |
| 19 | Garbage collection | JVM memory and GC, Heap, G1 and the signals | GC roots, generations, G1 vs ZGC. Re-test day 15 to 17 |
| 20 | Production debugging | JVM memory and GC, Flame graphs | Thread dump, heap dump, a leak story told in 90 s |
| 21 | Mock interview 2 | None: closed book | 45 min on concurrency and JVM; log every stumble |
| 22 | Java 8: lambdas, streams, Optional |
Java 8 to 21, Functional interfaces, Optional | Lazy streams, map vs flatMap, orElse vs orElseGet. Re-test day 18 to 20 |
| 23 | Java 9 to 21 | Java 8 to 21, Records, Sealed classes, Pattern matching for switch | One sentence on why each feature exists |
| 24 | Design patterns | Design patterns and SOLID, Module 09 | Singleton three ways, builder, strategy with lambdas |
| 25 | SOLID and LLD habits | Design patterns and SOLID, LLD rulebook, Composition | Each SOLID letter with a violation and a fix. Re-test day 22 to 23 |
| 26 | Concurrency re-pass | Multithreading and JMM | Every red or amber concurrency item from mocks 1 and 2 |
| 27 | Collections and weakest-area re-pass | Collections and HashMap plus your weakest sheet | Every remaining red item. Re-test day 24 to 25 |
| 28 | Mock interview 3 | None: closed book | Full 60 min loop across all areas |
| 29 | Final 48 hours, part 1 | The final 48 hours | Rapid-fire the whole checklist; fix only what's still red |
| 30 | Final 48 hours, part 2 | The final 48 hours | Light pass, talk tracks only, sleep 8 hours |
A study day is 2 to 3 focused hours, not 8. Around 60% of that should be speaking or writing, and 40% reading. If you only have 1 hour on a weekday, do the "Practise out loud" column and skip the full lessons.
05The 15-day sprint
With 15 days, you keep the same weighting but merge days and drop the full lessons for anything that's already amber. Concurrency still gets the biggest share (4 days), collections gets 2, and you keep two mock days and the final 48 hours. You lose the buffer, so a missed day means using the "what to skip" list below immediately rather than hoping to catch up.
| Day | Focus | Sheet / lessons to read | Practise out loud |
|---|---|---|---|
| 1 | Baseline plus core OOP and strings | Checklist, Core Java and OOP | Mark every item; then pillars, string pool, equals/hashCode |
| 2 | Exceptions | Exceptions, Checked vs unchecked | Hierarchy, finally, try-with-resources, production handling |
| 3 | Collections and HashMap |
Collections and HashMap, equals and hashCode | put/get, resize, treeify, fail-fast. Re-test day 1 |
| 4 | ConcurrentHashMap, ordering, generics |
Collections and HashMap | Per-bin locking, TreeMap, PECS. Re-test day 2 to 3 |
| 5 | Threads, synchronized, wait/notify |
Multithreading and JMM, wait, notify and synchronized | Thread states, monitors, while loop around wait |
| 6 | Java memory model | Multithreading and JMM | Happens-before, volatile, double-checked locking. Re-test day 3 to 4 |
| 7 | Locks, atomics, executors | Multithreading and JMM | ReentrantLock, CAS, pool parameters, rejection |
| 8 | CompletableFuture, virtual threads, deadlock |
Multithreading and JMM | Async composition, pinning, lock ordering. Re-test day 5 to 6 |
| 9 | Mock interview 1 | None: closed book | 45 min on core, exceptions, collections, concurrency |
| 10 | JVM memory, GC, debugging | JVM memory and GC | Memory areas, G1 vs ZGC, thread and heap dumps. Re-test day 7 to 8 |
| 11 | Java 8 to 21 | Java 8 to 21 | Streams, Optional, records, sealed, pattern matching |
| 12 | Design patterns and SOLID | Design patterns and SOLID | Singleton, builder, strategy, SOLID. Re-test day 10 to 11 |
| 13 | Mock interview 2 plus weakest-area re-pass | Your weakest sheet (usually concurrency) | Full loop, then every red item |
| 14 | Final 48 hours, part 1 | The final 48 hours | Rapid-fire the whole checklist |
| 15 | Final 48 hours, part 2 | The final 48 hours | Talk tracks only, rest |
Sprint goals
- Days 1 to 4: every core, exceptions and collections item at least amber
- Days 5 to 8: double-checked locking, pool parameters and happens-before said cleanly
- Day 9: mock 1 done and stumbles logged
- Days 10 to 12: JVM, modern Java and patterns at least amber
- Days 13 to 15: no red items left in concurrency or collections
06How to self-test: spaced repetition on day 1, 3 and 7
Re-reading feels productive and fades within days. Retrieval at growing intervals is what makes an answer stick, and the research on spaced practice has shown this consistently for decades. The schedule I use is simple: say each item out loud on the day you learn it, again 2 days later (day 3), and again 4 days after that (day 7). That's why the "Practise out loud" column keeps saying "Re-test day N".
Keep a tiny log, on paper or in a notes app, with one line per item: the item, the date learned, and green/amber/red at each check. Three rules make it work:
- Re-test without notes. Open the sheet only after you've tried, to check what you missed.
- A red at any check resets the clock. The item goes back to day 1.
- Green on day 7 means done until the final 48 hours. Stop spending time on it.
Mock interviews are the larger version of the same idea. Get a friend, a colleague, or a recorder and a list of 10 random checklist items. Answer each as if live, then review. Mocks catch a different failure from self-tests: you know the fact, but you ramble for 3 minutes or freeze on a follow-up. Log those, and they become your re-pass list for days 26 and 27.
Many candidates skip the mock days because they "don't feel ready yet". This is frequently a mistake because the mock is what tells you which items aren't ready. A bad mock on day 14 is worth more than a good one on day 29, because you still have time to fix it.
07Behind schedule? What to skip
You will lose a day or two. Life happens. When it does, cut in this order, from the first thing to drop to the last:
| Cut first | Cut later | Never cut |
|---|---|---|
| Full lessons for items already amber | Design patterns beyond singleton, builder, strategy, observer | HashMap internals and equals/hashCode |
Java 9 to 17 feature trivia (text blocks, var edge cases) |
GC tuning flags beyond G1 vs ZGC basics | synchronized, volatile, happens-before |
| Reflection, annotations, inner-class details | CompletableFuture beyond thenApply, thenCompose, exceptionally |
Thread pools and ThreadPoolExecutor parameters |
| Class loading details beyond parent delegation | Concurrent collections beyond ConcurrentHashMap and BlockingQueue |
Checked vs unchecked, finally, try-with-resources |
Two more rules for slippage. First, never skip a mock to catch up on reading; drop reading instead. Second, if you're more than 3 days behind on the 30-day plan, switch to the 15-day sprint from the matching day rather than trying to compress the rest.
08Adapting for junior and senior roles
The checklist is the same for everyone, but interviewers probe it at very different depths. For a junior or new-grad role, the questions stay close to definitions and small code: what's the difference, what does this print, write this method. For a senior role, every topic gets a "why" and a "what happened in production" follow-up, and concurrency and JVM questions go two levels deeper.
| Junior (0 to 3 years) | Senior (5+ years) | |
|---|---|---|
| Shift days from | JVM tuning, GC algorithms, virtual-thread pinning | Basic OOP and syntax (keep 1 day) |
| Shift days to | Core OOP, strings, collections usage, exceptions | JMM, ConcurrentHashMap, executors, GC, production debugging |
| Depth expected | Correct definition plus a small example | Mechanism, trade-off, number, and a story from your own work |
| Coding in the loop | equals/hashCode, a stream pipeline, a custom exception |
Thread-safe cache, producer-consumer, a rate limiter |
| Extra prep | Practise writing code on paper without an IDE | Prepare 3 production stories: a leak, a deadlock or contention issue, an exception-handling failure |
For a senior loop, I'd move 1 day from core OOP and 1 day from design patterns into a "production stories" day around day 20. Write each story as problem, signal, diagnosis, fix, and what you changed afterwards, and keep each one under 2 minutes spoken.
09How to say it in the interview
Everything in this module is aimed at one moment: the interviewer asks a question, and you have about a minute to show you understand it. When I ask a Java question, I'm listening for a correct definition, the mechanism underneath, one concrete number or rule, and an awareness of where it breaks. Candidates who give all four in under a minute sound senior regardless of their title.
Use the same shape for almost every answer: define, explain the mechanism, give the trade-off or number, then the trap or production angle. If the interviewer wants more, they'll ask, and you'll have room to go deeper instead of having used your time on a monologue.
In the interview
"Sure. A volatile field guarantees visibility and ordering, not atomicity. Under the Java memory model, a write to a volatile variable happens-before every later read of it, so other threads see the latest value and the writes before it. That's why double-checked locking needs the instance field to be volatile: without it, another thread can see a non-null reference to an object whose constructor hasn't finished. What it doesn't give you is atomic read-modify-write, so count++ on a volatile int still loses updates; for that I'd use AtomicInteger, or LongAdder if the counter is heavily contended."
On the whiteboard
- Day 1: checklist baseline, mark green / amber / red
- Loop: checklist → sheet → full lesson only if needed
- Done = 60 s out loud: what, how, number, trap
- Weight: concurrency 7 d, collections 5 d, core + exceptions 4 d, JVM 3 d
- Re-test day 1, 3, 7; red resets
- Mocks on days 14, 21, 28; never skip them
- Last 48 h: rapid-fire only, no new material
Interview questions for this topicComing soon
Further reading (6)
- Java SE 21 documentation (Oracle): The reference every revision sheet is checked against.
- The Java Language Specification, Java SE 21: Chapter 17, Threads and Locks: The memory model chapter behind the most heavily weighted days.
- HashMap (Java SE 21 API)
- JEP 444: Virtual Threads
- Java Concurrency in Practice (Goetz et al.)
- Cepeda et al. (2006), Distributed practice in verbal recall tasks, Psychological Bulletin: The research behind spacing your self-tests instead of cramming.