Today I learned that from Java 23+ all annotation processors have been explicitly disabled by default. Before Java 23 the full classpath was scanned for any processors and those were automatically picked up. An attacker could exploit this by slipping a malicious processor into one of the many dependencies in your project. Otherwise known as a supply chain attack. That is why Bob stopped working according to some of my colleagues who switched from Java 21 to 25. Turned out it wasn't Bob after all. As such I updated Bobs documentation on how to explicitly set the annotation processor so you can happily generate your builders! https://lnkd.in/eQjD7hcq #java
Jonas Geiregat’s Post
More Relevant Posts
-
🚀 Top 3 Java Features for Cleaner & Shorter Code 🤔 Cut the clutter in your Java code with these 3 modern features. 👇 1️⃣ VAR – Local Variable 🔹E.g., var i = 1; var message = "Hello"; 🔹Java infers types automatically based on data value 🔹BEFORE Java 10, you had to declare types explicitly like below 🔹E.g., int i = 1; String message = "Hello"; 2️⃣ SWITCH EXPRESSIONS – Smarter Branching 🔹Cleaner syntax, returns values directly. 🔹E.g., int result = switch(day) { case MONDAY -> 1; default -> 0; }; 🔹BEFORE Java 14, switch was like below 🔹E.g., switch(day) { case MONDAY: result = 1; break; default: result = 0; } 3️⃣ RECORDS – Lightweight Data Carriers 🔹Below one line is enough to create data class 🔹E.g., record User(String name) {} 🔹Compact and auto-generates constructor & methods. 🔹BEFORE Java 16, creating data classes needed boilerplate like below 🔹E.g., class User { private final String name; User(String name) 🔹E.g., { this. name = name; } public String name() { return name; } } 💬 Which one’s your favorite new feature? #Java #ModernJava #JavaFeatures #CleanCode #CodeSimplified #Programming #SoftwareDevelopment #Developers #CodingTips
To view or add a comment, sign in
-
🚀 Understanding HashMap in Java – The Heart of Fast Lookups! Have you ever wondered how Java’s HashMap gives such blazing-fast access to data? ⚡ Let’s break it down simply 👇 🧠 What is a HashMap? A HashMap in Java is a data structure that stores data in key-value pairs. It allows O(1) average time complexity for insertion, deletion, and lookup! 💡 How it works internally: 1️⃣ Every key is converted into a hash code using the hashCode() method. 2️⃣ The hash code decides which bucket (or index) the entry will be stored in. 3️⃣ If two keys map to the same bucket (collision), Java uses a LinkedList or Balanced Tree (after Java 8) to handle it. 4️⃣ When you call get(key), Java calculates the hash again, jumps directly to the bucket, and fetches the value — super fast! ⚙️ Key Features: ✅ No duplicate keys ✅ Allows one null key and multiple null values ✅ Not thread-safe (use ConcurrentHashMap for concurrency) 🔍 Quick Tip: Always override equals() and hashCode() together to avoid unexpected behavior in collections like HashMap. #Java #HashMap #Coding #BackendDevelopment #JavaInterview #SpringBoot #AdvanceJava
To view or add a comment, sign in
-
How HashMap Works in Java Behind the Scenes Ever wondered what really happens when you write: map.put("Aman", 101); Let’s break it down visually. 1) Hashing: The key’s hashCode() is calculated. Example: "Aman".hashCode() gives an integer. This number decides where the entry will go inside the HashMap. 2) Index Calculation: That hash value is converted to a bucket index using: index = hash & (n - 1); This ensures it fits within the internal array size (n). 3) Bucket Storage (Collision Handling): Each bucket is like a locker. If the locker is empty, your entry is stored directly. If another entry already exists at that index, a linked list is created to chain them. Since Java 8, if too many entries go into the same bucket, it converts into a balanced tree for faster lookup. 4) Lookup / Update: When you do map.get("Aman"), Java repeats the same hash process to find the correct bucket and retrieve the value usually in O(1) time. In short: HashMap = Hashing + Buckets + Trees → Fast & Efficient key-value storage #Java #HashMap #DataStructures #BackendDevelopment #SpringBoot #CodingInsights #Programming
To view or add a comment, sign in
-
-
💡Practical Use of Java 8 Streams — Think Beyond Just Loops Ever found yourself writing long loops just to filter or transform data from a list? That’s where Java 8 Streams shine — clean, readable, and efficient. Let’s look at a real-world example 👇 Imagine you have a list of employees and you want to: • Get all employees earning more than ₹50,000 • Sort them by salary (descending) • Collect just their names Before Java 8: List<String> result = new ArrayList<>(); for (Employee e : employees) { if (e.getSalary() > 50000) { result.add(e.getName()); } } Collections.sort(result); With Streams: List<String> result = employees.stream() .filter(e -> e.getSalary() > 50000) .sorted(Comparator.comparing(Employee::getSalary).reversed()) .map(Employee::getName) .collect(Collectors.toList()); ✅ Readable – you describe what to do, not how to do it ✅ Chainable – each step flows like a pipeline ✅ Parallelizable – add .parallelStream() for large datasets Key takeaway: Streams make your code more declarative, concise, and less error-prone. Once you start using them, you’ll rarely go back to old-style loops. Question for you 👇 What’s one Stream operation you use the most — filter, map, or collect? #Java #Programming #Streams #Java8 #CleanCode #CodingTips
To view or add a comment, sign in
-
🚀 When Java’s HashMap Switches from Linked List to Balanced Tree — and Why It Matters! Did you know that Java’s HashMap got smarter since Java 8? 😎 When multiple keys land in the same hash bucket (due to hash collisions), older versions of Java stored them in a linked list — giving O(n) lookup time in the worst case. But Java 8+ said: “Let’s fix that!” 🔧 Here’s what happens now 👇 ✅ If a bucket gets 8 or more entries, it’s converted from a LinkedList to a Balanced Red-Black Tree. ✅ This makes lookups much faster — turning worst-case O(n) into O(log n). ✅ If the number of entries later drops below 6, it switches back to a linked list. ✅ Treeification only happens when the map capacity is at least 64 — otherwise, it just resizes. 💡 Performance insight: You’ll almost never notice this change in everyday use — because good hash distribution keeps buckets small. But it’s a great defensive design that keeps your application safe from performance drops or hash-collision attacks. 🔍 Pro tips for developers: Always implement a strong hashCode() for custom objects. Initialize maps with a sensible capacity if you know their expected size. Remember, this feature doesn’t replace good design — it’s just a safety net! 📊 In short: Java 8’s HashMap automatically switches to a red-black tree when collisions get heavy, improving lookup speed from O(n) → O(log n). #Java #SpringBoot #HashMap #Coding #Performance #Java8 #DeveloperTips #TechLearning
To view or add a comment, sign in
-
⚙️ Java Multithreading Locks are safe… but slow. 😴 What if threads could update shared data without waiting? That’s where Atomic classes come in — like AtomicInteger, AtomicBoolean, or AtomicReference. Example 👇 // Old way (synchronized) synchronized void increment() { count++; } // Modern way AtomicInteger count = new AtomicInteger(0); count.incrementAndGet(); Here, AtomicInteger ensures thread safety without locking — using something called Compare-And-Set (CAS). 🧠 How CAS works: 1️⃣ Read the current value 2️⃣ Compute the new value 3️⃣ Update it only if the value hasn’t changed in the meantime If another thread changed it, the operation retries — no blocking, no waiting. ⚡ That’s why atomic classes are faster than synchronized methods — they avoid the overhead of acquiring locks while still staying thread-safe. So next time you need lightweight synchronization, reach for AtomicInteger — it’s the modern way to handle concurrency safely. 🌱 If you enjoyed this, follow me — I’m posting Java Multithreading concept every day in simple language. And if you’ve ever used atomic classes in real-world code, share your story in the comments 💬 “Fast, safe, and lock-free — that’s how modern concurrency runs.” ⚙️ #Java #Multithreading #Concurrency #AtomicClasses #CompareAndSet #BackendDevelopment #SpringBoot #Microservices #Interview #Coding #Learning #Placement
To view or add a comment, sign in
-
Spring Boot and the @NotNull Annotation! One of the most common exceptions we face in Java Spring Boot is the NullPointerException — and that’s exactly what @NotNull helps prevent. In my latest article, I explained: 1. What @NotNull does and how it works 2. How to handle validation errors gracefully in Spring Boot If you’re working with REST APIs or data validation in Spring Boot, this one’s for you #SpringBoot #Java #BackendDevelopment #CodingTips #Validation #NotNull #Programming
To view or add a comment, sign in
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development