Think of Java operators like the buttons on a calculator. The '+' button adds two numbers, the '>' button checks which number is bigger, and the '==' button asks 'are these two things the same?' In Java, operators are the symbols that tell the program what to DO with your data. Without them, you'd have a bunch of numbers and words sitting there doing absolutely nothing — operators are what bring your data to life.
Every useful program ever written does one of three things: it calculates something, it makes a decision, or it does both. When you open a banking app and it shows your balance after a purchase, that's subtraction. When Netflix decides whether to show you a 'Kids Mode' option based on your account type, that's a comparison. Every single one of those actions is powered by operators — and they're arguably the most fundamental tool in any Java developer's toolbox.
Arithmetic Operators — Java as Your Personal Calculator
Arithmetic operators do exactly what they sound like — they perform maths. Java gives you six of them: addition (+), subtraction (-), multiplication (*), division (/), modulus (%), and the increment/decrement shortcuts (++ and --). You already know the first four from school. The one that surprises beginners is the modulus operator (%). It gives you the remainder after division. So 10 % 3 gives you 1, because 10 divided by 3 is 3 with 1 left over. This is incredibly useful in real programs — for example, checking if a number is even or odd by seeing if number % 2 equals zero. The increment operator (++) simply adds 1 to a variable. Writing score++ is identical to writing score = score + 1, just shorter and cleaner. You'll use this constantly inside loops. The decrement operator (--) does the opposite — subtracts 1. One subtle thing: there's a difference between ++score (pre-increment) and score++ (post-increment) when you use them inside expressions. We'll cover that in the Gotchas section — it trips up almost everyone at first.
ArithmeticOperatorsDemo.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
publicclassArithmeticOperatorsDemo {
publicstaticvoidmain(String[] args) {
int totalPrice = 250; // starting price in pence
int discountAmount = 30; // discount to apply
int numberOfItems = 3; // items in the basket// Basic arithmetic — works exactly like a calculatorint priceAfterDiscount = totalPrice - discountAmount;
System.out.println("Price after discount: " + priceAfterDiscount); // 220int totalForAllItems = priceAfterDiscount * numberOfItems;
System.out.println("Total for all items: " + totalForAllItems); // 660// Integer division — IMPORTANT: both values are int, so result is also int// Any decimal part is simply dropped (not rounded)int sharePerPerson = totalForAllItems / 2;
System.out.println("Each person pays: " + sharePerPerson); // 330// Modulus — gives us the REMAINDER after division// Great for checking even/odd, or wrapping valuesint leftoverPence = totalForAllItems % 7;
System.out.println("Remainder when split 7 ways: " + leftoverPence); // 2// Checking if a number is even — a classic modulus use caseint quantity = 8;
if (quantity % 2 == 0) {
System.out.println(quantity + " is an even number"); // prints this
}
// Increment — adds 1 to the variable, shorter than writing score = score + 1int score = 10;
score++; // score is now 11System.out.println("Score after increment: " + score); // 11// Decrement — subtracts 1int livesRemaining = 3;
livesRemaining--; // livesRemaining is now 2System.out.println("Lives remaining: " + livesRemaining); // 2
}
}
In Java, dividing two int values always produces an int result — the decimal is thrown away without any warning. So 7 / 2 gives you 3, not 3.5. If you need the decimal, make at least one number a double: 7.0 / 2 gives 3.5. This silent truncation causes budget-calculation bugs that are notoriously hard to track down.
Production Insight
Integer division is the #1 source of financial bugs in Java codebases.
One production outage was caused by int shares = total / count; where count was 3 and total was 1000 — shares became 333 instead of 333.33.
Always cast to double when precision matters, or use BigDecimal.
Key Takeaway
Arithmetic operators work on numeric types.
Integer division truncates the decimal part — no rounding.
Use (double) a / b or a * 1.0 / b when you need a decimal result.
Relational and Logical Operators — Teaching Java to Make Decisions
If arithmetic operators are the calculator, relational operators are the judge. They compare two values and return a boolean — either true or false. That's it. There are six of them: == (equals), != (not equals), > (greater than), < (less than), >= (greater than or equal to), and <= (less than or equal to). Notice that equality uses TWO equals signs (==), not one. A single = means assignment (you're setting a value). Two == means comparison (you're asking a question). This is one of the most common beginner mistakes in any language. Logical operators let you chain those comparisons together. AND (&&) means both conditions must be true. OR (||) means at least one must be true. NOT (!) flips a boolean — true becomes false and vice versa. Think of && like a nightclub bouncer checking two ID criteria at once: 'Are you over 18 AND do you have valid ID?' Both must pass. Think of || like a door that opens if you have a keycard OR you know the code — either one is enough.
RelationalAndLogicalDemo.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
publicclassRelationalAndLogicalDemo {
publicstaticvoidmain(String[] args) {
int userAge = 20;
boolean hasValidMembership = true;
double accountBalance = 150.75;
double minimumRequired = 100.00;
// --- RELATIONAL OPERATORS ---// Each comparison produces a boolean: true or falseboolean isAdult = userAge >= 18;
System.out.println("Is user an adult? " + isAdult); // trueboolean balanceIsSufficient = accountBalance > minimumRequired;
System.out.println("Balance sufficient? " + balanceIsSufficient); // trueboolean isExactlyTwenty = userAge == 20;
System.out.println("Is user exactly 20? " + isExactlyTwenty); // trueboolean isNotTwenty = userAge != 20;
System.out.println("Is user NOT20? " + isNotTwenty); // false// --- LOGICAL OPERATORS ---// && (AND) — BOTH sides must be true for the result to be true// Real use: user can access premium content only if adult AND has membershipboolean canAccessPremiumContent = isAdult && hasValidMembership;
System.out.println("Can access premium content? " + canAccessPremiumContent); // true// || (OR) — AT LEAST ONE side must be true// Real use: show warning if balance is low OR membership has expiredboolean membershipExpired = false;
boolean showWarning = !balanceIsSufficient || membershipExpired;
System.out.println("Show account warning? " + showWarning); // false// ! (NOT) — flips the boolean value
boolean isLoggedOut = !hasValidMembership; // hasValidMembership is true, so this is falseSystem.out.println("Is user logged out? " + isLoggedOut); // false// Combining everything — a realistic access checkif (isAdult && hasValidMembership && balanceIsSufficient) {
System.out.println("Access granted — welcome to the platform!");
} else {
System.out.println("Access denied — check your account.");
}
}
}
Output
Is user an adult? true
Balance sufficient? true
Is user exactly 20? true
Is user NOT 20? false
Can access premium content? true
Show account warning? false
Is user logged out? false
Access granted — welcome to the platform!
Pro Tip: Short-Circuit Evaluation Saves You From NullPointerExceptions
Java's && and || operators are 'short-circuit' operators. With &&, if the left side is false, Java skips the right side entirely — it already knows the result is false. This means you can safely write: if (user != null && user.isActive()) — Java checks user != null first, and if it's false (user IS null), it never evaluates user.isActive(), preventing a NullPointerException. Always put the cheaper or null-guarding check on the left.
Production Insight
Short-circuit evaluation prevents null pointer crashes when guarding method calls.
A common production bug: swapping the order so the object is dereferenced before null check.
Always put the null check on the left in AND (&&) conditions.
Use short-circuit && to guard against null: obj != null && obj.isReady().
Never confuse = (assignment) with == (comparison).
Assignment and Compound Assignment Operators — Writing Less, Doing More
The basic assignment operator (=) stores a value into a variable. You've already seen it: int score = 10. That's it doing its job. But Java also gives you compound assignment operators, which combine an arithmetic operation with assignment in one step. Instead of writing totalScore = totalScore + 50, you write totalScore += 50. They're shorthand — nothing more, nothing less. The full set is: += (add and assign), -= (subtract and assign), *= (multiply and assign), /= (divide and assign), and %= (modulus and assign). Beyond being shorter to type, they're also clearer to read. When a teammate sees totalScore += 50 they instantly know you're adding to an existing value — they don't have to parse both sides of a longer expression to figure that out. There's also the ternary operator (?:), which is a compact way to write a simple if-else in a single line. It looks unusual at first, but once it clicks, you'll use it constantly for concise value assignment. The structure is: condition ? valueIfTrue : valueIfFalse. Think of it as asking a yes/no question inline: 'Is the temperature above 25? If yes, use sunscreen; if no, use a jacket'.
AssignmentOperatorsDemo.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
publicclassAssignmentOperatorsDemo {
publicstaticvoidmain(String[] args) {
int playerScore = 100; // basic assignment — storing 100 into playerScore// Compound assignment operators — shorthand for common operations
playerScore += 50; // same as: playerScore = playerScore + 50System.out.println("After bonus points: " + playerScore); // 150
playerScore -= 20; // same as: playerScore = playerScore - 20System.out.println("After penalty: " + playerScore); // 130
playerScore *= 2; // same as: playerScore = playerScore * 2 (double multiplier active)System.out.println("After double multiplier: " + playerScore); // 260
playerScore /= 4; // same as: playerScore = playerScore / 4System.out.println("After score divided: " + playerScore); // 65
playerScore %= 10; // same as: playerScore = playerScore % 10 (keep only the ones digit)System.out.println("Remainder kept: " + playerScore); // 5// --- TERNARY OPERATOR ---// Structure: condition ? valueIfTrue : valueIfFalse// Think of it as a one-line if-else for simple value decisionsint temperature = 28;
// Standard if-else version (verbose):// String advice;// if (temperature > 25) { advice = "wear sunscreen"; }// else { advice = "bring a jacket"; }// Ternary version (clean and concise):String weatherAdvice = (temperature > 25) ? "wear sunscreen" : "bring a jacket";
System.out.println("Weather advice: " + weatherAdvice); // wear sunscreen// Another real-world example — labelling a valueint cartItemCount = 1;
String itemLabel = (cartItemCount == 1) ? "item" : "items";
System.out.println("You have " + cartItemCount + " " + itemLabel + " in your cart.");
// Output: You have 1 item in your cart.
}
}
Output
After bonus points: 150
After penalty: 130
After double multiplier: 260
After score divided: 65
Remainder kept: 5
Weather advice: wear sunscreen
You have 1 item in your cart.
Interview Gold: Ternary vs If-Else — When to Use Which
Use the ternary operator for simple, single-value decisions — it keeps the code readable. Use a full if-else block when you have multiple lines of logic to execute, or when nesting is involved. Nested ternary operators (ternary inside a ternary) are technically valid but almost always a bad idea — they become unreadable fast and most senior devs will flag them in code review.
Production Insight
Compound assignment operators are safe — they implicitly cast the result to the variable's type. But beware: temp += 0.5; on an int variable truncates to int, same as division.
Ternary operators shine in conditional string construction, but never nest them.
Using a += 1 instead of a = a + 1 avoids repeating the variable name and reduces typo risk.
Key Takeaway
Compound assignment operators (+=, -=, etc.) are shorthand for update-then-assign.
Ternary operator (?:) is a compact if-else for single-value decisions.
Do not nest ternaries — readability suffers.
Operator Precedence — Why Java Doesn't Always Calculate Left to Right
Here's something that surprises almost every beginner: Java doesn't always evaluate operators from left to right. It follows operator precedence — a hierarchy of which operators get calculated first, just like the BODMAS/PEMDAS rule you learned in maths class. Multiplication and division happen before addition and subtraction. Parentheses override everything. Without understanding this, you'll write expressions that produce completely unexpected results and spend hours debugging something that looks correct at first glance. The general order from highest to lowest priority is: parentheses first, then increment/decrement, then multiplication/division/modulus, then addition/subtraction, then relational comparisons, then equality checks, then logical AND, then logical OR, and finally assignment. You do not need to memorise this entire list right now. The practical rule that will save you 95% of the time is this: when in doubt, use parentheses. They make your intent crystal clear to both Java and to anyone reading your code later. Explicit is always better than clever when it comes to operator precedence.
OperatorPrecedenceDemo.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
publicclassOperatorPrecedenceDemo {
publicstaticvoidmain(String[] args) {
// --- WITHOUT PARENTHESES — precedence decides the order ---// Multiplication happens BEFORE addition, just like in mathsint resultWithoutBrackets = 2 + 3 * 4;
// Java calculates: 2 + (3 * 4) = 2 + 12 = 14System.out.println("Without brackets: " + resultWithoutBrackets); // 14// --- WITH PARENTHESES — you control the order ---int resultWithBrackets = (2 + 3) * 4;
// Java calculates: (5) * 4 = 20System.out.println("With brackets: " + resultWithBrackets); // 20// Real-world example: calculating a discount correctlydouble originalPrice = 200.0;
double discountPercent = 10.0;
double shippingCost = 15.0;
// WRONG — precedence causes a bug here:// Java calculates: 200.0 - (10.0 / 100.0 * 200.0) + 15.0// That's actually correct here, but watch what happens when intent is ambiguous// CLEAR — parentheses show exactly what you intend:
double discountAmount = (discountPercent / 100.0) * originalPrice; // 20.0double finalPrice = originalPrice - discountAmount + shippingCost;
System.out.println("Discount amount: £" + discountAmount); // £20.0System.out.println("Final price: £" + finalPrice); // £195.0// --- RELATIONAL before LOGICAL in precedence ---int userAge = 22;
double userBalance = 80.0;
// This works correctly because > and < are evaluated BEFORE &&// So Java reads it as: (userAge > 18) && (userBalance > 50.0)boolean isEligible = userAge > 18 && userBalance > 50.0;
System.out.println("User is eligible: " + isEligible); // true// Pre-increment vs post-increment — a precedence-related gotchaint counter = 5;
int postIncrementResult = counter++; // counter's CURRENT value (5) is assigned, THEN counter becomes 6System.out.println("Post-increment result: " + postIncrementResult); // 5System.out.println("Counter after post-increment: " + counter); // 6
int preIncrementResult = ++counter; // counter becomes 7 FIRST, then 7 is assignedSystem.out.println("Pre-increment result: " + preIncrementResult); // 7System.out.println("Counter after pre-increment: " + counter); // 7
}
}
Output
Without brackets: 14
With brackets: 20
Discount amount: £20.0
Final price: £195.0
User is eligible: true
Post-increment result: 5
Counter after post-increment: 6
Pre-increment result: 7
Counter after pre-increment: 7
Pro Tip: Parentheses Are Free — Use Them Generously
There is no performance cost to adding parentheses in Java. They're for human clarity, not compiler instructions. A complex expression with parentheses that your teammate can read in 3 seconds is infinitely better than a clever one-liner they have to puzzle over for 3 minutes. Code is read far more often than it's written.
Production Insight
I've spent hours debugging a formula that was perfectly valid but entirely wrong because of precedent — total = price - discount + tax * 0.08.
Parentheses eliminate ambiguity and make code review faster.
When writing boolean flags, always parenthesise: if ((a > b) && (c != d)).
Key Takeaway
Java follows strict precedence (multiplication before addition, etc.).
Use parentheses liberally — they cost nothing and clarify intent.
Never rely on memorising the full precedence table; explicit > clever.
Bitwise Operators — Manipulating Bits for Flags and Performance
Bitwise operators operate directly on the bits of integer types (int, long, short, byte, char). They are not used in everyday business logic, but they shine when you need compact flags, low-level network protocols, or performance-critical masking. Java has six bitwise operators: AND (&), OR (|), XOR (^), NOT (~), left shift (<<), right shift (>>), and unsigned right shift (>>>). The bitwise AND (&) compares each bit: if both bits are 1, result bit is 1; otherwise 0. Bitwise OR (|): if either bit is 1, result bit is 1. XOR (^): if bits differ, result is 1. NOT (~): flips every bit (one's complement). Shifts move bits left or right: << multiplies by 2^shift, >> divides by 2^shift (preserving sign), >>> fills left with zeros. The most common use case is storing multiple boolean flags in a single int using bit masks. For instance, user permissions: READ=1, WRITE=2, EXECUTE=4. Combine: permissions = READ | WRITE; Check: if ((permissions & EXECUTE) == 0) means user cannot execute. This is how Unix file permissions work, and it's still used in high-performance Java applications.
BitwiseOperatorsDemo.javaJAVA
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
publicclassBitwiseOperatorsDemo {
publicstaticvoidmain(String[] args) {
// --- Define permission flags as powers of 2 ---
final int READ = 1 << 0; // 0001 = 1
final int WRITE = 1 << 1; // 0010 = 2
final int EXECUTE = 1 << 2; // 0100 = 4// Combine permissions using bitwise OR
int userPermissions = READ | WRITE; // 0011 = 3System.out.println("User permissions: " + userPermissions); // 3// Check if user has READ permission using bitwise ANDboolean canRead = (userPermissions & READ) != 0;
System.out.println("Can read? " + canRead); // true// Check if user has EXECUTE permissionboolean canExecute = (userPermissions & EXECUTE) != 0;
System.out.println("Can execute? " + canExecute); // false// Add EXECUTE permission using OR
userPermissions |= EXECUTE; // 0111 = 7System.out.println("Updated permissions: " + userPermissions); // 7// Remove WRITE permission using AND with complement
userPermissions &= ~WRITE; // 0101 = 5System.out.println("After removing WRITE: " + userPermissions); // 5// XOR toggles a flag
userPermissions ^= EXECUTE; // 0001 = 1 (EXECUTE removed)System.out.println("After toggling EXECUTE: " + userPermissions); // 1// --- Bit shifts ---
int value = 8; // 1000System.out.println("value << 1: " + (value << 1)); // 16 (10000)System.out.println("value >> 1: " + (value >> 1)); // 4 (0100)
int negative = -8; // 11111111 11111111 11111111 11111000System.out.println("negative >> 1: " + (negative >> 1)); // -4 (preserves sign bit)System.out.println("negative >>> 1: " + (negative >>> 1)); // 2147483644 (fills with 0)
}
}
Output
User permissions: 3
Can read? true
Can execute? false
Updated permissions: 7
After removing WRITE: 5
After toggling EXECUTE: 1
value << 1: 16
value >> 1: 4
negative >> 1: -4
negative >>> 1: 2147483644
Mental Model: Bits as Light Switches
AND (&): both must be ON for the result to be ON — like two switches in series
OR (|): at least one ON — like switches in parallel
XOR (^): ON only if they are different — like a hallway light with two switches
NOT (~): flips every switch — ON ↔ OFF for every bit
Shift (<<, >>, >>>): moves all switches left or right — fills new positions with 0 or sign bit
Production Insight
Bitwise operators are used in high-performance code like compression, cryptography, and game engines.
In Java, bitwise operations are extremely fast — they compile to single CPU instructions.
Common production use: storing up to 32 boolean flags in one int reduces memory and cache misses.
But misuse (like swapping & and |) produces silent logic bugs that are hard to trace.
Key Takeaway
Bitwise operators work on individual bits of integer types.
Use &, |, ^, ~ for flag manipulation with powers of 2 masks.
Shifts multiply or divide by powers of 2 efficiently.
>> preserves sign; >>> fills with zeros (unsigned).
● Production incidentPOST-MORTEMseverity: high
Integer Division Bug Causes £5,000 Invoice Error
Symptom
Customers in group invoices were consistently undercharged by 1–5 pence per transaction. Finance noticed a drift in total revenue vs expected after daily reconciliation.
Assumption
The developer assumed that dividing two int values (e.g., totalAmount / numberOfPeople) would produce a precise monetary result, forgetting that integer division truncates the decimal part.
Root cause
The code was: int share = totalAmount / numberOfPeople; where totalAmount was in pence and numberOfPeople was an int. This drops the remainder entirely — e.g., 1000 / 3 becomes 333 instead of 333.33, giving the customer 1 pence discount on each of 3 shares.
Fix
Changed the variable types to double for monetary calculations: double share = (double) totalAmount / numberOfPeople; and rounded appropriately at the final display step. Added a unit test with edge cases (not evenly divisible).
Key lesson
Never use int for financial calculations that involve division
Always cast to double before division when decimal precision is needed
Add unit tests with non-divisible amounts to catch truncation bugs
Use BigDecimal for high-precision monetary work; double is acceptable when rounding at display is controlled
Production debug guideSymptom → Action patterns for operator-related bugs that sneak past unit tests4 entries
Symptom · 01
Unexpected numeric result in calculations (e.g., total is off by a fixed amount)
→
Fix
Check if integer division is involved — add debug prints with (double) cast to verify decimal part. Look for int / int patterns in code review.
Symptom · 02
Logical condition always evaluates to true or false regardless of input
→
Fix
Check for assignment = instead of comparison ==. Add parentheses around conditions. Use Yoda conditions (if (10 == x)) to catch accidental assignment.
Symptom · 03
NullPointerException in logical expression
→
Fix
Verify short-circuit evaluation: if left side of && is false the right side is never evaluated. If using ||, null-guard on the left. Ensure object references are checked before method calls.
Symptom · 04
Array index out of bounds in loop
→
Fix
Check increment operator: post-increment vs pre-increment inside loop condition. Use for-each loop if possible. Add bounds check with < not <=.
★ Operator Pitfalls Quick ReferenceThree common operator bugs and how to spot/fix them immediately in production code
Division result is always whole number (no decimals)−
Immediate action
Check if both operands are int. Cast one to double or use double literals.
Commands
System.out.println(7 / 2); // prints 3
System.out.println(7.0 / 2); // prints 3.5
Fix now
Change at least one operand to double: (double) a / b or a * 1.0 / b
if condition compiles but never executes expected block+
Immediate action
Look for single = inside the condition. Replace with ==.
Commands
if (x = 5) { ... } // compiles in some languages, but Java will error for boolean; for non-boolean? Actually Java won't compile this for int types. But for boolean: boolean flag = false; if (flag = true) // always enters
Always compile with warnings enabled: javac -Xlint:all
Fix now
Replace assignment with comparison: if (x == 5)
Increment inside expression returns wrong value+
Immediate action
Separate increment onto its own line.
Commands
int a = 5; int b = a++; // b=5, a=6
int a = 5; int b = ++a; // b=6, a=6
Fix now
Write int b = a; a++; or a++; int b = a; to avoid confusion
Java Operator Types Quick Reference
Operator Type
Symbols
Returns
Primary Use Case
Arithmetic
+ - * / % ++ --
A number (int, double, etc.)
Calculations — totals, scores, discounts
Relational
== != > < >= <=
boolean (true/false)
Comparisons — is X bigger than Y?
Logical
&& || !
boolean (true/false)
Chaining conditions — AND/OR/NOT logic
Assignment
= += -= *= /= %=
The assigned value
Storing or updating variable values
Ternary
? :
Either of two values
Concise if-else for single value decisions
Bitwise
& | ^ ~ << >> >>>
An integer (int, long, etc.)
Low-level bit manipulation, flag operations, network protocols
Key takeaways
1
The modulus operator (%) returns the remainder after division
number % 2 == 0 is the canonical way to check evenness, used in pagination and round-robin.
2
Integer division silently drops decimals in Java
7 / 2 is 3, not 3.5. Cast to double when you need precision: (double) 7 / 2 gives 3.5.
3
== compares primitive values correctly, but for objects (especially Strings) it checks reference identity, not content equality. That's a separate deep-dive, but knowing == has this limitation starts here.
4
Parentheses have zero performance cost and massively improve readability
use them whenever operator precedence might not be obvious.
5
Bitwise operators are fast but rarely needed in everyday Java
save them for flags, networking, and performance-critical sections.
Common mistakes to avoid
4 patterns
×
Using = instead of == in a comparison
Symptom
Code compiles (for boolean types) but the if block always executes or never executes because you assigned instead of compared. For non-boolean types, Java gives a compile error (e.g., if (x = 5) fails). But when using boolean variables, if (flag = true) sets flag to true and always enters the block.
Fix
Always use == for equality comparison. To prevent accidental assignment, consider Yoda conditions: if (5 == x) — if you accidentally write = Java will error because 5 is a literal, not a variable.
×
Integer division silently discarding decimals
Symptom
A calculation like 7 / 2 yields 3 instead of 3.5, causing downstream logic to misbehave. No error or warning is given.
Fix
If you need a decimal result, ensure at least one operand is a double: 7.0 / 2 or (double) 7 / 2. For financial calculations, use BigDecimal.
×
Confusing post-increment and pre-increment inside expressions
Symptom
Expected value from expression is off by one: int b = a++ yields b = 5 when a = 5, but you expected 6 because you thought increment happens before assignment.
Fix
Put the increment on its own line when its relative timing matters. Use a++; int b = a; to guarantee you get the incremented value. If you need the original value, place the variable first: int b = a; a++;
×
Using & or | instead of && or || for logical conditions
Symptom
Both sides are always evaluated even if the left side is false, potentially causing NullPointerException or unnecessary computation. The result might be correct but performance or safety degrades.
Fix
Use && and || for boolean logic to enable short-circuit evaluation. Reserve & and | for bitwise operations on integers.
INTERVIEW PREP · PRACTICE MODE
Interview Questions on This Topic
Q01JUNIOR
What is the difference between == and .equals() in Java, and when would ...
Q02JUNIOR
What does the modulus operator (%) actually return, and can you give me ...
Q03JUNIOR
What is the output of this code and why: int a = 5; int b = a++; System....
Q01 of 03JUNIOR
What is the difference between == and .equals() in Java, and when would using == to compare two String objects give you wrong answer?
ANSWER
== compares primitive values directly (for int, double, boolean, etc.) but for objects it compares reference identity (memory address). .equals() compares logical content. For String, s1 == s2 may be true if both refer to the same object from the String pool, but if created with new String("abc"), they will be different objects. Always use .equals() for String content comparison.
Q02 of 03JUNIOR
What does the modulus operator (%) actually return, and can you give me a real-world use case for it beyond just checking if a number is even or odd?
ANSWER
% returns the remainder after division. Real use cases: (1) Wrapping array indices: index = (index + 1) % array.length for circular traversal. (2) Round-robin load balancing: serverIndex = requestCount % serverCount. (3) Extracting digits from a number: lastDigit = number % 10. (4) Converting seconds to time: minutes = seconds / 60; seconds = seconds % 60.
Q03 of 03JUNIOR
What is the output of this code and why: int a = 5; int b = a++; System.out.println(a + ' ' + b); — Walk me through exactly what happens at each step.
ANSWER
Output: 6 5. Explanation: a is initialised to 5. The expression a++ uses post-increment: the current value of a (5) is assigned to b, THEN a is incremented to 6. So b = 5, a = 6.
01
What is the difference between == and .equals() in Java, and when would using == to compare two String objects give you wrong answer?
JUNIOR
02
What does the modulus operator (%) actually return, and can you give me a real-world use case for it beyond just checking if a number is even or odd?
JUNIOR
03
What is the output of this code and why: int a = 5; int b = a++; System.out.println(a + ' ' + b); — Walk me through exactly what happens at each step.
JUNIOR
FAQ · 4 QUESTIONS
Frequently Asked Questions
01
What is the difference between = and == in Java?
A single = is the assignment operator — it stores a value into a variable, like int age = 25. A double == is the equality comparison operator — it asks a yes/no question, like if (age == 25). Using = where you meant == is one of the most common beginner errors, so always double-check which one you need.
Was this helpful?
02
What does the % operator do in Java?
The % operator is called the modulus operator and it returns the remainder after integer division. For example, 10 % 3 gives 1 because 10 divided by 3 is 3 remainder 1. It's commonly used to check if a number is even (number % 2 == 0), to wrap a value within a range, or to distribute items evenly across groups.
Was this helpful?
03
Why does 7 / 2 equal 3 in Java instead of 3.5?
Because both 7 and 2 are integers (int type), and when Java divides two integers the result is also an integer — the decimal part is simply discarded without rounding. To get 3.5, you need at least one value to be a double: write 7.0 / 2 or cast it with (double) 7 / 2. This is called integer division and it catches beginners off-guard frequently.
Was this helpful?
04
When should I use bitwise operators instead of boolean operators?
Use bitwise operators (&, |, ^) when you need to manipulate individual bits of an integer, such as storing multiple boolean flags in one int, implementing network protocol headers, or low-level cryptography. Use logical operators (&&, ||) for boolean conditions because they short-circuit and are more readable.