Một chương trình thực tế bao hàm việc tạo ra các biến. Các toán tử kết hợp các giá trị đơn giản hoặc các biểu thức con thành những biểu thức mới, phức tạp hơn và có thể trả về các giá trị. Điều này có hàm ý tạo ra các toán tử luận lý, số học, quan hệ và so sánh trên các biểu thức.
Toán tử trong java là 1 ký hiệu được dùng để thực hiện 1 phép tính/chức năng nào đấy. Techacademy sẽ giới thiệu đến bạn các toán tử cơ bản (Basic Operators) trong Java
I. Toán Tử New Trong Java
1. Từ khóa new trong Java là gì?
Đầu tiên, phải khẳng định luôn “new” trong Java là 1 … từ khóa (keyword). Vâng, chính vì vậy, chúng ta không được đặt tên hàm, phương thức, biến hay bất cứ thứ gì trùng với từ khóa new. Từ khóa new được dùng để cấp phát bộ nhớ cho đối tượng.
Nói rõ hơn đó là:
Lúc ta định nghĩa ra 1 đối tượng, chúng ta chỉ mới tạo ra nó trong “kế hoạch”, trong “tưởng tượng”. Đối tượng chưa thực sự tồn tại vì chưa được cấp phát vùng nhớ trên máy tính.
Tiếp đó, chúng ta dùng new để chính thức cấp phát vùng nhớ cho đối tượng. Đến lúc này thì đối tượng mới thực sự tồn tại trong chương trình của chúng ta.
Lưu ý: Trong Java có 1 số lớp đặc trưng không cần dùng từ khóa “new” để tạo đối tượng cho nó, do đó cách dùng của nó khá giống với 1 kiểu dữ liệu, điển hình trong trường hợp này là String.
2. Những cách dùng từ khóa new trong Java?
Từ khóa new được dùng chủ yếu trong việc tạo ra đối tượng, giúp ta có thể thao tác với đối tượng đó.
Cú pháp đơn giản của nó:
ViDuNew obj = new ViDuNew();
Nó thường được dùng bằng 1 số cách sau đây:
Cách 1: Các dùng từ khóa new để tạo đối tượng đơn giản
public class ViDuTuKhoaNew1 { void hienThiThongTin() { System.out.println("Gọi phương thức hienThiThongTin"); } public static void main(String[] args) { // Tạo đối tượng mới ViDuTuKhoaNew1 obj = new ViDuTuKhoaNew1(); // Truy cập phương thức của đối tượng obj.hienThiThongTin(); } }
Như các bạn thấy, sau khi tạo 1 class và định nghĩa phương thức hienThiThongTin() thì chúng ta chưa truy cập được phương thức đó ngay.
Mà phải tạo 1 đối tượng (thể hiện) của class đó thì mới truy cập được:
ViDuTuKhoaNew1 obj = new ViDuTuKhoaNew1();
Sau đó, các bạn có thể dùng đối tượng (thể hiện) vừa tạo để truy cập các phương thức, biến đối tượng của nó.
obj.hienThiThongTin();
Kết quả nhận được là:
Gọi đến phương thức hienThiThongTin
Cách 2: dùng từ khóa new và tham chiếu đến constructor tương ứng.
Như các bạn đã biết, khi tạo đối tượng, chương trình sẽ tự động gọi đến constructor tương ứng (nếu có định nghĩa rõ ràng constructor) hoặc nếu không có thì tự tạo và gọi đến constructor mặc định.
public class ViDuTuKhoaNew2 { ViDuTuKhoaNew2() { System.out.println("Gọi đến constructor tương ứng"); } public static void main(String[] args) { // Tạo đối tượng mới ViDuTuKhoaNew2 obj = new ViDuTuKhoaNew2(); } }
Khi chạy chương trình, chúng ta nhận được kết quả là:
Gọi đến constructor tương ứng
Cách 3: Gọi từ khóa new để khởi tạo đối tượng mới có đối số.
Ví dụ, ở đây mình định nghĩa 1 class là Student và thực hiện get / set cho class này.
class Student { private String MSSV; private String ten; // Hàm (constructor) khởi tạo đối tượng public Student(String MSSV, String ten) { this.MSSV = MSSV; this.ten = ten; } // Các hàm get, set thuộc tính của đối tượng public String LayMSSV() { return this.MSSV; } public String LayTen() { return this.ten; } public void DatMSSV(String MSSV) { this.MSSV = MSSV; } public void DatTen(String ten) { this.ten = ten; } }
Tiếp đó mình tạo 1 class Main (trong cùng file Main.java) để thực hiện 1 số hành động dùng class Student.
class Main { public static void main(String[] args) { // Khai báo 1 đối tượng Student và khởi tạo nó luôn, cùng 1 dòng lệnh Student student = new Student("B1714757", "Tran Thanh Tam"); // Thao tác với đối tượng vừa được khởi tạo System.out.println("Trước khi chỉnh sửa:"); System.out.println("Mã số sinh viên: " + student.LayMSSV()); System.out.println("Tên sinh viên: " + student.LayTen()); student.DatMSSV("B1704948"); student.DatTen("Nguyen Viet Tu"); System.out.println("Sau khi chỉnh sửa:"); System.out.println("Mã số sinh viên: " + student.LayMSSV()); System.out.println("Tên sinh viên: " + student.LayTen()); } }
Khi định nghĩa xong class Student thì bạn chưa dùng được chúng, chưa gọi đến được các phương thức của nó.
Bởi vì bạn mới chỉ lập 1 bản kế hoạch thôi.
Sau khi dùng từ khóa new, ví dụ như thế này:
Student student = new Student("B1714757", "Tran Thanh Tam");
Thì 1 sinh viên thực thụ mới được tạo ra (được cấp phát bộ nhớ)
Ở đây, mình truyền đối số trong khi new đối tượng để tận dụng constructor tạo ra các thông tin ban đầu của sinh viên luôn.
Kết quả có được như thế này:
Trước khi chỉnh sửa: Mã số sinh viên: B1714757 Tên sinh viên: Tran Thanh Tam Sau khi chỉnh sửa: Mã số inh viên: B1704948 Tên sinh viên: Nguyen Viet Tu
Nếu bạn không tạo đối tượng, thì bạn không thể truy cập, chỉnh sửa như thế này được đâu:
student.DatMSSV("B1704948"); student.DatTen("Nguyen Viet Tu");
Cách 4: dùng từ khóa new để tạo mảng
Đúng vậy, bạn có thể tạo 1 mảng bằng cách dùng từ khóa new:
public class ViDuTuKhoaNew4 { // Tạo 1 đối tượng mảng static int arr[]=new int[5]; public static void main(String[] args) { System.out.println("Độ dài của mảng là: "+ arr.length); } }
Lưu ý, ta dùng từ khóa static
khi tạo mảng đối tượng để truy cập mà không cần tạo đối tượng mới.
Kết quả nhận được là:
Độ dài của mảng là: 5
Hoặc nếu bạn tạo đối tượng mảng mới trong phương thưc main thì không cần static, ví dụ:
public class ViDuTuKhoaNew4 { public static void main(String[] args) { // Tạo 1 đối tượng mảng int arr[]=new int[5]; System.out.println("Độ dài của mảng là: "+ arr.length); } }
Khi chạy chương trình, chúng ta cũng nhận được kết quả tương tự:
Độ dài của mảng là: 5
II. Toán Tử Bit Trong Java
Các toán tử dạng bit cho phép mọi người thao tác trên từng bit riêng biệt trong các kiểu dữ liệu nguyên thuỷ. Toán tử Bit có thể áp dụng cho kiểu số nguyên integer, long, short, char, byte.
Giả sử A = 60, B = 13
Chuyển qua dạng nhị phân
A = 0011 1100
B = 0000 1101
Toán tử | Mô tả | Ví dụ |
& | Bitwise and | A & B = 0000 1100 |
| | Bitwise or | A || B = 0011 1101 |
^ | Bitwise xor | A ^ B = 0011 0001 |
~ | Bitwise đảo bit | ~A = 1100 0011 |
<< | Left shift | A << 2 = 1111 0000 |
>> | Right shift | A >> 2 = 1111 |
>>> | Righ shift fill zero | A >> 2 = 0000 1111 |
dùng hàm Integer.toBinaryString() để chuyển 1 số nguyên sang số dạng bit.
public class Main { public static void main(String[] args) { int a = 60, b = 13; int c; System.out.println("bit a: " + Integer.toBinaryString(a)); System.out.println("bit b: " + Integer.toBinaryString(b)); c = a & b; System.out.println("Ket qua phep (&): " + Integer.toBinaryString(c)); c = a | b; System.out.println("Ket qua phep (|): " + Integer.toBinaryString(c)); c = a ^ b; System.out.println("Ket qua phep (^): " + Integer.toBinaryString(c)); c = ~a; System.out.println("Ket qua phep (~): " + Integer.toBinaryString(c)); c = a << 2; System.out.println("Ket qua phep (<<): " + Integer.toBinaryString(c)); c = a >>2; System.out.println("Ket qua phep (>>): " + Integer.toBinaryString(c)); c = a >>>2; System.out.println("Ket qua phep (>>>): " + Integer.toBinaryString(c)); } }
III. Toán Tử Instanceof Trong Java
Toán tử instanceof trong Java là 1 toán tử được dùng để kiểm tra xem đối tượng này có phải là instance của 1 class hay interface nào đấy hay không? Kết quả trả về của toán tử này sẽ là true nếu đối tượng đấy là thể hiện của class mà bạn đang check, ngược lại thì false.
Ví dụ, mình có 1 class Application dưới đây:
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Application application = new Application(); System.out.println(application instanceof Application); }
Trong hàm main() của class này, mình initialize 1 đối tượng của class Application và dùng toán tử instanceof để kiểm tra xem đối tượng này có phải là instance của class Application này hay không? bạn sẽ thấy kết quả sẽ dưới đây:
Nếu bạn viết code dưới đây:
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Application application = new Application(); System.out.println(application instanceof String); } }
thì IDE sẽ báo lỗi ngay:
Đây là trong trường hợp quá tường minh, quá rõ ràng, IDE có thể báo lỗi cho bạn biết ngay.
Nhưng nếu bạn có 1 interface với 2 implementation dưới đây:
package com.huongdanjava.java; public interface Shape { }
package com.huongdanjava.java; public class Triangle implements Shape { }
package com.huongdanjava.java; public class Rectangle { }
thì lúc này nếu bạn initialize đối tượng của class Triangle nhưng lại đi kiểm tra đối tượng này có phải là thể hiện của class Rectangle,
package com.huongdanjava.java; public class Application { public static void main(String[] args) { Shape shape = new Triangle(); System.out.println(shape instanceof Rectangle); } }
IDE sẽ không thể detect lỗi lúc compile time nhưng khi chạy bạn sẽ thấy kết quả dưới đây:
Chúng ta sẽ thường dùng toán tử instanceof trong trường hợp kiểm tra xem tham số truyền vào của 1 phương thức có phải là instance của 1 class nào đấy hay không? Ví dụ như:
private void check(Shape shape) { if (shape instanceof Triangle) { Triangle triangle = (Triangle) shape; System.out.println("This is triangle: " + triangle.toString()); } }
Trong phương thức trên, tham số interface Shape có nhiều implementation khác nhau, trong phần body của phương thức, chúng ta sẽ check xem là instance được truyền vào phương thức này có phải là Triangle hay không? Nếu đúng thì xử lý code tiếp.
Kết quả:
package com.huongdanjava.java; public class Application { private void check(Shape shape) { if (shape instanceof Triangle) { Triangle triangle = (Triangle) shape; System.out.println("This is triangle: " + triangle.toString()); } } public static void main(String[] args) { Application application = new Application(); application.check(new Triangle()); } }
Từ Java 14, bạn có thể viết lại phương thức check() dùng pattern matching instanceof, đơn giản dưới đây:
private void check(Shape shape) { if (shape instanceof Triangle triangle) { System.out.println("This is triangle: " + triangle.toString()); } }
Với cách viết mới, chúng ta không cần viết thêm 1 dòng code để cast instance về đối tượng mà chúng ta muốn nữa. Tất cả sẽ được thực hiện trong dòng lệnh if.
Kết quả vẫn như vậy:
IV. Toán Tử Gán Trong Java
Chương trình ví dụ đơn giản như sau minh họa những toán tử gán trong Java. Copy và paste chương trình Java này trong Test.java file và sau đó biên dịch và thực thi chương trình này:
TOÁN TỬ | MIÊU TẢ | VÍ DỤ: B = 20, A = 10 |
---|---|---|
= | Toán tử gán đơn giản. Gán giá trị toán hạng bên phải cho toán hạng trái. | C = A + B sẽ gán giá trị của A + B vào cho C |
+= | Thêm giá trị toán hạng phải tới toán hạng trái và gán giá trị đó cho toán hạng trái. | C += A là tương đương với C = C + A |
-= | Trừ đi giá trị toán hạng phải từ toán hạng trái và gán giá trị này cho toán hạng trái. | C -= A là tương đương với C = C – A |
*= | Nhân giá trị toán hạng phải với toán hạng trái và gán giá trị này cho toán hạng trái. | C *= A là tương đương với C = C * A |
/= | Chia toán hạng trái cho toán hạng phải và gán giá trị này cho toán hạng trái. | C /= A là tương đương với C = C / A |
%= | Lấy phần dư của phép chia toán hạng trái cho toán hạng phải và gán cho toán hạng trái. | C %= A là tương đương với C = C % A |
<<= | Dịch trái toán hạng trái sang số vị trí là giá trị toán hạng phải. | C <<= 2 là giống như C = C << 2 |
>>= | Dịch phải toán hạng trái sang số vị trí là giá trị toán hạng phải. | C >>= 2 là giống như C = C >> 2 |
&= | Phép AND bit | C &= 2 là giống như C = C & 2 |
^= | Phép OR loại trừ bit | C ^= 2 là giống như C = C ^ 2 |
|= | Phép OR bit. | C |= 2 là giống như C = C | 2 |
public class Test { public static void main(String args[]) { int a = 10; int b = 20; int c = 0; c = a + b; System.out.println("c = a + b = " + c ); c += a ; System.out.println("c += a = " + c ); c -= a ; System.out.println("c -= a = " + c ); c *= a ; System.out.println("c *= a = " + c ); a = 10; c = 15; c /= a ; System.out.println("c /= a = " + c ); a = 10; c = 15; c %= a ; System.out.println("c %= a = " + c ); c <<= 2 ; System.out.println("c <<= 2 = " + c ); c >>= 2 ; System.out.println("c >>= 2 = " + c ); c >>= 2 ; System.out.println("c >>= a = " + c ); c &= a ; System.out.println("c &= 2 = " + c ); c ^= a ; System.out.println("c ^= a = " + c ); c |= a ; System.out.println("c |= a = " + c ); } }
Nó sẽ cho kết quả như sau:
c = a + b = 30 c += a = 40 c -= a = 30 c *= a = 300 c /= a = 1 c %= a = 5 c <<= 2 = 20 c >>= 2 = 5 c >>= 2 = 1 c &= a = 0 c ^= a = 10 c |= a = 10
Các bạn không được dùng toán tử gán này để gán giá trị boolean cho 1 biến có kiểu dữ liệu là char, byte, short, int, long hay float, hay double và ngược lại. Nếu cố gắng làm điều đó thì sẽ bị lỗi compile ngay.
Bạn không thể gán 1 biến mà kiểu dữ liệu của nó có khoảng giá trị lớn hơn sang 1 biến có kiểu giá trị có khoảng giá trị nhỏ hơn.
Ví dụ, chúng ta không thể gán 1 biến có kiểu long sang biến có kiểu int như sau:
đó là bởi vì khoảng giá trị của kiểu long lớn hơn int rất nhiều.
– Các toán tử còn lại bao gồm “+=“, “-=“, “*=“, “/=” là dạng viết tắt của của phép tính cộng trừ nhân chia với toán tử gán.
“+=”: đầu tiên là cộng sau đó là gán.
“-=”: đầu tiên là trừ sau đó là gán.
“*=”: đầu tiên là nhân sau đó là gán.
“/=”: đầu tiền là chia sau đó là gán.
Ví dụ chúng ta có phép tính như sau:
a += b;
có nghĩa là
1 a = a + b;
Hay
Java a -= b; 1 a -= b;
có nghĩa là
a = a - b
Tương tự vậy cho phép chia và phép nhân.
V. Toán Tử Chia Hết Trong Java
Cùng Techacademy viết chương trình nhập vào 1 mảng các số nguyên bất kỳ và sau đó hiển thị các phần tử chia hết cho 5 trong mảng đó.
Để kiểm tra 1 phần tử trong mảng có chia hết cho 5 hay không thì các bạn sẽ dùng vòng lặp for để duyệt các phần tử trong mảng và thực hiện toán tử chia lấy dư phần tử đó cho 5. Nếu kết quả của toán tử đó = 0 thì sẽ hiển thị phần tử đó ra, ngược lại thì quay lại vòng lặp for và thực hiện lại các lệnh trong thân vòng lặp.
public static void main(String[] args) { int n; Scanner scanner = new Scanner(System.in); do { System.out.println("Nhập vào số phần tử của mảng: "); n = scanner.nextInt(); } while (n <= 0); int A[] = new int[n]; System.out.println("Nhập các phần tử cho mảng: "); for (int i = 0; i < n; i++) { System.out.print("Nhập phần tử thứ " + i + ": "); A[i] = scanner.nextInt(); } // tìm và hiển thị các phần tử trong mảng chia hết cho 5 System.out.println("Các phần tử chia hết cho 5 là: "); for (int i = 0; i < n; i++) { if (A[i] % 5 == 0) { System.out.print(A[i] + "\t"); } } }
Kết quả sau khi biên dịch chương trình:
VI. Toán Tử Chia Lấy Dư Trong Java
Cùng Techacademy tham khảo các ví dụ về toán tử chia lấy dư trong Java nhé
Cho 2 biến kiểu số nguyên a
và b
được nhập từ bàn phím, các bạn hãy viết chương trình hiển thị ra màn hình:
a % b = {P}
Với {P} là phần dư của phép chia a/b.
Ví dụ nếu các bạn nhập
7 3
thì màn hình sẽ hiển thị lên dòng chữ:
a % b = 1
Giải thích: 7 chia 3 dư 1
Lý thuyết:
Để lấy phần dư của 1 phép chia các bạn có thể sử dụng toán tử %. Ví dụ chương trình:
import java.util.Scanner; public class Input { public static void main(String[] args) { System.out.println(5 % 3); } }
Kết quả khi chạy chương trình:
2
Do 2 là phần dư của phép chia 5/3.
Đọc tới đây bạn đã biết cách lấy ra phần dư của phép chia, hãy quay lại phần bài tập và làm thử.
Hướng dẫn:
Code mẫu sử dụng toán tử %:
import java.util.Scanner; public class Input { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); System.out.println("a % b = " + (a % b)); } }
Code mẫu không sử dụng toán tử %:
import java.util.Scanner; public class Input { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); System.out.println("a % b = " + (a - b * (a / b))); } }
VII. Toán Tử Điều Kiện Trong Java
Bài tập:
Toán tử này gồm 3 toán hạng và được dùng để ước lượng những biểu thức quan hệ. Mục tiêu của toán tử chính là quyết định giá trị nào sẽ được gán cho biến.
Toán tử này được viết như sau:
bien x = (bieu_thuc) ? (giatri1 neu true) : (giatri1 neu true); //hoac ban cung co the su dung trong cac lenh RETURN return (bieu_thuc) ? (giatri1 neu true) : (giatri2 neu false);
- biểu thức 1: Biểu thức logic. Trả trả về giá trị True hoặc False
biểu thức 2: Là giá trị trả về nếu xác định là True
biểu thức 3: Là giá trị trả về nếu xác định là False
Tất nhiên, bạn không cần thiết phải dùng các dấu ngoặc đơn như trên. Mình viết như vậy để giúp các bạn dễ nhìn hơn. Sau đây chính là ví dụ minh họa toán tử điều kiện (? trong Java:
public class Test { public static void main(String args[]){ int a , b; a = 10; b = (a == 1) ? 20: 30; //Day la vi du ve toan tu dieu kien. System.out.println( "Gia tri cua b la : " + b ); b = (a == 10) ? 20: 30; //Day la vi du ve toan tu dieu kien. System.out.println( "Gia tri cua b la : " + b ); } }
Nó sẽ cho kết quả sau:
Gia tri cua b la : 30 Gia tri cua b la : 20
Ví dụ 2:
public class Test { public static void main(String[] args) { int a = 20; int b = 3; String s = (a % b == 0) ? "a chia het cho b" : "a khong chia het cho b"; System.out.println(s); } }
Kết quả là:
a khong chia het cho b
VIII. Toán Tử Mũ Trong Java
Math.pow(x,y) là phương thức dùng để tính lũy thừa xy (x là cơ số và y là số mũ).
Ví dụ cụ thể như sau:
public static void main(String[] args) { double x = 2, y = 3, z; z = Math.pow(x, y); System.out.println(x + "^" + y + " = " + z); }
Kết quả sau khi biên dịch chương trình sẽ nhận được:
IX. Toán Tử 2 Ngôi Trong Java
Toán tử &, |, ^ – Đây là các toán tử 2 ngôi với 2 số hạng là 2 dãy bit
&: đọc là AND, kết quả của biểu thức là 1 nếu cả 2 bit số hạng là 1, ngược lại kết quả là 0.
| : đọc là OR, kết quả của biểu thức là 1 nếu một trong 2 bit số hạng là 1, ngược lại kết quả là 0.
^: đọc là XOR, kết quả của biểu thức là 1 nếu 2 bit số hạng khác nhau, ngược lại kết quả là 0.
Ví dụ có p và q là 2 bit cần đưa vào tính toán:
p | q | p & q | p | q | p ^ q |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
X. Toán Tử 3 Ngôi Trong Java
Toán tử điều kiện là 1 loại toán tử đặc biệt vì nó gồm 3 thành phần cấu thành biểu thức điều kiện, hay nói cách khác toán tử điều kiện là toán tử 3 ngôi.
Cú pháp:
biến = Biểu thức logic ? Câu lệnh khi biểu thức trả về true : Câu lệnh khi biếu thức trả về false;
Trong đó:
Biểu thức logic: là 1 biểu thức logic, nó trả trả về giá trị true hoặc false.
Câu lệnh khi biểu thức trả về true: Giá trị trả về nếu Biểu thức logic nhận giá true.
Câu lệnh khi biếu thức trả về false: Giá trị trả về nếu Biểu thức logic nhận giá false.
Ví dụ 1:
String result = isTroiMua() === true ? System.out.println("Tôi sẽ nghỉ học") : System.out.println("Tôi sẽ đi học");
Chú ý: Kiểu giá trị của Câu lệnh khi biểu thức trả về true và Câu lệnh khi biếu thức trả về false phải tương thích với nhau.
Ví dụ 2: Đoạn biểu thức điều kiện sau trả về giá trị “a là số chẵn” nếu như giá trị của biến a là số chẵn, ngược lại trả về giá trị “a là số lẻ” nếu như giá trị của biến a là số lẻ.
String result = a % 2 == 0 ? "a là số chẵn" : "a là số lẻ";
Ví dụ 3: Nếu như trước đây khi phải dùng với if – else chúng ta sẽ có như thế này:
int exp = 3; int salary; if (exp > 3) { salary = 1000; } else { salary = 500; }
Thì bây giờ chỉ còn:
int exp = 1; int salary = exp > 3 ? 1000 : 500;
Nếu như trước đây ta sẽ có :
int exp = 2; int salary; if ( exp < 1 ) { salary = 1000; } else if ( exp < 2 ) { salary = 1500; } else if ( exp < 3 ) { salary = 2000; } else { salary = 3000; }
Thì bây giờ chỉ còn:
int exp = 2; int salary = exp < 1 ? 1000 : exp < 2 ? 1500 : exp < 3 ? 2000 : 3000
XI. Toán Tử Quan Hệ Trong Java
Các toán tử quan hệ được dùng kiểm tra mối quan hệ giữa hai toán hạng. Kết quả của 1 biểu thức có dùng các toán tử quan hệ là những giá trị Boolean (logic “true” hoặc “false”). Các toán tử quan hệ được dùng trong các cấu trúc điều khiển.
TOÁN TỬ | MIÊU TẢ | VÍ DỤ: B = 20, A = 10 |
---|---|---|
== | Kiểm tra nếu giá trị của 2 toán hạng có cân bằng hay không, nếu có thì điều kiện là true. | (A == B) là không true. |
!= | Kiểm tra nếu giá trị 2 toán hạng là cân bằng hay không, nếu không cân bằng, thì điều kiện là true | (A != B) là true. |
> | Kiểm tra nếu toán hạng trái có lớn hơn toán hạng phải hay không, nếu có thì điều kiện là true | (A > B) là không true. |
< | Kiểm tra nếu toán hạng phải có lớn hơn toán hạng trái hay không, nếu có thì điều kiện là true | (A < B) là true. |
>= | Kiểm tra nếu toán hạng trái có lớn hơn hoặc bằng toán hạng phải hay không, nếu có thì điều kiện là true | (A >= B) là không true. |
<= | Kiểm tra nếu toán hạng phải có lớn hơn hoặc bằng toán hạng trái hay không, nếu có thì điều kiện là true | (A <= B) là true. |
Lưu ý: Toán tử == và != được dùng trong các trường hợp sau:
So sánh hai kiểu nguyên thủy số hoặc ký tự. Nếu các giá trị số thuộc các kiểu dữ liệu khác nhau, các giá trị sẽ tự động được thăng hạng. Ví dụ: 5 == 5,00 trả về true vì phía bên trái được thăng cấp thành double.
So sánh hai giá trị boolean.
So sánh hai đối tượng, bao gồm giá trị null và chuỗi.
Ví dụ:
1 class RelationalOp { 2 public static void main(String args[]) { 3 float a = 10.0 F; 4 double b = 10.0; 5 if (a = = b) 6 System.out.println(a and b are equal”); 7 else 8 System.out.println("a and b are not equal"); 9 } 10 }
Output:
a and b are not equal
Trong chương trình trên cả a và b là các số có dấu phẩy động, dạng dữ liệu có khác nhau, a là kiểu float còn b là kiểu double. Tuy vậy chúng không phải là cùng 1 kiểu. Bởi vậy khi kiểm tra giá trị của các toán hạng, kiểu dữ liệu cần phải được kiểm tra.
XII. Toán Tử So Sánh Trong Java
Thực hiện so sánh đối tượng với toán tử == và nạp chồng phương thức equals để so sánh ư đối tượng giống nhau về dữ liệu. Cần phải nhớ rằng khi bạn tạo ra các đối tượng, biến lưu đối tượng là 1 tham chiếu tới đối tượng. Do đó khi dùng toán tử so sánh bằng ==, nó sẽ dùng tham chiếu để so sánh chứ không dùng giá trị đối tượng so sánh.
class Animal { String name; Animal(String n) { name = n; } } class MyClass { public static void main(String[ ] args) { Animal a1 = new Animal("Robby"); Animal a2 = new Animal("Robby"); Animal a3 = a1; System.out.println(a1 == a2);//false System.out.println(a1 == a3);//true } } //Outputs false true
Bạn thấy a1, a2 có dữ liệu name giống nhau nhưng so sánh là khác nhau vì nó dùng tham khảo a1 là 1 đối tượng khác với a2 (a1,a2 ở hai vị trí bộ nhớ khác nhau).
a1, a3 đều trỏ đến 1 địa chỉ bộ nhớ lên nó bằng nhau.
equals()
Mỗi đối tượng đều có 1 phương thức định nghĩa sẵn equals() được dùng để so sánh về dữ liệu. Để dùng nó với lớp, bạn cần nạp chồng và thi hành kiểm tra điều kiện bằng nhau hay không.
Cách đơn giản với Eclipse là nhấn phải chuột cửa sổ soạn thảo lớp, chọn Source > Generate hashCode() and equals()…, sẽ tự sinh ra cho bạn
class Animal { String name; Animal(String n) { name = n; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Animal other = (Animal) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } } class MyClass { public static void main(String[] args) { Animal a1 = new Animal("Robby"); Animal a2 = new Animal("Robby"); System.out.println(a1.equals(a2)); //true } }
Ví dụ trên đã thực sự so sánh dữ liệu đối tượng
XIII. Toán Tử Xor Và Or Trong Java
Toán Tử Xor
Phép toán thao tác bit XOR lấy hai dãy bit có cùng độ dài và thực hiện phép toán logic bao hàm XOR trên mỗi cặp bit tương ứng. Kết quả ở mỗi vị trí là 1 chỉ khi bit đầu tiên là 1 hoặc nếu chỉ khi bit thứ hai là 1, nhưng sẽ là 0 nếu cả hai là 0 hoặc cả hai là 1. Ở đây ta thực hiện phép so sánh hai bit, kết quả là 1 nếu hai bit khác nhau và là 0 nếu hai bit giống nhau. Ví dụ:
0101 (số thập phân 5)
XOR 0011 (số thập phân 3)
0110 (số thập phân 6)
(cách nhớ dễ nhất là: 2 bit giống nhau trả về 0, 2 bit khác nhau trả về 1)
Bảng chân trị cho XOR:
Phép toán thao tác bit XOR có thể được dùng để đảo ngược các bit được lựa chọn trong thanh ghi (còn được gọi là bật (set) hoặc lật (flip)). Bất kỳ bit nào được bật bằng cách thực hiện phép toán thao tác bit XOR nó với 1. Ví dụ: cho dãy bit 0010 (số 2 thập phân), bit thứ hai và thứ tư có thể được kích hoạt bằng cách dùng phép toán thao tác bit XOR với 1 dãy bit có chứa 1 ở vị trí thứ hai và thứ tư:
0010 (số thập phân 2) XOR 1010 (số thập phân 10) = 1000 (số thập phân 8)
Kỹ thuật này có thể được dùng để điều khiển dãy bit biểu hiện các bộ chứa phép toán logic đúng sai (boolean).
Trong C, C++, Java, C#, toán tử thao tác bit XOR được biểu diễn bằng ký hiệu “^” (dấu mũ). Trong Pascal, toán tử này là “xor”. Ví dụ:
x = y ^ z; // C
Hay:
x:= y xor z;
Câu lệnh trên sẽ gáp trình thienmaonline.vnên hợp ngữ (Assembly) thường dùng toán tử XOR để gán giá trị của 1 thanh ghi (register) về 0. Khi thực hiện phép toán XOR cho 1 mẫu bit với chính bản thân nó, mẫu nhị phân nhận được sẽ toàn bit 0. Trên nhiều kiến trúc máy tính, dùng XOR để gán 0 cho 1 thanh ghi sẽ được CPU xử lý nhanh hơn so với chuỗi thao tác tương ứng để nạp và lưu giá trị 0 vào thanh ghi.
Toán Tử Or
Phép toán trên thao tác bit OR lấy hai dãy bit có độ dài bằng nhau và thực hiện phép toán lý luận bao hàm OR trên mỗi cặp bit tương ứng. Kết quả ở mỗi vị trí sẽ là 0 nếu cả hai bit là 0, ngược lại thì kết quả là 1. Ví dụ:
0101 (số thập phân 5)
OR 0011 (số thập phân 3)
= 0111 (số thập phân 7)
Bảng chân trị cho OR:
Phép toán thao tác bit XOR có thể được dùng để đảo ngược các bit được lựa chọn trong thanh ghi (còn được gọi là bật (set) hoặc lật (flip)). Bất kỳ bit nào được bật bằng cách thực hiện phép toán thao tác bit XOR nó với 1. Ví dụ: cho dãy bit 0010 (số 2 thập phân), bit thứ 2 và thứ tư có thể được kích hoạt bằng cách dùng phép toán thao tác bit XOR với 1 dãy bit có chứa 1 ở vị trí thứ hai và thứ tư:
0010 (số thập phân 2)
XOR 1010 (số thập phân 10)
= 1000 (số thập phân 8)
Kỹ thuật này có thể được dùng để điều khiển dãy bit biểu hiện các bộ chứa phép toán logic đúng sai (boolean).
Trong C, C++, Java, C#, toán tử thao tác bit XOR được biểu diễn bằng ký hiệu “^” (dấu mũ). Trong Pascal, toán tử này là “xor”. Ví dụ:
x = y ^ z; // C
Hay:
x:= y xor z; { Pascal }
Câu lệnh trên sẽ gáp trình viên hợp ngữ (Assembly) thường dùng toán tử XOR để gán giá trị của 1 thanh ghi (register) về 0. Khi thực hiện phép toán XOR cho 1 mẫu bit với chính bản thân nó, mẫu nhị phân nhận được sẽ toàn bit 0. Trên nhiều kiến trúc máy tính, dùng XOR để gán 0 cho 1 thanh ghi sẽ được CPU xử lý nhanh hơn so với chuỗi thao tác tương ứng để nạp và lưu giá trị 0 vào thanh ghi.
XIV. Toán Tử Logic Trong Java
Toán tử logic được sử dụng để kiểm tra tính đúng đắn của một hoặc nhiều biểu thức. Giá trị trả về của các biểu thức này là 1 giá trị kiểu boolean, true hoặc false. Trong Java, ta có các toán tử logic như sau:
AND (&&)
OR (||)
NOT (!)
Toán tử AND
Toán tử AND được sử dụng trong trường hợp chúng ta có hai hay nhiều biểu thức và chúng ta cần tất cả các biểu thức đó đều đúng, có nghĩa là kết quả trả về của chúng đều là true.
Ví dụ:
int a = 10; int b = 15; int c = 200; System.out.println(c > a && c > b);
Ở đây ta có hai biểu thức là c > a và c > b và toán tử AND được sử dụng để chắc chắn rằng giá trị của c đều lớn hơn hai giá trị của hai biến còn lại là a và b.
Toán tử OR
Toán tử OR cũng được sử dụng trong trường hợp chúng ta có hai hay nhiều biểu thức và chúng ta chỉ cần 1 trong các biểu thức đó là đúng, nghĩa là giá trị của nó là true. Các biểu thức còn lại true hay false đều được nhưng ít nhất phải có 1 cái là true.
Ví dụ:
int a = 10; int b = 15; int c = 200; System.out.println(c > a || b > c);
Trong ví dụ này, ta chỉ cần c lớn a là được rồi, b có lớn hơn c hay không cũng ko sao.
Toán tử NOT
Toán tử NOT dùng để đảo ngược kết quả của một hay nhiều biểu thức trả về giá trị boolean. Có nghĩa nếu 1 biểu thức bất kỳ trả về giá trị true, sử dụng toán tử NOT thì kết quả cuối cùng sẽ là ngược lại với true, là false.
Ví dụ:
int a = 10; int b = 15; System.out.println(!(a > b));
Kết quả của ví dụ này là true bởi vì a không lớn hơn b, false, đảo ngược lại sẽ là true.
Để bạn hiểu rõ hơn về kết quả của các biểu thức sử dụng với toán tử logic, mình đưa ra bảng dưới đây, ta thường gọi nó là bảng chân trị:
Toán tử AND (&&) | Toán tử OR (||) | Toán tử NOT (!) |
true && true => true | true || true => true | !true => false |
true && false => false | true || false => true | !false => true |
false && true => false | false || true => true | |
false && false => false | false || false => false | |
true && true && false => false | false || false || true => true |
Nhìn vào bảng trên ta có thể thấy
Toán tử AND chỉ có thể trả về true nếu tất cả các kết quả của biểu thức đều là true, nếu một trong số chúng là false thì kết quả sẽ là false.
Toán tử OR chỉ trả về false nếu tất cả các kết quả của biểu thức là false, ngược lại, chỉ cần một biểu thức là true thì kết quả sẽ là true.
Toán tử NOT thì đảo ngược kết quả có giá trị boolean.
XV. Thứ Tự Ưu Tiên Toán Tử Trong Java
Toán tử trong lập trình cũng có những thứ tự ưu tiên giống như các phép toán của chúng ta ngoài đời thực (vd: nhân chia trước cộng trừ sau). Trong Java độ ưu tiên các toán tử sẽ được sắp xếp như sau (Toán tử nào có độ ưu tiên cao hơn sẽ được thực thi trước).
Bảng dưới đây liệt kê thứ tự ưu tiên của các toán tử. Những toán tử với quyền ưu tiên cao nhất xuất hiện trên cùng của bảng, và các toán tử có quyền ưu tiên thấp nhất thì ở bên dưới cùng của bảng. Trong 1 biểu thức, các toán tử có quyền ưu tiên cao nhất được tính toán đầu tiên.
Cùng xem ảnh sau để biết thứ tự ưu tiên của các loại toán tử trong Java:
The post Các Toán Tử Trong Java first appeared on Techacademy.
source https://techacademy.edu.vn/cac-toan-tu-trong-java/
Nhận xét
Đăng nhận xét