Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Java Program แปลง LinkedList ↔ Array

LinkedList ↔ Array Conversion

LinkedList<E> และ Array สามารถแปลงกันได้ 2 ทิศทาง

กรณีที่ 1: LinkedList → Array

1. toArray() - ไม่มี Argument (คืน Object[])

LinkedList list = new LinkedList<>(Arrays.asList("A", "B", "C"));
Object[] objArray = list.toArray(); // Object[] - ต้อง Cast

2. toArray(T[] a) - มี Argument (Type-Safe) ⭐ แนะนำ

LinkedList list = new LinkedList<>(Arrays.asList("A", "B", "C"));
String[] strArray = new String[list.size()];
list.toArray(strArray); // ไปไว้ใน strArray

// หรือ Short form (Java 11+)
String[] strArray2 = list.toArray(String[]::new);

ตัวอย่างที่ 1: LinkedList → Array

import java.util.LinkedList;

public class Demo {
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        LinkedList inputList = new LinkedList<>();
        inputList.add("Java");
        inputList.add("Python");
        inputList.add("Scala");
        inputList.add("Mysql");
        
        System.out.println("The list is defined as: " + inputList);
        
        // สร้าง Array ขนาดเท่า List
        String[] resultArray = new String[inputList.size()];
        
        // แปลง LinkedList → Array
        inputList.toArray(resultArray);
        
        System.out.print("\nThe result array is: ");
        for (String element : resultArray) {
            System.out.print(element + " ");
        }
    }
}

ผลลัพธ์

The required packages have been imported
The list is defined as: [Java, Python, Scala, Mysql]
The result array is: Java Python Scala Mysql

กรณีที่ 2: Array → LinkedList

1. Arrays.asList() + LinkedList Constructor

String[] array = {"Java", "Python", "Scala", "Mysql"};
LinkedList list = new LinkedList<>(Arrays.asList(array));

2. Collections.addAll()

String[] array = {"Java", "Python", "Scala", "Mysql"};
LinkedList list = new LinkedList<>();
Collections.addAll(list, array);

3. Stream API (Java 8+)

String[] array = {"Java", "Python", "Scala", "Mysql"};
LinkedList list = Arrays.stream(array)
    .collect(Collectors.toCollection(LinkedList::new));

ตัวอย่างที่ 2: Array → LinkedList

import java.util.Arrays;
import java.util.LinkedList;

public class Demo {
    public static void main(String[] args) {
        System.out.println("The required packages have been imported");
        
        String[] resultArray = {"Java", "Python", "Scala", "Mysql"};
        System.out.println("The elements of the result_array are defined as: " + 
            Arrays.toString(resultArray));
        
        // แปลง Array → LinkedList
        LinkedList resultList = new LinkedList<>(Arrays.asList(resultArray));
        
        System.out.println("\nThe elements of the result list are: " + resultList);
    }
}

ผลลัพธ์

The required packages have been imported
The elements of the result_array are defined as: [Java, Python, Scala, Mysql]
The elements of the result list are: [Java, Python, Scala, Mysql]

LinkedList vs ArrayList สำหรับ toArray()

ทั้งคู่ implement List interface มี toArray() เหมือนกัน

ด้าน ArrayList LinkedList
toArray() Performance เร็ว (Backed by array) ช้ากว่า (ต้อง Copy ทีละ Node)
Memory Contiguous Scattered (Node objects)
Get by Index O(1) O(n)

Multidimensional / Nested Collections

// LinkedList of Arrays
LinkedList listOfArrays = new LinkedList<>();
listOfArrays.add(new int[]{1, 2});
listOfArrays.add(new int[]{3, 4, 5});

// Convert to 2D Array
int[][] twoD = listOfArrays.toArray(new int[0][]);

Primitive Types (int, double, etc.)

Generics ไม่รองรับ Primitive ต้องใช้ Wrapper หรือ Library:

// ❌ ไม่ได้: LinkedList

// ✅ ใช้ Wrapper
LinkedList list = new LinkedList<>();
list.add(1); list.add(2); list.add(3);

// toArray() → Integer[]
Integer[] boxed = list.toArray(new Integer[0]);

// แปลงเป็น primitive int[] (Manual/Stream)
int[] primitive = list.stream().mapToInt(Integer::intValue).toArray();

// หรือ Library (Apache Commons Lang, Guava)
int[] primitive2 = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

Best Practices

  • ใช้ toArray(new Type[0]) หรือ toArray(Type[]::new) (Java 11+) สำหรับ Type Safety
  • หลีกเลี่ยง toArray() ไม่มี Argument (คืน Object[])
  • Array → List: ใช้ new LinkedList<>(Arrays.asList(array))
  • Primitive Arrays: ใช้ Stream .mapToInt(Integer::intValue).toArray()

สรุป

  • LinkedList → Array: list.toArray(new String[list.size()]) หรือ list.toArray(String[]::new)
  • Array → LinkedList: new LinkedList<>(Arrays.asList(array))
  • toArray(T[]) Type-Safe และประสิทธิภาพดีกว่า toArray()
  • Primitive Types ต้องใช้ Wrapper Class + Stream mapToInt