Topic 22 of 119 3. Operators in Java Interactive Tutorial

Complete Guide to Java Operators and Their Practical Usage

16 mins read Last updated: 22 Aug 2026 18,806 views

Direct Answer & Core Concept

Java operators are special symbols that perform an action on one or more operands. They are grouped into eight families: Arithmetic (+ - * / %), Unary (+ - ++ -- ! ~), Assignment (= += -= *= /= %=), Relational (== != > < >= <=), Logical (&& || !), Bitwise (& | ^ << >> >>>), Ternary (?:) and the Type Comparison operator (instanceof). Understanding how each one behaves lets you write calculations, comparisons, conditions and bit-level logic with confidence.

Detailed Explanation & Mechanics

1. What Are Java Operators? A Beginner-Friendly Definition

An operator in Java is a special symbol that performs an action on one or more values. The values it works with are called operands. So in the expression a + b, the plus sign is the operator and a and b are the operands.

Here is a simple way to remember it: variables and literals are the nouns of your program, while operators are the verbs. Writing age > 18 is Java asking a yes-or-no question, and writing total = total + 1 is Java following an instruction. Remove every operator from a program and you are left with data that can never change, never get compared, and never drive a decision.

  • Operands are the values being processed, such as 10, 3.5, true, or a variable like score.
  • Operators are the symbols that combine or transform those values, for example +, ==, && and ++.
  • An expression is any valid mix of operands and operators, such as (price * quantity) - discount.
  • The result of an expression can be printed, stored in a variable, or reused inside a bigger expression.
Architecture Diagram
ANATOMY OF A JAVA EXPRESSION
┌──────────────────────────────────────────────────────────────┐
│   int total = 10 + 5 * 2;                                    │
│       │        │  │ │ │                                     │
│       │        │  │ └─┴──► Operands  (the numbers 5 and 2)  │
│       │        │  └──────► Operator  (multiplication)       │
│       │        └─────────► Operator  (addition)             │
│       └──────────────────► Variable that stores the result  │
└──────────────────────────────────────────────────────────────┘

One detail that surprises beginners is that the same symbol can mean different things depending on what sits next to it. The + sign adds two numbers, but place a String beside it and the very same symbol joins text together. Java allows this only for string concatenation; for your own classes, operators always keep their original meaning.

2. Why Java Operators Matter in Real Programs

It is tempting to treat operators as a tiny chapter and move on quickly. In practice, almost every feature you will ever build leans on them.

  • In a shopping cart, price * quantity calculates a line total and % applies a percentage discount.
  • In a login form, user.equals(input) && pass.equals(secret) decides whether access is allowed.
  • In a game, health -= damage updates player state and health <= 0 triggers game over.
  • In a banking app, balance >= withdrawal blocks an overdraft before it can happen.
  • In a permissions system, a single bitwise check like flags & READ reveals whether a user may open a record.
Architecture Diagram
OPERATORS INSIDE A REAL APPLICATION
┌───────────────────────────────────────────────────────────────┐
│  USER INPUT ──► COMPARE (==, >, &&) ──► DECIDE ( ? : )        │
│        │                                       │              │
│        └──► CALCULATE (+ - * / %) ◄────────────┘              │
│                     │                                         │
│                     ▼                                         │
│        STORE / UPDATE (=, +=, ++) ──► DISPLAY OUTPUT          │
└───────────────────────────────────────────────────────────────┘

The short version: operators are the tools that convert static values into working logic. Once they feel natural, conditions, loops and calculations stop being scary.

3. The 8 Types of Operators in Java at a Glance

Java groups its operators into a few clear families. Learning the family name makes it easier to search for help later and makes technical interview questions far less intimidating.

Operator FamilySymbolsWhat It DoesEveryday Example
Arithmetic+ - * / %Performs maths on numberstotal = price * qty;
Unary+ - ++ -- ! ~Works on a single valuecount++;
Assignment= += -= *= /= %= &= |= ^= <<= >>= >>>=Stores or updates a valuescore += 10;
Relational== != > < >= <=Compares two values and returns true or falseage >= 18
Logical&& || !Combines boolean conditionsloggedIn && isAdmin
Bitwise& | ^ << >> >>>Works directly on individual bitsflags & 0b0100
Ternary? :Compact single-line if-else choicemax = a > b ? a : b;
Type ComparisoninstanceofChecks the type of an objectobj instanceof String

Do not try to memorize this table in one sitting. Each family below comes with a plain-English explanation and a runnable example, so the details will stick naturally as you go.

4. Arithmetic Operators in Java: Doing the Maths

Java gives you five binary arithmetic operators, and each one needs two operands. They work with int, long, float, double, and even char values (because a char is really a number underneath).

  • + adds two values together, or concatenates a String when one side is text.
  • - subtracts the right value from the left one.
  • * multiplies two values.
  • / divides the left value by the right one.
  • % returns the remainder after division, which is perfect for even/odd checks and clock-style maths.

The single most common beginner trap is integer division. When both operands are whole numbers, Java throws away the fraction instead of rounding it.

Main.java
Run Online
public class ArithmeticDemo {
    public static void main(String[] args) {
        int a = 7, b = 2;
        System.out.println("Add: " +(a + b));
        // 9
        System.out.println("Sub: " +(a - b));
        // 5
        System.out.println("Mul: " +(a * b));
        // 14
        System.out.println("Int div: " +(a / b));
        // 3  (fraction lost)
        System.out.println("Real div: " +(a / 2.0));
        // 3.5 (double involved)
        System.out.println("Modulus: " +(a % b));
        // 1
    }
}
  • Division by zero with whole numbers throws an ArithmeticException and stops the program.
  • Division by zero with double or float produces Infinity or NaN instead of crashing.
  • The modulus sign follows the sign of the left operand: -7 % 2 gives -1, while 7 % -2 gives 1.
  • Adding a double (2.0) to the expression automatically promotes the whole calculation to floating point.

5. Unary Operators in Java: Actions on a Single Value

A unary operator needs only one operand, which is why this family feels a little different. You will see it constantly in loops and counters.

  • Unary plus (+x) keeps a value positive and is rarely used on its own.
  • Unary minus (-x) flips the sign of the value.
  • Increment (++) adds one, and decrement (--) subtracts one.
  • Logical complement (!x) flips true to false and false to true.
  • Bitwise complement (~x) inverts every bit of an integer.

The real interview favourite is the difference between prefix and postfix increment. Prefix change happens first; postfix change happens after the current value is already used.

Main.java
Run Online
public class UnaryDemo {
    public static void main(String[] args) {
        int a = 5;
        int pre = ++a;
        // a becomes 6, pre is 6
        int b = 5;
        int post = b++;
        // post is 5, b becomes 6
        boolean flag = false;
        System.out.println("pre=" + pre + " post=" + post + " b=" + b);
        System.out.println("!flag = " +(!flag));
        // true
        System.out.println("~0 = " +(~0));
        // -1
    }
}
  • Prefer separate statements such as count++; instead of mixing them into larger expressions.
  • A classic puzzle is i = i++; which leaves i unchanged, because the postfix value is written back before the increment takes effect.

6. Assignment Operators in Java: Storing and Updating Values

The assignment operator = copies the value on its right into the variable on its left. Reading it as "gets" instead of "equals" prevents most beginner confusion, because == is the comparison operator, not =.

Compound assignment operators combine a calculation and a store in one short step.

Architecture Diagram
COMPOUND ASSIGNMENT SHORTHAND
┌──────────────────────┬──────────────┬──────────────────────┐
│  Full form           │  Shorthand   │  Meaning             │
├──────────────────────┼──────────────┼──────────────────────┤
│  total = total + 5;  │  total += 5; │  add and store       │
│  total = total - 5;  │  total -= 5; │  subtract and store  │
│  total = total * 5;  │  total *= 5; │  multiply and store  │
│  total = total / 5;  │  total /= 5; │  divide and store    │
│  total = total % 5;  │  total %= 5; │  remainder and store │
└──────────────────────┴──────────────┴──────────────────────┘

There is a hidden bonus: compound assignment quietly performs an automatic type cast, which plain assignment does not.

Main.java
Run Online
public class AssignmentDemo {
    public static void main(String[] args) {
        int score = 50;
        score += 25;
        // 75
        score *= 2;
        // 150
        byte b = 10;
        b += 5;
        // compiles: implicit cast back to byte
        // b = b + 5;  // would NOT compile: int result cannot fit in byte
        System.out.println("score=" + score + " b=" + b);
        int x, y, z;
        x = y = z = 100;
        // chained, evaluated right-to-left
        System.out.println(x + "," + y + "," + z);
    }
}
  • Assignment operators are right-to-left associative, which is what allows chaining like x = y = z = 5.
  • Never use = where you meant ==, because = inside an if condition is either a compile error or a silent logic bug.

7. Relational Operators in Java: Asking Yes-or-No Questions

Relational (comparison) operators always return a boolean: true or false. They are the engine behind every if statement and loop condition you will ever write.

Architecture Diagram
RELATIONAL OPERATORS AT A GLANCE
┌──────────┬──────────────────────────┬──────────────────┐
│ Operator │ Meaning                  │ Example (true)   │
├──────────┼──────────────────────────┼──────────────────┤
│    ==    │ equal to                 │   5 == 5         │
│    !=    │ not equal to             │   5 != 3         │
│    >     │ greater than             │   9 > 4          │
│    <     │ less than                │   2 < 8          │
│    >=    │ greater than or equal to │   5 >= 5         │
│

For primitive values, == compares the actual values. For objects such as String, == compares references (memory addresses), while .equals() compares content. This single difference causes more bugs than any other operator topic.

Main.java
Run Online
public class RelationalDemo {
    public static void main(String[] args) {
        int age = 20;
        System.out.println(age >= 18);
        // true
        System.out.println(age != 20);
        // false
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        System.out.println(s1 == s2);
        // true  (same pooled object)
        System.out.println(s1 == s3);
        // false (different objects)
        System.out.println(s1.equals(s3));
        // true  (same characters)
    }
}
  • Use == and != for primitives such as int, char, boolean and double.
  • Use .equals() for objects such as String, Integer and your own classes.
  • Avoid comparing floating-point numbers with == because tiny rounding differences make the result unreliable.

8. Logical Operators in Java: Combining Conditions

Logical operators let you join several boolean conditions into one. They are what make real-world rules expressible in a single line.

  • && (AND) is true only when both sides are true.
  • || (OR) is true when at least one side is true.
  • ! (NOT) flips a boolean value.

The && and || operators are called short-circuit operators, and that behaviour is a genuine feature rather than a quirk. Java stops evaluating the moment the answer is already known, which improves speed and, more importantly, keeps your code safe.

Main.java
Run Online
public class LogicalDemo {
    public static void main(String[] args) {
        String name = null;
        // Safe: the null check runs first and the second part is skipped
        if (name != null && name.length() > 0) {
            System.out.println("Name is valid");
        } else {
            System.out.println("No crash - short circuit saved us");
        } int marks = 72;
        boolean passed = marks >= 40 && marks
Architecture Diagram
SHORT-CIRCUIT EVALUATION
┌────────────────────────────────────────────────────────────┐
│   (a != null)  &&  (a.length() > 0)                        │
│         │                                                  │
│         │  left side is false ──► right side is SKIPPED    │
│         ▼                                                  │
│   No NullPointerException, the overall result is false     │
├────────────────────────────────────────────────────────────┤
│   (isAdmin)  ||  (isEditor)                                │
│         │                                                  │
│         │  left side is true ──► right side is SKIPPED     │
│         ▼                                                  │
│   Faster execution, the overall result is true             │
└────────────────────────────────────────────────────────────┘
  • Order matters. Put the cheapest or safest check first, such as the null check.
  • The single-character versions & and | also work on booleans, but they evaluate both sides every time, so use them only when you intend that.

9. Bitwise and Shift Operators in Java: Working With Raw Bits

Bitwise operators act on the individual 0s and 1s of an integer. Most beginners will not need them daily, but they are the standard tool for flags, permissions, cryptography and highly efficient code.

Architecture Diagram
BITWISE TRUTH TABLE
┌───────────┬────────┬────────┬────────┐
│  a    b   │  a & b │  a | b │  a ^ b │
├───────────┼────────┼────────┼────────┤
│  0    0   │    0   │    0   │    0   │
│  0    1   │    0   │    1   │    1   │
│  1    0   │    0   │    1   │    1   │
│  1    1   │    1   │    1   │    0   │
└───────────┴────────┴────────┴────────┘
& = both bits are 1    | = either bit is 1    ^ = bits differ
Main.java
Run Online
public class BitwiseDemo {
    public static void main(String[] args) {
        int a = 0b1100;
        // 12 in binary
        int b = 0b1010;
        // 10 in binary
        System.out.println("AND  a & b  = " +(a & b));
        // 8
        System.out.println("OR   a | b  = " +(a | b));
        // 14
        System.out.println("XOR  a ^ b  = " +(a ^ b));
        // 6
        System.out.println("Left  a > 1 = " +(a >> 1));
        // 6  (halves)
    }
}
  • << shifts bits left and effectively multiplies by powers of two.
  • >> shifts bits right and preserves the sign bit, so it divides negative numbers correctly.
  • >>> shifts right and fills the empty left bits with zeros, which is why it is called the unsigned shift.
  • A popular trick uses XOR to swap two values without a temporary variable.

10. The Ternary Operator in Java: A Compact if-else

The ternary operator is the only operator in Java that takes three operands. It is a neat way to choose one of two values in a single line.

Architecture Diagram
SYNTAX:   condition ? valueIfTrue : valueIfFalse
┌────────────────────────────────────────────────────────────┐
│   isLoggedIn  ?  "Welcome back"  :  "Please sign in"       │
│       │              │                    │                │
│       │              │                    └─► answer when  │
│       │              │                        the test is  │
│       │              │                        false         │
│       │              └──────────────────────► answer when  │
│       │                                        the test is │
│       │                                        true        │
│       └──────────────────────────────────────► the question │
└────────────────────────────────────────────────────────────┘
Main.java
Run Online
public class TernaryDemo {
    public static void main(String[] args) {
        int score = 85;
        String grade =(score >= 90) ? "A" :(score >= 80) ? "B" : "C";
        int a = 15, b = 25;
        int max =(a > b) ? a : b;
        System.out.println("Grade: " + grade);
        // B
        System.out.println("Max: " + max);
        // 25
    }
}
  • Use the ternary operator for short, readable choices such as setting a label or a default value.
  • Avoid chaining more than two ternaries, because nested versions become hard to read and debug.
  • Both branches must return a value; you cannot place statements such as System.out.println() inside them.

11. The instanceof Operator in Java: Checking Object Types

The instanceof operator checks whether an object belongs to a particular class or interface. It is a safety net before you cast, and it plays a big role in polymorphism and modern pattern matching.

Main.java
Run Online
public class InstanceofDemo {
    public static void main(String[] args) {
        Object value = "Java";
        System.out.println(value instanceof String);
        // true
        System.out.println(value instanceof Integer);
        // false
        // Safe cast thanks to the check
        if (value instanceof String) {
            String text =(String) value;
            System.out.println(text.toUpperCase());
        } // Java 16+ pattern matching removes the manual cast
        if (value instanceof String s) {
            System.out.println("Length = " + s.length());
        }
    }
}
  • instanceof always returns a boolean and never throws an exception, even for null.
  • Checking the type before casting prevents the dreaded ClassCastException.
  • From Java 16 onward, pattern matching lets you declare the variable right inside the condition.

12. Java Operator Precedence and Associativity: Which One Runs First

When several operators appear in one expression, Java follows a fixed priority list. Operators higher in the table are evaluated first, and when two operators share the same level, associativity decides the direction.

PriorityOperatorsAssociativity
Highestexpr++ expr-- . () []Left to Right
High++expr --expr +expr -expr ! ~ (cast) newRight to Left
Medium* / %Left to Right
Medium+ -Left to Right
Medium<< >> >>>Left to Right
Medium< > <= >= instanceofLeft to Right
Low== !=Left to Right
Low& then ^ then |Left to Right
Low&& then ||Left to Right
Low? : (ternary)Right to Left
Lowest= += -= *= /= %= &= |= ^= <<= >>= >>>=Right to Left
Main.java
Run Online
public class PrecedenceDemo {
    public static void main(String[] args) {
        int a = 10 + 5 * 2;
        // 20  (multiplication first)
        int b =(10 + 5) * 2;
        // 30  (parentheses win)
        boolean check = 5 + 3 > 6 && 2 * 4 < 20;
        // 8>6 && 8 true
        System.out.println(a + " " + b + " " + check);
    }
}
  • Parentheses always win, and adding them never hurts readability.
  • Because assignment is right-to-left associative, a = b = c = 5 works as expected.
  • When in doubt, split a long expression into smaller steps with named variables.

13. Practical Usage: Four Real-World Examples You Can Try

Reading about operators is useful, but writing them is what makes them stick. Here are four tiny programs that mirror genuine tasks.

Example One - A shopping cart total with a discount:

Main.java
Run Online
int price = 250, qty = 3;
int subtotal = price * qty;
double discount =(subtotal > 500) ? subtotal * 0.10 : 0;
double payable = subtotal - discount;
System.out.println("Payable = " + payable);
// 675.0

Example Two - An even-or-odd checker using the modulus operator:

Main.java
Run Online
int number = 42;
System.out.println(number % 2 == 0 ? "Even" : "Odd");
// Even

Example Three - A permission system with bitwise flags:

Main.java
Run Online
final int READ = 1;
// 001
final int WRITE = 2;
// 010
final int EXEC = 4;
// 100
int userFlags = READ | WRITE;
// 3
boolean canWrite =(userFlags & WRITE) != 0;
System.out.println("Can write: " + canWrite);
// true

Example Four - A safe age gate using short-circuit logic:

Main.java
Run Online
Integer userAge = null;
boolean allowed = userAge != null && userAge >= 18;
System.out.println("Allowed: " + allowed);
// false, no crash
  • Notice how each example combines two or more operator families rather than using them in isolation.
  • Real code rarely uses a single operator type; it blends arithmetic with comparison and logic.

14. Mistakes Beginners Make With Java Operators

Almost every Java learner hits the same handful of stumbles. Knowing them in advance saves hours of debugging.

  • Confusing = with ==. One assigns, the other compares; mixing them up produces either an error or a silent bug.
  • Comparing Strings with == instead of .equals(), which compares memory references rather than text content.
  • Forgetting integer division, so 5 / 2 returns 2 instead of 2.5. Add a decimal or cast to double to fix it.
  • Writing byte b = 1; b = b + 2; and wondering why it will not compile. Use b += 2 or an explicit cast.
  • Assuming && always evaluates both sides. It does not, thanks to short-circuiting.
  • Using the wrong shift operator, mixing up >> with >>> on negative numbers.
  • Comparing doubles with ==, where floating-point rounding makes the result unpredictable.

15. Java Operators Cheat Sheet: Quick Reference

Keep this short table handy while you practise. It condenses the whole page into a single glance.

TaskOperator to UseTiny Example
Add two numbers+a + b
Get the remainder%a % 2
Increase by one++count++
Add and store+=total += 5
Check equality of primitives==a == b
Check equality of objects.equals()s1.equals(s2)
Combine conditions&& ||a > 0 && b > 0
Invert a boolean!!flag
Flip bits~~x
Toggle a bit^mask ^ 1
Choose between two values? :a > b ? a : b
Check an object typeinstanceofobj instanceof String

Once these twelve lines feel automatic, you are ready for the control-flow chapter, where operators power every if statement, switch case and loop condition you write.

Runnable Code Example: Complete Guide to Java Operators and The

Java 17+
Main.java
Run Online
public class OperatorsGuide {
    public static void main(String[] args) {
        // ---------- Arithmetic operators ----------
        int a = 10, b = 3;
        System.out.println("Add: " +(a + b));
        // 13
        System.out.println("Div: " +(a / b));
        // 3  (integer division)
        System.out.println("Real div: " +(a / 3.0));
        // 3.333...
        System.out.println("Modulus: " +(a % b));
        // 1
        // ---------- Unary operators ----------
        int x = 5;
        System.out.println("Prefix ++x: " +(++x));
        // 6
        System.out.println("Postfix x++: " +(x++));
        // 6, then x becomes 7
        System.out.println("Now x is: " + x);
        // 7
        System.out.println("Bitwise ~0: " +(~0));
        // -1
        // ---------- Assignment operators ----------
        int score = 50;
        score += 20;
        // 70
        score *= 2;
        // 140
        System.out.println("Score: " + score);
        // ---------- Relational and logical operators ----------
        int age = 21;
        boolean canVote = age >= 18 && age <= 120;
        System.out.println("Can vote: " + canVote);
        // true
        // ---------- Short-circuit safety ----------
        String name = null;
        boolean validName = name != null && name.length() > 0;
        System.out.println("Valid name: " + validName);
        // false, no crash
        // ---------- Strings need equals(), not == ----------
        String s1 = "java";
        String s2 = new String("java");
        System.out.println("s1 == s2: " +(s1 == s2));
        // false
        System.out.println("s1.equals(s2): " + s1.equals(s2));
        // true
        // ---------- Bitwise flags ----------
        final int READ = 1, WRITE = 2, EXEC = 4;
        int permissions = READ | WRITE;
        // 3
        System.out.println("Can write: " +((permissions & WRITE) != 0));
        // true
        // ---------- Ternary operator ----------
        int p = 15, q = 25;
        int max =(p > q) ? p : q;
        System.out.println("Max: " + max);
        // 25
        // ---------- instanceof ----------
        Object value = "Java Operators";
        if (value instanceof String s) {
            // Java 16+ pattern matching
            System.out.println("Length: " + s.length());
        }
    }
}

Common Java Technical Interview Questions & Answers

Interview Prep
Q1

What is the difference between == and equals() in Java?

The == operator compares primitive values directly and compares object references (memory addresses) for objects. The equals() method compares the actual content of two objects, which is why String comparison should always use equals().
Q2

What is the difference between prefix (++i) and postfix (i++) increment?

Prefix increments the variable first and then returns the new value, so ++i uses the updated value immediately. Postfix returns the current value first and increments afterwards, so i++ uses the old value inside the expression and updates the variable only after.
Q3

Why does 5 / 2 give 2 instead of 2.5 in Java?

When both operands are integers, Java performs integer division and discards the fractional part instead of rounding it. To get 2.5, make at least one operand a floating-point value, for example 5 / 2.0 or (double) 5 / 2.
Q4

What is short-circuit evaluation in Java?

With && and ||, Java stops evaluating as soon as the final result is already determined. Because the right-hand side may be skipped, short-circuiting improves performance and allows safe guard checks such as name != null && name.length() > 0.
Q5

What is the difference between >> and >>> in Java?

The >> operator is the signed (arithmetic) right shift and preserves the sign bit, so negative numbers stay negative. The >>> operator is the unsigned (logical) right shift and fills the vacated leftmost bits with zeros.
Q6

Does Java support operator overloading?

Java does not allow programmers to overload operators for their own classes. The only built-in exception is the + operator, which is internally overloaded to concatenate Strings as well as add numbers.
Q7

What does the ternary operator do and when should you use it?

The ternary operator (condition ? valueIfTrue : valueIfFalse) is a compact form of a simple if-else that returns one of two values. It is ideal for short assignments such as setting a default, but nested ternaries hurt readability and should be avoided.
Q8

What is the role of the instanceof operator?

instanceof checks whether an object is an instance of a specific class or interface and returns a boolean. It is commonly used to verify a type before casting, which prevents a ClassCastException. Java 16 and later also support pattern matching with instanceof.
Q9

Why is b = b + 2 invalid for a byte variable but b += 2 is valid?

The expression b + 2 promotes the byte to an int, and assigning an int back to a byte requires an explicit cast. The compound assignment operator += performs that implicit narrowing cast automatically, which is why it compiles.
Q10

Which operator has the highest precedence in Java?

Postfix operators such as expr++, expr-- and array or member access have the highest precedence, followed by unary operators. Because precedence strongly affects results, using explicit parentheses is always the safest choice.

Key Takeaways, Best Practices & Clean Code Rules

Java Best Practice & Production Rules

Reach for == only with primitives and use equals() for every object comparison, especially Strings. Wrap complicated expressions in parentheses even when you are sure of the precedence rules, because readability beats cleverness and your future self will thank you. Prefer clear named variables over long chained expressions. Remember that integer division truncates, so cast to double whenever a decimal result is expected. Take advantage of short-circuit evaluation by placing null or boundary checks first. Use compound assignment operators such as += for automatic narrowing casts on small types, and reserve the ternary operator for short, single decisions rather than deeply nested logic. Finally, test edge cases like zero, negatives and overflow, since most operator bugs hide in exactly those places.
We value your privacy & transparency

OperateTools uses cookies and local storage to ensure basic tool functionality, preserve preferences, and analyze aggregated traffic. We never sell your personal data or index your document files. Learn more in our Privacy Policy.