Kiểu Dữ Liệu Tham Chiếu Trong Java - Đối Tượng Và Cấu Trúc Dữ Liệu! 🎯
Chào mừng bạn đến với bài học về kiểu dữ liệu tham chiếu trong Java! Trong bài học này, chúng ta sẽ tìm hiểu về các kiểu dữ liệu phức tạp hơn, bao gồm các lớp (classes), mảng (arrays) và interface.
💡 Fun Fact: Trong Java, tất cả các kiểu dữ liệu tham chiếu đều kế thừa từ lớp
Object
, đây là lớp cơ sở cho tất cả các lớp trong Java.
1. Các Lớp Cơ Bản (Wrapper Classes) 📦
Integer 🔢
Integer number = 42;
Integer maxValue = Integer.MAX_VALUE;
Integer minValue = Integer.MIN_VALUE;
// Chuyển đổi String sang Integer
Integer parsed = Integer.parseInt("42");
⚠️ Lưu ý: Wrapper classes cho phép chúng ta sử dụng các phương thức với kiểu dữ liệu nguyên thủy.
Double 🌊
Double pi = 3.14159;
Double maxValue = Double.MAX_VALUE;
Double minValue = Double.MIN_VALUE;
// Chuyển đổi String sang Double
Double parsed = Double.parseDouble("3.14159");
String 📝
String text = "Hello, World!";
String empty = "";
String nullString = null;
// Các phương thức String
int length = text.length();
String upper = text.toUpperCase();
String lower = text.toLowerCase();
boolean contains = text.contains("World");
💡 Mẹo: String là một lớp đặc biệt trong Java, nó là immutable (không thể thay đổi sau khi tạo).
Boolean ✅
Boolean isTrue = true;
Boolean isFalse = false;
// Chuyển đổi String sang Boolean
Boolean parsed = Boolean.parseBoolean("true");
2. Mảng (Arrays) 📊
Mảng Một Chiều
// Khai báo và khởi tạo
int[] numbers = {1, 2, 3, 4, 5};
String[] names = new String[3];
// Truy cập phần tử
int first = numbers[0];
names[0] = "John";
// Độ dài mảng
int length = numbers.length;
Mảng Nhiều Chiều
// Khai báo và khởi tạo
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Truy cập phần tử
int value = matrix[0][0];
3. Collections Framework 📚
ArrayList 📋
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
// Truy cập phần tử
String first = list.get(0);
// Xóa phần tử
list.remove("Banana");
// Kiểm tra tồn tại
boolean contains = list.contains("Apple");
HashMap 🔑
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 3);
// Truy cập giá trị
int value = map.get("Apple");
// Kiểm tra key tồn tại
boolean contains = map.containsKey("Apple");
// Xóa cặp key-value
map.remove("Banana");
4. Custom Classes 👤
Định Nghĩa Lớp
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters và Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// toString method
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
Sử Dụng Lớp
Person person = new Person("John", 30);
System.out.println(person.getName()); // John
System.out.println(person.getAge()); // 30
5. Interface 🎯
Định Nghĩa Interface
public interface Drawable {
void draw();
double getArea();
}
Implement Interface
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing Circle");
}
@Override
public double getArea() {
return Math.PI * radius * radius;
}
}
6. So Sánh Với Kiểu Nguyên Thủy ⚖️
Khác Biệt Chính
-
Giá Trị Mặc Định
- Kiểu nguyên thủy: có giá trị mặc định (0, false, '\u0000')
- Kiểu tham chiếu: mặc định là null
-
Bộ Nhớ
- Kiểu nguyên thủy: lưu trữ trực tiếp giá trị
- Kiểu tham chiếu: lưu trữ địa chỉ của đối tượng
-
Phương Thức
- Kiểu nguyên thủy: không có phương thức
- Kiểu tham chiếu: có nhiều phương thức hữu ích
7. Best Practices ✨
1. Null Safety
// Kiểm tra null
if (text != null) {
System.out.println(text.length());
}
// Sử dụng Optional
Optional<String> optionalText = Optional.ofNullable(text);
optionalText.ifPresent(t -> System.out.println(t.length()));
2. Immutability
// Lớp immutable
public final class ImmutablePerson {
private final String name;
private final int age;
public ImmutablePerson(String name, int age) {
this.name = name;
this.age = age;
}
// Chỉ có getters, không có setters
public String getName() { return name; }
public int getAge() { return age; }
}
3. Builder Pattern
public class PersonBuilder {
private String name;
private int age;
public PersonBuilder setName(String name) {
this.name = name;
return this;
}
public PersonBuilder setAge(int age) {
this.age = age;
return this;
}
public Person build() {
return new Person(name, age);
}
}
💡 Lời khuyên: Hãy sử dụng các kiểu dữ liệu tham chiếu một cách thông minh và hiệu quả. Đặc biệt là với Collections Framework, nó cung cấp nhiều cấu trúc dữ liệu hữu ích cho các tình huống khác nhau.
Tiếp Theo 🎯
Trong các bài học tiếp theo, chúng ta sẽ:
- Tìm hiểu về Generics
- Học cách sử dụng Collections Framework nâng cao
- Thực hành với các design patterns
- Tìm hiểu về Lambda expressions