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];