Tutorial

Java 101 - String & StringBuffer & StringBuilder (EP.5)

By Arnon Puitrakul - 24 December 2014 - 1 min read min(s)

Java 101 - String &  StringBuffer & StringBuilder (EP.5)

เมื่อวานเราได้เรียนเรื่องของอะไรว่ะ ลืม... เดียวนะอ่อ Array กับ ArrayList ไปแล้ว วันนี้มาเปลี่ยนอารมณ์กันบ้าง (ตรงไหนว่ะ!!) วันนี้เราจะมาเรียนรู้ในเรื่องของ String กัน
String หรือในภาษาไทยอันสวยเก๊ว่า "สายอัขระ" สวยป่ะล่ะ สรุปสั้นเลยว่า String มันก็คือชุดของตัวอักษรนั้นแหละ แต่มันจะต่างจากภาษา C อยู่ จากในภาษา C String มันคือ Array ของ Char แต่ใน Java เราพัฒนาแล้วจร้า มันถูกบัญญัติลงไปเป็น Datatype แบบนึงเลยล่ะแกร์!! เจ๋งเวอร์!! ถามว่า แล้วเราจะประกาศมันยังไงล่ะ? ไม่ยาก
ถ้าเราจำเรื่องของการสร้าง Object ได้ (String 1 อันเราจะมองว่ามันเป็น Object ชิ้นหนึ่งเหมือนกัน)

String a = new String();

ก็ได้ หรือ เอาที่ง่ายกว่านั้นคือ

String a;

จบง่ายมั้ยล่าาา
การให้ค่ามันก็ไม่ยุ่งยากเหมือนใน C เพียงแค่บอกว่า (สมมุติผมประกาศ String a; ไปแล้วนะ)

a = “Hello World”;

ได้เลย ก็ยังไม่ยากอยู่ดี ทีนี้เมื่อตอนแรกผมบอกว่า String มันก็คือ Object ตัวนึงใช่ม่ะ
แปลว่ามันจะต้องมี Method ด้วยเหมือนกัน เรามาดู Method กันดีกว่า

  • equals() - ไว้ใช้ Compare String ถามแค่ว่า เท่าหรือไม่เท่า Return กลับมาเป็น True,False
  • compareTo() - ต่างจาก equals นิดหน่อย เพราะว่าอันนี้มันจะ Return ค่าเป็นตัวเลข ตัวเลขนี้เกิดจากการ เอาผลรวมของค่า ASCII ของ String ตัวเองกับ String ที่ Compare ด้วยมาลบกัน
  • concat() - ไว้เชื่อม String เข้าด้วยกัน (จริงๆใช้เครื่องหมาย + ไปซะก็จบ เหมือนกัน)
  • substring() - ตามชื่อเลยครับ เอาไว้ substring โดย Input ตำแหน่งเริ่มต้น กับสุดท้ายที่ต้องการ แล้วมันจะตัดส่งกลับมาให้เลย เช่น a.substring(0,5); นั่นคือ เอา Char ที่อยู่ตำแหน่ง 0 ถึง 5 ออกมา
  • replace() - ตามชื่ออีกเหมือนกัน มันจะแทนที่ String เดิม (เป็นคำหรือตัวอักษรก็ได้) ด้วย String ใหม่ที่เรากำหนดลงไป เช่น a.replace("Java","World"); มันก็คือการเอาคำว่า World ไปแทนที่คำว่า Java ใน String a ทั้งหมด (ไม่ต้องแคร์ว่าใน a มันจะมีคำว่า Java หรือไม่เพราะถ้ามันหาไม่เจอมันก็จะไม่มีอะไรเกิดขึ้น)
  • toUpperCase() - อันนี้มันจะทำให้ String ที่เราใช้ Method นี้กลายเป็นตัวใหญ่ทั้งหมดเช่น จาก Hello -> HELLO เป็นต้น เช่น a.toUpperCase(); มันก็จะเปลี่ยน String ใน a ให้เป็นตัวใหญ่ทั้งหมด
  • toLowerCase() - อันนี้จะตรงข้ามกับ toUpperCase มันจะทำให้ String ที่ใช้ Method นี้กลายเป็นตัวเล็กทั้งหมด
  • charAt() - อันนี้เป็นการเอา char ที่ตำแหน่งใดๆมา เช่นมี String a ที่มีค่าเป็น Hello ถ้าเราบอกว่า a.charAt(0) จะได้ออกมาเป็น H เป็นต้น
    จบเรื่อง String และ เห็นมั้ยว่ามันง่ายมากกก แต่ String เนี่ยมันก็มีข้อเสียอยู่คือ
    เวลาเรากำหนดค่าให้มันไปแล้ว เราจะเปลี่ยนค่ามันไม่ได้ นั่นคือ ต่อไม่ได้ ทำอะไรไม่ได้เลย เหมือนค่าคงที่ตัวนึง
    แต่!!! แต่เราเห็นว่า อ้าวมันทำได้นิ!! แล้วทำไมบอกว่าทำไม่ได้?
    จริงๆแล้วการที่เราเปลี่ยนแปลง String อะไรทั้งหมด มันคือการสร้าง String ใหม่ในชื่อเดิม
    ลองคิดเล่น ถ้า String ตัวเดียวเราก็คงไม่เห็นผลเท่าไหร่ ลองเป็น String เยอะๆยาวๆดูสิ จะเห็นได้ชัดเลย
    ดังนั้น StringBuilder กับ StringBuffer จึงเกิดขึ้นมาเพื่อแก้ปัญหานี้!!

ถามว่าแล้วเราจะสร้างมันขึ้นมาได้ยังไง
ก่อนหน้านั้น ขอให้มองมัน 2 ตัวนี้เป็น Class ตัวนึงก่อน เหมือนเดิม การสร้าง Object จาก Class
ในที่นี้ผมจะยกตัวอย่างแค่ StringBuffer พอนะ เพราะว่าการใช้มันเหมือนกันเลย (ส่วนความแตกต่างเดียวจะมาอธิบายข้างล่างนะ)
มาสร้างกันเลย สมมุติว่าผมจะสร้าง StringBuffer ชื่อ sb มาตัวนึง

StringBuffer sb = new StringBuffer();
[/code]

**Warning เราไม่สามารถ sb = “Hello”; ไม่ได้นะ มันจะ Error**

แค่นี้เองเราก็จะได้ StringBuffer ตัวนึงมาใช้แล้ว ทีนี้เรามาดู Method ของมันบ้าง
  • append() - อันนี้เราจะส่ง String แล้วเอาไปต่อข้างหลังสุด เช่น sb.append(“Hello World”); เพราะฉะนั้น StringBuffer ของเราจะมีคำว่า Hello World อยู่ด้านหลังสุด

  • insert() - คล้ายๆ append เมื่อกี้เลย แต่ append มันเอาไปต่อที่หลังสุด insert ก็เอาไปต่อเหมือนกัน แต่เราระบุตำแหน่งเองได้ เช่น sb.insert(0,”HI!!”); จากเมื่อกี้เรามีคำว่า Hello World อยู่แล้ว ถ้าเราอัก insert เมื่อกี้เข้าไปมันก็จะเป็น HI!!Hello World

  • delete() - ตามชื่อเลยคือการลบออก เช่น sb.delete(0,3); นั่นคือการ delete char ตั้งแต่ตำแหน่ง 0 ถึง 3 นั่นคือคำว่า HI!! เพราะฉะนั้น sb จะเหลือแค่คำว่า Hello World เหมือนเดิม

  • length() - ก็ตามชื่ออีกตามเคย เราจะได้จำนวนตัวอักษรของมันกลับมา เช่น sb.length(); ใน sb เรามี Hello World เพราะฉะนั้นค่าที่เราจะได้จาก Method length ก็คือ 11 นั่นเอง (รวม space ด้วยนะ)

    อย่างที่ผมบอกไว้ตอนข้างบนว่า เดียวจะมาอธิบายความแตกต่างของ StringBuilder กับ StringBuffer

    จริงๆแล้วมันทั้ง 2 นั้นต่างกันเพียงเล็กน้อยเท่านั้น

    ต่างกันในเรื่องของ Thread S****ynchronization ซึ่งผมว่ามันลึกไปในระดับเบื้องต้นจึงไม่ขอพูดถึงในที่นี้

    เอาง่ายๆถ้าอยาก Play Safe ให้ใช้ StringBuffer

    แต่ถ้าอยากไวใน String ใหญ่ๆยาวๆ (รู้นะคิดอะไรกัน) ให้ใช้ StringBuilder
    จบแล้ว สำหรับเรื่อง String ตอนนี้น่าจะมาได้สักครึ่งทางของ Java 101 แล้ว สู้ๆๆ

    Source Code
    **String : ** https://drive.google.com/folderview?id=0BwrPA9Miv4o2RUFsbzVNT1Q3YXc&usp=sharing
    ** StringBuilder & StringBuffer : ** https://drive.google.com/folderview?id=0BwrPA9Miv4o2RlB0YUFCcUN0b0k&usp=sharing