ความแตกต่างระหว่างจำนวนเต็มและ int ใน Java คืออะไร?


249

เช่นทำไมคุณสามารถทำ:

int n = 9;

แต่ไม่:

Integer n = 9;

และคุณสามารถทำได้:

Integer.parseInt("1");

แต่ไม่:

int.parseInt("1");

35
จำนวนเต็มเป็นคลาส int เป็นชนิดดั้งเดิม
Anycorn

24
คุณสามารถทำInteger n = 9;เนื่องจาก autoboxing (ยกเว้นกรณีที่คุณกำลังใช้รุ่นเก่ามากของ Java)
Alderath

คำตอบ:


321

intเป็นชนิดดั้งเดิม ตัวแปรชนิดที่intจัดเก็บค่าไบนารีจริงสำหรับจำนวนเต็มที่คุณต้องการเป็นตัวแทน int.parseInt("1")ไม่ได้ทำให้รู้สึกเพราะintเป็นไม่ได้ระดับและดังนั้นจึงไม่ได้มีวิธีการใด ๆ

Integerเป็นคลาสที่ไม่แตกต่างจากภาษาอื่นในภาษา Java ตัวแปรของการอ้างอิงประเภทIntegerร้านค้ากับวัตถุเช่นเดียวกับประเภทการอ้างอิงอื่น ๆ (วัตถุ) เป็นการเรียกใช้เมธอดสแตติกจากคลาส(โปรดทราบว่าเมธอดนี้ส่งคืนและไม่ใช่)IntegerInteger.parseInt("1")parseIntIntegerintInteger

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

โปรดทราบว่าทุกประเภทดั้งเดิมใน Java มีคลาสwrapperเทียบเท่า:

  • byte มี Byte
  • short มี Short
  • int มี Integer
  • long มี Long
  • boolean มี Boolean
  • char มี Character
  • float มี Float
  • double มี Double

คลาสของ Wrapper สืบทอดมาจากคลาส Object และไม่ใช่แบบดั้งเดิม ดังนั้นจึงสามารถใช้ในคอลเลกชันที่มีการอ้างอิงวัตถุหรือกับ Generics

ตั้งแต่ java 5 เรามีออโต้บ็อกซ์และการแปลงระหว่างคลาสดั้งเดิมและคลาส wrapper จะถูกทำโดยอัตโนมัติ อย่างไรก็ตามระวังเพราะสิ่งนี้สามารถแนะนำข้อบกพร่องที่ละเอียดอ่อนและปัญหาประสิทธิภาพการทำงาน ชัดเจนเกี่ยวกับการแปลงไม่เจ็บ


6
ในC#ทุกประเภทข้อมูลมี "นามแฝง" และint.Parse()ไม่มีเหตุผล (แม้ว่ามันจะไม่เป็นจริง)
Vahid Amiri

22
@ VSG24 ... แต่นี่เป็นคำถามของ Java และนี่คือคำตอบของ Java C#ไม่เกี่ยวข้องอย่างสมบูรณ์ที่นี่
Darkhogg

3
ตัวอย่างที่ดีอาจเป็น: ข้อผิดพลาดในการรวบรวม: รายการ <int> ที่ถูกต้อง: รายการ <Integer>
hagai

ความรู้เพิ่มเติมจะได้รับประโยชน์เสมอ
sumit sharma

1
ฉันชอบเรียนรู้สิ่งใหม่โดยเฉพาะเมื่อความรู้เกี่ยวข้องกับหัวข้อปัจจุบัน ขอบคุณ Vahid
Paul Oliver

30

จำนวนเต็มเป็นคลาสและ int เป็นชนิดดั้งเดิม

อ่านต่อได้ที่ลิงค์เหล่านี้:


1
ฉันต้องการชี้ให้เห็นว่าฉันคิดว่านี่เป็นคำตอบที่สมบูรณ์แบบสำหรับสองเหตุผล: 1 กระชับและถูกต้องทำให้ผู้ชม / ผู้ถามอยู่ในใจ 2- ให้ทิศทางสำหรับรายละเอียดเพิ่มเติมแทนที่จะวางไว้ในเนื้อหาของคำตอบไม่ใช่ทั้งหมด คำถามสามารถตอบได้อย่างถูกต้องและรัดกุม (บางคนต้องการรายละเอียดและความแตกต่างเล็กน้อยเพื่อให้ถูกต้องและสมบูรณ์) แต่ฉันคิดว่าคำตอบทั้งหมดควรพยายามให้ง่ายและตรงไปตรงมา
DRich

11
ฉันคิดว่ามันตรงกันข้ามจริงๆ "int เป็นชนิดดั้งเดิม" ไม่ได้บอกอะไรคุณเลยถ้าคุณไม่รู้ว่าประเภทดั้งเดิมนั้นคืออะไร (และถ้าคุณทำคุณน่าจะรู้ถึงความแตกต่างระหว่าง int และจำนวนเต็ม) และการส่งผู้อ่านไปยังสองลิงก์ที่มีข้อความว่า "ลิงก์ 1" และ "ลิงก์ 2" นั้นค่อนข้างไม่ช่วยเหลือโดยเฉพาะเมื่อเปรียบเทียบกับการอ้างอิงส่วนที่เกี่ยวข้อง
Steve Bennett

7

ค่า Integer นั้นค่อนข้างจะเป็นเพียงแค่ wrapper สำหรับ int ดั้งเดิม type ช่วยให้คุณใช้ฟังก์ชั่นทั้งหมดของคลาส Integer เพื่อทำให้ชีวิตของคุณง่ายขึ้น

หากคุณยังใหม่กับ Java สิ่งที่คุณควรเรียนรู้ที่จะชื่นชมคือเอกสาร Java ตัวอย่างเช่นทุกสิ่งที่คุณต้องการทราบเกี่ยวกับInteger Classนั้นจะมีการบันทึกรายละเอียดไว้

ตรงนี้เป็นเอกสารประกอบสำหรับคลาส Integer:

ชั้น Integer ล้อมรอบคุณค่าของดั้งเดิมประเภท int ในวัตถุ วัตถุประเภทจำนวนเต็มมีเขตข้อมูลเดียวที่มีประเภทเป็น int


7
เรื่องนี้ค่อนข้างพลาดจุด ตัวอย่างเช่นเป็นIntegerคลาสนั้นสามารถเก็บไว้ในคอนเทนเนอร์ (ไม่เหมือนชนิดดั้งเดิม)
Oliver Charlesworth

6

ตัวแปร int เก็บค่าจำนวนเต็ม 32 บิตที่เซ็นชื่อ Integer (ที่มี capital I) ถือการอ้างอิงถึงอ็อบเจกต์ของคลาส (ประเภท) Integer หรือเป็นโมฆะ

Java ปลดเปลื้องโดยอัตโนมัติระหว่างสอง; จากจำนวนเต็มถึง int ทุกครั้งที่วัตถุจำนวนเต็มเกิดขึ้นเป็นอาร์กิวเมนต์ให้กับตัวดำเนินการ int หรือถูกกำหนดให้กับตัวแปร int หรือค่า int ถูกกำหนดให้กับตัวแปร Integer การคัดเลือกนักแสดงนี้เรียกว่า boxing / unboxing

ถ้าตัวแปรอ้างอิงจำนวนเต็มเป็นโมฆะไม่มีการบอกกล่าวอย่างชัดเจนหรือโดยปริยาย NullPointerException จะถูกโยนทิ้ง

(ในข้อความด้านบนคำว่า "ตัวแปร" หมายถึงตัวแปรท้องถิ่นเขตข้อมูลหรือพารามิเตอร์)


5

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

ในตัวอย่างของคุณดังต่อไปนี้

Integer n = 9;

ค่าคงที่9จะถูกบรรจุไว้ในกล่องอัตโนมัติ ( auto-boxingและunboxingเกิดขึ้นโดยอัตโนมัติจากjava 5เป็นต้นไป) Integerและดังนั้นคุณสามารถใช้คำสั่งเช่นนั้นและInteger n = new Integer(9)ด้วย นี่คือความจริงผ่านคำสั่งInteger.valueOf(9).intValue();


3

int เป็นชนิดดั้งเดิมและไม่ใช่วัตถุ นั่นหมายความว่าไม่มีวิธีการที่เกี่ยวข้อง จำนวนเต็มเป็นวัตถุที่มีวิธีการ (เช่น parseInt)

ด้วยจาวารุ่นใหม่จะมีฟังก์ชั่นสำหรับ auto Boxing (และ unboxing) นั่นหมายความว่าคอมไพเลอร์จะแทรก Integer.valueOf (int) หรือ integer.intValue () เมื่อจำเป็น นั่นหมายความว่าเป็นไปได้จริงที่จะเขียน

Integer n = 9;

ซึ่งตีความว่าเป็น

Integer n = Integer.valueOf(9);

3

จำนวนเต็มเป็นคลาส wrapper / Object และ int เป็นชนิดดั้งเดิม ความแตกต่างนี้มีบทบาทอย่างมากเมื่อคุณต้องการเก็บค่า int ไว้ในคอลเล็กชันเนื่องจากยอมรับเฉพาะวัตถุเป็นค่า (จนถึง jdk1.4) JDK5 เป็นต้นไปเนื่องจากการ autoboxing มันเป็นเรื่องที่แตกต่างกันอย่างสิ้นเชิง


5
JDK5 + ยอมรับเฉพาะวัตถุเท่านั้น ก็เพียงว่า autoboxing ช่วยให้คอมไพเลอร์โดยอัตโนมัติโทรInteger.valueOf(i)หรือInteger.intValue()สำหรับคุณ Collection<int>จะยังไม่ทำงาน ดังนั้นมันจึงไม่ใช่เรื่องที่แตกต่างอย่างสิ้นเชิง - เป็นเรื่องเดียวกันโดยมีการจดชวเลขเล็กน้อย
yshavit

ตกลง ขออภัยข้อความของฉันอาจไม่สะท้อนถึงสิ่งนั้น
kosa

3

ใน Java int เป็นชนิดข้อมูลดั้งเดิมในขณะที่ Integer เป็นคลาสตัวช่วยใช้ในการแปลงเป็นประเภทข้อมูลหนึ่งไปเป็นประเภทอื่น

ตัวอย่างเช่น:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

ชนิดข้อมูลดั้งเดิมจัดเก็บหน่วยความจำที่เร็วที่สุดที่คลาส Helper ซับซ้อนและจัดเก็บในหน่วยความจำฮีพ

อ้างอิงจาก "David Gassner" Java Essential Training


2

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

นอกจากนี้คุณยังสามารถใช้แนวคิด OOP Integerด้วย ตัวอย่างเช่นคุณสามารถใช้ Integer สำหรับข้อมูลทั่วไป (เช่น)Collection<Integer>


2

สิ่งนี้นำมาจากJava: การอ้างอิงที่สมบูรณ์รุ่นที่เก้า

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

แม้จะมีประโยชน์ด้านประสิทธิภาพที่นำเสนอโดยประเภทดั้งเดิม แต่ก็มีบางครั้งที่คุณจะต้องแสดงวัตถุ ตัวอย่างเช่นคุณไม่สามารถส่งชนิดดั้งเดิมโดยอ้างอิงถึงวิธีการ นอกจากนี้หลายของโครงสร้างข้อมูลมาตรฐานดำเนินการโดย Java ทำงานบนวัตถุซึ่งหมายความว่า คุณไม่สามารถใช้เหล่านี้ (วัตถุที่เฉพาะเจาะจง) โครงสร้างข้อมูลในการจัดเก็บชนิดดั้งเดิม เพื่อจัดการกับสถานการณ์เหล่านี้ (และอื่น ๆ ), Java ให้ประเภท wrappers ซึ่งเป็นคลาสที่แค็ปซูลประเภทดั้งเดิมภายในวัตถุ

คลาสของ Wrapper นั้นเกี่ยวข้องโดยตรงกับ ฟีเจอร์autoboxingของ Java ห่อประเภทมีคู่ Float, ยาว, จำนวนเต็มสั้นไบต์ตัวอักษรและบูลีน คลาสเหล่านี้มีวิธีการมากมายที่ช่วยให้คุณสามารถรวมชนิดดั้งเดิมเข้ากับลำดับชั้นวัตถุของ Java


1

เพื่อเพิ่มประสิทธิภาพการรันไทม์รหัส Java, int ประเภทดั้งเดิม (s)ได้รับการเพิ่มรวมทั้งfloat, boolฯลฯ แต่พวกเขามาพร้อมกับมีการเรียนการห่อหุ้มเพื่อที่ว่าถ้าจำเป็นคุณสามารถแปลงและใช้พวกเขาเป็นมาตรฐานวัตถุ Java พร้อมกับยูทิลิตี้จำนวนมากที่มาเป็นสมาชิกของพวกเขา ฟังก์ชั่น (เช่นInteger.parseInt("1"))


1

intเป็นชนิดข้อมูลดั้งเดิมในขณะที่Integerเป็น Reference หรือ Wrapper Type (Class) ใน Java

หลังจากนั้นจึงjava 1.5นำเสนอแนวคิดของautoboxingและunboxingคุณสามารถเริ่มต้นทั้งสองอย่างintหรือIntegerเช่นนี้

int a= 9
Integer a = 9 // both valid After Java 1.5.

ทำไมInteger.parseInt("1");แต่ไม่ใช่int.parseInt("1");??

Integerเป็น Class ที่กำหนดไว้ในjdkไลบรารีและparseInt()เป็นวิธีการคงที่อยู่ในIntegerClass

ดังนั้นInteger.parseInt("1");เป็นไปได้ใน java แต่intเป็นประเภทพื้นฐาน (ถือว่าเป็นคำหลัก) ในภาษาจาวา ดังนั้นคุณจะไม่สามารถเรียกด้วยparseInt()int

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.