<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tapas Pal</title>
    <description>The latest articles on DEV Community by Tapas Pal (@tapaspal).</description>
    <link>https://dev.to/tapaspal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3925877%2F8aaa6fa2-66fc-4530-b1e5-d3c5eb7eca0d.jpg</url>
      <title>DEV Community: Tapas Pal</title>
      <link>https://dev.to/tapaspal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tapaspal"/>
    <language>en</language>
    <item>
      <title>Interview Q &amp; A Non-technical</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Mon, 01 Jun 2026 23:05:20 +0000</pubDate>
      <link>https://dev.to/tapaspal/interview-q-a-non-technical-5541</link>
      <guid>https://dev.to/tapaspal/interview-q-a-non-technical-5541</guid>
      <description>&lt;p&gt;&lt;strong&gt;Q1. How do you handle disagreements during design discussions?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Answer:&lt;/strong&gt; &lt;br&gt;
&lt;em&gt;I focus on technical facts, business requirements, and measurable outcomes rather than personal preferences. I encourage open discussion, present pros and cons of each approach, and support decisions with data, architecture principles, and operational considerations. If needed, I build a proof of concept to validate assumptions before making a final recommendation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2.Have you participated in system design reviews?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Answer:&lt;/strong&gt; &lt;br&gt;
&lt;em&gt;Yes. I regularly participate in design reviews where we discuss service boundaries, API contracts, database design, security requirements, deployment strategies, scalability concerns, and integration patterns. My role is to identify risks, suggest improvements, and ensure the design aligns with architectural standards and best practices.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3. How do you actively participate in architectural and design discussions?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;I actively participate by understanding both the business requirements and technical constraints before proposing solutions. During design discussions, I evaluate different approaches, identify trade-offs, consider scalability, security, performance, maintainability, and operational impacts. I collaborate with architects, product owners, QA teams, and other developers to ensure the proposed solution aligns with the existing architecture and long-term business goals&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4. Can you give an example of an architectural decision you influenced?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;In a previous project, a service was making multiple synchronous calls to downstream systems, causing high latency and occasional timeouts. During architecture discussions, I proposed moving to an event-driven approach using Kafka for non-critical processing. We analyzed the trade-offs, updated the design, and implemented asynchronous communication. This reduced API response times significantly and improved system resilience during peak traffic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;(STAR Format)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt;&lt;br&gt;
Our order-processing system was experiencing performance issues during peak traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt;&lt;br&gt;
We needed to improve response times without redesigning the entire platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action:&lt;/strong&gt;&lt;br&gt;
I analyzed the architecture and identified that synchronous communication with downstream services was causing bottlenecks. Since Kafka was already part of the ecosystem, I proposed an event-driven approach where requests were published to Kafka and processed asynchronously. I documented trade-offs, reviewed the design with architects and stakeholders, and led the implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt;&lt;br&gt;
API response times decreased from several seconds to under 500 milliseconds, throughput increased significantly, and the solution was implemented without major architectural changes.&lt;br&gt;
&lt;code&gt;-----------------------------------------------------------------&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Kanban in Agile?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Kanban is an Agile methodology focused on visualizing work, limiting work in progress (WIP), and continuously improving the flow of work.&lt;br&gt;
Unlike Scrum, Kanban does not require fixed-length sprints. Work items are pulled through the system continuously.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When Kanban is Preferred&lt;/strong&gt;&lt;br&gt;
Kanban works well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support Teams&lt;/li&gt;
&lt;li&gt;Production Issues&lt;/li&gt;
&lt;li&gt;Bug Fixes&lt;/li&gt;
&lt;li&gt;Urgent Requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Work arrives unpredictably.&lt;br&gt;
&lt;code&gt;-----------------------------------------------------------------&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conduct code reviews and ensure adherence to best practices and coding standards&lt;/strong&gt;&lt;br&gt;
Interviewers want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you perform code reviews&lt;/li&gt;
&lt;li&gt;What you look for&lt;/li&gt;
&lt;li&gt;How you provide feedback&lt;/li&gt;
&lt;li&gt;How you maintain coding standards&lt;/li&gt;
&lt;li&gt;How you mentor developers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How do you conduct code reviews and ensure adherence to best practices and coding standards?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;I treat code reviews as an opportunity to improve code quality, maintainability, security, and team knowledge sharing. During reviews, I focus on correctness, readability, performance, security, test coverage, adherence to coding standards, and alignment with the overall architecture. I provide constructive feedback, explain the reasoning behind my suggestions, and encourage discussions rather than simply approving or rejecting changes. I also ensure that the code follows SOLID principles, clean code practices, and established team guidelines.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Do You Look For During Code Reviews?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Code Correctness&lt;/li&gt;
&lt;li&gt;Readability&lt;/li&gt;
&lt;li&gt;SOLID Principles&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Exception Handling&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;Test Coverage&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;What coding standards do you enforce?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meaningful naming conventions&lt;/li&gt;
&lt;li&gt;Constructor injection&lt;/li&gt;
&lt;li&gt;SOLID principles&lt;/li&gt;
&lt;li&gt;Clean Code practices&lt;/li&gt;
&lt;li&gt;Proper exception handling&lt;/li&gt;
&lt;li&gt;Logging standards&lt;/li&gt;
&lt;li&gt;Unit test coverage&lt;/li&gt;
&lt;li&gt;Security best practices&lt;/li&gt;
&lt;li&gt;Consistent formatting&lt;/li&gt;
&lt;li&gt;Avoidance of code duplication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What would you do if a developer disagrees with your review comments?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;I would discuss the concern openly and focus on the technical reasoning rather than personal preferences. If there are multiple valid approaches, I would evaluate them based on maintainability, performance, consistency, and team standards. If necessary, I would involve the team or architect to reach a consensus.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--------------------------------------------------------------&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Work collaboratively with other teams to ensure seamless integration of software components&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How you collaborate across teams&lt;/li&gt;
&lt;li&gt;Communication skills&lt;/li&gt;
&lt;li&gt;Integration experience&lt;/li&gt;
&lt;li&gt;Handling dependencies&lt;/li&gt;
&lt;li&gt;Working in Agile environments&lt;/li&gt;
&lt;li&gt;Leadership and stakeholder management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;I work closely with product owners, architects, QA teams, DevOps engineers, and other development teams from the early stages of a project. I participate in design discussions, define clear API contracts, identify dependencies, and ensure integration requirements are understood by all parties. I also use regular communication channels such as Agile ceremonies, technical workshops, and integration testing sessions to proactively address issues before deployment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Can you give an example of a cross-team integration project?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Sample Answer (STAR)&lt;/strong&gt;&lt;br&gt;
We were developing an order processing platform that required integration between the Order, Payment, and Customer services owned by different teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Task&lt;/strong&gt;&lt;br&gt;
Ensure all services integrated correctly and met business requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;br&gt;
I coordinated API contract discussions, documented integration requirements, defined error-handling strategies, and worked with QA teams to create end-to-end test scenarios. We also established regular integration checkpoints during development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;&lt;br&gt;
The integration was completed successfully with minimal defects, and the solution was deployed without impacting existing services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. How do you manage dependencies between teams?&lt;/strong&gt;&lt;br&gt;
I identify dependencies early during backlog refinement, sprint planning, or PI planning sessions. I work with other teams to agree on delivery timelines, API contracts, and testing strategies. I also track dependencies throughout the sprint and communicate any risks or delays proactively to avoid surprises late in the delivery cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. What do you do when another team's API is not ready?&lt;br&gt;
Strong Answer&lt;/strong&gt;&lt;br&gt;
I try to avoid blocking development by using mocks, stubs, or contract-based development. For example, if the API specification is available, we can create mock services using tools such as WireMock and continue development while waiting for the actual implementation.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Service
      |
Mock Payment Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This reduces dependency-related delays.&lt;br&gt;
&lt;strong&gt;5. How do you ensure API integrations are successful?&lt;br&gt;
Answer&lt;/strong&gt;&lt;br&gt;
I focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clear API contracts&lt;/li&gt;
&lt;li&gt;OpenAPI/Swagger documentation&lt;/li&gt;
&lt;li&gt;Contract testing&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Versioning strategy&lt;/li&gt;
&lt;li&gt;Integration testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order Service
      |
REST API Contract
      |
Payment Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both teams agree on request and response formats before development begins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Have you participated in Three Amigos sessions?&lt;/strong&gt;&lt;br&gt;
Yes. I regularly participate in Three Amigos sessions involving Product Owners, Developers, and QA engineers. These discussions help clarify requirements, identify edge cases, define acceptance criteria, and ensure that integration requirements are understood before development begins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. How do you handle integration issues discovered late in testing?&lt;/strong&gt;&lt;br&gt;
First, I work with the relevant teams to quickly identify the root cause. Then I assess the impact, communicate the issue to stakeholders, and agree on a resolution plan. I also review why the issue was not detected earlier and improve testing, contract validation, or communication processes to prevent similar problems in the future.&lt;/p&gt;

</description>
      <category>career</category>
      <category>interview</category>
      <category>softwareengineering</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>What's the difference IoC and Dependency Injection?</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Sat, 30 May 2026 10:01:31 +0000</pubDate>
      <link>https://dev.to/tapaspal/whats-the-difference-ioc-and-dependency-injection-168d</link>
      <guid>https://dev.to/tapaspal/whats-the-difference-ioc-and-dependency-injection-168d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Inversion of Control (IoC) and Dependency Injection (DI) are related concepts, but they are not the same thing.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question.&lt;/strong&gt; Is Dependency Injection the same as Inversion of Control?&lt;br&gt;
&lt;strong&gt;Answer:&lt;/strong&gt;  No. IoC is a principle, while DI is one way to implement that principle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What is Inversion of Control (IoC)?&lt;/strong&gt;&lt;br&gt;
Normally, an object creates and manages its own dependencies.&lt;br&gt;
Without IoC&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What happens here?&lt;/strong&gt;&lt;br&gt;
paymentService = new PaymentService();&lt;br&gt;
OrderService is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the dependency&lt;/li&gt;
&lt;li&gt;Managing the dependency&lt;/li&gt;
&lt;li&gt;Using the dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control is inside OrderService&lt;br&gt;
&lt;strong&gt;Problem&lt;/strong&gt;&lt;br&gt;
Suppose tomorrow you want:&lt;br&gt;
&lt;code&gt;CreditCardPaymentService&lt;/code&gt; instead of &lt;code&gt;PaymentService&lt;/code&gt;&lt;br&gt;
You must modify: &lt;code&gt;OrderService&lt;/code&gt;&lt;br&gt;
This creates tight coupling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IoC Concept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With IoC:&lt;/strong&gt; Object creation responsibility is moved outside the class.&lt;br&gt;
Instead of: &lt;code&gt;OrderService creates PaymentService&lt;/code&gt;&lt;br&gt;
we do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Someone else creates PaymentService&lt;/li&gt;
&lt;li&gt;Someone else gives it to OrderService&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Control is inverted.&lt;br&gt;
That's why it is called: &lt;strong&gt;Inversion of Control&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-Life Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a restaurant.&lt;br&gt;
Without IoC - You go into the kitchen and cook your own food.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer --&amp;gt; Kitchen --&amp;gt; Cooks food
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customer controls everything.&lt;br&gt;
With IoC - You sit at the table.&lt;/p&gt;

&lt;p&gt;Waiter brings food.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer &amp;lt;-- Waiter &amp;lt;-- Kitchen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customer doesn't control food preparation.&lt;br&gt;
&lt;strong&gt;Control has been inverted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. What is Dependency Injection (DI)?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dependency Injection is a technique used to achieve IoC.&lt;br&gt;
Instead of creating dependencies yourself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;someone injects them.&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="n"&gt;orderService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dependency is injected from outside.&lt;br&gt;
&lt;strong&gt;This is Dependency Injection.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;IoC vs DI&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpowmlynuinie1rhy7fyw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpowmlynuinie1rhy7fyw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring Boot Example&lt;/strong&gt;&lt;br&gt;
Let's see what Spring does internally.&lt;br&gt;
&lt;strong&gt;Step 1: Component&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment Processed"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Dependent Class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice: &lt;code&gt;new PaymentService()&lt;/code&gt;&lt;br&gt;
does not exist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Spring Starts&lt;/strong&gt;&lt;br&gt;
When application starts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@SpringBootApplication&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Application&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring scans:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="nd"&gt;@Repository&lt;/span&gt;
&lt;span class="nd"&gt;@Controller&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;classes. Spring finds:&lt;br&gt;
&lt;strong&gt;PaymentService&lt;br&gt;
OrderService&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Spring Creates Beans&lt;/strong&gt;&lt;br&gt;
Internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PaymentService&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bean created.&lt;/p&gt;

&lt;p&gt;Stored in IoC Container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spring Container
      |
      +--&amp;gt; PaymentService Bean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Spring Finds Dependency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It understands: &lt;code&gt;OrderService needs PaymentService&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Spring Injects Dependency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="n"&gt;orderService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Spring passes the object.&lt;/p&gt;

&lt;p&gt;This is Dependency Injection.&lt;/p&gt;

&lt;p&gt;Internal Flow Diagram&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application Starts
       |
       V
Component Scan
       |
       V
Find PaymentService
       |
       V
Create PaymentService Bean
       |
       V
Find OrderService
       |
       V
OrderService requires PaymentService
       |
       V
Inject PaymentService Bean
       |
       V
Create OrderService Bean
       |
       V
Store in IoC Container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What is the IoC Container?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring's IoC Container is essentially a registry that manages objects (beans).&lt;/p&gt;

&lt;p&gt;Simplified view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ApplicationContext
       |
       +--&amp;gt; PaymentService
       |
       +--&amp;gt; OrderService
       |
       +--&amp;gt; UserService

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates objects&lt;/li&gt;
&lt;li&gt;Injects dependencies&lt;/li&gt;
&lt;li&gt;Manages lifecycle&lt;/li&gt;
&lt;li&gt;Destroys objects
Types of Dependency Injection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1. Constructor Injection (Recommended)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Immutable dependencies&lt;/li&gt;
&lt;li&gt;Easy testing&lt;/li&gt;
&lt;li&gt;Spring recommendation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Setter Injection&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Autowired&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setPaymentService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Field Injection&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;@Autowired&lt;br&gt;
private PaymentService paymentService;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Works, but generally discouraged because it makes testing harder.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inversion of Control (IoC) is a design principle where the control of creating and managing objects is transferred from application code to a container or framework.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dependency Injection (DI) is a technique used to implement IoC by supplying dependencies from outside rather than creating them inside the class.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Without DI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With DI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;OrderService&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentService&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;In Spring Boot, the IoC container (ApplicationContext) creates beans and injects dependencies automatically using constructor injection, thereby implementing IoC through Dependency Injection.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>spring</category>
      <category>java</category>
      <category>development</category>
    </item>
    <item>
      <title>How Spring does JWT verification based on RS256</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Thu, 21 May 2026 05:14:36 +0000</pubDate>
      <link>https://dev.to/tapaspal/how-spring-does-jwt-verification-bases-on-rs256-10a4</link>
      <guid>https://dev.to/tapaspal/how-spring-does-jwt-verification-bases-on-rs256-10a4</guid>
      <description>&lt;p&gt;RS256 JWT flow between two microservices, then how Spring actually validates it internally.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsisi61as3rgz7pg26my5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsisi61as3rgz7pg26my5.png" alt=" " width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;how Spring Security internally validates that JWT step by step.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwirhhpwa2052npg9dicp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwirhhpwa2052npg9dicp.png" alt=" " width="800" height="778"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's what the actual code looks like in the Inventory Service (spring-boot-starter-oauth2-resource-server):&lt;br&gt;
application.yml — tell Spring where to fetch the public key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="na"&gt;spring&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;security&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;oauth2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;resourceserver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;jwt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;jwk-set-uri&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://auth-service/oauth2/jwks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SecurityConfig.java&lt;/code&gt; — configure the filter chain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="nd"&gt;@Configuration&lt;/span&gt;
&lt;span class="nd"&gt;@EnableWebSecurity&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SecurityConfig&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;SecurityFilterChain&lt;/span&gt; &lt;span class="nf"&gt;filterChain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HttpSecurity&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;http&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;authorizeHttpRequests&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;
           &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestMatchers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/inventory/reserve"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;hasRole&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ORDER_SVC"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;anyRequest&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;authenticated&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
          &lt;span class="o"&gt;)&lt;/span&gt;
          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;oauth2ResourceServer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oauth2&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;oauth2&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jwt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jwtAuthenticationConverter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jwtAuthConverter&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;
          &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Bean&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;JwtAuthenticationConverter&lt;/span&gt; &lt;span class="nf"&gt;jwtAuthConverter&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;JwtGrantedAuthoritiesConverter&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JwtGrantedAuthoritiesConverter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAuthoritiesClaimName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"roles"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// map "roles" claim → GrantedAuthority&lt;/span&gt;
        &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAuthorityPrefix&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ROLE_"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;JwtAuthenticationConverter&lt;/span&gt; &lt;span class="n"&gt;jwtConverter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JwtAuthenticationConverter&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;jwtConverter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setJwtGrantedAuthoritiesConverter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jwtConverter&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;InventoryController.java&lt;/code&gt; — the endpoint is now protected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="nd"&gt;@RestController&lt;/span&gt;
&lt;span class="nd"&gt;@RequestMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/api/inventory"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InventoryController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@PostMapping&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/reserve"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@PreAuthorize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hasRole('ORDER_SVC')"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reserveStock&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="nd"&gt;@RequestBody&lt;/span&gt; &lt;span class="nc"&gt;ReserveRequest&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="nd"&gt;@AuthenticationPrincipal&lt;/span&gt; &lt;span class="nc"&gt;Jwt&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;   &lt;span class="c1"&gt;// inject the parsed JWT&lt;/span&gt;

        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;callerService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSubject&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// "order-service"&lt;/span&gt;
        &lt;span class="c1"&gt;// proceed with reservation...&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;ResponseEntity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ok&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Reserved for "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;callerService&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudgq65pigm7a29nt1wjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudgq65pigm7a29nt1wjx.png" alt=" " width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does BearerTokenAuthenticationFilter do exactly in Spring Security?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5p457xxxxs50lev5bme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn5p457xxxxs50lev5bme.png" alt=" " width="800" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What BearerTokenAuthenticationFilter does&lt;br&gt;
It is a OncePerRequestFilter — guaranteed to run exactly once per request, sitting early in Spring Security's filter chain. Its entire job is to bridge the raw HTTP world (a string in a header) to Spring Security's authentication world (a typed Authentication object in the SecurityContext).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt; — Token extraction via DefaultBearerTokenResolver&lt;br&gt;
It reads the Authorization header and strips Bearer  from the front. It also optionally checks request parameters (access_token=...) if you configure allowFormEncodedBodyParameter or allowUriQueryParameter. If no token is found at all, it just calls chain.doFilter() — the request passes through unauthenticated, and a later filter or your controller will enforce access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt; — Wraps the raw token in BearerTokenAuthenticationToken&lt;br&gt;
This is a lightweight container that holds the raw JWT string and is marked as not yet authenticated (isAuthenticated() = false). Think of it as the question — "here's a token, can you validate it?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt; — Hands off to AuthenticationManager&lt;br&gt;
The filter calls authenticationManager.authenticate(token). The manager routes this to JwtAuthenticationProvider, which calls NimbusJwtDecoder to do the actual RS256 verification, expiry check, issuer check, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4a&lt;/strong&gt; — On success: populates SecurityContextHolder&lt;br&gt;
If authentication succeeds, the provider returns a fully populated JwtAuthenticationToken (which is authenticated, carries the parsed claims, and has GrantedAuthority objects derived from your roles). The filter stores this in SecurityContextHolder.getContext().setAuthentication(...), then calls chain.doFilter() — the request proceeds to your controller, where @PreAuthorize and @AuthenticationPrincipal work because the context is populated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4b&lt;/strong&gt; — On failure: delegates to AuthenticationEntryPoint&lt;br&gt;
If the provider throws JwtValidationException (bad signature, expired, wrong issuer), the filter catches it, clears the SecurityContext (important — prevents stale auth from leaking), and calls authenticationEntryPoint.commence(...), which writes a 401 Unauthorized response with a WWW-Authenticate: Bearer error="invalid_token" header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key things it does NOT do&lt;/strong&gt;&lt;br&gt;
It does not do authorization — that's AuthorizationFilter further down the chain. &lt;br&gt;
It doesn't decode the JWT itself — that's NimbusJwtDecoder. &lt;br&gt;
It doesn't map claims to roles — that's JwtAuthenticationConverter. &lt;/p&gt;

&lt;p&gt;The filter's job is purely: extract → wrap → delegate → store or reject.&lt;/p&gt;

</description>
      <category>springsecurity</category>
      <category>springboot</category>
      <category>security</category>
      <category>java</category>
    </item>
    <item>
      <title>Difference Between StackOverflowError and OutOfMemoryError in Java</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Wed, 20 May 2026 05:19:17 +0000</pubDate>
      <link>https://dev.to/tapaspal/difference-between-stackoverflowerror-and-outofmemoryerror-in-java-26h2</link>
      <guid>https://dev.to/tapaspal/difference-between-stackoverflowerror-and-outofmemoryerror-in-java-26h2</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;StackOverflowError occurs when stack memory is exhausted due to
excessive method calls, typically caused by infinite or very deep
recursion. OutOfMemoryError occurs when the JVM cannot allocate
more memory, usually because heap memory is exhausted by excessive
object creation or memory leaks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r5cxlzesl8ei3ew7yb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa0r5cxlzesl8ei3ew7yb.png" alt=" " width="658" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Java memory mainly has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Stack Memory
2. Heap Memory

JVM Memory
│
├── Stack Memory
│      ├── Method calls
│      ├── Local variables
│      └── Function frames
│
└── Heap Memory
       ├── Objects
       ├── Arrays
       └── Instance data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;u&gt;&lt;strong&gt;1. StackOverflowError&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;What Is It?&lt;br&gt;
stack memory becomes full&lt;/p&gt;

&lt;p&gt;Most Common Cause?&lt;br&gt;
Infinite recursion&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final Error&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt;
&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;StackOverflowError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stack Frames Growing and eventually stack full.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TOP
│
├── test()
├── test()
├── test()
├── test()
├── test()
│
BOTTOM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every method call creates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;stack frame&lt;/li&gt;
&lt;li&gt;local variables&lt;/li&gt;
&lt;li&gt;return address&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Too many frames → overflow.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Causes of StackOverflowError&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F501mr1iv5ioayt7hqbhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F501mr1iv5ioayt7hqbhr.png" alt=" " width="504" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;2. OutOfMemoryError&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;What Is It? Occurs when?&lt;br&gt;
JVM cannot allocate more memory&lt;/p&gt;

&lt;p&gt;usually in:  heap memory&lt;/p&gt;

&lt;p&gt;Most Common Cause :  Too many objects&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.ArrayList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Happens Internally?&lt;br&gt;
Each loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;creates huge array&lt;/li&gt;
&lt;li&gt;stores in heap&lt;/li&gt;
&lt;li&gt;references retained in list&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Garbage collector cannot free memory.&lt;br&gt;
Eventually: &lt;code&gt;heap full&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Final Error&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;OutOfMemoryError&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="nc"&gt;Java&lt;/span&gt; &lt;span class="n"&gt;heap&lt;/span&gt; &lt;span class="n"&gt;space&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heap Growing and no space left.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Heap
│
├── Object
├── Object
├── Object
├── Object
├── Object
├── Object
│
FULL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Common Causes of OutOfMemoryError&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6gs1qunckx68yajnsl8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6gs1qunckx68yajnsl8.png" alt=" " width="504" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;StackOverflowError&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usually easier to debug.&lt;/li&gt;
&lt;li&gt;Stack trace clearly shows recursion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OutOfMemoryError&lt;br&gt;
Can be very difficult:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory leaks&lt;/li&gt;
&lt;li&gt;object retention&lt;/li&gt;
&lt;li&gt;cache problems&lt;/li&gt;
&lt;li&gt;GC tuning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;often require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;heap dumps&lt;/li&gt;
&lt;li&gt;profilers&lt;/li&gt;
&lt;li&gt;memory analyzers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Important JVM Parameters&lt;br&gt;
Stack Size &lt;code&gt;-Xss&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;java -Xss2m Main&lt;/code&gt;&lt;br&gt;
Increase stack size.&lt;/p&gt;

&lt;p&gt;Heap Size &lt;code&gt;-Xmx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;java -Xmx2g Main&lt;/code&gt;&lt;br&gt;
Increase heap size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can StackOverflowError Cause OutOfMemoryError?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Indirectly yes sometimes.&lt;br&gt;
Huge recursion may:&lt;/p&gt;

&lt;p&gt;create many objects&lt;br&gt;
trigger memory exhaustion&lt;/p&gt;

&lt;p&gt;&lt;em&gt;But normally they are distinct problems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Are These Errors and Not Exceptions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serious JVM resource exhaustion&lt;/li&gt;
&lt;li&gt;application usually cannot safely recover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both extend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;not: &lt;code&gt;Exception&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can We Catch Them?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technically yes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StackOverflowError&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OutOfMemoryError&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;BUT usually: &lt;code&gt;bad practice&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Application state may already be unstable.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>computerscience</category>
      <category>java</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Checked Exceptions in Java Q &amp;A Advantages and disadvantages</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Sun, 17 May 2026 06:12:01 +0000</pubDate>
      <link>https://dev.to/tapaspal/checked-exceptions-in-java-q-a-advantages-and-disadvantages-1eo6</link>
      <guid>https://dev.to/tapaspal/checked-exceptions-in-java-q-a-advantages-and-disadvantages-1eo6</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Checked exceptions provide compile-time enforcement and are useful
for recoverable conditions such as IO or network failures, ensuring
callers consciously handle exceptional situations. However, they
often introduce excessive boilerplate, tight coupling across
layers, and poor compatibility with modern functional programming
styles, which is why many modern frameworks prefer unchecked
exceptions for cleaner API design.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Why Java has checked exceptions?&lt;/li&gt;
&lt;li&gt;Are checked exceptions good or bad?&lt;/li&gt;
&lt;li&gt;Why many modern frameworks avoid them?&lt;/li&gt;
&lt;li&gt;When should we use checked exceptions?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To answer well, you need balanced understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Is a Checked Exception?&lt;/strong&gt;&lt;br&gt;
A checked exception is an exception that:&lt;br&gt;
must be handled or declared at compile time&lt;br&gt;
Compiler forces handling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Examples&lt;/em&gt; Checked Exception&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IOException&lt;/li&gt;
&lt;li&gt;SQLException&lt;/li&gt;
&lt;li&gt;FileNotFoundException&lt;/li&gt;
&lt;li&gt;ParseException&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Example&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;FileReader&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"abc.txt"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Compiler error unless:&lt;/em&gt;&lt;br&gt;
try-catch&lt;br&gt;
OR:&lt;br&gt;
throws IOException used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Java Introduced Checked Exceptions?&lt;/strong&gt;&lt;br&gt;
Main idea: force developers to think about recoverable failures&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file may not exist&lt;/li&gt;
&lt;li&gt;DB connection may fail&lt;/li&gt;
&lt;li&gt;network may timeout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Java designers wanted: explicit error handling&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ADVANTAGES OF CHECKED EXCEPTIONS&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;1. Compile-Time Safety&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;BIGGEST advantage. Compiler forces handling.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caller MUST: catch or rethrow&lt;br&gt;
Benefit Reduces:&lt;br&gt;
ignored critical failures&lt;/p&gt;

&lt;p&gt;Without Checked Exceptions Developer may completely forget error handling.&lt;br&gt;
&lt;em&gt;2. Better API Documentation&lt;/em&gt;&lt;br&gt;
Method signature clearly communicates: what can go wrong&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;  &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;SQLException&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Immediately tells caller:&lt;br&gt;
DB failure possible&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Encourages Recovery Logic&lt;/em&gt;&lt;br&gt;
Checked exceptions usually represent:&lt;br&gt;
recoverable situations&lt;br&gt;
&lt;em&gt;Example:&lt;/em&gt;&lt;br&gt;
retry network call&lt;br&gt;
ask user for another file&lt;br&gt;
reconnect DB&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;readFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s"&gt;"Please provide valid file"&lt;/span&gt;&lt;span class="o"&gt;=);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Application can continue.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;4. Prevents Silent Failures&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Forces conscious handling.&lt;br&gt;
Good for:&lt;br&gt;
banking&lt;br&gt;
healthcare&lt;br&gt;
critical enterprise systems&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
Ignoring payment gateway failure can be dangerous.&lt;br&gt;
Checked exceptions force handling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;5. Improves Code Contracts&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Method contract becomes explicit.&lt;br&gt;
&lt;em&gt;Example&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;transferMoney&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;InsufficientBalanceException&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clear business-level expectation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISADVANTAGES OF CHECKED EXCEPTIONS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now the important part.&lt;/p&gt;

&lt;p&gt;Most experienced developers criticize checked exceptions heavily.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Boilerplate Code Explosion&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;BIGGEST complaint.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; 
&lt;span class="n"&gt;readFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repeated everywhere.&lt;br&gt;
Creates: ceremonial code&lt;br&gt;
Especially Bad In Layered Architectures&lt;/p&gt;

&lt;p&gt;Suppose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository layer&lt;/li&gt;
&lt;li&gt;Service layer&lt;/li&gt;
&lt;li&gt;Controller layer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checked exception propagates through ALL layers.&lt;br&gt;
&lt;em&gt;Example&lt;/em&gt;&lt;br&gt;
throws IOException&lt;br&gt;
throws IOException&lt;br&gt;
throws IOException&lt;/p&gt;

&lt;p&gt;Very noisy.&lt;br&gt;
&lt;em&gt;2. Exception Leakage Across Layers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Low-level implementation details leak upward.&lt;br&gt;
Service layer now knows: SQLException&lt;br&gt;
This tightly couples:&lt;br&gt;
business logic&lt;br&gt;
database technology Bad design.&lt;/p&gt;

&lt;p&gt;Better Design&lt;br&gt;
Service layer should expose:&lt;br&gt;
BusinessException&lt;br&gt;
not DB exceptions.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Developers Often Ignore Proper Handling&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because compiler forces handling,&lt;br&gt;
developers sometimes write:&lt;/p&gt;

&lt;p&gt;catch(Exception e) { }&lt;br&gt;
OR:&lt;br&gt;
e.printStackTrace();&lt;/p&gt;

&lt;p&gt;Bad practice.&lt;/p&gt;

&lt;p&gt;So Checked Exceptions Sometimes Create:&lt;br&gt;
fake handling&lt;br&gt;
instead of meaningful handling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;4. Bad Fit for Functional Programming&lt;/em&gt;&lt;br&gt;
Streams/lambdas work poorly with checked exceptions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;readFile&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If readFile() throws checked exception:&lt;/p&gt;

&lt;p&gt;compilation issues&lt;br&gt;
ugly wrappers required&lt;br&gt;
Example Ugly Wrapper&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very common frustration.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;5. Frameworks Prefer Unchecked Exceptions&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Modern frameworks:&lt;br&gt;
Spring&lt;br&gt;
Hibernate&lt;br&gt;
Reactor&lt;/p&gt;

&lt;p&gt;mostly use: RuntimeException&lt;/p&gt;

&lt;p&gt;Why? Cleaner APIs.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
Spring converts:&lt;br&gt;
SQLException into: DataAccessException unchecked exception.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;6. Reduces API Evolution Flexibility&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Suppose API initially: throws IOException&lt;br&gt;
Later you add: SQLException&lt;br&gt;
ALL callers break.&lt;br&gt;
Huge maintenance issue.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;7. Deep Call Stack Pollution&lt;/em&gt;&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Controller
   ↓
Service
   ↓
Repository
   ↓
FileReader
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every layer forced to:&lt;br&gt;
catch or rethrow&lt;/p&gt;

&lt;p&gt;Leads to:&lt;br&gt;
throws pollution&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Runtime Exceptions Became More Popular?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cleaner APIs&lt;/li&gt;
&lt;li&gt;less boilerplate&lt;/li&gt;
&lt;li&gt;better framework integration&lt;/li&gt;
&lt;li&gt;functional programming friendliness&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;But Does That Mean Checked Exceptions Are Bad?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;NO.&lt;br&gt;
They are useful when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caller can realistically recover&lt;/li&gt;
&lt;li&gt;failure expected and meaningful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good Use Cases for Checked Exceptions&lt;br&gt;
Scenario           Good?&lt;br&gt;
File operations         ✅&lt;br&gt;
Network calls           ✅&lt;br&gt;
User input parsing  ✅&lt;br&gt;
Retryable operations    ✅&lt;/p&gt;

&lt;p&gt;Bad Use Cases&lt;br&gt;
Scenario                   Bad?&lt;br&gt;
Programming bugs            ❌&lt;br&gt;
NullPointerException            ❌&lt;br&gt;
Validation programming errors   ❌&lt;/p&gt;

&lt;p&gt;These should be:&lt;br&gt;
unchecked exceptions&lt;/p&gt;

&lt;p&gt;Golden Design Principle&lt;br&gt;
Use checked exceptions for:&lt;br&gt;
recoverable conditions&lt;/p&gt;

&lt;p&gt;Use unchecked exceptions for:&lt;br&gt;
programming errors&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why IOException Is Checked But NullPointerException Is Not?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;missing file may be recoverable&lt;/li&gt;
&lt;li&gt;programming bug usually not recoverable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Spring Uses Runtime Exceptions?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spring philosophy:&lt;br&gt;
developer productivity over forced handling and:&lt;br&gt;
centralized exception handling&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AOP&lt;/li&gt;
&lt;li&gt;transaction rollback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;work better with unchecked exceptions.&lt;br&gt;
Important Real-World Observation&lt;br&gt;
Most modern enterprise applications:&lt;br&gt;
use checked exceptions very minimally&lt;br&gt;
convert low-level checked exceptions into runtime exceptions&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;SQLException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DataAccessException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cleaner service APIs.&lt;br&gt;
Important Senior-Level Insight&lt;/p&gt;

&lt;p&gt;Checked exceptions work best when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;failure is expected&lt;/li&gt;
&lt;li&gt;caller has meaningful recovery strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Otherwise they create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;boilerplate&lt;/li&gt;
&lt;li&gt;coupling&lt;/li&gt;
&lt;li&gt;noisy APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q. Can overridden method throw broader checked exception?&lt;/strong&gt;&lt;br&gt;
NO.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;IOException&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;//INVALID&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. Can overridden method throw narrower checked exception?&lt;/strong&gt;&lt;br&gt;
YES.&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;FileNotFoundException&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allowed.&lt;br&gt;
&lt;strong&gt;Q. Can checked exception be ignored?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only if:&lt;br&gt;
caught&lt;br&gt;
or declared&lt;br&gt;
Compiler enforces it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>java</category>
      <category>programming</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>What Is the N+1 Problem in Hibernate/JPA? How to resolve it? Interview Q&amp;A</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Sun, 17 May 2026 05:24:59 +0000</pubDate>
      <link>https://dev.to/tapaspal/what-is-the-n1-problem-in-hibernatejpa-how-to-resolve-it-interview-qa-8io</link>
      <guid>https://dev.to/tapaspal/what-is-the-n1-problem-in-hibernatejpa-how-to-resolve-it-interview-qa-8io</guid>
      <description>&lt;p&gt;The N+1 problem happens when:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hibernate executes 1 query to fetch parent records
+
N additional queries to fetch child records
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;too many database calls&lt;/li&gt;
&lt;li&gt;performance degradation&lt;/li&gt;
&lt;li&gt;slow APIs
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The Hibernate N+1 problem occurs when Hibernate executes one query
to fetch parent entities and then executes additional queries for
each associated child entity due to lazy loading. This leads to
excessive database round trips and performance degradation. The
most common solution is using JOIN FETCH, EntityGraph, batch
fetching, or DTO projections to load related data efficiently in
fewer queries.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple Real-World Example&lt;/p&gt;

&lt;p&gt;Suppose: 100 customers each customer has N orders&lt;br&gt;
You want: all customers with their orders&lt;br&gt;
But Hibernate executes: &lt;br&gt;
&lt;code&gt;1 query for customers&lt;br&gt;
100 separate queries for orders&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Total: 101 queries&lt;br&gt;
This is: &lt;code&gt;N+1 problem&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Customer Entity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"customers"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Getter&lt;/span&gt;
&lt;span class="nd"&gt;@Setter&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@ToString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"orders"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@OneToMany&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;mappedBy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"customer"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FetchType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LAZY&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;cascade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CascadeType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALL&lt;/span&gt;
    &lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Order Entity&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.entity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jakarta.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Entity&lt;/span&gt;
&lt;span class="nd"&gt;@Table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"orders"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@Getter&lt;/span&gt;
&lt;span class="nd"&gt;@Setter&lt;/span&gt;
&lt;span class="nd"&gt;@NoArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@AllArgsConstructor&lt;/span&gt;
&lt;span class="nd"&gt;@ToString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exclude&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"customer"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Id&lt;/span&gt;
    &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@ManyToOne&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FetchType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LAZY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nd"&gt;@JoinColumn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"customer_id"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important Thing &lt;code&gt;FetchType.LAZY&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orders NOT loaded immediately&lt;/li&gt;
&lt;li&gt;loaded only when accessed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Problematic Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;customerRepository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrders&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looks harmless. BUT internally dangerous.&lt;br&gt;
What Happens Internally?&lt;br&gt;
Query 1 : Hibernate fetches customers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose 100 customers returned.&lt;/p&gt;

&lt;p&gt;Then Loop Starts Iteration 1 &lt;code&gt;c.getOrders()&lt;/code&gt;&lt;br&gt;
Triggers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iteration 2&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Final Total &lt;code&gt;1 + N queries&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;If: 100 customers then: 101 queries&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Visual Representation&lt;br&gt;
Initial Query&lt;br&gt;
&lt;code&gt;SELECT customers&lt;/code&gt;&lt;br&gt;
returns:&lt;/p&gt;

&lt;p&gt;C1 C2 C3 C4 C5&lt;br&gt;
Then Lazy Loading&lt;br&gt;
&lt;code&gt;C1 → SELECT orders&lt;br&gt;
C2 → SELECT orders&lt;br&gt;
C3 → SELECT orders&lt;br&gt;
C4 → SELECT orders&lt;br&gt;
C5 → SELECT orders&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Many DB round trips. Why Is This Bad?&lt;br&gt;
Database calls are expensive.&lt;br&gt;
Problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;network latency&lt;/li&gt;
&lt;li&gt;DB CPU usage&lt;/li&gt;
&lt;li&gt;connection pool pressure&lt;/li&gt;
&lt;li&gt;slow response times&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How To Detect N+1 Problem &lt;code&gt;Enable SQL logging.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Spring Boot&lt;br&gt;
&lt;code&gt;spring.jpa.show-sql=true&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you see: repeated similar queries&lt;br&gt;
then likely N+1 issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution 1. FETCH JOIN&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.entity.Customer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.data.jpa.repository.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Repository&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;CustomerRepository&lt;/span&gt;
        &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;JpaRepository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@Query&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""
           SELECT DISTINCT c
           FROM Customer c
           JOIN FETCH c.orders
           """&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAllCustomersWithOrders&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Happens Now? Hibernate executes ONE query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customer&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;
&lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result Instead of: 101 queries Only: 1 query&lt;/p&gt;

&lt;p&gt;Huge improvement. &lt;br&gt;
Visual&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;&lt;br&gt;
1 customer query + 100 order queries&lt;br&gt;
After FETCH JOIN 1 combined query&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. EntityGraph&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@EntityGraph&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attributePaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"orders"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tells Hibernate: load orders together&lt;br&gt;
&lt;code&gt;Advantage :  Cleaner than custom JPQL sometimes.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Batch Fetching&lt;/strong&gt; - Hibernate optimization.&lt;br&gt;
Example&lt;br&gt;
&lt;code&gt;spring.jpa.properties.hibernate.default_batch_fetch_size=20&lt;/code&gt;&lt;br&gt;
What Happens? Instead of: 100 queries Hibernate batches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much fewer queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. DTO Projection&lt;/strong&gt; - Best for read-heavy APIs.&lt;/p&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Query&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""
       SELECT new com.dto.CustomerDTO(
              c.name,
              o.item)
       FROM Customer c
       JOIN c.orders o
       """&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoids entity graph entirely. Very efficient.&lt;br&gt;
** Service Class**&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example.service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.entity.Customer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.example.repository.CustomerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;lombok.RequiredArgsConstructor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.stereotype.Service&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.List&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomerService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;CustomerRepository&lt;/span&gt; &lt;span class="n"&gt;customerRepository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;printCustomers&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
                &lt;span class="n"&gt;customerRepository&lt;/span&gt;
                        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAllCustomersWithOrders&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrders&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Interview Question&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Q1. Why Not Use EAGER Fetching?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many thinks: &lt;code&gt;FetchType.EAGER&lt;/code&gt;&lt;br&gt;
solves N+1 but NOT always true.&lt;/p&gt;

&lt;p&gt;Why?&lt;br&gt;
EAGER can STILL produce N+1.&lt;br&gt;
And may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;load unnecessary data&lt;/li&gt;
&lt;li&gt;create huge joins&lt;/li&gt;
&lt;li&gt;&lt;p&gt;hurt performance&lt;br&gt;
Example Suppose:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Orders&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Payments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Addresses&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;EAGER loading everything creates:&lt;br&gt;
Cartesian product explosion&lt;br&gt;
massive memory usage&lt;br&gt;
Best Practice Prefer:&lt;br&gt;
&lt;code&gt;LAZY + FETCH JOIN when needed&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2. Why LAZY Exists If It Causes N+1?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because:&lt;br&gt;
loading everything always is worse&lt;br&gt;
sometimes child data not needed&lt;/p&gt;

&lt;p&gt;LAZY improves:&lt;br&gt;
memory usage&lt;br&gt;
startup cost&lt;br&gt;
flexibility&lt;/p&gt;

&lt;p&gt;Problem occurs only when: &lt;code&gt;iterative lazy access happens&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Another Dangerous Situation&lt;/strong&gt;&lt;br&gt;
Nested N+1.&lt;br&gt;
Example&lt;br&gt;
&lt;code&gt;Customer → Orders → Items&lt;/code&gt;&lt;br&gt;
Now queries become:&lt;br&gt;
&lt;code&gt;1 + N + N*M&lt;/code&gt;&lt;br&gt;
Can explode massively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important Hibernate Internals&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;N+1 happens because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hibernate proxy objects&lt;/li&gt;
&lt;li&gt;lazy initialization&lt;/li&gt;
&lt;li&gt;session-triggered fetch&lt;/li&gt;
&lt;li&gt;Lazy Loading Mechanism&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hibernate initially creates:&lt;code&gt;proxy objects&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Actual SQL executed only when accessed.&lt;br&gt;
Example &lt;code&gt;c.getOrders()&lt;/code&gt;&lt;br&gt;
This line triggers DB query.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Solutions Comparison&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Solution&lt;/em&gt;  &lt;em&gt;Best For&lt;/em&gt;&lt;br&gt;
FETCH JOIN  Most common&lt;br&gt;
EntityGraph Clean JPA&lt;br&gt;
Batch Fetching  Large collections&lt;br&gt;
DTO Projection  APIs/reporting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3. Does N+1 happen only in OneToMany?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NO. Can happen in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ManyToOne&lt;/li&gt;
&lt;li&gt;OneToOne&lt;/li&gt;
&lt;li&gt;nested associations&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>hibernate</category>
      <category>jpa</category>
      <category>java</category>
      <category>interview</category>
    </item>
    <item>
      <title>Find First Non Repeating Character - Java Program With Time and Space Complexity</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Wed, 13 May 2026 04:49:30 +0000</pubDate>
      <link>https://dev.to/tapaspal/find-first-non-repeating-character-java-program-with-time-and-space-complexity-4lje</link>
      <guid>https://dev.to/tapaspal/find-first-non-repeating-character-java-program-with-time-and-space-complexity-4lje</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Problem Statement
Given a string: "swiss"
Find the first character that appears only once.
Expected Output : w
Because:
s repeats
w appears once and comes first
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;
Best Approach (Using LinkedHashMap)&lt;br&gt;
We will use: &lt;strong&gt;LinkedHashMap&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Why?&lt;/strong&gt; Because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stores frequency count&lt;/li&gt;
&lt;li&gt;Maintains insertion order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Approach-1 : Frequency Array (int[256])&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Method to find the first non-repeating character&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FirstNonRepeatingCharacter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Character&lt;/span&gt; &lt;span class="nf"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
         &lt;span class="c1"&gt;// Check if string is null or empty&lt;/span&gt;
        &lt;span class="c1"&gt;// If yes, return null because no character exists&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Create frequency array of size 256&lt;/span&gt;
        &lt;span class="c1"&gt;// Each index represents an ASCII character&lt;/span&gt;
        &lt;span class="c1"&gt;// Example: freq['a'] stores count of 'a'&lt;/span&gt;
       &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;freq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
       &lt;span class="c1"&gt;// Convert string into char array and iterate each character&lt;/span&gt;
       &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
           &lt;span class="c1"&gt;// Increment frequency count of character&lt;/span&gt;
           &lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;]++;&lt;/span&gt;
       &lt;span class="o"&gt;}&lt;/span&gt;
       &lt;span class="c1"&gt;// Iterate again to preserve original order&lt;/span&gt;
       &lt;span class="c1"&gt;// We need FIRST non-repeating character&lt;/span&gt;
       &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
          &lt;span class="c1"&gt;// Check if character frequency is exactly 1&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
             &lt;span class="c1"&gt;// Return first unique character immediately&lt;/span&gt;
             &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
          &lt;span class="o"&gt;}&lt;/span&gt;
       &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="c1"&gt;// If no non-repeating character found&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Example 1&lt;/span&gt;
        &lt;span class="c1"&gt;// swiss&lt;/span&gt;
        &lt;span class="c1"&gt;// s -&amp;gt; 3&lt;/span&gt;
        &lt;span class="c1"&gt;// w -&amp;gt; 1&lt;/span&gt;
        &lt;span class="c1"&gt;// i -&amp;gt; 1&lt;/span&gt;
        &lt;span class="c1"&gt;// First non-repeating = w&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"swiss"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="c1"&gt;// Example 2&lt;/span&gt;
        &lt;span class="c1"&gt;// null input&lt;/span&gt;
        &lt;span class="c1"&gt;// returns null&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Approach-2 : LinkedHashMap&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FirstNonRepeatingCharacter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;Character&lt;/span&gt; &lt;span class="nf"&gt;findFirstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Step 1: Create LinkedHashMap to store character frequencies&lt;/span&gt;
        &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;// Step 2: Count frequency of each character&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//If key exists → return value otherwise return default   &lt;/span&gt;
       &lt;span class="c1"&gt;//value 0, for first time of each character always map.getOrDefault(ch, 0) = 0&lt;/span&gt;
            &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Step 3: Find first character with frequency 1&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Entry&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entrySet&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getKey&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"swiss"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Approach-3 : Java Streams + groupingBy&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FirstNonRepeatingCharacter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="nf"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
       &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
            &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
             &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mapToObj&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
             &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupingBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
                     &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                     &lt;span class="nl"&gt;LinkedHashMap:&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                     &lt;span class="nc"&gt;Collectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;counting&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
             &lt;span class="o"&gt;));&lt;/span&gt;

       &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entrySet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getValue&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Entry&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;getKey&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findFirst&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
              &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orElse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"swiss"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNonRepeating&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Comparing 3 Approaches for First Non-Repeating Character&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We will compare:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frequency Array (int[256])&lt;/li&gt;
&lt;li&gt;LinkedHashMap&lt;/li&gt;
&lt;li&gt;Java Streams + groupingBy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We’ll analyze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;readability&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;memory usage&lt;/li&gt;
&lt;li&gt;Unicode support&lt;/li&gt;
&lt;li&gt;interview suitability&lt;/li&gt;
&lt;li&gt;production suitability&lt;/li&gt;
&lt;li&gt;Problem Statement&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Input: "swiss"&lt;/code&gt;&lt;br&gt;
Frequency:&lt;br&gt;
s -&amp;gt; 3&lt;br&gt;
w -&amp;gt; 1&lt;br&gt;
i -&amp;gt; 1&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Output: w&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Approach 1 — Frequency Array (int[256])&lt;/strong&gt;&lt;br&gt;
Code Logic&lt;br&gt;
&lt;code&gt;int[] freq = new int[256];&lt;/code&gt;&lt;br&gt;
Store frequency using ASCII index.&lt;br&gt;
Example: &lt;code&gt;freq['s']&lt;/code&gt;&lt;br&gt;
stores count of s. Visual Flow "swiss"&lt;br&gt;
↓&lt;br&gt;
freq['s'] = 3&lt;br&gt;
freq['w'] = 1&lt;br&gt;
freq['i'] = 1&lt;br&gt;
Second loop:&lt;br&gt;
s -&amp;gt; 3 ❌&lt;br&gt;
w -&amp;gt; 1 ✅&lt;br&gt;
&lt;code&gt;Return:  w&lt;/code&gt;&lt;br&gt;
Time Complexity  &lt;code&gt;Two loops: O(n) + O(n)&lt;/code&gt;&lt;br&gt;
Final: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
Space Complexity &lt;code&gt;int[256]&lt;/code&gt;&lt;br&gt;
Fixed size, so: &lt;code&gt;O(1)&lt;/code&gt; (constant space)&lt;br&gt;
Advantages&lt;br&gt;
✅ Fastest approach&lt;br&gt;
✅ Lowest memory usage&lt;br&gt;
✅ Very interview-friendly&lt;br&gt;
✅ Excellent cache locality&lt;br&gt;
✅ No object creation overhead&lt;br&gt;
Disadvantages&lt;br&gt;
❌ ASCII only&lt;br&gt;
❌ Not Unicode-safe&lt;br&gt;
❌ Less flexible&lt;br&gt;
❌ Hardcoded size assumption&lt;br&gt;
Important Unicode Problem&lt;br&gt;
This breaks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chinese&lt;/li&gt;
&lt;li&gt;Japanese&lt;/li&gt;
&lt;li&gt;Emoji&lt;/li&gt;
&lt;li&gt;Unicode chars&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because Unicode exceeds 256.&lt;br&gt;
Best Use Case Best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;competitive programming&lt;/li&gt;
&lt;li&gt;ASCII-only systems&lt;/li&gt;
&lt;li&gt;performance-critical code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Approach 2 — LinkedHashMap&lt;/strong&gt;&lt;br&gt;
Code Logic&lt;br&gt;
&lt;code&gt;Map&amp;lt;Character, Integer&amp;gt; map = new LinkedHashMap&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why LinkedHashMap?&lt;/strong&gt; Preserves insertion order&lt;/p&gt;

&lt;p&gt;Needed for: FIRST non-repeating character&lt;br&gt;
&lt;code&gt;Time Complexity Insertion: O(1) for each char.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Total: &lt;code&gt;O(n) Space Complexity&lt;/code&gt;&lt;br&gt;
Worst case: all unique characters&lt;br&gt;
Map stores all. So: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Advantages&lt;/strong&gt;&lt;br&gt;
✅ Unicode-safe&lt;br&gt;
✅ Easy to understand&lt;br&gt;
✅ Flexible&lt;br&gt;
✅ Maintains insertion order&lt;br&gt;
✅ Production-friendly&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;br&gt;
❌ More memory usage&lt;br&gt;
❌ Object overhead&lt;br&gt;
❌ HashMap node overhead&lt;br&gt;
❌ Slightly slower than array&lt;/p&gt;

&lt;p&gt;Internal Memory Cost Each entry stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Character object&lt;/li&gt;
&lt;li&gt;Integer object&lt;/li&gt;
&lt;li&gt;Node object&lt;/li&gt;
&lt;li&gt;next pointer&lt;/li&gt;
&lt;li&gt;hash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Much heavier than array.&lt;br&gt;
&lt;strong&gt;Best Use Case&lt;/strong&gt;&lt;br&gt;
Best for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enterprise applications&lt;/li&gt;
&lt;li&gt;Unicode support&lt;/li&gt;
&lt;li&gt;maintainable code&lt;/li&gt;
&lt;li&gt;real production systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Approach 3 — Streams + groupingBy&lt;/strong&gt;&lt;br&gt;
Code Logic &lt;code&gt;str.chars()&lt;/code&gt;&lt;br&gt;
Convert string to stream. Then: &lt;code&gt;groupingBy(...)&lt;/code&gt;&lt;br&gt;
creates frequency map.&lt;br&gt;
Visual Flow&lt;br&gt;
"swiss"&lt;br&gt;
↓ chars()&lt;br&gt;
115 119 105 115 115&lt;br&gt;
↓ mapToObj()&lt;br&gt;
[s,w,i,s,s]&lt;br&gt;
↓ groupingBy()&lt;br&gt;
{&lt;br&gt;
 s=3,&lt;br&gt;
 w=1,&lt;br&gt;
 i=1&lt;br&gt;
}&lt;br&gt;
↓ filter(value == 1)&lt;br&gt;
w&lt;br&gt;
&lt;code&gt;Time Complexity Still: O(n)&lt;/code&gt;&lt;br&gt;
BUT Important Hidden Cost&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streams introduce:&lt;/li&gt;
&lt;li&gt;lambda calls&lt;/li&gt;
&lt;li&gt;boxing/unboxing&lt;/li&gt;
&lt;li&gt;stream pipeline overhead&lt;/li&gt;
&lt;li&gt;temporary objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;So practical runtime is slower. Space Complexity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Internally creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stream objects&lt;/li&gt;
&lt;li&gt;Collectors&lt;/li&gt;
&lt;li&gt;Lambda instances&lt;/li&gt;
&lt;li&gt;LinkedHashMap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worst case: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
but with higher constant factors.&lt;br&gt;
&lt;strong&gt;Advantages&lt;/strong&gt;&lt;br&gt;
✅ Elegant&lt;br&gt;
✅ Functional style&lt;br&gt;
✅ Modern Java&lt;br&gt;
✅ Very expressive&lt;br&gt;
✅ Concise&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;br&gt;
❌ Slowest approach&lt;br&gt;
❌ More garbage objects&lt;br&gt;
❌ Higher memory overhead&lt;br&gt;
❌ Harder debugging&lt;br&gt;
❌ Less beginner-friendly&lt;/p&gt;

&lt;p&gt;Performance Reality Even though all are: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
Big difference exists in actual runtime.&lt;br&gt;
&lt;strong&gt;Real Runtime Ranking **&lt;br&gt;
&lt;code&gt;Array &amp;gt; LinkedHashMap &amp;gt; Streams&lt;/code&gt;&lt;br&gt;
**Memory Ranking Least memory → Highest memory&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Array &amp;gt; LinkedHashMap &amp;gt; Streams&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Readability Ranking&lt;/strong&gt;&lt;br&gt;
Most readable: LinkedHashMap&lt;br&gt;
Most concise: Streams&lt;br&gt;
Most low-level: Array&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9l0uplqjfbno8k18w28s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9l0uplqjfbno8k18w28s.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DRY RUN WITH APPROACH 2(LinkedHashMap) with input&lt;/strong&gt; &lt;code&gt;swiss&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 1 — Null/Empty Check&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Input: "swiss"&lt;br&gt;
Condition: false&lt;br&gt;
Continue execution.&lt;br&gt;
&lt;strong&gt;Step 2 — Create LinkedHashMap&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;LinkedHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initially: {} (empty map)&lt;br&gt;
IMPORTANT&lt;br&gt;
LinkedHashMap preserves insertion order. This is critical.&lt;br&gt;
&lt;strong&gt;Step 3 — Convert String to char[]&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;str.toCharArray()&lt;/code&gt;&lt;br&gt;
Result: [s, w, i, s, s]&lt;br&gt;
FIRST LOOP — Count Frequencies&lt;br&gt;
Iteration 1 char ch = 's'&lt;br&gt;
Execute &lt;code&gt;map.getOrDefault('s', 0)&lt;/code&gt;&lt;br&gt;
's' not present.&lt;br&gt;
Returns: 0 Then 0 + 1 becomes: 1&lt;br&gt;
Put into map&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'s'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Map Now&lt;br&gt;
{&lt;br&gt;
  s=1&lt;br&gt;
}&lt;br&gt;
&lt;strong&gt;Visual Representation&lt;/strong&gt;&lt;br&gt;
Head&lt;br&gt;
 ↓&lt;br&gt;
[s=1]&lt;br&gt;
Iteration 2&lt;br&gt;
char ch = 'w'&lt;br&gt;
Execute&lt;br&gt;
map.getOrDefault('w', 0)&lt;br&gt;
'w' absent.&lt;br&gt;
Returns: 0&lt;br&gt;
Put&lt;br&gt;
&lt;code&gt;map.put('w', 1)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Map Now
{
  s=1,
  w=1
}
Visual
Head
 ↓
[s=1] ⇄ [w=1]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Iteration 3&lt;br&gt;
char ch = 'i'&lt;br&gt;
Execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'i'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns: 0&lt;br&gt;
Put&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;map.put('i', 1)
Map Now
{
  s=1,
  w=1,
  i=1
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visual&lt;br&gt;
&lt;code&gt;[s=1] ⇄ [w=1] ⇄ [i=1]&lt;/code&gt;&lt;br&gt;
Iteration 4 char ch = 's'&lt;br&gt;
Execute&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getOrDefault&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'s'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;'s' exists. Returns: 1&lt;br&gt;
Increment&lt;br&gt;
1 + 1 = 2&lt;br&gt;
Update Map&lt;br&gt;
&lt;code&gt;map.put('s', 2)&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Map Now
{
  s=2,
  w=1,
  i=1
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IMPORTANT&lt;/p&gt;

&lt;p&gt;Insertion order remains SAME.&lt;br&gt;
's' does NOT move.&lt;br&gt;
Visual&lt;br&gt;
&lt;code&gt;[s=2] ⇄ [w=1] ⇄ [i=1]&lt;/code&gt;&lt;br&gt;
Iteration 5&lt;br&gt;
char ch = 's'&lt;br&gt;
Execute&lt;br&gt;
map.getOrDefault('s', 0)&lt;br&gt;
Returns: 2&lt;br&gt;
Increment&lt;br&gt;
2 + 1 = 3&lt;br&gt;
Update&lt;br&gt;
map.put('s', 3)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Final Map
{
  s=3,
  w=1,
  i=1
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Final&lt;/span&gt; &lt;span class="nc"&gt;Internal&lt;/span&gt; &lt;span class="nc"&gt;Linked&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;
&lt;span class="nc"&gt;Head&lt;/span&gt;
 &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="err"&gt;⇄&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="err"&gt;⇄&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="no"&gt;SECOND&lt;/span&gt; &lt;span class="no"&gt;LOOP&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt; &lt;span class="nc"&gt;Find&lt;/span&gt; &lt;span class="nc"&gt;First&lt;/span&gt; &lt;span class="nc"&gt;Non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;Repeating&lt;/span&gt;
&lt;span class="nc"&gt;Traverse&lt;/span&gt; &lt;span class="nf"&gt;entrySet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Entry&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Character&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entrySet&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Traversal order:&lt;br&gt;
&lt;code&gt;s → w → i&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;because LinkedHashMap preserves insertion order.&lt;/p&gt;

&lt;p&gt;Entry 1&lt;br&gt;
s=3&lt;br&gt;
Check&lt;br&gt;
entry.getValue() == 1&lt;br&gt;
Result: false&lt;br&gt;
Continue.&lt;br&gt;
Entry 2&lt;br&gt;
w=1&lt;br&gt;
Check&lt;br&gt;
entry.getValue() == 1&lt;br&gt;
Result: true&lt;br&gt;
Return return 'w'&lt;br&gt;
Final Output &lt;code&gt;w&lt;/code&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>computerscience</category>
      <category>interview</category>
      <category>java</category>
    </item>
    <item>
      <title>Generics in Java Interview Q&amp;A</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Tue, 12 May 2026 20:05:24 +0000</pubDate>
      <link>https://dev.to/tapaspal/generics-in-java-interview-qa-4f1k</link>
      <guid>https://dev.to/tapaspal/generics-in-java-interview-qa-4f1k</guid>
      <description>&lt;p&gt;Java Generics is one of the MOST important Java concepts.&lt;br&gt;
If you understand Generics properly:&lt;br&gt;
&lt;code&gt;collections become safer&lt;br&gt;
code becomes reusable&lt;br&gt;
compile-time bugs reduce dramatically&lt;/code&gt;&lt;br&gt;
A generic type is a generic class or interface that is parameterized over types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Are Generics?&lt;/strong&gt;&lt;br&gt;
Generics allow classes, interfaces, and methods to work with:&lt;br&gt;
&lt;code&gt;different data types safely&lt;/code&gt;&lt;br&gt;
without rewriting code.&lt;br&gt;
&lt;strong&gt;The Diamond&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;In Java SE 7 and later, you can replace the type arguments required to invoke the constructor of a generic class with an empty set of type arguments (&amp;lt;&amp;gt;) as long as the compiler can determine, or infer, the type arguments from the context. This pair of angle brackets, &amp;lt;&amp;gt;, is informally called the diamond. For example, you can create an instance of Box with the following&lt;/em&gt;&lt;br&gt;
statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;integerBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Generic Class&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usage&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Does  Mean?&lt;br&gt;
&lt;code&gt;T means:Type parameter&lt;/code&gt;&lt;br&gt;
Placeholder for actual type.&lt;br&gt;
&lt;strong&gt;Common Generic Type Names&lt;/strong&gt;&lt;br&gt;
Symbol  -   Meaning&lt;br&gt;
T   -    Type&lt;br&gt;
E   -    Element&lt;br&gt;
K   -    Key&lt;br&gt;
V   -    Value&lt;br&gt;
N   -   Number&lt;/p&gt;

&lt;p&gt;Same class reused.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;intBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;strBox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Box&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DISADVANTAGES OF GENERICS&lt;/strong&gt;&lt;br&gt;
Now let us discuss the IMPORTANT limitations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Type Erasure&lt;/strong&gt;&lt;br&gt;
MOST IMPORTANT limitation.&lt;br&gt;
&lt;code&gt;Java removes generic type information at runtime.&lt;/code&gt;&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At runtime becomes: &lt;code&gt;List&lt;/code&gt;&lt;br&gt;
Generic type removed. Why?&lt;br&gt;
&lt;code&gt;Backward compatibility with old Java.&lt;/code&gt;&lt;br&gt;
Consequences of Type Erasure&lt;br&gt;
&lt;code&gt;Cannot Do This&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="k"&gt;instanceof&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile-time error.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Cannot Create Generic Array&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not allowed. Why?&lt;br&gt;
&lt;code&gt;Because runtime type unknown.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Primitive Types Not Allowed&lt;/strong&gt;&lt;br&gt;
Cannot use: &lt;code&gt;List&amp;lt;int&amp;gt;&lt;/code&gt;&lt;br&gt;
Only objects allowed.&lt;br&gt;
Correct &lt;code&gt;List&amp;lt;Integer&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Uses wrapper classes.&lt;/em&gt;&lt;br&gt;
Problem&lt;br&gt;
Wrapper classes add:&lt;br&gt;
memory overhead&lt;br&gt;
boxing/unboxing cost&lt;br&gt;
Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ArrayList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Actually becomes:&lt;br&gt;
Integer.valueOf(10)&lt;br&gt;
Auto-boxing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cannot Create Static Generic Fields&lt;/strong&gt;&lt;br&gt;
Invalid&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="no"&gt;T&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;br&gt;
&lt;code&gt;A static field belongs to the class,&lt;br&gt;
but a generic type belongs to the object instance/type parameter.&lt;/code&gt;&lt;br&gt;
&lt;em&gt;These two concepts conflict.&lt;/em&gt;&lt;br&gt;
First Understand Static Variables&lt;br&gt;
&lt;code&gt;Static variables are:shared across ALL objects&lt;/code&gt;&lt;br&gt;
Only ONE copy exists.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>interview</category>
      <category>java</category>
      <category>programming</category>
    </item>
    <item>
      <title>How ConcurrentHashMap works Internally</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Tue, 12 May 2026 19:35:30 +0000</pubDate>
      <link>https://dev.to/tapaspal/difference-between-hashmap-and-concurrenthashmap-mhl</link>
      <guid>https://dev.to/tapaspal/difference-between-hashmap-and-concurrenthashmap-mhl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmdthzacp4g43ejbfgx2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmdthzacp4g43ejbfgx2.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HashMap is non-thread-safe and optimized for single-threaded performance, while ConcurrentHashMap is designed for concurrent access using fine-grained synchronization and CAS operations. HashMap is preferable for local non-shared data, whereas ConcurrentHashMap is ideal for shared mutable state in multi-threaded applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is ConcurrentHashMap?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ConcurrentHashMap is a thread-safe version of HashMap designed for high concurrency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HashMap Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose two threads update a normal HashMap simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"B"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Since HashMap is not thread-safe, data corruption or lost updates can occur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How ConcurrentHashMap Solves It Java 7&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Used Segment-based locking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ConcurrentHashMap
 ├── Segment 0 (Lock)
 ├── Segment 1 (Lock)
 ├── Segment 2 (Lock)
 └── Segment 3 (Lock)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only the segment being modified gets locked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Java 8+ (Current Implementation)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Segments were removed.&lt;br&gt;
Uses: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CAS (Compare-And-Swap)&lt;/li&gt;
&lt;li&gt;Synchronized locking on individual buckets when needed&lt;/li&gt;
&lt;li&gt;Volatile reads&lt;/li&gt;
&lt;li&gt;Fine-grained locking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly improves performance.&lt;br&gt;
Internal Structure&lt;br&gt;
Imagine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Index 0 -&amp;gt; Node
Index 1 -&amp;gt; Node
Index 2 -&amp;gt; Node
Index 3 -&amp;gt; Node
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each bucket contains a linked list or red-black tree.&lt;br&gt;
Bucket 5&lt;br&gt;
&lt;code&gt;A -&amp;gt; B -&amp;gt; C&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Detailed Example&lt;/strong&gt;&lt;br&gt;
Let's assume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Java"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Spring"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose both keys hash to Bucket 1.&lt;/p&gt;

&lt;p&gt;Internal structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 1
1=Java -&amp;gt; 17=Spring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Scenario -&lt;/strong&gt; Two threads execute simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Kafka"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"AWS"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assume both keys also hash to Bucket 1.&lt;br&gt;
&lt;strong&gt;Step 1: Calculate Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both threads compute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: Bucket 1&lt;br&gt;
Both want to modify the same bucket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: First Thread Acquires Lock&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thread-1 reaches Bucket 1 first.&lt;br&gt;
Internally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// insert new node&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Java&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;Spring&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thread-1 locks the first node.&lt;br&gt;
&lt;code&gt;LOCKED by Thread-1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Thread-2 Arrives&lt;/strong&gt;&lt;br&gt;
Thread-2 also wants Bucket 1.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"AWS"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It tries to acquire the same bucket lock.&lt;br&gt;
Bucket 1 locked --&amp;gt; Thread-2 waits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Thread-1 Updates&lt;/strong&gt;&lt;br&gt;
Thread-1 adds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1=Java
   ↓
17=Spring
   ↓
33=Kafka
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lock released.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Thread-2 Continues&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now Thread-2 acquires the bucket lock.&lt;br&gt;
Current bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1=Java
   ↓
17=Spring
   ↓
33=Kafka
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1=Java
   ↓
17=Spring
   ↓
33=Kafka
   ↓
49=AWS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lock released.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important Observation&lt;/strong&gt;&lt;br&gt;
Only Bucket 1 was locked.&lt;/p&gt;

&lt;p&gt;Other buckets remain available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 0 -&amp;gt; Free
Bucket 2 -&amp;gt; Free
Bucket 3 -&amp;gt; Free
Bucket 4 -&amp;gt; Free
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If another thread writes to Bucket 4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Docker"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it proceeds without waiting.&lt;br&gt;
&lt;strong&gt;This is why ConcurrentHashMap performs much better than Hashtable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;CAS Optimization&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For an empty bucket:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Java"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No lock is taken initially.&lt;br&gt;
Instead it uses CAS:&lt;br&gt;
&lt;strong&gt;compareAndSwap()&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pseudo-code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="no"&gt;CAS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;CAS is a CPU-level atomic operation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This avoids locking completely for many operations.&lt;br&gt;
&lt;em&gt;Read Operations&lt;/em&gt; - Reads usually do not require locking.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thread:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Computes hash&lt;/li&gt;
&lt;li&gt;Finds bucket&lt;/li&gt;
&lt;li&gt;Traverses nodes&lt;/li&gt;
&lt;li&gt;Returns value&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No lock is acquired in most cases.&lt;br&gt;
That's why reads are extremely fast.&lt;br&gt;
&lt;code&gt;---------------------------------------------------------------&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;What is the difference between segment-level locking and CAS-level locking?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;For ConcurrentHashMap, the difference between segment-level locking (Java 7) and CAS + bucket-level locking (Java 8+) is a very common interview question.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Segment-Level Locking (Java 7)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Java 7, the map was divided into multiple Segments.&lt;br&gt;
Think of a segment as a mini hash table with its own lock.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ConcurrentHashMap&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Segment 0 (Lock 0)
 ├─ Bucket 0
 ├─ Bucket 1
 └─ Bucket 2

Segment 1 (Lock 1)
 ├─ Bucket 3
 ├─ Bucket 4
 └─ Bucket 5

Segment 2 (Lock 2)
 ├─ Bucket 6
 ├─ Bucket 7
 └─ Bucket 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Segment 0&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"B"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Segment 0&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Segment 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Thread 1&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"A"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Locks: &lt;code&gt;Segment 0&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Thread 2&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;map.put("B", 200);&lt;/code&gt;&lt;br&gt;
Also needs:&lt;br&gt;
&lt;code&gt;Segment 0&lt;/code&gt;&lt;br&gt;
&lt;em&gt;It must wait even if "A" and "B" are in different buckets inside Segment 0.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 --&amp;gt; LOCK Segment 0
Thread 2 --&amp;gt; WAITING
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Thread 3&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uses Segment 1.&lt;br&gt;
&lt;code&gt;Thread 3 --&amp;gt; LOCK Segment 1&lt;/code&gt;&lt;br&gt;
Can run concurrently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitation&lt;/strong&gt; - A whole segment gets locked.&lt;/p&gt;

&lt;p&gt;Even if there are 100 buckets inside that segment, only one writer can modify anything in that segment at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. CAS + Bucket-Level Locking (Java 8+)&lt;/strong&gt;&lt;br&gt;
Java 8 removed Segments completely.&lt;br&gt;
Structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 0
Bucket 1
Bucket 2
Bucket 3
Bucket 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each bucket can be independently synchronized when needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1: Empty Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Java"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Spring"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bucket 5 is empty. Instead of locking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;insert&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ConcurrentHashMap uses CAS.&lt;br&gt;
Pseudo-code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="no"&gt;CAS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newNode&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What CAS Means&lt;br&gt;
&lt;strong&gt;CAS = Compare And Swap&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected value = null
New value = Node(Java)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CPU executes atomically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If current value == null
    insert node
Else
    fail
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No lock involved.&lt;br&gt;
Example of CAS&lt;br&gt;
Initial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 5 = null
Thread 1
put("Java", value)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CAS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;null -&amp;gt; Node(Java)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Success.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thread 2&lt;/strong&gt;&lt;br&gt;
At the same time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Spring"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CAS checks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Expected = null
Actual   = Node(Java)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fails.&lt;br&gt;
Thread 2 retries.&lt;br&gt;
No lock was used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2: Bucket Already Has Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Suppose: Bucket 5&lt;br&gt;
&lt;code&gt;Java -&amp;gt; Kafka&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"AWS"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Needs linked-list modification.&lt;br&gt;
ConcurrentHashMap locks only that bucket.&lt;br&gt;
Internally similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;firstNode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// update linked list&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comparison Example&lt;br&gt;
Assume:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Segment 0
 ├ Bucket A
 ├ Bucket B
 └ Bucket C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java 7&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1: put(keyA)
locks: Segment 0

Thread 2: put(keyB)
also needs: Segment 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Must wait.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 ---&amp;gt; Running
Thread 2 ---&amp;gt; Waiting
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java 8&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Thread 1: put(keyA)&lt;br&gt;
locks only: Bucket A&lt;/p&gt;

&lt;p&gt;Thread 2: put(keyB)&lt;br&gt;
locks only: Bucket B&lt;/p&gt;

&lt;p&gt;Both proceed simultaneously.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread 1 ---&amp;gt; Running
Thread 2 ---&amp;gt; Running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much higher concurrency.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>java</category>
      <category>performance</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Mutable Key Problem in HashMap</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Tue, 12 May 2026 17:55:52 +0000</pubDate>
      <link>https://dev.to/tapaspal/hash-collision-in-java-2iia</link>
      <guid>https://dev.to/tapaspal/hash-collision-in-java-2iia</guid>
      <description>&lt;p&gt;&lt;strong&gt;Mutable Key Problem in HashMap&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;HashMap depends on hashCode() remaining stable&lt;/code&gt;&lt;br&gt;
If the key changes after insertion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hashCode changes&lt;/li&gt;
&lt;li&gt;bucket location changes&lt;/li&gt;
&lt;li&gt;HashMap cannot find the object anymore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First Understand One Critical Rule&lt;br&gt;
HashMap Stores Entry Based On: &lt;code&gt;hashCode() + equals()&lt;/code&gt;&lt;br&gt;
Simple Mutable Key Example&lt;br&gt;
Employee Class&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 1 — Create Object&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;emp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Current value:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;name = "John"&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Step 2 — Put into HashMap&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Developer"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What Happens Internally?&lt;br&gt;
&lt;code&gt;A. HashMap Calls hashCode()&lt;/code&gt;&lt;br&gt;
&lt;code&gt;emp.hashCode()&lt;/code&gt;&lt;br&gt;
Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"John".hashCode() = 2314539
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;B. Bucket Index Calculated&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Formula:&lt;code&gt;index = (n - 1) &amp;amp; hash&lt;/code&gt;&lt;br&gt;
Suppose result: &lt;code&gt;bucket = 5&lt;/code&gt;&lt;br&gt;
Internal Structure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 5
   ↓
(Employee{name="John"}, "Developer")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Everything works correctly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Retrieve Object&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HashMap again calculates:&lt;br&gt;
&lt;code&gt;"John".hashCode()&lt;/code&gt;&lt;br&gt;
Gets same bucket: &lt;code&gt;bucket 5&lt;/code&gt;&lt;br&gt;
Finds object successfully.&lt;br&gt;
&lt;code&gt;Output:Developer&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;NOW THE DANGEROUS PART&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Step 4 — Modify Key Object&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;emp.name = "David";&lt;/code&gt;&lt;br&gt;
Now object becomes: &lt;code&gt;Employee{name="David"}&lt;/code&gt;&lt;br&gt;
Important Thing The SAME object reference exists.&lt;br&gt;
But: hashCode has changed&lt;br&gt;
&lt;strong&gt;Step 5 — Try Retrieval Again&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;map.get(emp);&lt;/code&gt;&lt;br&gt;
What Happens Internally Now?&lt;br&gt;
A. HashMap Calls hashCode()&lt;br&gt;
Now:&lt;code&gt;"David".hashCode() = 65805908&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Different hashCode.&lt;/em&gt;&lt;br&gt;
B. New Bucket Calculated &lt;code&gt;Now: bucket = 12&lt;/code&gt;&lt;br&gt;
HashMap Searches Wrong Bucket HashMap now checks:&lt;code&gt;Bucket 12&lt;/code&gt;&lt;br&gt;
BUT object actually stored in:&lt;code&gt;Bucket 5&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;BEFORE Mutation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 5
   ↓
(Employee{name="John"}, "Developer")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;hashCode based on:&lt;code&gt;John&lt;/code&gt;&lt;br&gt;
AFTER Mutation Object becomes:&lt;code&gt;Employee{name="David"}&lt;/code&gt; Now HashMap calculates: &lt;code&gt;bucket 12&lt;/code&gt;&lt;br&gt;
So retrieval searches: &lt;code&gt;Bucket 12 → EMPTY&lt;/code&gt;&lt;br&gt;
Final Result&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;null&lt;/code&gt;&lt;br&gt;
&lt;em&gt;This is called:&lt;/em&gt;&lt;code&gt;Hash-based collection corruption&lt;/code&gt;&lt;br&gt;
Even Worse Scenario&lt;br&gt;
Now try: &lt;code&gt;map.containsKey(emp);&lt;/code&gt;&lt;br&gt;
Output:&lt;code&gt;false&lt;/code&gt; even though object exists inside map.&lt;br&gt;
Another Dangerous Problem&lt;br&gt;
Suppose: &lt;code&gt;map.put(emp, "Manager");&lt;/code&gt;&lt;br&gt;
Now HashMap inserts NEW entry.&lt;br&gt;
Internal State Becomes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 5
   ↓
(Employee{name="David"}, "Developer")

Bucket 12
   ↓
(Employee{name="David"}, "Manager")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Same object reference appears logically duplicated.&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;Why Immutable Objects are Safe&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Example: &lt;code&gt;String key = "John";&lt;/code&gt; as Strings are immutable.&lt;br&gt;
Meaning:value never changes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hashCode stable&lt;/li&gt;
&lt;li&gt;bucket stable
So retrieval always works.
Best Practice &lt;code&gt;Always Use Immutable Keys&lt;/code&gt;
Recommended:
&lt;code&gt;String
Integer
UUID
Immutable custom objects
For Custom class use instance variable as final&lt;/code&gt;
&lt;code&gt;How to Create Immutable Key Object&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now object cannot change after insertion.&lt;code&gt;Safe for HashMap&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Real Production Problems Caused&lt;/p&gt;

&lt;p&gt;Mutable keys can cause:&lt;br&gt;
&lt;code&gt;Memory leaks&lt;br&gt;
Duplicate entries&lt;br&gt;
Data inconsistency&lt;br&gt;
Cache corruption&lt;br&gt;
Hard-to-debug production issues&lt;/code&gt;&lt;br&gt;
Especially dangerous in:&lt;br&gt;
&lt;code&gt;caching systems&lt;br&gt;
distributed systems&lt;br&gt;
Hibernate&lt;br&gt;
microservices&lt;br&gt;
concurrent systems&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q1: Why does retrieval fail even though same object reference is used?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Answer:&lt;/strong&gt; &lt;code&gt;Because HashMap first locates bucket using hashCode().&lt;/code&gt; Reference equality is irrelevant until bucket found.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q2: Can equals() alone solve this?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Answer:&lt;/strong&gt;  &lt;code&gt;No.&lt;/code&gt;&lt;br&gt;
Because equals() is checked only AFTER correct bucket located.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q3: Can mutable keys ever be safe?&lt;/strong&gt;&lt;br&gt;
*&lt;em&gt;Answer: *&lt;/em&gt; &lt;code&gt;Only if fields used in hashCode()/equals() never change.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q4: Is there any advantages of using mutable key?&lt;/strong&gt;&lt;br&gt;
*&lt;em&gt;Answer: *&lt;/em&gt;  Mostly used for:&lt;br&gt;
`- object graph traversal&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;serialization frameworks&lt;/li&gt;
&lt;li&gt;proxy systems&lt;/li&gt;
&lt;li&gt;JVM internals`
&lt;em&gt;"Mutable keys are only safe if the mutable state is excluded from equals() and hashCode(). In practice, immutable or effectively immutable keys are preferred because HashMap bucket placement depends on stable hash codes."&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Using StringBuilder as a HashMap Key — Why It Is Dangerous&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;"StringBuilder is a poor HashMap key because it uses reference-based equals/hashCode from Object and is mutable. Even though mutating it does not change the bucket location, the logical identity of the key changes, leading to unpredictable behavior, failed lookups, duplicate logical keys, and corrupted business semantics."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Q. If I have to use a custom class as a key, what precaution I need to take it?&lt;/strong&gt;&lt;br&gt;
Using a Custom Class as a HashMap Key — Precautions You MUST Take&lt;br&gt;
This is a very common experienced-level Java interview question.&lt;br&gt;
If you use a custom object as a HashMap key, the MOST important rule is:&lt;br&gt;
&lt;code&gt;equals() and hashCode() must be implemented correctly and consistently.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Otherwise you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;failed retrievals&lt;/li&gt;
&lt;li&gt;duplicate keys&lt;/li&gt;
&lt;li&gt;memory leaks&lt;/li&gt;
&lt;li&gt;corrupted collections &lt;/li&gt;
&lt;li&gt;unpredictable behavior
&lt;code&gt;Golden Rules for Custom Keys&lt;/code&gt;
Rule 1 — Override BOTH equals() and hashCode()
Never override only one.
&lt;em&gt;WRONG Example&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This breaks HashMap contract.&lt;br&gt;
Correct Rule&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If:
a.equals(b) == true
then:
a.hashCode() MUST equal b.hashCode()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Rule 2 — Use Immutable Fields for Equality&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fields used in:&lt;/p&gt;

&lt;p&gt;`- equals()&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hashCode()`&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;should NEVER change after insertion.&lt;br&gt;
&lt;strong&gt;Best Practice Example&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;)}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why This Is Safe because:&lt;br&gt;
&lt;code&gt;id never changes&lt;br&gt;
hashCode stable&lt;br&gt;
bucket stable&lt;/code&gt;&lt;br&gt;
HashMap works correctly forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be Careful with Lombok&lt;/strong&gt;&lt;br&gt;
Dangerous Lombok Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Data&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;br&gt;
plaintext&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@Data includes ALL fields.&lt;/code&gt;&lt;br&gt;
If name changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hashCode changes&lt;/li&gt;
&lt;li&gt;HashMap breaks
Better

&lt;code&gt;
@EqualsAndHashCode(of = "id")
&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Q. Why do we need to increase the size of the hash map and who determines when to increase it? Although we have hash collision, if we have hash collision, why do we need to increase the size?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Collisions can be handled,&lt;br&gt;
but too many collisions destroy performance.&lt;/code&gt;&lt;br&gt;
Resizing exists to maintain:&lt;br&gt;
&lt;code&gt;near O(1) lookup/insertion performance&lt;/code&gt;&lt;br&gt;
First Understand the Core Structure&lt;/p&gt;

&lt;p&gt;A HashMap internally has:&lt;code&gt;Array of buckets&lt;/code&gt;&lt;br&gt;
Example:&lt;code&gt;table[16]&lt;/code&gt;&lt;br&gt;
Each bucket may contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;empty&lt;/li&gt;
&lt;li&gt;one node&lt;/li&gt;
&lt;li&gt;linked list&lt;/li&gt;
&lt;li&gt;tree&lt;/li&gt;
&lt;li&gt;Visual Example
Suppose capacity:&lt;code&gt;16&lt;/code&gt;
Good Distribution
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bucket 0 → A
Bucket 1 → empty
Bucket 2 → B
Bucket 3 → C
Bucket 4 → empty
Bucket 5 → D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Very few collisions.Operations close to: &lt;code&gt;O(1)&lt;/code&gt; Fast.&lt;br&gt;
What Happens If Map Keeps Growing Without Resize?&lt;br&gt;
Suppose:&lt;br&gt;
&lt;code&gt;still only 16 buckets&lt;br&gt;
but now 10,000 entries inserted&lt;br&gt;
Internal Structure Becomes&lt;br&gt;
Bucket 0 → A → B → C → D → E → F&lt;br&gt;
Bucket 1 → G → H → I → J&lt;br&gt;
Bucket 2 → K → L → M → N → O&lt;br&gt;
...&lt;/code&gt;&lt;br&gt;
Huge collision chains.Now Lookup Becomes Slow&lt;br&gt;
Suppose searching: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
instead of:&lt;code&gt;O(1)&lt;/code&gt;&lt;br&gt;
Important Point&lt;code&gt;Collision handling does NOT eliminate performance degradation.&lt;/code&gt;&lt;br&gt;
&lt;code&gt;It only prevents data loss.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Why Resize Helps, Suppose capacity increases:&lt;br&gt;
16 → 32 Now more buckets available.&lt;br&gt;
Entries redistribute.&lt;br&gt;
&lt;code&gt;BEFORE Resize&lt;br&gt;
Bucket 5&lt;br&gt;
   ↓&lt;br&gt;
A → B → C → D → E&lt;br&gt;
AFTER Resize&lt;br&gt;
Bucket 5  → A → C&lt;br&gt;
Bucket 21 → B → D → E&lt;/code&gt;&lt;br&gt;
Collision chains smaller.&lt;br&gt;
Performance improves.&lt;br&gt;
Main Goal of Resizing&lt;br&gt;
Reduce: collision density&lt;br&gt;
This keeps:&lt;br&gt;
&lt;code&gt;lookup fast&lt;br&gt;
insertion fast&lt;br&gt;
deletion fast&lt;/code&gt;&lt;br&gt;
Who Decides When Resize Happens?&lt;br&gt;
HashMap uses:&lt;br&gt;
load factor&lt;br&gt;
Default Load Factor&lt;br&gt;
0.75&lt;br&gt;
Formula&lt;br&gt;
threshold = capacity × loadFactor&lt;br&gt;
&lt;strong&gt;Bucket Index Calculation&lt;/strong&gt;&lt;br&gt;
Java internally uses:&lt;br&gt;
&lt;code&gt;index = (n - 1) &amp;amp; hash&lt;/code&gt;&lt;br&gt;
Where: n = array capacity&lt;br&gt;
hash = processed hashCode&lt;br&gt;
This is fixed.You cannot override it in normal HashMap.&lt;br&gt;
&lt;code&gt;The bucket calculation algorithm in Java HashMap is fixed internally and cannot be overridden. Java uses (capacity - 1) &amp;amp; hash for fast bucket computation. However, developers indirectly influence bucket placement through the quality of their hashCode() implementation.&lt;/code&gt;&lt;/p&gt;

</description>
      <category>hashmap</category>
      <category>java</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>How does HashMap work internally?</title>
      <dc:creator>Tapas Pal</dc:creator>
      <pubDate>Mon, 11 May 2026 22:11:57 +0000</pubDate>
      <link>https://dev.to/tapaspal/java-questions-on-collections-d1o</link>
      <guid>https://dev.to/tapaspal/java-questions-on-collections-d1o</guid>
      <description>&lt;p&gt;Day-1&lt;br&gt;
&lt;strong&gt;1. How does HashMap work internally?&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Answer:&lt;/em&gt;&lt;br&gt;
High-Level Internal Structure&lt;br&gt;
Internally, HashMap uses:&lt;br&gt;
&lt;code&gt;Array + LinkedList + Red-Black Tree (Java 8+)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Internal Data Structure&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;transient&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;[]&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
     &lt;span class="no"&gt;K&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
     &lt;span class="no"&gt;V&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an array of buckets.&lt;br&gt;
Each bucket stores:&lt;br&gt;
&lt;code&gt;single node&lt;br&gt;
linked list&lt;br&gt;
tree nodes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Basic Working Flow&lt;br&gt;
When you do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HashMap performs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calculate hashCode()&lt;/li&gt;
&lt;li&gt;Calculate bucket index&lt;/li&gt;
&lt;li&gt;Store value in bucket&lt;/li&gt;
&lt;li&gt;Handle collision if needed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step-by-Step Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;102&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"David"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;103&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Alex"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let us understand internally what happens.&lt;br&gt;
Step 1: Create HashMap&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally:&lt;br&gt;
&lt;code&gt;capacity = 16&lt;br&gt;
loadFactor = 0.75&lt;br&gt;
threshold = 12&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Meaning:&lt;br&gt;
resize after 12 elements&lt;br&gt;
&lt;strong&gt;Internal Array&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Initially: &lt;code&gt;table[16]&lt;/code&gt;&lt;br&gt;
Like:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejobnqmgep1u78qw5ns8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fejobnqmgep1u78qw5ns8.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;br&gt;
All buckets empty initially.&lt;br&gt;
Step 2: Insert First Entry&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nc"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="o"&gt;};&lt;/span&gt;
  &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="nc"&gt;Node&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internal Working&lt;br&gt;
&lt;code&gt;A. Calculate hashCode()&lt;/code&gt;&lt;br&gt;
For Integer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For 101: &lt;code&gt;hash = 101&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;B. Calculate Bucket Index&lt;/strong&gt;&lt;br&gt;
Formula:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where: &lt;code&gt;n = capacity = 16&lt;/code&gt;&lt;br&gt;
So: &lt;code&gt;15 &amp;amp; 101&lt;/code&gt;&lt;br&gt;
Binary:&lt;br&gt;
&lt;code&gt;15  = 00001111&lt;br&gt;
101 = 01100101&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Result: 5&lt;/code&gt;&lt;br&gt;
So element stored in: &lt;code&gt;bucket 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal Structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;table[5] → Node(101, "John")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Insert Another Entry&lt;br&gt;
&lt;code&gt;map.put(102, "David");&lt;/code&gt;&lt;br&gt;
Hash: &lt;code&gt;102&lt;/code&gt;&lt;br&gt;
Index: &lt;code&gt;15 &amp;amp; 102 = 6&lt;/code&gt;&lt;br&gt;
Stored at: &lt;code&gt;bucket 6&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Current Structure&lt;br&gt;
&lt;code&gt;table[5] → (101, John)&lt;br&gt;
table[6] → (102, David)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Node Internally?&lt;/strong&gt;&lt;br&gt;
Simplified internal class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="no"&gt;K&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="no"&gt;V&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;next&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Collision Handling&lt;br&gt;
Now suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;117&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Mike"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why Collision Happens?&lt;br&gt;
Index formula: &lt;code&gt;15 &amp;amp; 117 = 5&lt;/code&gt;&lt;br&gt;
Same bucket as &lt;code&gt;101.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now What Happens?&lt;br&gt;
HashMap creates linked list.&lt;br&gt;
&lt;code&gt;table[5]&lt;br&gt;
   ↓&lt;br&gt;
(101, John)&lt;br&gt;
   ↓&lt;br&gt;
(117, Mike)&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This is collision handling.&lt;br&gt;
&lt;strong&gt;How Retrieval Works&lt;/strong&gt;&lt;br&gt;
Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;117&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Step-by-Step Retrieval&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Step 1: Calculate hash&lt;br&gt;
hash = 117&lt;br&gt;
Step 2: Find bucket&lt;br&gt;
15 &amp;amp; 117 = 5&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Go to bucket &lt;code&gt;5&lt;/code&gt;.&lt;br&gt;
Step 3: Traverse nodes&lt;br&gt;
Bucket contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(101, John)
(117, Mike)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HashMap checks: &lt;code&gt;equals()&lt;/code&gt;&lt;br&gt;
until matching key found.&lt;br&gt;
Returns: &lt;code&gt;Mike&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Why equals() is Important?&lt;/strong&gt;&lt;br&gt;
Hash collision possible.&lt;br&gt;
So HashMap uses:&lt;br&gt;
`1. hashCode()&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;equals()`&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are mandatory.&lt;br&gt;
&lt;strong&gt;Internal Put Logic (Simplified)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="no"&gt;V&lt;/span&gt; &lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;V&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;K&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Node&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// collision handling&lt;/span&gt;
        &lt;span class="c1"&gt;// traverse linked list&lt;/span&gt;
        &lt;span class="c1"&gt;// compare using equals()&lt;/span&gt;
        &lt;span class="c1"&gt;// update or append&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Java 8 Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Before Java 8:&lt;/code&gt;&lt;br&gt;
collisions stored as linked list only&lt;br&gt;
&lt;strong&gt;Problem&lt;/strong&gt;:  &lt;code&gt;worst-case O(n)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Java 8 Improvement&lt;/code&gt;&lt;br&gt;
If bucket size becomes: &lt;code&gt;&amp;gt; 8&lt;/code&gt;&lt;br&gt;
Linked list converts to: &lt;code&gt;Red-Black Tree&lt;/code&gt;&lt;br&gt;
called: &lt;code&gt;Treeification&lt;/code&gt;&lt;br&gt;
Now complexity becomes: &lt;code&gt;O(log n)&lt;/code&gt;&lt;br&gt;
instead of: &lt;code&gt;O(n)&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Visual Example&lt;/strong&gt;&lt;br&gt;
Before Treeify&lt;br&gt;
Bucket 5:&lt;br&gt;
&lt;code&gt;A → B → C → D → E → F → G → H → I&lt;/code&gt;&lt;br&gt;
Search slow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;After Treeify
          D
        /   \
       B     G
      / \   / \
     A  C  F  I
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Faster searching.&lt;br&gt;
&lt;strong&gt;Important Interview Point&lt;/strong&gt;&lt;br&gt;
Why Capacity Always Power of 2?&lt;br&gt;
Because index calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is faster than modulo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load Factor Default: &lt;code&gt;0.75&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Meaning: &lt;code&gt;resize when 75% full&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rehashing&lt;/strong&gt;&lt;br&gt;
When threshold exceeded:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;New bigger array created&lt;/li&gt;
&lt;li&gt;Entries redistributed
Example:
&lt;code&gt;16 → 32&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;*&lt;em&gt;Why Immutable Keys Recommended?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
Suppose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;If name changes:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hashCode changes&lt;/li&gt;
&lt;li&gt;retrieval fails&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Very dangerous.&lt;br&gt;
That is why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;String&lt;/li&gt;
&lt;li&gt;Integer&lt;/li&gt;
&lt;li&gt;immutable objects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;recommended as keys.&lt;/p&gt;

&lt;p&gt;**Real Interview Example&lt;br&gt;
**Bad Mutable Key&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Employee&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Employee&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Developer"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"David"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// FAILS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Because:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;bucket changed&lt;/li&gt;
&lt;li&gt;object unreachable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time Complexity&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;Operation Average Worst&lt;br&gt;
put O(1)    O(n)&lt;br&gt;
get O(1)    O(n)&lt;br&gt;
remove  O(1)    O(n)&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Java 8 treeification improves worst case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;O(log n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internal Hash Function&lt;br&gt;
Java improves hash distribution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
            &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashCode&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids poor bucket distribution.&lt;br&gt;
*&lt;em&gt;Null Handling *&lt;/em&gt;&lt;br&gt;
HashMap allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one null key&lt;/li&gt;
&lt;li&gt;multiple null values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Null key always stored in:&lt;/em&gt; &lt;code&gt;bucket 0&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Important Differences&lt;br&gt;
Feature   Thread-safe Null-allowed Performance&lt;br&gt;
HashMap   No           Yes.         Faster&lt;br&gt;
Hashtable Yes          No           Slower&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>interview</category>
      <category>beginners</category>
      <category>hashmap</category>
    </item>
  </channel>
</rss>
