Long vs Integer, long vs int ใช้อะไรและเมื่อไร?


คำตอบ:


192

Longเป็นObjectรูปแบบของlongและเป็นรูปแบบของวัตถุIntegerint

longใช้64 บิต intใช้ 32 บิตและเพื่อให้สามารถเก็บตัวเลขได้ถึง± 2 พันล้าน (-2 วันที่ 31ที่จะ +2 31 -1)

คุณควรใช้longและintนอกจากที่คุณจะต้องทำให้การใช้วิธีการสืบทอดมาจากเช่นObject เมธอดมักใช้เวอร์ชันบรรจุกล่อง ( -wrapped) เนื่องจากต้องใช้งานได้กับทุกประเภทและประเภทดั้งเดิมเช่นหรือไม่ใช่ไฟล์.hashcodeJava.util.collectionsObjectObjectintlongObject

ความแตกต่างอีกประการหนึ่งคือlongและintเป็นpass-by-valueในขณะที่LongและIntegerเป็นค่าpass-by-referenceเช่นเดียวกับ Java ที่ไม่ใช่แบบดั้งเดิมทั้งหมด ดังนั้นหากเป็นไปได้ที่จะแก้ไขLongหรือInteger (ไม่เป็นเช่นนั้นก็ไม่สามารถเปลี่ยนรูปได้โดยไม่ต้องใช้รหัส JNI) ก็จะมีเหตุผลอื่นที่จะใช้อีกอันหนึ่ง

ความแตกต่างที่สุดท้ายคือว่าLongหรืออาจจะเป็นIntegernull


5
@Borealid นี่ผิดมาก Java มักจะส่งผ่านค่าไม่มีอะไรเช่น pass by reference ใน Java
Diego Ramos

9
เอ่อฮะ? เอาล่ะมาสำรวจแนวคิดที่ว่า Java ไม่เคยผ่านการอ้างอิง ถ้าฉันเรียกใช้ฟังก์ชันโดยให้ int [2] จากนั้นภายในฟังก์ชันฉันเปลี่ยนค่าที่อยู่ในองค์ประกอบแรกของอาร์เรย์นั้นผู้เรียกของฟังก์ชันจะเห็นการเปลี่ยนแปลงนั้นหรือไม่ ใช่? นั่นเป็นเพราะสิ่งที่ส่งผ่านไปยังฟังก์ชันไม่ใช่ค่าในอาร์เรย์ แต่เป็นการอ้างอิงถึงค่าเหล่านั้น "ส่งผ่านค่า" หมายถึงข้อมูลจริงที่กำลังถูกคัดลอกโดยไม่มีทิศทาง ใครก็ตามที่สอนคุณว่า Java เป็นแบบ pass-by-value ทำให้คุณเสียหาย
Borealid

3
@ คุณไม่ถูกต้องค่าจะเปลี่ยนไปเนื่องจากมีการสร้างสำเนาใหม่ของการอ้างอิงไปยังอาร์เรย์นั่นคือเหตุผลที่ใครก็ตามที่เรียกใช้ฟังก์ชันจะเห็นการเปลี่ยนแปลงนี้ยังคงส่งผ่านค่า ฉันไม่อยากจะเชื่อเลยว่าคุณพูดว่ามี pass by reference ใน Java คุณไม่เคยผ่านการอ้างอิงดั้งเดิมไปยังฟังก์ชัน
Diego Ramos

6
ในโลกแห่งทฤษฎีที่ Java มีพฤติกรรมแตกต่างจากที่เป็นจริงอย่างสิ้นเชิงและการส่งวัตถุหรืออาร์เรย์ไปยังฟังก์ชันส่งผลให้เกิดการคัดลอกที่แยกจากกันโดยสิ้นเชิง (โดยที่การปรับเปลี่ยนภายในฟังก์ชันไม่ได้สะท้อนให้ผู้โทรเห็นเลย) คุณจะทำอย่างไร อธิบายภาษา? โปรดทราบว่าสิ่งที่เรากำลังพูดถึงไม่ใช่สิ่งที่ Java ทำจริงๆ
Borealid

2
@DiegoRamos พูดถูก Java มักจะส่งผ่านค่าความสับสนจะถูกสร้างขึ้นเนื่องจากค่าเมื่อไม่ใช่แบบดั้งเดิมเป็นการอ้างอิงหน่วยความจำการแลกเปลี่ยนแบบคงที่ไม่ทำงานใน java ดูรายละเอียดเพิ่มเติมที่นี่: journaldev.com/3884/…
Panthro

29

มีสองสิ่งที่คุณไม่สามารถทำได้กับประเภทดั้งเดิม:

  • มีnullค่า
  • ประสานกับพวกเขา
  • ใช้เป็นพารามิเตอร์ประเภทสำหรับคลาสทั่วไปและเกี่ยวข้องกับสิ่งนั้น:
  • ส่งผ่านไปยัง API ที่ใช้งานได้กับObjects

หากคุณไม่ต้องการสิ่งเหล่านี้คุณควรเลือกประเภทดั้งเดิมเนื่องจากต้องการหน่วยความจำน้อยกว่า


24
  • โดยค่าเริ่มต้นให้ใช้intเมื่อถือตัวเลข
  • หากช่วงintเล็กเกินไปให้ใช้ไฟล์long
  • หากช่วงlongเล็กเกินไปให้ใช้BigInteger
  • หากคุณต้องการจัดการตัวเลขของคุณเป็นวัตถุ (เช่นเมื่อใส่ลงใน a Collection, การจัดการnull, ... ) ให้ใช้Integer/ Longแทน

13

An intคือจำนวนเต็ม 32 บิต a longคือจำนวนเต็ม 64 บิต จะใช้อันไหนขึ้นอยู่กับจำนวนตัวเลขที่คุณคาดว่าจะใช้ได้

intและlongเป็นประเภทดั้งเดิมในขณะที่IntegerและLongเป็นวัตถุ ประเภทดั้งเดิมมีประสิทธิภาพมากกว่า แต่บางครั้งคุณต้องใช้วัตถุ ตัวอย่างเช่นคลาสคอลเลกชันของ Java สามารถใช้ได้กับอ็อบเจ็กต์เท่านั้นดังนั้นหากคุณต้องการรายการจำนวนเต็มคุณต้องทำให้เป็นList<Integer>เช่น (คุณไม่สามารถใช้intใน a Listโดยตรงได้)


6

Integerเป็นประเภทจำนวนเต็ม 32 บิตที่มีการลงนาม

  • แสดงเป็น Int
  • ขนาด = 32 bits (4byte)
  • สามารถเก็บจำนวนเต็มของช่วง -2,147,483,648 to 2,147,483,647
  • ค่าเริ่มต้นคือ0


Longเป็นประเภทจำนวนเต็ม 64 บิตที่ลงนาม

  • แสดงเป็น Long
  • ขนาด = 64 bits (8byte)
  • สามารถเก็บจำนวนเต็มของช่วง -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • ค่าเริ่มต้นคือ0L


หากใช้งานของคุณของตัวแปรตกอยู่ในช่วง 32 บิตการใช้งานInt, longการใช้งานอื่น โดยปกติแล้ว long จะใช้สำหรับการคำนวณทางวิทยาศาสตร์และสิ่งที่ต้องการความแม่นยำมาก (เช่นค่า pi)

ตัวอย่างของการเลือกอย่างใดอย่างหนึ่งคือกรณีของ YouTube พวกเขากำหนดตัวนับการดูวิดีโอเป็นครั้งแรกว่ามีการintดูมากเกินไปเมื่อมีการดูวิดีโอยอดนิยมมากกว่า 2,147,483,647 ครั้ง เนื่องจากตัวIntนับไม่สามารถจัดเก็บค่าใด ๆ เกินกว่าช่วงได้ YouTube จึงเปลี่ยนตัวนับเป็นตัวแปร 64 บิตและตอนนี้สามารถนับจำนวนการดูได้ถึง 9,223,372,036,854,775,807 ครั้ง ทำความเข้าใจข้อมูลของคุณและเลือกประเภทที่เหมาะกับตัวแปร 64 บิตจะใช้หน่วยความจำมากกว่าตัวแปร 32 บิตเป็นสองเท่า


1

เมื่อพูดถึงการใช้ตัวเลขที่ยาวมากซึ่งอาจเกิน 32 บิตในการแสดงคุณอาจใช้ long เพื่อให้แน่ใจว่าคุณจะไม่มีพฤติกรรมแปลก ๆ

จาก Java 5 คุณสามารถใช้คุณสมบัติในการชกมวยและนอกชกมวยเพื่อให้การใช้ int และ Integer เหมือนกันโดยสิ้นเชิง หมายความว่าคุณสามารถทำได้:

int myInt = new Integer(11);
Integer myInt2 = myInt;

ทั้งในและนอกมวยช่วยให้คุณสามารถสลับไปมาระหว่าง int และจำนวนเต็มโดยไม่ต้องแปลงใด ๆ เพิ่มเติม (เหมือนกันสำหรับLong, Double, Shortเกินไป)

คุณอาจใช้ intตลอดเวลา แต่Integerมีวิธีการช่วยเหลือบางอย่างที่สามารถช่วยคุณดำเนินการบางอย่างที่ซับซ้อนด้วยจำนวนเต็ม (เช่นInteger.parseInt(String))


0

a) object Class "Long" กับ primitive type "long" (อย่างน้อยก็ใน Java)

b) มีขนาดหน่วยความจำที่แตกต่างกัน (แม้ไม่ชัดเจน) ของประเภทดั้งเดิม:

Java - ชัดเจนทั้งหมด: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

  • ไบต์ถ่าน .. 1B .. 8b
  • int สั้น .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • int ยาว .. 8B .. 64b

ค .. แค่ยุ่ง: https://en.wikipedia.org/wiki/C_data_types

  • สั้น ๆ .. .. 16b
  • int .. .. 16b ... wtf?!?!
  • ยาว .. .. 32b
  • ยาว .. 64b .. เละ! : - /

สิ่งนี้ไม่ตอบคำถามซึ่งเกี่ยวกับความแตกต่างระหว่าง Long และ Long เป็นต้น
GreenAsJade

ไม่มันไม่ได้ตอบอย่างชัดเจนไม่ได้บอกความแตกต่างระหว่างประเภทดั้งเดิมกับอ็อบเจ็กต์ประเภทข้อมูลอย่างชัดเจนแน่นอน @GreenAsJade เนื่องจากคำถามที่นี่ด้านบนไม่ได้ระบุภาษาเฉพาะใด ๆ ดังนั้นฉันจึงทำการเปรียบเทียบ - เพื่อให้ทุกคนสามารถตรวจสอบความแตกต่างได้ (จากข้อมูลยากตามที่ให้ไว้)
Franta

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