Hoán đổi đối tượng là một trong những hành động phổ biến nhất trong lập trình. Nó đặc biệt hữu ích trong việc phân loại. Điều xảy ra trong hoán đổi là hai biến trao đổi giá trị của chúng. Trong bài viết này, chúng ta tìm hiểu cách hoán đổi đối tượng trong Java trong hai trường hợp khác nhau. Một là hoán đổi các đối tượng độc lập và hai là hoán đổi hai đối tượng trong Danh sách hoặc Mảng. Trước tiên hãy kiểm tra việc hoán đổi các đối tượng độc lập.
Không có hoán đổi! Khi chúng ta gọi phương thức hoán đổi và truyền các đối tượng, chúng ta truyền một bản sao của đối tượng, với tất cả các giá trị thuộc tính. Đây là lý do tại sao nó được gọi là “Pass by Value”. Phương thức hoán đổi thực sự hoán đổi các đối tượng chỉ tác động đến bản sao của đối tượng ban đầu. Vì vậy, các đối tượng ban đầu được giữ nguyên. Giải pháp cho vấn đề này là sử dụng lớp trình bao bọc để bao bọc hai đối tượng.

Hoán đổi đối tượng khác với hoán đổi kiểu dữ liệu nguyên thủy
Một trong những phương pháp phổ biến được sử dụng để hoán đổi các giá trị nguyên thủy là sử dụng biến thời gian. Tuy nhiên, bạn biết Java sử dụng “Truyền theo giá trị” khi truyền tham số cho một phương thức. Do đó, hoán đổi đối tượng sẽ không hoạt động như bạn mong đợi với phương pháp này. Ví dụ sau sẽ cho thấy điều đó.
public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
swap(obj1, obj2);
System.out.println("Obj1 ID value : " + obj1.id + "\n" + "Obj2 ID value : " + obj2.id);
}
static void swap(InnerClass x, InnerClass y) {
InnerClass temp;
temp = x;
x = y;
y = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
this.id = Id;
}
}
}
Đầu ra: 
Trao đổi các đối tượng với một lớp bao bọc
public class ObjectSwapper {
public static void main(String[] args) {
InnerClass obj1 = new InnerClass(12345);
InnerClass obj2 = new InnerClass(11111);
objectWrapper wrapperObj1 = new objectWrapper(obj1);
objectWrapper wrapperObj2 = new objectWrapper(obj2);
// Values before swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id + "\n");
swap(wrapperObj1, wrapperObj2);
// Values after swapping
System.out.println("WrapperObj1 InncerClass ID value : " + wrapperObj1.innerObject.id + "\n" + "WrapperObj2 InncerClass ID value : "
+ wrapperObj2.innerObject.id);
}
static void swap(objectWrapper wrapperObj1, objectWrapper wrapperObj2) {
InnerClass temp;
temp = wrapperObj1.innerObject;
wrapperObj1.innerObject = wrapperObj2.innerObject;
wrapperObj2.innerObject = temp;
}
static class InnerClass {
public int id;
public InnerClass(int Id) {
id = Id;
}
}
static class objectWrapper {
InnerClass innerObject;
public objectWrapper(InnerClass objInnner) {
this.innerObject = objInnner;
}
}
}
Ở đây, chúng tôi đã sử dụng một lớp bao bọc có thuộc tính của loại đối tượng mà chúng tôi cần trao đổi. Bằng cách sử dụng một phương thức hoán đổi đơn giản, nó hoán đổi nội dung của các đối tượng InnerClass của các đối tượng lớp bao bọc. Để triển khai thêm các đối tượng InnerClass đã hoán đổi, chúng ta có thể sử dụng trình bao bọcObj1.xyz và trình bao bọcObj2.xyz tương ứng. Đầu ra:
Phương thức hoán đổi () tích hợp trong Java
Các lớp của Java Collections Framework có một phương thức tích hợp sẵn để hoán đổi các phần tử được gọi là swap() . Java.util là một lớp tiện ích chứa các phương thức tĩnh có thể hoạt động trên các phần tử như Danh sách từ giao diện Bộ sưu tập . Sử dụng phương thức hoán đổi dễ dàng hơn nhiều so với ví dụ mà chúng ta đã thảo luận trước đó. Phương thức hoán đổi() là một phương thức tĩnh và do đó bạn gọi nó với tên lớp là Collections.swap() . Kiểu trả về của phương thức swap() là void nên nó sẽ không trả về gì cả. Bạn cần truyền ba đối số cho phương thức swap() . Kiểm tra ghi chú dưới đây.
swap(List<?> list, int a, int b)
Thông số:
- danh sách - danh sách chứa các yếu tố chúng tôi trao đổi.
- a — chỉ mục của phần tử được hoán đổi .
- b — chỉ mục của một phần tử khác được hoán đổi .
phương thức hoán đổi () trên ArrayList
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListSwapper {
public static void main(String[] args) {
try {
List fruits = new ArrayList();
fruits.add("Mango");
fruits.add("Papaya");
fruits.add("Apple");
fruits.add("Orange");
fruits.add("Watermelon");
fruits.add("Bael");
System.out.println("Before swapping : " + fruits);
//using Collection.swap() method
Collections.swap(fruits, 2, 5);
System.out.println("After swapping : " + fruits);
} catch (IndexOutOfBoundsException e) {
System.out.println("Index Out of Bound Exception thrown : " + e);
}
}
}
ArrayList của trái cây chứa sáu phần tử. Chúng ta hoán đổi phần tử thứ 2 và thứ 5 bằng phương thức hàm swap() . Cách tốt nhất là viết phương thức swap() trong khối try-catch vì nó có thể tạo ra một ngoại lệ IndexOutOfBoundsException khi chạy. Kết quả: Nếu chúng ta chuyển '2' và '8' làm chỉ mục, ứng dụng sẽ đưa ra một ngoại lệ vì kích thước của danh sách là sáu. 
Collections.swap(fruits, 2, 8);
Đầu ra sẽ là:
GO TO FULL VERSION