لغة - ما الفرق بين int و integer في Java و C#؟




شرح method في الجافا (18)

"int" هي نوع بيانات بدائي و "عدد صحيح" في فئة التفاف في Java. يمكن استخدام "عدد صحيح" كوسيطة لطريقة تتطلب كائنًا ، حيث يمكن استخدام "int" كوسيطة لطريقة تتطلب قيمة عددية ، والتي يمكن استخدامها للتعبير الحسابي.

كنت أقرأ More Joel on Software عندما صادفت Joel Spolsky وهو يقول شيئًا عن نوع معين من المبرمجين يعرف الفرق بين int و Integer في Java / C # (Object Oriented Programming Languages).

فما الفرق؟


(إصدار Java) في الكلمات البسيطة ، int هي بدائية و Integer عبارة عن كائن مُلحق لـ int.

مثال واحد حيث يمكنك استخدام Integer vs int ، عندما تريد المقارنة و int متغير مرة أخرى لاغية سوف يلقي خطأ.

int a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is wrong - cannot compare primitive to null
{
do something...}

Instead you will use,
Integer a;
//assuming a value you are getting from data base which is null
if(a ==null) // this is correct/legal
{ do something...}

بالنسبة إلى Java 1.5 و autoboxing ، فهناك " autoboxing " مهم يأتي للعب عند مقارنة كائنات Integer.

في Java ، تكون الكائنات Integer ذات القيم من 128 إلى 127 غير قابلة للتغيير (أي بالنسبة لقيمة عدد صحيح معين ، مثلا 23 ، جميع كائنات Integer التي تم إنشاء مثيل لها من خلال البرنامج مع القيمة 23 نقطة إلى نفس الكائن بالضبط ).

مثال ، هذا يعود صحيحاً:

Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2); //  true

في حين أن هذا يعود كاذبة:

Integer i1 = new Integer(128);
Integer i2 = new Integer(128);
System.out.println(i1 == i2); //  false

يقارن == حسب المرجع (هل تشير المتغيرات إلى نفس الكائن).

قد تختلف أو لا تختلف هذه النتيجة اعتمادًا على JVM الذي تستخدمه. يتطلب autoboxing الخاص بالمواصفات Java 1.5 أن تكون الأعداد الصحيحة (-128 إلى 127) دائمًا على نفس كائن المجمّع.

حل؟ =) يجب على المرء دائمًا استخدام الأسلوب Integer.equals () عند مقارنة الكائنات الصحيحة.

System.out.println(i1.equals(i2)); //  true

مزيد من المعلومات في java.net مثال على bexhuff.com


تمت الإجابة على هذا بالفعل عن Java ، إليك الإجابة C #:

"Integer" ليس اسمًا صالحًا للنوع في C # و "int" هو مجرد اسم مستعار لـ System.Int32. أيضًا ، على عكس Java (أو C ++) ، لا توجد أنواع بدائية خاصة في C # ، فكل مثيل لنوع في C # (بما في ذلك int) هو كائن. إليك بعض التعليمات البرمجية التوضيحية:

void DoStuff()
{
    System.Console.WriteLine( SomeMethod((int)5) );
    System.Console.WriteLine( GetTypeName<int>() );
}

string SomeMethod(object someParameter)
{
    return string.Format("Some text {0}", someParameter.ToString());
}

string GetTypeName<T>()
{
    return (typeof (T)).FullName;
}

سأضيف إلى الإجابات الممتازة الواردة أعلاه ، وأتحدث عن الملاكمة وإلغاء الملاكمة ، وكيف ينطبق ذلك على Java (على الرغم من أن C # لديها أيضًا). سأستخدم مصطلحات Java فقط ، لأنني أكثر ملاءمة لذلك.

كما ذكر الإجابات ، int مجرد رقم (يُسمى النوع غير المُعلب ) ، في حين أن Integer عبارة عن كائن (يحتوي على الرقم ، وبالتالي نوع محاصر ). في مصطلحات Java ، يعني ذلك (بصرف النظر عن عدم القدرة على الاتصال بالطرق على int ) ، لا يمكنك تخزين أنواع int أو غير الكائنات الأخرى في المجموعات ( List ، Map ، إلخ). لتخزينها ، يجب عليك أولاً وضعها في المربع المخصص لها.

يشتمل Java 5 وما بعده على شيء يسمى الملاكمة التلقائية وإلغاء الملاك التلقائي والذي يسمح بالقيام بالملاكمة / إلغاء التخزين خلف الكواليس. المقارنة والتباين: إصدار Java 5:

Deque<Integer> queue;

void add(int n) {
    queue.add(n);
}

int remove() {
    return queue.remove();
}

Java 1.4 أو إصدار سابق (لا توجد أنواع من الوراثة أيضًا):

Deque queue;

void add(int n) {
    queue.add(Integer.valueOf(n));
}

int remove() {
    return ((Integer) queue.remove()).intValue();
}

تجدر الإشارة إلى أنه على الرغم من الإيجاز في إصدار Java 5 ، فإن كلا الإصدارين يولدان رمزًا ثنائيًا متطابقًا. وبالتالي ، على الرغم من أن الملاكمة التلقائية و unboxing unboxing مريحة للغاية لأنك تكتب رمزًا أقل ، فإن هذه العمليات تحدث خلف الكواليس ، مع نفس تكاليف وقت التشغيل ، لذلك لا يزال عليك أن تكون مدركًا لوجودها.

أتمنى أن يساعدك هذا!


سأنشر هنا فقط لأن بعض المنشورات الأخرى غير دقيقة قليلاً فيما يتعلق بـ C #.

صحيح: int هو اسم مستعار لـ System.Int32 .
خطأ: float ليس اسمًا مستعارًا لـ System.Float ، ولكن بالنسبة System.Single

في الأساس ، int هي كلمة رئيسية محجوزة في لغة البرمجة C # ، وهي اسم مستعار لنوع قيمة System.Int32 .

float و Float ليس هو نفسه ، لأن نوع النظام الصحيح لـ " float " هو System.Single. هناك بعض أنواع مثل هذه التي تحتوي على الكلمات الأساسية المحجوزة التي لا يبدو أنها تطابق أسماء الأنواع مباشرة.

في C # ، لا يوجد فرق بين " int " و " System.Int32 " أو أي من الأزواج الأخرى أو أنواع الكلمات الرئيسية / أنواع الأنظمة ، باستثناء عند تحديد التعدادات. باستخدام التعدادات ، يمكنك تحديد حجم التخزين المراد استخدامه وفي هذه الحالة ، يمكنك فقط استخدام الكلمة المحجوزة وليس اسم نوع وقت تشغيل النظام.

عندما يتم تخزين القيمة في int على المكدس ، في الذاكرة ، أو ككائن كومة مرجعية يعتمد على السياق وكيفية استخدامه.

هذا الإعلان بطريقة:

int i;

يعرّف المتغير i من النوع System.Int32 ، ويعيش في سجل أو على المكدس ، اعتمادًا على التحسينات. يحدد التعريف نفسه في نوع (بنية أو فئة) حقل عضو. يعرّف نفس التعريف في قائمة وسيطات الطريقة معلمة ، مع نفس خيارات التخزين مثل متغير محلي. (لاحظ أن هذه الفقرة غير صالحة إذا بدأت في سحب طرق التكرار إلى المزيج ، فهذه حيوانات مختلفة تمامًا)

للحصول على كائن كومة الذاكرة المؤقتة ، يمكنك استخدام الملاكمة:

object o = i;

سيؤدي هذا إلى إنشاء نسخة محاصر من محتويات i على الكومة. في IL يمكنك الوصول إلى الأساليب الموجودة على كائن الكومة مباشرةً ، ولكن في C # تحتاج إلى إعادتها إلى int ، مما يؤدي إلى إنشاء نسخة أخرى. وبالتالي ، لا يمكن بسهولة تغيير الكائن الموجود في الكومة في C # دون إنشاء نسخة جديدة محاصر من قيمة int جديدة. (لاف ، هذه الفقرة لا تقرأ كل ذلك بسهولة.)


في Java int هو نوع بيانات بدائي بينما Integer هي فئة Helper ، وهي تستخدم للتحويل لنوع بيانات واحد إلى آخر.

فمثلا:

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

تخزن أنواع البيانات البدائية أسرع ذاكرة متاحة حيث تكون فئة Helper معقدة وتخزينها في ذاكرة heep.

مرجع من "David Gassner" Java Essential Training.


في Java ، النوع int هو نوع بيانات بدائي ، حيث أن نوع Integer هو كائن.

في C # ، نوع int هو أيضًا نوع بيانات مثل System.Int32 . يمكن محاصر integer (تماما مثل أي أنواع قيمة أخرى) ("ملفوفة") في كائن.


في جافا حسب معرفتي إذا كنت متعلمًا ، عندما تكتب int؛ ثم في java عام ، سوف يقوم بتجميع كود مثل Integer a = new Integer() . لذلك ، كما هو الحال في الوراثة لا يتم استخدام Integer ولكن يتم استخدام int . لذلك هناك مثل هذا الاختلاف هناك.


في كلتا اللغتين (Java و C #) int 4 بايت.

بخلاف Java ، يوفر C # قيم عدد صحيح موقعة وغير موقعة. نظرًا لأن Java و C # موجهان للكائنات ، فإن بعض العمليات في هذه اللغات لا تحدد مباشرة على الإرشادات المقدمة في وقت التشغيل ، وبالتالي تحتاج إلى تعريفها كجزء من كائن من نوع ما.

يوفر C # System.Int32 وهو نوع قيمة باستخدام جزء من الذاكرة ينتمي إلى نوع المرجع على الكومة.

يوفر java java.lang.Integer وهو نوع مرجعي يعمل على int . لا يمكن تجميع الطرق في Integer مباشرة لتشغيل إرشادات وقت التشغيل. لذلك نحن نضع قيمة int لتحويلها إلى مثيل لـ Integer ونستخدم الطرق التي تتوقع valueOf() من نوع ما (مثل toString() و parseInt() و valueOf() الخ).

في متغير C # يشير إلى System.Int32.Any 4 بايت قيمة في الذاكرة يمكن تفسيرها على أنها int بدائية ، والتي يمكن معالجتها بواسطة مثيل System.Int32.So int هو اسم مستعار لـ System.Int32.When باستخدام integer- الأساليب ذات الصلة مثل int.Parse() ، int.ToString() إلخ. يتم تصنيف Integer في بنية FCL System.Int32 تستدعي الأساليب المعنية مثل Int32.Parse() و Int32.ToString() .


هل سبق لك أن برمجة قبل ذلك (int) هو أحد الأنواع البدائية التي يمكنك تعيينها للمتغيرات الخاصة بك (مثل char ، float ، ...).

لكن Integer عبارة عن فئة مجمعة يمكنك استخدامها للقيام ببعض الوظائف على متغير int (مثل تحويلها إلى سلسلة أو العكس ، ...) ، لكن تذكر أن الطرق في فئات المجمّع ثابتة حتى تتمكن من استخدامها في أي وقت دون إنشاء مثيل لفئة عدد صحيح. كملخص:

int x;
Integer y; 

x و y كلاهما متغيرين من النوع int لكن y يتم لفهما بفئة Integer ولهما العديد من الطرق التي تستخدمها ، ولكن إذا كنت بحاجة إلى استدعاء بعض وظائف فئة المجمع Integer ، فيمكنك القيام بذلك ببساطة.

Integer.toString(x);

لكن عليك أن تدرك أن كلا من x و y صحيحان ولكن إذا كنت ترغب في استخدامهما كنوع بدائي ، فاستخدم النموذج البسيط (المستخدم لتعريف x).


هناك العديد من الأسباب لاستخدام فئات المجمّع:

  1. نحصل على سلوك إضافي (على سبيل المثال يمكننا استخدام الأساليب)
  2. يمكننا تخزين القيم الخالية في حين أننا لا نستطيع ذلك
  3. مجموعات تدعم تخزين الأشياء وليس البدائية.

يستخدم int لإعلان المتغير البدائي

e.g. int i=10;

يستخدم عدد صحيح لإنشاء متغير مرجع من فئة عدد صحيح

Integer a = new Integer();

يعد int و Integer في Java و C # مصطلحين مختلفين يستخدمان لتمثيل أشياء مختلفة. إنه أحد أنواع البيانات البدائية التي يمكن تعيينها لمتغير يمكنه تخزينها بالضبط. قيمة واحدة من نوعه المعلن في كل مرة.

فمثلا:

int number = 7;

حيث int هو نوع البيانات المعين للرقم المتغير الذي يحتفظ بالقيمة سبعة. لذلك int هو مجرد بدائي وليس كائن.

في حين أن Integer هو فئة المجمع لنوع البيانات البدائية التي لديها أساليب ثابتة. يمكن استخدام ذلك كوسيطة لأسلوب يتطلب كائنًا ، حيث يمكن استخدام int كوسيطة لأسلوب يتطلب قيمة عددية يمكن استخدامها للتعبير الحسابي.

فمثلا:

Integer number = new Integer(5);

int مسبقًا في وظيفة المكتبة c # ولكن في java يمكننا إنشاء كائن Integer


01. عدد صحيح يمكن أن تكون فارغة. لكن الباحث لا يمكن أن يكون لاغيا.

Integer value1 = null; //OK

int value2 = null      //Error

02. يمكن فقط تمرير قيم أنواع التفاف الفئات إلى أي فئة تجميع.

(فئات التفاف - منطقية ، حرف ، بايت ، قصير ، عدد صحيح ، طويل ، تعويم ، مزدوج)

List<Integer> element = new ArrayList<>();
int valueInt = 10;
Integer  valueInteger = new Integer(value);
element.add(valueInteger);

ولكن عادة نضيف القيم البدائية إلى مجموعة جمع؟ هل النقطة 02 صحيحة؟

List<Integer> element = new ArrayList<>();
element.add(5);

نعم 02 هو الصحيح ، beacouse autoboxing.

Autoboxing هو التحويل التلقائي الذي يقوم به برنامج التحويل البرمجي java بين النوع البدائي وطبقة المجمع المقابلة.

ثم 5 تحويل كقيمة عدد صحيح عن طريق autoboxing.


جافا:

int ، double ، long ، byte ، float ، double ، short ، boolean ، char - primitives. يستخدم لعقد أنواع البيانات الأساسية التي تدعمها اللغة. الأنواع البدائية ليست جزءًا من التسلسل الهرمي للكائن ، ولا ترث الكائن. لا يمكن أن يمر بالرجوع إلى طريقة.

Double ، Float ، Long ، Integer ، Short ، Byte ، Character ، Boolean ، هي نوع مغلفة ، مغلفة في java.lang . تعرّف كل مغلفات النوع الرقمي المنشئات التي تسمح بإنشاء كائن من قيمة معينة أو تمثيل سلسلة لتلك القيمة. يمكن أن يؤدي استخدام الكائنات إلى إضافة حمل إلى أبسط العمليات الحسابية.

بداية من JDK 5 ، تضمنت Java ميزتين مفيدتين للغاية: autoboxing و autounboxing. تعمل ميزة Autoboxing / unboxing على تبسيط وترميز التعليمات البرمجية التي يجب أن تحول الأنواع البدائية إلى كائنات ، والعكس صحيح.

مثال على المنشئات:

Integer(int num)
Integer(String str) throws NumberFormatException
Double(double num)
Double(String str) throws NumberFormatException

مثال على الملاكمة / unboxing:

class ManualBoxing {
        public static void main(String args[]) {
        Integer objInt = new Integer(20);  // Manually box the value 20.
        int i = objInt.intValue();  // Manually unbox the value 20
        System.out.println(i + " " + iOb); // displays 20 20
    }
}

مثال على autoboxing / autounboxing:

class AutoBoxing {
    public static void main(String args[]) {
        Integer objInt = 40; // autobox an int
        int i = objInt ; // auto-unbox
        System.out.println(i + " " + iOb); // displays 40 40
    }
}

وقد اتخذ كتاب PS هربرت شيلت كمرجع.


في Java ، يكون النوع "int" بدائيًا ، بينما النوع "Integer" هو كائن.

في C # ، يكون النوع "int" هو نفسه System.Int32 وهو نوع قيمة (أي يشبه java 'int'). يمكن boxed عدد صحيح (تماما مثل أي أنواع قيمة أخرى) ("ملفوفة") في كائن.

الاختلافات بين الأشياء والأولويات تتجاوز إلى حد ما نطاق هذا السؤال ، ولكن لتلخيص:

توفر الكائنات تسهيلات لتعدد الأشكال ، ويتم تمريرها بالرجوع إليها (أو بدقة أكثر يتم تمرير المراجع حسب القيمة) ، ويتم تخصيصها من heap . على العكس من ذلك ، البدائية هي أنواع ثابتة يتم تمريرها حسب القيمة وغالبًا ما يتم تخصيصها من stack .







int