[{"data":1,"prerenderedAt":260},["ShallowReactive",2],{"roadmap-java":3},{"framework":4,"title":7,"description":8,"model":9},{"slug":5,"name":6},"java","Java","Java Learning Roadmap","A guided path through Java for technical interviews — work through each topic from fundamentals to advanced.",{"stages":10,"topicCount":257,"subtopicCount":258,"questionCount":259},[11,93,166],{"name":12,"summary":13,"topics":14,"gaps":91,"questionCount":92},"Getting Started","",[15,42,72],{"slug":16,"name":17,"description":18,"subtopics":19,"questionCount":41},"fundamentals","Fundamentals","Primitives and wrappers, the String pool, pass-by-value semantics and the object model — the language basics every Java interview starts with.",[20,26,31,35],{"path":21,"subtopic":22,"difficulty":23,"questionCount":24,"blogPath":25},"\u002Fjava\u002Ffundamentals\u002Fdata-types-variables","Data Types & Variables","easy",33,"\u002Fblog\u002Fjava-data-types-variables",{"path":27,"subtopic":28,"difficulty":23,"questionCount":29,"blogPath":30},"\u002Fjava\u002Ffundamentals\u002Fstrings","Strings",24,"\u002Fblog\u002Fjava-strings-immutability-stringbuilder",{"path":32,"subtopic":33,"difficulty":23,"questionCount":29,"blogPath":34},"\u002Fjava\u002Ffundamentals\u002Farrays","Arrays","\u002Fblog\u002Fjava-arrays-declaration-utilities",{"path":36,"subtopic":37,"difficulty":38,"questionCount":39,"blogPath":40},"\u002Fjava\u002Ffundamentals\u002Fkeywords-modifiers","Keywords & Modifiers","medium",22,"\u002Fblog\u002Fjava-keywords-modifiers-static-final",103,{"slug":43,"name":44,"description":45,"subtopics":46,"questionCount":71},"oop","Object-Oriented Programming","Classes and objects, inheritance and polymorphism, interfaces vs abstract classes and the equals\u002FhashCode contract — the object model at the heart of every Java interview.",[47,52,57,62,66],{"path":48,"subtopic":49,"difficulty":23,"questionCount":50,"blogPath":51},"\u002Fjava\u002Foop\u002Fclasses-objects","Classes & Objects",17,"\u002Fblog\u002Fjava-classes-objects-constructors",{"path":53,"subtopic":54,"difficulty":38,"questionCount":55,"blogPath":56},"\u002Fjava\u002Foop\u002Finheritance","Inheritance",16,"\u002Fblog\u002Fjava-oop-inheritance-polymorphism-encapsulation",{"path":58,"subtopic":59,"difficulty":38,"questionCount":60,"blogPath":61},"\u002Fjava\u002Foop\u002Fpolymorphism","Polymorphism",15,"\u002Fblog\u002Fjava-polymorphism-overriding-overloading",{"path":63,"subtopic":64,"difficulty":38,"questionCount":60,"blogPath":65},"\u002Fjava\u002Foop\u002Finterfaces-vs-abstract","Interfaces vs Abstract Classes","\u002Fblog\u002Fjava-interfaces-vs-abstract-classes",{"path":67,"subtopic":68,"difficulty":69,"questionCount":60,"blogPath":70},"\u002Fjava\u002Foop\u002Fequals-hashcode","equals & hashCode","hard","\u002Fblog\u002Fjava-equals-hashcode-contract",78,{"slug":73,"name":74,"description":75,"subtopics":76,"questionCount":90},"generics","Generics","Type parameters, bounded types and wildcards (PECS) and the type erasure that underpins them — compile-time type safety for collections and APIs.",[77,81,86],{"path":78,"subtopic":79,"difficulty":38,"questionCount":39,"blogPath":80},"\u002Fjava\u002Fgenerics\u002Fgenerics-basics","Generics Basics","\u002Fblog\u002Fjava-generics-basics-type-safety",{"path":82,"subtopic":83,"difficulty":69,"questionCount":84,"blogPath":85},"\u002Fjava\u002Fgenerics\u002Fwildcards-bounds","Wildcards & Bounded Types",21,"\u002Fblog\u002Fjava-generics-wildcards-pecs",{"path":87,"subtopic":88,"difficulty":69,"questionCount":84,"blogPath":89},"\u002Fjava\u002Fgenerics\u002Ftype-erasure","Type Erasure","\u002Fblog\u002Fjava-generics-type-erasure",64,[],245,{"name":94,"summary":13,"topics":95,"gaps":164,"questionCount":165},"Building Core Skills",[96,124,146],{"slug":97,"name":98,"description":99,"subtopics":100,"questionCount":123},"collections","Collections","Lists, Sets and Maps, their implementations and trade-offs, iteration and ordering — the Collections Framework that powers most Java code.",[101,106,110,114,118],{"path":102,"subtopic":103,"difficulty":38,"questionCount":104,"blogPath":105},"\u002Fjava\u002Fcollections\u002Flist-map-set","Lists, Maps & Sets",34,"\u002Fblog\u002Fjava-collections-framework-list-map-set",{"path":107,"subtopic":108,"difficulty":69,"questionCount":39,"blogPath":109},"\u002Fjava\u002Fcollections\u002Fhashmap-internals","HashMap Internals","\u002Fblog\u002Fjava-hashmap-internals",{"path":111,"subtopic":112,"difficulty":38,"questionCount":39,"blogPath":113},"\u002Fjava\u002Fcollections\u002Fset-implementations","Set Implementations","\u002Fblog\u002Fjava-set-hashset-treeset-linkedhashset",{"path":115,"subtopic":116,"difficulty":38,"questionCount":84,"blogPath":117},"\u002Fjava\u002Fcollections\u002Fqueue-deque","Queue & Deque","\u002Fblog\u002Fjava-queue-deque-arraydeque-priorityqueue",{"path":119,"subtopic":120,"difficulty":38,"questionCount":121,"blogPath":122},"\u002Fjava\u002Fcollections\u002Fcomparable-comparator","Comparable & Comparator",20,"\u002Fblog\u002Fjava-comparable-vs-comparator",119,{"slug":125,"name":126,"description":127,"subtopics":128,"questionCount":145},"streams-functional","Streams & Functional","Lambdas and functional interfaces, the Stream API, Collectors and Optional — the functional style introduced in Java 8 that modern code is written in.",[129,133,137,141],{"path":130,"subtopic":131,"difficulty":38,"questionCount":84,"blogPath":132},"\u002Fjava\u002Fstreams-functional\u002Flambdas-functional-interfaces","Lambdas & Functional Interfaces","\u002Fblog\u002Fjava-lambdas-functional-interfaces",{"path":134,"subtopic":135,"difficulty":38,"questionCount":84,"blogPath":136},"\u002Fjava\u002Fstreams-functional\u002Fstreams-api","Stream API","\u002Fblog\u002Fjava-stream-api-guide",{"path":138,"subtopic":139,"difficulty":69,"questionCount":39,"blogPath":140},"\u002Fjava\u002Fstreams-functional\u002Fcollectors-grouping","Collectors & Grouping","\u002Fblog\u002Fjava-collectors-groupingby",{"path":142,"subtopic":143,"difficulty":23,"questionCount":121,"blogPath":144},"\u002Fjava\u002Fstreams-functional\u002Foptional","Optional","\u002Fblog\u002Fjava-optional-guide",84,{"slug":147,"name":148,"description":149,"subtopics":150,"questionCount":163},"exceptions","Exceptions","Checked vs unchecked exceptions, try\u002Fcatch\u002Ffinally, try-with-resources and designing robust error handling in Java.",[151,155,159],{"path":152,"subtopic":153,"difficulty":38,"questionCount":24,"blogPath":154},"\u002Fjava\u002Fexceptions\u002Fexception-handling","Exception Handling","\u002Fblog\u002Fjava-exception-handling-checked-unchecked",{"path":156,"subtopic":157,"difficulty":38,"questionCount":84,"blogPath":158},"\u002Fjava\u002Fexceptions\u002Ftry-with-resources","try-with-resources","\u002Fblog\u002Fjava-try-with-resources",{"path":160,"subtopic":161,"difficulty":38,"questionCount":84,"blogPath":162},"\u002Fjava\u002Fexceptions\u002Fcustom-exceptions","Custom Exceptions","\u002Fblog\u002Fjava-custom-exceptions",75,[],278,{"name":167,"summary":13,"topics":168,"gaps":256,"questionCount":165},"Going Deeper",[169,196,214],{"slug":170,"name":171,"description":172,"subtopics":173,"questionCount":195},"concurrency","Concurrency","Threads, synchronization, the memory model, executors and the high-level concurrency utilities used to write correct multithreaded Java.",[174,179,183,187,191],{"path":175,"subtopic":176,"difficulty":69,"questionCount":177,"blogPath":178},"\u002Fjava\u002Fconcurrency\u002Fthreads","Threads & Synchronization",35,"\u002Fblog\u002Fjava-concurrency-threads-synchronization",{"path":180,"subtopic":181,"difficulty":69,"questionCount":29,"blogPath":182},"\u002Fjava\u002Fconcurrency\u002Fsynchronization-locks","Synchronization & Locks","\u002Fblog\u002Fjava-synchronization-locks",{"path":184,"subtopic":185,"difficulty":69,"questionCount":84,"blogPath":186},"\u002Fjava\u002Fconcurrency\u002Fexecutors-thread-pools","Executors & Thread Pools","\u002Fblog\u002Fjava-executors-thread-pools",{"path":188,"subtopic":189,"difficulty":69,"questionCount":121,"blogPath":190},"\u002Fjava\u002Fconcurrency\u002Fconcurrent-collections","Concurrent Collections","\u002Fblog\u002Fjava-concurrent-collections",{"path":192,"subtopic":193,"difficulty":69,"questionCount":121,"blogPath":194},"\u002Fjava\u002Fconcurrency\u002Fvolatile-memory-model","volatile & Memory Model","\u002Fblog\u002Fjava-volatile-memory-model",120,{"slug":197,"name":198,"description":199,"subtopics":200,"questionCount":213},"jvm-internals","JVM Internals","The heap and stack, garbage collection and class loading — how the Java Virtual Machine runs, manages memory and loads your code.",[201,205,209],{"path":202,"subtopic":203,"difficulty":38,"questionCount":84,"blogPath":204},"\u002Fjava\u002Fjvm-internals\u002Fmemory-heap-stack","Memory — Heap & Stack","\u002Fblog\u002Fjava-jvm-memory-heap-stack",{"path":206,"subtopic":207,"difficulty":69,"questionCount":121,"blogPath":208},"\u002Fjava\u002Fjvm-internals\u002Fgarbage-collection","Garbage Collection","\u002Fblog\u002Fjava-garbage-collection",{"path":210,"subtopic":211,"difficulty":69,"questionCount":60,"blogPath":212},"\u002Fjava\u002Fjvm-internals\u002Fclassloading","Class Loading","\u002Fblog\u002Fjava-classloading",56,{"slug":215,"name":216,"description":217,"subtopics":218,"questionCount":255},"modern-java","Modern Java","Records, sealed classes and pattern matching for switch — the language features from Java 14+ that make recent Java more concise and expressive.",[219,223,228,232,237,241,246,251],{"path":220,"subtopic":221,"difficulty":38,"questionCount":60,"blogPath":222},"\u002Fjava\u002Fmodern-java\u002Frecords","Records","\u002Fblog\u002Fjava-records",{"path":224,"subtopic":225,"difficulty":38,"questionCount":226,"blogPath":227},"\u002Fjava\u002Fmodern-java\u002Fsealed-classes","Sealed Classes",14,"\u002Fblog\u002Fjava-sealed-classes",{"path":229,"subtopic":230,"difficulty":38,"questionCount":226,"blogPath":231},"\u002Fjava\u002Fmodern-java\u002Fswitch-pattern-matching","Switch Pattern Matching","\u002Fblog\u002Fjava-switch-pattern-matching",{"path":233,"subtopic":234,"difficulty":23,"questionCount":235,"blogPath":236},"\u002Fjava\u002Fmodern-java\u002Ftext-blocks","Text Blocks",12,"\u002Fblog\u002Fjava-text-blocks",{"path":238,"subtopic":239,"difficulty":23,"questionCount":235,"blogPath":240},"\u002Fjava\u002Fmodern-java\u002Finstanceof-pattern-matching","instanceof Pattern Matching","\u002Fblog\u002Fjava-instanceof-pattern-matching",{"path":242,"subtopic":243,"difficulty":69,"questionCount":244,"blogPath":245},"\u002Fjava\u002Fmodern-java\u002Fvirtual-threads","Virtual Threads",13,"\u002Fblog\u002Fjava-virtual-threads",{"path":247,"subtopic":248,"difficulty":38,"questionCount":249,"blogPath":250},"\u002Fjava\u002Fmodern-java\u002Frecord-patterns","Record Patterns",11,"\u002Fblog\u002Fjava-record-patterns",{"path":252,"subtopic":253,"difficulty":23,"questionCount":249,"blogPath":254},"\u002Fjava\u002Fmodern-java\u002Fsequenced-collections","Sequenced Collections","\u002Fblog\u002Fjava-sequenced-collections",102,[],9,40,801,1782244083099]