العمل مع عدد صحيح
كفئة مجمعة، توفر Integer طرقًا مختلفة للعمل مع int ، بالإضافة إلى عدد من الطرق لتحويل int إلى String و String إلى int . يحتوي الفصل على منشئين:-
عدد صحيح عام (int i) ، حيث i هي قيمة بدائية للتهيئة. يقوم هذا بإنشاء كائن عدد صحيح تتم تهيئته بقيمة int .
-
عدد صحيح عام (سلسلة) يطرح NumberFormatException . هنا s هو تمثيل سلسلة لقيمة int . يقوم هذا المُنشئ بإنشاء كائن عدد صحيح تمت تهيئته باستخدام قيمة int التي يوفرها تمثيل السلسلة .
إنشاء كائن عدد صحيح
هناك خيارات مختلفة لإنشاء كائن عدد صحيح . أحد أكثر الطرق استخدامًا هو الأسهل. هنا مثال:Integer myInteger = 5;
تشبه تهيئة المتغير الصحيح في هذه الحالة تهيئة المتغير int البدائي . بالمناسبة يمكنك تهيئة متغير Integer بقيمة int . هنا مثال:
int myInt = 5;
Integer myInteger = myInt;
System.out.println(myInteger);
الإخراج هنا هو:
Integer myInteger = new Integer(5);
يمكنك أن تفعل مع المتغير الصحيح نفس الشيء كما هو الحال مع int (إضافة، طرح، ضرب، قسمة، زيادة، إنقاص). ومع ذلك، من المهم أن تتذكر أن Integer هو نوع بيانات مرجعي، ويمكن أن يكون المتغير من هذا النوع خاليًا. وفي هذه الحالة الأفضل الامتناع عن مثل هذه العمليات.
Integer myInteger1 = null;
Integer myInteger2 = myInteger1 + 5;
هنا سنحصل على استثناء:
ثوابت فئة عدد صحيح
توفر فئة Integer ثوابت وأساليب مختلفة للتعامل مع الأعداد الصحيحة. ها هم:-
الحجم يعني عدد البتات في نظام الأرقام المكون من رقمين الذي يشغله النوع int
-
BYTES هو عدد البايتات في نظام الأرقام المكون من رقمين الذي يشغله النوع int
-
MAX_VALUE هي القيمة القصوى التي يمكن أن يحملها النوع int
-
MIN_VALUE هو الحد الأدنى للقيمة التي يمكن أن يحملها النوع int
-
تقوم TYPE بإرجاع كائن من النوع Class من النوع int
الطرق الأكثر فائدة لفئة الأعداد الصحيحة
الآن دعونا نلقي نظرة على الأساليب الأكثر استخدامًا لفئة Integer . وأفترض أن أكثرها شيوعًا هي طرق تحويل رقم من سلسلة أو العكس.-
static int parseInt(String s) تقوم هذه الطريقة بتحويل String إلى int . إذا لم يكن التحويل ممكنًا، فسيتم طرح NumberFormatException .
-
static int parseInt(String s, int radix) تقوم هذه الطريقة أيضًا بتحويل المعلمة s إلى int . تشير معلمة الجذر إلى أن نظام الأرقام قد تمت كتابته في الأصل.
-
static Integer valueOf(int i) يُرجع عددًا صحيحًا قيمته i ؛
-
تعمل قيمة عدد صحيح ثابت (String s) مثل parseInt(String s) ولكن النتيجة ستكون عدد صحيح وليس int ؛
-
تعمل قيمة عدد صحيح ثابت (String s, int radix) بنفس طريقة parseInt(String s, int radix) ، ولكن النتيجة هي عدد صحيح ، وليس int .
هل هناك أي مشكلة مع فئة عدد صحيح؟ اه نعم هناك…
لذلك هناك نوعان من الأعداد الصحيحة (التي تتناسب مع 32 بت) في Java: int و Integer . لفهم تفاصيل كل منها، نحتاج إلى معرفة ما يلي حول نموذج ذاكرة JVM: يتم تخزين كل ما تعلن عنه إما في Stack Memory (JVM Stack خاص بكل مؤشر ترابط)، أو Heap Space. يتم تخزين الأنواع البدائية ( int ، long ، float ، boolean ، double ، char ، byte ، إلخ) في ذاكرة Stack. يتم تخزين كافة الكائنات والمصفوفات في مساحة الكومة. يتم تخزين المراجع إلى هذه الكائنات والمصفوفات اللازمة للطرق في Stack. لذا. لماذا نهتم؟ حسنًا، كما ترى، Stack أصغر من Heap (خدعة)، ولكن تخصيص القيم في Stack أسرع بكثير منه في Heap (محترفة). لنبدأ بنوع بدائي int . يستغرق بالضبط 32 بت. هذا هو 32/8 = 4 بايت. لأنه نوع بدائي. الآن، دعونا نفكر في عدد صحيح . إنه كائن، مع حمل إضافي ومحاذاة. لقد استخدمت مكتبة jol لقياس حجمها:public static void main(String[] args) {
System.out.println(ClassLayout.parseInstance(Integer.valueOf(1)).toPrintable());
}
واتضح أنه يستهلك 16 بايت:
public static void main(String[] args) {
int[] array = new int[1000];
for (int i = 0; i < 1000; i++) array[i] = i; System.out.println(ClassLayout.parseInstance(array).toPrintable());
}
والنتيجة هي 4016 بايت:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) list.add(i);
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
والنتيجة هي 20040 بايت (مرة أخرى، 4 مرات أكثر!):
public static void main(String[] args) {
TIntList list = new TIntArrayList(1000);
for (int i = 0; i < 1000; i++) list.add(i);
System.out.println(GraphLayout.parseInstance(list).toFootprint());
}
والنتيجة هي 4040 بايت (تقريبًا نفس حجم int[] !):
benchmark {
configurations {
main {
warmups = 5 // number of warmup iterations
iterations = 50 // number of iterations
iterationTime = 500 // time in seconds per iteration
iterationTimeUnit = "ns" // time unit for iterationTime
المعايير:
private static final Random random = new Random();
@Benchmark
public int testPrimitiveIntegersSum() {
int a = random.nextInt();
int b = random.nextInt();
return a + b;
}
@Benchmark
public Integer testBoxedIntegersSum() {
Integer a = random.nextInt();
Integer b = random.nextInt();
return a + b;
}
النتائج:
@Benchmark
public int testPrimitiveArray() {
int[] array = new int[1000];
for (int i = 0; i < 1000; i++) array[i] = i;
int sum = 0;
for (int x : array) sum += x;
return sum;
}
11933.545 ops/s [Average]
@Benchmark
public int testBoxesArray() {
Integer[] array = new Integer[1000];
for (int i = 0; i < 1000; i++) array[i] = i;
int sum = 0;
for (int x : array) sum += x;
return sum;
}
2733.312 ops/s [Average]
@Benchmark
public int testList() {
List<Integer> list = new ArrayList<>(1000);
for (int i = 0; i < 1000; i++) list.add(i);
int sum = 0;
for (int x : list) sum += x;
return sum;
}
2086.379 ops/s [Average]
@Benchmark
public int testTroveIntList() {
TIntList list = new TIntArrayList(1000);
for (int i = 0; i < 1000; i++) list.add(i);
int sum = 0;
for (int i = 0; i < 1000; i++) sum += list.get(i);
return sum;
}
5727.979 ops/s [Average]
النتائج: مصفوفة الأوليات أسرع بأكثر من 4 مرات من مصفوفة القيم المعبأة ( Integer s)؛ أسرع بست مرات تقريبًا من ArrayList للقيم المعبأة ( Integer s)؛ وأسرع مرتين من TIntArrayList (الذي يزين في الواقع مجموعة من ints البدائية). لذلك، إذا كنت بحاجة إلى بنية بيانات لتخزين مجموعة من القيم الصحيحة، ولن يتغير حجمها، فاستخدم int [] ؛ إذا كان الحجم سيتغير — فقد ترغب في استخدام مكتبة tove4j مع TIntArrayList . وهنا تأتي نهاية مقالتي حيث أشرح سلبيات استخدام النوع الصحيح . هناك بعض الأساليب الثابتة المثيرة للاهتمام لـ Integer ، والتي يجب أن أتحدث عنها قبل أن أنتهي. عدد صحيح ثابت عام getInteger(String nm, int val) لا يفعل ما قد يظنه المرء، ولكنه يسترد قيمة عدد صحيح لخاصية النظام. Val هو الإعداد الافتراضي في حالة عدم تعيين هذه الخاصية. تقوم السلسلة الثابتة العامة toBinaryString(int i) بإرجاع سلسلة ذات تمثيل ثنائي لرقم. هناك طرق لاسترجاع التمثيلات المستندة إلى 16 ( toHexString ) و المستندة إلى 8 ( toOctalString ). هناك طريقة لتحليل سلسلة إلى int . حتى لو كانت السلسلة عبارة عن تمثيل غير قائم على الجذر 10. فيما يلي بعض الأمثلة: Integer.parseInt("-FF"، 16) يُرجع -255 Integer.parseInt("+42"، 10) يُرجع 42 Integer.parseInt("1100110"، 2) يُرجع 102
GO TO FULL VERSION