NOTE: For best experience, please use Chrome Browser!
Evolution to Java #
graph TD; A[Writing Machine Code] --> B[Using Assembly Language] B --> C[Structured Programming with C Language] C --> D[OOPS with C++] D --> E[OOPS with Java] E --> F[Constant Java Updates]
Java Platform Independence #
graph TD A(Java Code) -->|javac Compiled| C(bytecode) C -->D[Windows JVM] D --> K[Windows Machine Code] C -->E[Unix JVM] E --> L[Unix Machine Code] C --> F[Linux JVM] F --> M[Linux Machine Code] C --> G[Other platform JVM] G --> N[ Other Platform Machine Code]
Compiled Languages #
graph TD A(Code) -->|Windows Compiler| B(Windows Machine Code) A(Code) -->|Linux Compiler| C(Linux Machine Code) A(Code) -->|Mac Compiler| D(Mac Machine Code)
JDK vs JVM vs JRE #
graph TD; JDK --> |contains| JRE; JRE --> |contains| JVM;
JVM is Reused by Other Programming Languages #
graph TD A(Java Code) -->|Compiled| C(bytecode) AA[Kotlin Code] -->|Compiled| C(bytecode) AAA[Scala Code] -->|Compiled| C(bytecode) AAAA[Groovy Code] -->|Compiled| C(bytecode) C -->D[Windows JVM] D --> K[Windows Machine Code] C -->E[Unix JVM] E --> L[Unix Machine Code] C --> F[Linux JVM] F --> M[Linux Machine Code] C --> G[Other platform JVM] G --> N[ Other Platform Machine Code]
HashCode usage in Buckets #
graph LR %% Hash Code Calculation Outside HashMap %% A1["Key: 'John' → hashCode(35123) → 35123 % 3 → Index 1"] -->|Stored at Index 1| B1 A2["Key: 'Emma' → hashCode(67234) → 67234 % 3 → Index 2"] -->|Stored at Index 2| B2 A3["Key: 'Alice' → hashCode(89125) → 89125 % 3 → Index 0"] -->|Stored at Index 0| B3 A4["Key: 'Bob' → hashCode(11234) → 11234 % 3 → Index 1"] -->|Stored at Index 1| B1 A5["Key: 'Charlie' → hashCode(98341) → 98341 % 3 → Index 2"] -->|Stored at Index 2| B2 A6["Key: 'David' → hashCode(54189) → 54189 % 3 → Index 0"] -->|Stored at Index 0| B3 %% HashMap Buckets %% subgraph HashMap B1["Bucket[1]: ('John', 1001) → ('Bob', 4004)"] B2["Bucket[2]: ('Emma', 2002) → ('Charlie', 5005)"] B3["Bucket[0]: ('Alice', 3003) → ('David', 6006)"] end
Parallelism and Concurrency #
Sequential Execution
sequenceDiagram participant Main as Main Thread participant S1 as Step 1 (IO-Bound) participant S2 as Step 2 (IO-Bound) participant S3 as Step 3 (Processing) Main->>+S1: Start IO Task 1 S1-->>Main: Return Result 1 (after IO) Main->>+S2: Start IO Task 2 S2-->>Main: Return Result 2 (after IO) Main->>+S3: Process Result 1 & 2 S3-->>Main: Final Output
Concurrent Execution
sequenceDiagram participant Main as Main Thread participant S1 as Step 1 (IO-Bound) participant S2 as Step 2 (IO-Bound) participant S3 as Step 3 (Processing) Main->>+S1: Start IO Task 1 Main->>+S2: Start IO Task 2 S1-->>Main: Return Result 1 (after IO) S2-->>Main: Return Result 2 (after IO) Main->>+S3: Process Result 1 & 2 S3-->>Main: Final Output
Parallelism
graph TD; A[Parallelism] -->|Needs Multi-Core| B[Multiple Cores]; B --> C[Core 1]; B --> D[Core 2]; B --> E[Core 3]; B --> F[Core 4]; C -->|Runs Task A| G[Task A]; D -->|Runs Task B| H[Task B]; E -->|Runs Task C| I[Task C]; F -->|Runs Task D| J[Task D];
Concurrency + Parallelism
graph TD; A[Concurrency + Parallelism] -->|Efficient| B[Concurrency]; A -->|Fast| C[Parallelism]; B -->|Task Switching| D[One CPU, Multiple Tasks]; C -->|Task Splitting| E[Multiple CPUs, Multiple Tasks];
OS Process and Threads
graph TD; A[OS Process] -->|Has| B[Multiple OS Threads]; B --> C[OS Thread 1]; B --> D[OS Thread 2]; B --> E[OS Thread 3];
Platform Threads
graph TD; A[OS Process] -->|Has| B[Multiple OS Threads]; B --> C[OS Thread 1]; C --> CC[Platform Thread 1] B --> D[OS Thread 2]; D --> DD[Platform Thread 2] B --> E[OS Thread 3]; E --> EE[Platform Thread 3];
Virtual Threads
graph TD; A[OS Thread 1] -->|Maps to| B[Multiple Virtual Threads]; B --> C[Virtual Thread 11]; B --> D[Virtual Thread 12]; B --> E[Virtual Thread 13]; B --> F[Virtual Thread 14]; B --> G[...]; B --> H[Virtual Thread n];