1. รายการประเภทดั้งเดิม
Java มี 8 ประเภทดั้งเดิมพื้นฐาน พวกเขาเรียกว่า ดั้งเดิม เนื่องจากค่าของประเภทเหล่านี้ไม่ใช่วัตถุและถูกเก็บไว้ภายในตัวแปรโดยตรง
นี่คือตารางที่มีข้อมูลสั้น ๆ เกี่ยวกับประเภทเหล่านี้:
พิมพ์ | ขนาด เป็นไบต์ |
ช่วงค่า | ค่าเริ่มต้น | คำอธิบาย |
---|---|---|---|---|
byte |
1 | -128 .. 127 | 0 |
ประเภทจำนวนเต็มที่น้อยที่สุดคือหนึ่งไบต์ |
short |
2 | -32,768 .. 32.767 | 0 |
จำนวนเต็มสั้น สองไบต์ |
int |
4 | -2*10 9 .. 2*10 9 | 0 |
จำนวนเต็ม 4 ไบต์ |
long |
8 | -9*10 18 .. 9*10 18 | 0L |
จำนวนเต็มยาว 8 ไบต์ |
float |
4 | -10 38 .. 10 38 | 0.0f |
จำนวนทศนิยม 4 ไบต์ |
double |
8 | -10 308 .. 10 308 | 0.0d |
หมายเลขทศนิยมที่มีความแม่นยำสองเท่า 8 ไบต์ |
boolean |
1 | true ,false |
false |
ประเภทบูลีน (เท่านั้นtrue และfalse ) |
char |
2 | 0 .. 65.535 | '\u0000' |
อักขระ 2 ไบต์ ทั้งหมดมากกว่า 0 |
อย่างไรก็ตาม นี่คือความแตกต่างที่สำคัญ หากคุณประกาศตัวแปรอินสแตนซ์ (ฟิลด์ ) หรือตัวแปรคลาสแบบสแตติก และไม่ได้กำหนดค่าใดๆ ให้กับตัวแปรนั้นทันที ตัวแปรนั้นจะถูกเริ่มต้นด้วยค่าเริ่มต้น ตารางแสดงรายการของค่าเหล่านี้
ตัวแปรโลคัลในเมธอดไม่มีค่าเริ่มต้น หากคุณไม่ได้กำหนดค่าให้กับตัวแปรดังกล่าว จะถือว่าตัวแปรเหล่านั้นไม่ได้กำหนดค่าเริ่มต้นและไม่สามารถใช้ได้
แต่ลองกลับมาที่ประเภทดั้งเดิมและดูให้ละเอียดยิ่งขึ้น
2. ประเภทจำนวนเต็ม
Java มีจำนวนเต็ม 4 ประเภท: byte
, short
, int
และlong
. โดยจะแตกต่างกันในขนาดและช่วงของค่าที่สามารถจัดเก็บได้
int
พิมพ์
ที่ใช้กันมากที่สุดคือint
ประเภท ชื่อนี้มาจากคำว่าint eger (จำนวนเต็ม) จำนวนเต็มตามตัวอักษร (จำนวนเต็ม) ทั้งหมดในโค้ดคือints
(หากไม่ได้ลงท้ายด้วยL
, F
, หรือD
)
ตัวแปรประเภทนี้สามารถรับค่าจาก-2,147,483,648
ถึง+2,147,483,647
ซึ่งเยอะและเพียงพอในแทบทุกโอกาส เกือบทุกฟังก์ชันที่คืนค่าตัวเลขจะส่งคืนค่าint
.
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
วิธีlength() การคืนค่าความยาวของสตริง |
|
เขต ข้อมูลlength ประกอบด้วยความยาวของอาร์เรย์ |
short
พิมพ์
ประเภทshort
ได้รับชื่อมาshort int
จาก เรียกอีกอย่างว่าจำนวนเต็มสั้น ต่างจากint
ประเภทตรงที่มีความยาวเพียงสองไบต์และช่วงของค่าที่เป็นไปได้คือfrom -32,768
ถึง+32,767
นั่นหมายความว่าคุณไม่สามารถเก็บหมายเลขหนึ่งล้านไว้ในนั้นได้ หรือ 50,000. นี่เป็นประเภทจำนวนเต็มที่ใช้บ่อยที่สุดใน Java แรงจูงใจหลักในการใช้งานคือการอนุรักษ์หน่วยความจำ
สมมติว่าคุณมีสถานการณ์ที่คุณรู้ล่วงหน้าว่าคุณจะต้องทำงานกับค่าที่ไม่เกิน 30,000 และจะมีค่าเหล่านี้หลายล้านค่า
ตัวอย่างเช่น สมมติว่าคุณกำลังเขียนแอปพลิเคชันที่ประมวลผลรูปภาพความละเอียดสูงพิเศษที่ใช้10
บิตต่อสี และคุณมีล้านพิกเซลในรูปภาพของคุณ นี่คือสถานการณ์ที่การตัดสินใจใช้int
หรือshort
มีความสำคัญ
long
พิมพ์
ประเภทนี้ได้ชื่อมาจากlong int
และเรียกอีกอย่างว่าจำนวนเต็มยาว ซึ่งแตกต่างจากint
ประเภทคือมีค่ามากมายอย่างไม่น่าเชื่อ: จากถึง-9*1018
+9*1018
ทำไมไม่เป็นประเภทจำนวนเต็มพื้นฐาน
เนื่องจาก Java ปรากฏขึ้นในช่วงกลางทศวรรษที่ 90 เมื่อคอมพิวเตอร์ส่วนใหญ่เป็นแบบ 32 บิต นั่นหมายความว่าโปรเซสเซอร์ทั้งหมดได้รับการปรับให้เหมาะสมสำหรับการทำงานกับตัวเลขที่ประกอบด้วย 32 บิต โปรเซสเซอร์สามารถทำงานกับจำนวนเต็ม 64 บิตได้ แต่การดำเนินการกับจำนวนเต็มนั้นช้ากว่า
เป็นผลให้โปรแกรมเมอร์ตัดสินใจอย่างสมเหตุสมผลที่จะสร้างint
ประเภทจำนวนเต็มมาตรฐาน และใช้long
ประเภทเมื่อจำเป็นจริงๆ เท่านั้น
byte
พิมพ์
นี่เป็นประเภทจำนวนเต็มที่น้อยที่สุดใน Java แต่ยังห่างไกลจากประเภทที่ใช้น้อยที่สุด ชื่อของมันbyte
ยังเป็นคำสำหรับบล็อกหน่วยความจำแอดเดรสที่เล็กที่สุดใน Java
มีค่าที่ถูกต้องไม่มากนักสำหรับประเภทbyte
: จาก-128
ถึง +127
แต่นั่นไม่ใช่จุดแข็งของมัน ประเภท นี้byte
ใช้บ่อยที่สุดเมื่อคุณต้องการเก็บข้อมูลหยดขนาดใหญ่ไว้ในหน่วยความจำ อาร์เรย์ของbyte
s เหมาะสำหรับจุดประสงค์นี้
สมมติว่าคุณต้องการคัดลอกไฟล์ที่ไหนสักแห่ง
คุณไม่จำเป็นต้องประมวลผลเนื้อหาของไฟล์ คุณเพียงแค่ต้องการสร้างพื้นที่หน่วยความจำ (บัฟเฟอร์) คัดลอกเนื้อหาของไฟล์ลงในนั้น จากนั้นเขียนข้อมูลจากบัฟเฟอร์ไปยังไฟล์อื่น อาร์เรย์byte
เป็นสิ่งที่คุณต้องการสำหรับสิ่งนี้
โปรดทราบว่าตัวแปรอาร์เรย์เก็บข้อมูลอ้างอิงไปยังพื้นที่หน่วยความจำเท่านั้น เมื่อตัวแปรถูกส่งผ่านไปยังบางเมธอด แอดเดรสหน่วยความจำเท่านั้นที่จะถูกส่งผ่าน บล็อกของหน่วยความจำไม่ได้ถูกคัดลอก
byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
int size = sourceFile.read(buffer); // Read data from a file into a buffer
destFile.write(buffer, 0, size); // Write data from the buffer to a file
// Stop copying if the buffer is not full
if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();
3. ประเภทจริง
ประเภทดั้งเดิมมีสองประเภทสำหรับจำนวนจริง แม้ว่าจะไม่ถูกต้องทั้งหมดที่จะใช้คำนั้น เมื่อคอมพิวเตอร์จัดการกับจำนวนจริง เราจะเรียกมันว่าเลขทศนิยม ชื่อนี้มาจากมาตรฐานสำหรับการแสดงตัวเลข ซึ่งส่วนจำนวนเต็มและเศษส่วนของตัวเลขจะถูกคั่นด้วยจุด (จุด ไม่ใช่เครื่องหมายจุลภาค)
แต่ละประเทศมีมาตรฐานการเขียนตัวเลขของตัวเอง (เซอร์ไพรส์!)
หลายคนคุ้นเคยกับการใช้จุดเพื่อคั่นหลักพันและเครื่องหมายจุลภาคเป็นตัวคั่นทศนิยม ตัวอย่างเช่น พวกเขาจะเขียนone million ones and 153 thousandths
เป็น 1.000.000,153
แต่ในสหรัฐอเมริกาที่ผู้สร้าง Java อาศัยอยู่ มีการใช้มาตรฐานที่แตกต่างออกไป:1000000.153
Java มีประเภทดั้งเดิมของทศนิยมสองประเภท: double
และfloat
.
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ ประเภทเหล่านี้มีการจัดเรียงภายในที่เฉพาะเจาะจงมาก อันที่จริง ภายในตัวแปรแต่ละประเภทไม่ใช่ตัวเลขเดียว แต่มีสองตัว:
ตัวอย่างเช่น จำนวนทศนิยม987654.321
สามารถแสดงเป็น จากนั้นในหน่วยความจำจะแสดงเป็นตัวเลขสองตัว( แมนทิสซาคือส่วนสำคัญของจำนวน) และ( เลขชี้กำลังคือกำลังของสิบ)0.987654321*106
987654321
6
float
พิมพ์
ชื่อของfloat
ประเภทมาจากหมายเลขจุดอิงทศนิยม ขนาดของประเภทนี้ค่อนข้างเล็ก — เพียง 4 ไบต์ (32 บิต) — แต่สามารถเก็บค่าได้ตั้งแต่ถึง มีการจัดสรร 24 บิตสำหรับแทนแมนทิสซา และ 8 บิตสำหรับเลขชี้กำลัง ประเภทนี้สามารถจัดเก็บได้เพียง 8 หลักที่มีนัยสำคัญ-3.4*1038
3.4*1038
วิธีการนี้ทำให้สามารถจัดเก็บตัวเลขที่มากกว่า a int
ในขณะที่ใช้ 4 ไบต์เท่าเดิม แต่เพื่อทำเช่นนั้น เราเสียสละความถูกต้อง เนื่องจากส่วนหนึ่งของหน่วยความจำจัดเก็บแมนทิสซา ตัวแปรเหล่านี้จึงจัดเก็บทศนิยมเพียง 6-7 ตำแหน่งเท่านั้น ในขณะที่ส่วนที่เหลือจะถูกละทิ้ง
ตัวอย่าง:
รหัส | ค่า |
---|---|
|
123.45679 |
|
12346.0 |
|
-1.2345679 |
อย่างที่คุณเห็น ข้อเสียเปรียบหลักของประเภทนี้คือจำนวนหลักที่มีนัยสำคัญน้อยมาก และสูญเสียความแม่นยำทันทีที่หลักที่แปด นั่นเป็นเหตุผลที่float
ประเภทนี้ไม่เป็นที่นิยมในหมู่โปรแกรมเมอร์ Java
double
พิมพ์
ประเภทdouble
คือประเภทจุดลอยตัวมาตรฐาน ชื่อนี้มาจากเลขทศนิยมที่มีความแม่นยำสองเท่า ตัวอักษรจริงทั้งหมดเป็นdouble
ค่าเริ่มต้น
ประเภทนี้ใช้หน่วยความจำสูงสุด 8 ไบต์ (64 บิต) และสามารถเก็บค่าได้ตั้งแต่ถึง สิ่งสำคัญที่ควรทราบคือมีการจัดสรร 53 บิตสำหรับแมนทิสซา ในขณะที่อีก 11 บิตที่เหลือมีไว้สำหรับเลขชี้กำลัง-1.7*10308
1.7*10308
สิ่งนี้ทำให้สามารถจัดเก็บตัวเลขสำคัญได้ 15-17 หลัก
ตัวอย่าง:
รหัส | ค่า |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
ความแม่นยำนี้โดยเฉพาะอย่างยิ่งเมื่อเปรียบเทียบกับfloat
ประเภท เป็นตัวชี้ขาด: 99% ของการดำเนินการทั้งหมดด้วยจำนวนจริงดำเนินการโดยใช้double
ประเภท
11
บิตถูกจัดสรรให้กับเลขยกกำลัง ซึ่งหมายความว่าคุณสามารถจัดเก็บยกกำลังสิบจาก-323
ถึง+308
(นั่นคือยกกำลังสองจาก-1024
ถึง+1023
) ประเภทdouble
สามารถจัดเก็บตัวเลขที่มีศูนย์หลายร้อยหลังจุดทศนิยมได้อย่างง่ายดาย:
รหัส | ค่า |
---|---|
|
600.0 |
4. อินฟินิตี้
ตัวเลขทศนิยมมีคุณสมบัติที่น่าสนใจอีกอย่างหนึ่ง: พวกมันสามารถเก็บค่าพิเศษที่แสดงถึงความไม่สิ้นสุดได้ และคุณสามารถแทนค่าอนันต์ที่เป็นบวกและค่าอนันต์ที่เป็นลบได้
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
|
|
|
|
|
ถ้าอินฟินิตี้คูณด้วยตัวเลข คุณจะได้อินฟินิตี้ ถ้าคุณบวกเลขเข้าไป คุณจะได้ค่าอนันต์ สะดวกสุด ๆ
ไม่ใช่ตัวเลข ( NaN
)
การดำเนินการใด ๆ ที่เกี่ยวข้องกับอินฟินิตี้ให้ผลอินฟินิตี้ ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด
ตัวเลขทศนิยมสามารถเก็บค่าพิเศษอื่นNaN
: ย่อมาจากN ot a N umber (ไม่ใช่ตัวเลข)
ในทางคณิตศาสตร์ ถ้าคุณหารอนันต์ด้วยอนันต์ ผลลัพธ์ที่ได้จะไม่ได้นิยาม
แต่ใน Java หากคุณหารอนันต์ด้วยอนันต์ ผลลัพธ์ที่ได้NaN
คือ
ตัวอย่าง:
รหัส | บันทึก |
---|---|
|
|
|
|
|
|
การดำเนินการใด ๆ ที่มีผลNaN
ตอบแทนNaN
5. char
ประเภท
ในบรรดาประเภทดั้งเดิมของJavachar
เราสมควรได้รับความสนใจเป็นพิเศษ: ประเภท ชื่อของมันมาจากคำว่าchar acterและประเภทนั้นใช้เพื่อเก็บอักขระ
ตัวอักษรเป็นสิ่งที่ทำมาจากสตริงใช่ไหม? สตริงเป็นอาร์เรย์ของอักขระ
แต่ที่น่าสนใจยิ่งกว่าคือความจริงที่ว่าchar
ประเภทนั้นเป็นประเภทตัวเลข ด้วย ! มันเป็นประเภทวัตถุประสงค์สองทางเพื่อที่จะพูด
ความจริงก็คือchar
ประเภทไม่ได้ตัวอักษร แต่จะเก็บรหัสอักขระจากการเข้ารหัส Unicode อักขระแต่ละตัวสอดคล้องกับตัวเลข: รหัสตัวเลขของอักขระ
ตัวแปร แต่ละตัวchar
ใช้สองไบต์ในหน่วยความจำ (เหมือนกับshort
ประเภท) แต่แตกต่างจากประเภทshort
ประเภทchar
จำนวนเต็มไม่ได้ลงนามและสามารถเก็บค่าจาก0
ถึง65,535
ประเภทchar
คือประเภทไฮบริด ค่าของมันสามารถตีความได้ทั้งเป็นตัวเลข (เช่น สามารถเพิ่มและคูณได้) และเป็นอักขระ สิ่งนี้เกิดขึ้นเพราะแม้ว่าอักขระจะเป็นการแสดงภาพ แต่สำหรับคอมพิวเตอร์แล้ว พวกมันอยู่เหนือตัวเลขทั้งหมด และสะดวกกว่าที่จะทำงานกับพวกเขาเป็นตัวเลข
ยูนิโค้ด
Unicodeเป็นตารางพิเศษ (การเข้ารหัส) ที่มีอักขระทั้งหมดในโลก และอักขระแต่ละตัวมีหมายเลขของตัวเอง มีลักษณะประมาณนี้:
มีหลายวิธีในการกำหนดค่าให้กับchar
ตัวแปร
รหัส | คำอธิบาย |
---|---|
|
ตัวแปรa จะมีตัวอักษรA ละติน |
|
ตัวแปรa จะมีตัวอักษรA ละติน รหัสของมัน65 คือ |
|
ตัวแปรa จะมีตัวอักษรA ละติน รหัสของมันคือ 65 ซึ่งเท่ากับ41 ในระบบเลขฐานสิบหก |
|
ตัวแปรa จะมีตัวอักษรA ละติน รหัสของมันคือ 65 ซึ่งเท่ากับ41 ในระบบเลขฐานสิบหก เลขศูนย์พิเศษสองตัวไม่เปลี่ยนแปลงอะไรเลย |
|
ตัวแปรa จะมีตัวอักษรA ละติน อีกวิธีในการกำหนดอักขระด้วยรหัส |
บ่อยครั้งที่ผู้คนระบุอักขระในเครื่องหมายคำพูด (เช่นในแถวแรกของตาราง) ที่กล่าวว่าวิธีหลังก็เป็นที่นิยมเช่นกัน ข้อดีของมันคือสามารถใช้ในสตริงได้
และอย่างที่เราบอกไปแล้วว่าchar
type เป็นประเภทจำนวนเต็มด้วย ดังนั้นคุณสามารถเขียนได้ดังนี้:
รหัส | เอาต์พุตคอนโซล |
---|---|
|
ตัวอักษรละตินB จะแสดงบนหน้าจอ เนื่องจาก: A – 65 B – 66 C –67 |
ร่วมงานกับchar
ส
แต่ละตัวchar
จะเป็นตัวเลข (รหัสอักขระ) ก่อน จากนั้นจึงตามด้วยอักขระ หากคุณทราบรหัสอักขระ คุณสามารถรับอักขระนั้นในโปรแกรมของคุณได้เสมอ ตัวอย่าง:
รหัส | เอาต์พุตคอนโซล |
---|---|
|
|
รหัสมาตรฐาน
นี่คือรหัสอักขระที่เป็นที่รู้จักมากที่สุด:
ตัวละคร | รหัส |
---|---|
0 , 1 , 2 , ...9 |
48 , 49 , 50 , ...57 |
a , b , c , ...z |
97 , 98 , 99 , ...122 |
A , B , C , ...Z |
65 , 66 , 67 , ...90 |
6. boolean
ประเภท
และประเภทดั้งเดิมสุดท้ายboolean
คือ
อย่างที่คุณทราบแล้วว่าสามารถรับได้เพียงสองค่าเท่านั้น: true
และfalse
และด้วยเหตุนี้คุณจึงรู้ทุกสิ่งที่ควรรู้เกี่ยวกับประเภทนี้
GO TO FULL VERSION