Java Integer: ความแตกต่างระหว่าง int และ Integer พร้อมวิธีใช้ที่ถูกต้อง

目次

1. บทนำ

พื้นฐานของประเภทจำนวนเต็ม (int) ใน Java

ในภาษา Java เมื่อเราต้องการจัดการกับตัวเลข หนึ่งในประเภทพื้นฐานที่สำคัญที่สุดคือ จำนวนเต็ม (int) ซึ่งเป็นประเภทข้อมูลแบบ primitive ที่ใช้บ่อยในการคำนวณเชิงตัวเลข การใช้ int จะช่วยให้การทำงานมีประสิทธิภาพด้านหน่วยความจำและความเร็วสูง

ในอีกด้านหนึ่ง Java ยังมี คลาส Integer ซึ่งเป็น คลาสห่อหุ้ม (Wrapper Class) สำหรับค่า int ทำให้ค่าจำนวนเต็มสามารถถูกจัดการเป็นออบเจกต์ได้ สอดคล้องกับแนวคิดการออกแบบเชิงวัตถุของ Java

แม้ว่าจะดูคล้ายกัน แต่ int และ Integer มีความแตกต่างชัดเจนทั้งในด้านวัตถุประสงค์และพฤติกรรม จึงไม่น่าแปลกใจที่ผู้เริ่มต้นมักจะมีคำถาม เช่น “int และ Integer ต่างกันอย่างไร?” หรือ “ควรเลือกใช้อย่างไร?”

ทำไมต้องเรียนรู้คลาส Integer

ในการใช้งาน Java จริง มีหลายกรณีที่ int ไม่สามารถตอบโจทย์ได้ เช่น การทำงานร่วมกับคอลเลกชัน (List, Map), การจัดการค่า null และเจเนอริก ซึ่งในกรณีเหล่านี้ จำเป็นต้องใช้คลาส Integer

นอกจากนี้ คลาส Integer ยังมีเมธอดที่มีประโยชน์ เช่น การแปลงข้อความเป็นตัวเลข การเปรียบเทียบ และการจัดการบิต การเรียนรู้วิธีใช้เหล่านี้จะช่วยให้คุณเขียนโค้ดที่อ่านง่ายและมีความเสถียรมากขึ้น

บทความนี้จะอธิบายความแตกต่างระหว่าง int และ Integer วิธีใช้งานจริง และกรณีตัวอย่างที่เหมาะสม ทั้งสำหรับผู้เริ่มต้นและผู้ที่มีพื้นฐาน Java อยู่แล้ว

2. คลาส Integer คืออะไร?

บทบาทในฐานะคลาสห่อหุ้ม (Wrapper Class)

Integer ในภาษา Java เป็น คลาสห่อหุ้ม สำหรับ int ที่เป็น primitive type คลาสห่อหุ้ม (Wrapper) คือสิ่งที่ทำหน้าที่ “ห่อ” ค่าพื้นฐานเพื่อให้ใช้งานเป็นออบเจกต์ได้ ในที่นี้ int ที่เป็นค่าจำนวนเต็มดิบ จะถูกห่อใน Integer ทำให้สามารถจัดการในรูปแบบออบเจกต์ได้

ตัวอย่างเช่น คอลเลกชันของ Java (เช่น List หรือ Map) รองรับเฉพาะออบเจกต์เท่านั้น จึงไม่สามารถใช้ int ได้โดยตรง จำเป็นต้องใช้ Integer แทน

List<Integer> numbers = new ArrayList<>();
numbers.add(10); // ค่า int 10 จะถูกแปลงเป็น Integer โดยอัตโนมัติ

การแปลง int เป็นออบเจกต์ (boxing) ทำให้สามารถทำงานร่วมกับ API และเฟรมเวิร์กต่างๆ ของ Java ได้อย่างราบรื่น

ออโต้บ็อกซิ่ง และ อันบ็อกซิ่ง

ตั้งแต่ Java 5 เป็นต้นมา ได้เพิ่มความสามารถของ ออโต้บ็อกซิ่ง (auto-boxing) และ อันบ็อกซิ่ง (unboxing) ซึ่งช่วยให้นักพัฒนาเขียนโค้ดได้ง่ายขึ้น

  • ออโต้บ็อกซิ่ง: ค่า int จะถูกแปลงเป็น Integer โดยอัตโนมัติ
  • อันบ็อกซิ่ง: ออบเจกต์ Integer จะถูกแปลงกลับเป็น int โดยอัตโนมัติ
Integer num = 100; // ออโต้บ็อกซิ่ง
int result = num + 50; // อันบ็อกซิ่งแล้วนำไปคำนวณ

ด้วยคุณสมบัตินี้ นักพัฒนาไม่จำเป็นต้องเขียนโค้ดเพื่อแปลงประเภทเอง ทำให้โค้ดอ่านง่ายและสะดวกมากขึ้น อย่างไรก็ตาม หากพยายามอันบ็อกซิ่งค่า null จะเกิด NullPointerException

Integer value = null;
int x = value; // จะเกิดข้อยกเว้นที่นี่

ความหมายที่แท้จริงของ Integer

Integer ไม่ได้เป็นเพียงแค่ตัวแทนของ int เท่านั้น แต่เพราะเป็นออบเจกต์ จึงมีคุณสมบัติพิเศษเพิ่มเติม เช่น:

  • สามารถจัดการกับค่า null ได้ เพื่อแทนสถานะ “ยังไม่ถูกกำหนด”
  • มีเมธอดต่างๆ ให้ใช้งาน ทำให้เขียนโค้ดได้ยืดหยุ่นมากขึ้น
  • ใช้งานร่วมกับโครงสร้างที่ต้องการออบเจกต์ เช่น คอลเลกชัน

ดังนั้น ในหลายบริบทที่ต้องใช้การเขียนโปรแกรมเชิงวัตถุ Integer จึงเหมาะสมกว่าการใช้ int

3. ฟิลด์และค่าคงที่สำคัญของคลาส Integer

คลาส Integer ใน Java มีการกำหนด ค่าคงที่ที่สำคัญ และ ฟิลด์สำหรับดึงข้อมูล ซึ่งช่วยให้โค้ดมีความอ่านง่ายและบำรุงรักษาได้สะดวกขึ้น

ต่อไปนี้คือฟิลด์ที่ใช้บ่อย:

MAX_VALUE และ MIN_VALUE

Integer.MAX_VALUE และ Integer.MIN_VALUE ใช้ระบุ ค่ามากที่สุด และ ค่าน้อยที่สุด ที่ int สามารถเก็บได้

  • MAX_VALUE: 2,147,483,647 (2^31 – 1)
  • MIN_VALUE: -2,147,483,648 (-2^31)

มักใช้สำหรับตรวจสอบขอบเขตหรือป้องกันการ overflow

int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;

System.out.println("ค่าสูงสุด: " + max); // 2147483647
System.out.println("ค่าต่ำสุด: " + min); // -2147483648

SIZE และ BYTES

SIZE และ BYTES ระบุ จำนวนบิต และ จำนวนไบต์ ที่ int ใช้

  • Integer.SIZE: 32 บิต
  • Integer.BYTES: 4 ไบต์
System.out.println("จำนวนบิตของ int: " + Integer.SIZE);   // 32
System.out.println("จำนวนไบต์ของ int: " + Integer.BYTES); // 4

ฟิลด์ TYPE

Integer.TYPE คือ ออบเจกต์ Class ที่แทนประเภท int โดยมักใช้ในเทคนิคขั้นสูง เช่น การสะท้อน (Reflection) และ Generics

Class<?> clazz = Integer.TYPE;
System.out.println(clazz.getName()); // int

แม้จะไม่ค่อยใช้ในการพัฒนาทั่วไป แต่เป็นความรู้ที่มีประโยชน์สำหรับผู้ที่สนใจโครงสร้างภายในของ Java

ค่าคงที่เหล่านี้ถูกกำหนดเป็น static final จึงสามารถเข้าถึงได้โดยตรง โดยไม่ต้องสร้างอินสแตนซ์ของ Integer

4. เมธอดหลักของคลาส Integer

Integer ไม่ได้มีไว้เพียงเพื่อห่อหุ้มค่า int เท่านั้น แต่ยังมีเมธอดที่มีประโยชน์มากมาย เช่น การแปลงข้อความกับตัวเลข การเปรียบเทียบ และการจัดการบิต ซึ่งใช้บ่อยในการพัฒนา Java ประจำวัน ต่อไปนี้คือเมธอดที่นิยมใช้ แบ่งตามหมวดหมู่

เมธอดแปลงตัวเลข

parseInt()

parseInt() เป็นเมธอดแบบ static ที่ใช้สำหรับ แปลง String ให้เป็น int มักใช้เวลารับค่าจากผู้ใช้หรือไฟล์ภายนอก

String str = "123";
int number = Integer.parseInt(str); // 123

* หาก String ไม่ใช่ตัวเลข จะเกิด NumberFormatException ดังนั้นควรใช้ try-catch ครอบ

valueOf()

valueOf() ใช้ แปลง String หรือ int ให้เป็นออบเจกต์ Integer แตกต่างจาก parseInt() ตรงที่ผลลัพธ์เป็น Integer ไม่ใช่ int

Integer num1 = Integer.valueOf("456");
Integer num2 = Integer.valueOf(789);

Integer.valueOf() มีการใช้ cache สำหรับค่าระหว่าง -128 ถึง 127 ทำให้มีประสิทธิภาพมากกว่าการสร้างอินสแตนซ์ใหม่ด้วย new

เมธอดแสดงผลและแปลงค่า

toString()

toString() ใช้สำหรับ แปลงค่าตัวเลขเป็น String นิยมใช้เมื่อเชื่อมข้อความหรือพิมพ์ออกหน้าจอ

int number = 100;
String str = Integer.toString(number); // "100"

ยังสามารถแปลงเป็นฐานอื่นๆ เช่น ฐาน 2 หรือฐาน 16 ได้

System.out.println(Integer.toBinaryString(10));  // "1010"
System.out.println(Integer.toHexString(255));    // "ff"

เมธอดเปรียบเทียบ

compareTo()

compareTo() ใช้ เปรียบเทียบ Integer สองค่า และคืนค่าจำนวนเต็มเพื่อระบุความสัมพันธ์

Integer a = 10;
Integer b = 20;

int result = a.compareTo(b); // -1 (ถ้า a < b)

equals()

equals() ใช้ ตรวจสอบความเท่ากันของค่า ต่างจาก == ที่ตรวจสอบการอ้างอิงออบเจกต์

Integer x = 100;
Integer y = 100;
System.out.println(x.equals(y)); // true

เมธอดจัดการบิต

คลาส Integer รองรับการทำงานระดับบิตที่มีประโยชน์ในการเขียนโปรแกรมระดับล่าง

bitCount()

คืนจำนวนบิตที่เป็น 1 ของค่าที่ระบุ

int count = Integer.bitCount(15); // 15 = 1111 → มี 4 บิตที่เป็น 1

highestOneBit()

คืนค่าโดยเก็บเฉพาะบิตที่สูงที่สุดที่เป็น 1

int highest = Integer.highestOneBit(10); // 10 (1010) → 8 (1000)

เมธอดอื่นๆ ที่มีประโยชน์

  • Integer.reverse(int): กลับลำดับบิตซ้ายขวา
  • Integer.signum(int): ตรวจสอบเครื่องหมาย (บวก: 1, ลบ: -1, ศูนย์: 0)
  • Integer.hashCode(): คืนค่าแฮชโค้ด (สำคัญเมื่อใช้กับคอลเลกชัน)

การรู้จักเมธอดเหล่านี้ช่วยให้เขียนโค้ดได้ กระชับ มีประสิทธิภาพ และอ่านง่าย

5. การเลือกใช้ int กับ Integer

แม้ว่า int และ Integer จะใช้แทนจำนวนเต็มเหมือนกัน แต่มีความแตกต่างในด้าน ประสิทธิภาพ ความยืดหยุ่น และข้อจำกัด หากใช้ไม่ถูกต้องอาจทำให้เกิดข้อผิดพลาดหรือทำงานช้าลง

ความแตกต่างด้านประสิทธิภาพ

int เป็น primitive type ที่มีขนาดคงที่ 4 ไบต์และทำงานได้เร็ว ส่วน Integer เป็นออบเจกต์ที่เก็บใน heap memory มี overhead เพิ่มเติม

int a = 10;
Integer b = 10;

แม้ค่าจะเหมือนกัน แต่กระบวนการทำงานต่างกัน หากต้องประมวลผลจำนวนมาก เช่น ใน loop ควรเลือกใช้ int เพื่อความเร็วและประหยัดหน่วยความจำ

ตัวอย่าง: ความแตกต่างของความเร็วในลูป

long startTime = System.nanoTime();
int sum = 0;
for (int i = 0; i < 1000000; i++) {
    sum += i;
}
long endTime = System.nanoTime();
System.out.println("เวลาใช้ int: " + (endTime - startTime) + " ns");

หากใช้ Integer จะมีการ boxing/unboxing ทำให้ช้าลงหลายเท่า

ความแตกต่างด้าน null และการจัดการข้อผิดพลาด

int ไม่สามารถเก็บค่า null ได้ แต่ Integer สามารถเก็บได้ เหมาะกับกรณีที่ต้องการแทนค่าว่างหรือไม่กำหนด

Integer value = null;
if (value == null) {
    System.out.println("ยังไม่ได้กำหนดค่า");
}

อย่างไรก็ตาม หาก unboxing ค่า null จะเกิด NullPointerException

การทำงานร่วมกับคอลเลกชัน

คอลเลกชันใน Java (เช่น List, Map) รองรับเฉพาะออบเจกต์ ดังนั้นจึงต้องใช้ Integer

List<Integer> numbers = new ArrayList<>();
numbers.add(100); // int จะถูกแปลงเป็น Integer โดยอัตโนมัติ

เจเนอริกก็เช่นกัน ไม่สามารถใช้ primitive type ได้

สรุปแนวทางการเลือกใช้

กรณีใช้งานประเภทที่แนะนำเหตุผล
คำนวณเชิงตัวเลขทั่วไปintเร็วและใช้หน่วยความจำน้อย
ต้องการตรวจสอบว่ามีค่า/ไม่มีค่าIntegerสามารถเก็บค่า null ได้
ใช้งานกับคอลเลกชัน/เจเนอริกIntegerเพราะต้องใช้ออบเจกต์
ใช้ค่าเป็น key ใน MapIntegerint ใช้ไม่ได้

จำง่ายๆ ว่า ถ้าเน้นความเร็ว ใช้ int แต่ถ้าเน้นความยืดหยุ่น ใช้ Integer

6. ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

การเกิด NullPointerException

สาเหตุ:

Integer เป็นออบเจกต์ จึงสามารถเก็บค่า null ได้ แต่เมื่อมีการ unboxing ให้เป็น int จะเกิด NullPointerException

Integer value = null;
int x = value; // จะเกิดข้อยกเว้นที่นี่
วิธีแก้:

ตรวจสอบค่า null ก่อน unboxing

if (value != null) {
    int x = value;
} else {
    int x = 0; // กำหนดค่าเริ่มต้น
}

หรือใช้ Optional (Java 8+) เพื่อความปลอดภัย

int x = Optional.ofNullable(value).orElse(0);

การเกิด NumberFormatException

สาเหตุ:

เมื่อใช้ Integer.parseInt() หรือ Integer.valueOf() กับ String ที่ไม่ใช่ตัวเลข

String input = "abc";
int num = Integer.parseInt(input); // NumberFormatException
วิธีแก้:

ตรวจสอบรูปแบบอินพุตด้วย regex หรือใช้ try-catch

if (input.matches("-?\\d+")) {
    int num = Integer.parseInt(input);
} else {
    System.out.println("ไม่ใช่ตัวเลข");
}
try {
    int num = Integer.parseInt(input);
} catch (NumberFormatException e) {
    System.out.println("รูปแบบไม่ถูกต้อง: " + input);
}

การใช้ == และ equals() ผิดพลาด

สาเหตุ:

== ใช้เปรียบเทียบการอ้างอิง ไม่ใช่ค่า ดังนั้นออบเจกต์คนละตัวอาจได้ false แม้ค่าจะเท่ากัน

Integer a = new Integer(128);
Integer b = new Integer(128);
System.out.println(a == b);       // false
System.out.println(a.equals(b)); // true

* สำหรับค่าระหว่าง -128 ถึง 127 จะถูก cache ทำให้ == อาจได้ true แต่ไม่ควรพึ่งพาพฤติกรรมนี้

วิธีแก้:

ใช้ equals() เสมอเมื่อเปรียบเทียบค่า

if (a.equals(b)) {
    System.out.println("ค่าเท่ากัน");
}

หรือ unboxing ให้เป็น int ก่อนเปรียบเทียบ

if (a.intValue() == b.intValue()) {
    System.out.println("ค่า int เท่ากัน");
}

การละเลย overflow

สาเหตุ:

int และ Integer เก็บได้เพียงค่าในช่วง ±2,147,483,647 หากเกินขอบเขตจะเกิด overflow

int a = Integer.MAX_VALUE;
int b = a + 1;
System.out.println(b); // -2147483648
วิธีแก้:

ใช้ long หรือ BigInteger เมื่อจำเป็น และเขียนโค้ดโดยคำนึงถึงขอบเขต

สรุป

Integer แม้จะยืดหยุ่นและมีประโยชน์ แต่ก็มีข้อควรระวัง เช่น null, การอ้างอิง, การแปลงประเภท ผู้เริ่มต้นควรทำความเข้าใจสาเหตุของข้อยกเว้นให้ชัดเจน

การรู้ข้อผิดพลาดล่วงหน้าช่วยลดบั๊กและทำให้โค้ดมีความเสถียรมากขึ้น

7. ตัวอย่างการใช้งานจริงของ Integer

หลังจากเรียนรู้คุณสมบัติของ Integer แล้ว มาดูกันว่าใช้จริงได้อย่างไรในสถานการณ์ต่างๆ

การแปลงค่าจากอินพุตผู้ใช้

ในแอปพลิเคชัน ค่าจากผู้ใช้มักจะเป็น String เช่น อายุหรือจำนวนสินค้า จำเป็นต้องแปลงเป็นจำนวนเต็ม

String input = "25";

try {
    Integer age = Integer.valueOf(input);
    System.out.println("อายุ: " + age);
} catch (NumberFormatException e) {
    System.out.println("อินพุตไม่ถูกต้อง");
}

การจัดการค่าการตั้งค่าและ environment variables

เมื่อโหลดค่าการตั้งค่าจากภายนอก (เช่น properties) มักจะอยู่ในรูป String ต้องแปลงเป็นตัวเลขก่อน

String maxConn = System.getProperty("app.maxConnections", "100");
int max = Integer.parseInt(maxConn);
System.out.println("จำนวนการเชื่อมต่อสูงสุด: " + max);

การใช้งานกับคอลเลกชัน

เมื่อเก็บค่าจำนวนเต็มใน List หรือ Map จำเป็นต้องใช้ Integer

List<Integer> ids = new ArrayList<>();
ids.add(101);
ids.add(205);
ids.add(309);

for (Integer id : ids) {
    System.out.println("กำลังประมวลผล ID: " + id);
}

การใช้บิตสำหรับจัดการสถานะ

สามารถใช้ Integer ในการจัดการ flag หรือ state ด้วยการคำนวณบิต

int flags = 0;

flags |= 0b0001; // เปิดบิตที่ 1
flags |= 0b0010; // เปิดบิตที่ 2

boolean isSet = (flags & 0b0010) != 0;

System.out.println("บิตที่ 2: " + (isSet ? "ON" : "OFF"));
System.out.println("สถานะปัจจุบัน: " + Integer.toBinaryString(flags));

การทำงานร่วมกับฐานข้อมูล

เมื่อใช้ JDBC หากคอลัมน์ในฐานข้อมูลสามารถเป็น null ได้ ควรใช้ Integer แทน int

ResultSet rs = stmt.executeQuery("SELECT age FROM users WHERE id = 1");

if (rs.next()) {
    Integer age = (Integer) rs.getObject("age");
    System.out.println(age != null ? "อายุ: " + age : "ยังไม่ได้บันทึกอายุ");
}

สรุป

Integer ไม่ได้เป็นเพียงตัวห่อหุ้มของ int แต่ช่วยให้:

  • แปลงค่าจากอินพุตหรือการตั้งค่าได้ง่าย
  • จัดการค่า null ได้
  • ใช้กับคอลเลกชันได้
  • จัดการสถานะด้วยบิตได้

หากใช้อย่างเหมาะสม จะช่วยเพิ่ม ความยืดหยุ่น ความเสถียร และการบำรุงรักษาโค้ด

8. สรุป

คลาส Integer ใน Java ไม่ได้เป็นเพียงตัวแทนของ int แต่เป็น คลาสสำคัญที่เกี่ยวข้องกับแนวคิดเชิงวัตถุของภาษา Java โดยตรง บทความนี้ได้อธิบายจุดสำคัญต่างๆ ไว้อย่างเข้าใจง่ายและนำไปใช้จริงได้

ข้อดีของคลาส Integer

  • จัดการในรูปแบบออบเจกต์ ทำให้รองรับค่า null และใช้งานกับคอลเลกชันได้
  • มีเมธอดที่มีประโยชน์ เช่น การแปลง String การเปรียบเทียบ และการคำนวณบิต
  • ทำงานได้ดีกับ System.getProperty() และฐานข้อมูล
  • รองรับกลไก cache และ auto-boxing ทำให้โค้ดกระชับ

ข้อควรระวัง

  • การ unboxing ค่า null จะทำให้เกิด NullPointerException
  • การใช้ == กับ Integer อาจได้ผลลัพธ์ไม่ตรงตามที่คาด ควรใช้ equals()
  • การประมวลผลจำนวนมาก int ทำงานได้เร็วกว่า

แนวทางการเลือกใช้

กรณีใช้งานประเภทที่แนะนำเหตุผล
การคำนวณตัวเลขที่ต้องการความเร็วintรวดเร็วและใช้หน่วยความจำน้อย
ข้อมูลที่อาจมีค่า nullIntegerรองรับค่า null ได้
ใช้งานร่วมกับคอลเลกชันหรือเจเนอริกIntegerต้องใช้ออบเจกต์
ใช้เป็น key ใน MapIntegerint ใช้ไม่ได้

สรุปสุดท้าย

การเข้าใจ Integer ไม่เพียงช่วยให้เขียนโค้ดที่ปลอดภัยขึ้น แต่ยังเป็นพื้นฐานของ การเขียนโปรแกรมเชิงวัตถุ การจัดการข้อยกเว้น และการเพิ่มประสิทธิภาพ ผู้เริ่มต้นควรเรียนรู้ตั้งแต่เนิ่นๆ เพราะ int และ Integer เป็นสิ่งที่เจอบ่อยมากในการพัฒนา Java

คำถามที่พบบ่อย (FAQ)

Q1. ความแตกต่างระหว่าง int และ Integer คืออะไร?

A. int เป็น primitive type ใช้สำหรับคำนวณที่รวดเร็วและประหยัดหน่วยความจำ ส่วน Integer เป็น คลาสห่อหุ้ม ที่ทำให้สามารถใช้งานค่าจำนวนเต็มเป็นออบเจกต์ รองรับ null และมีเมธอดเสริม

Q2. parseInt() ต่างจาก valueOf() อย่างไร?

A.

  • parseInt(String s) → คืนค่า int
  • valueOf(String s) → คืนค่า Integer

หากต้องการออบเจกต์หรือจัดการค่า null ควรใช้ valueOf()

Q3. ทำไมไม่ควรใช้ == ในการเปรียบเทียบ Integer?

A. เพราะ == ตรวจสอบการอ้างอิงออบเจกต์ ไม่ใช่ค่า แม้ค่าจะเท่ากันแต่ถ้าเป็นอินสแตนซ์ต่างกันจะได้ false ควรใช้ equals()

Integer a = 128;
Integer b = 128;
System.out.println(a == b);       // false
System.out.println(a.equals(b)); // true

Q4. ถ้า Integer เก็บค่า null แล้ว unboxing จะเกิดอะไรขึ้น?

A. จะเกิด NullPointerException เพราะ null ไม่สามารถแปลงเป็น int ได้ ต้องตรวจสอบก่อนเสมอ

Integer val = null;
int num = val; // จะเกิดข้อยกเว้น

Q5. จะดูค่ามากที่สุดและน้อยที่สุดของ Integer ได้อย่างไร?

A. ใช้ Integer.MAX_VALUE และ Integer.MIN_VALUE

System.out.println(Integer.MAX_VALUE); // 2147483647
System.out.println(Integer.MIN_VALUE); // -2147483648

Q6. ทำไมคอลเลกชันถึงใช้ int ไม่ได้?

A. เพราะคอลเลกชันใน Java รองรับเฉพาะออบเจกต์ primitive type ใช้ไม่ได้ จึงต้องใช้ Integer

List<Integer> list = new ArrayList<>();
list.add(123); // int จะถูกแปลงเป็น Integer อัตโนมัติ

Q7. ด้านประสิทธิภาพ ควรใช้ int หรือ Integer?

A. ถ้าต้องการความเร็วสูงและใช้กับข้อมูลจำนวนมาก ให้ใช้ int เพราะทำงานเร็วกว่าและใช้หน่วยความจำน้อยกว่า แต่ถ้าต้องการความยืดหยุ่น ใช้งานกับคอลเลกชัน หรือรองรับค่า null ควรใช้ Integer