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