انٹیجر کے ساتھ کام کرنا
ریپر کلاس کے طور پر، Integer int کے ساتھ کام کرنے کے مختلف طریقے فراہم کرتا ہے ، نیز int کو String اور String کو int میں تبدیل کرنے کے کئی طریقے ۔ کلاس میں دو کنسٹرکٹرز ہیں:-
public Integer(int i) ، جہاں i شروع کرنے کے لیے ایک قدیم قدر ہے۔ یہ ایک انٹیجر آبجیکٹ بناتا ہے جو int ویلیو کے ساتھ شروع کیا جاتا ہے۔
-
عوامی عدد (اسٹرنگ s) NumberFormatException کو پھینک دیتا ہے ۔ یہاں s int ویلیو کی سٹرنگ کی نمائندگی ہے ۔ یہ کنسٹرکٹر ایک انٹیجر آبجیکٹ بناتا ہے جو سٹرنگ کی نمائندگی کے ذریعہ فراہم کردہ int ویلیو کے ساتھ شروع کیا گیا تھا۔
انٹیجر آبجیکٹ کی تخلیق
انٹیجر آبجیکٹ بنانے کے مختلف اختیارات ہیں ۔ سب سے زیادہ عام استعمال میں سے ایک سب سے آسان ہے. یہاں ایک مثال ہے:Integer myInteger = 5;
اس معاملے میں انٹیجر متغیر کی ابتداء قدیم int متغیر کی ابتداء کی طرح ہے ۔ ویسے آپ انٹیجر متغیر کو 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;
یہاں ہمیں ایک استثناء ملے گا:
انٹیجر کلاس مستقل
انٹیجر کلاس انٹیجرز کے ساتھ کام کرنے کے لیے مختلف مستقل اور طریقے فراہم کرتی ہے۔ وہ یہاں ہیں:-
SIZE کا مطلب ہے دو ہندسوں کے نمبر سسٹم میں بٹس کی تعداد جو قسم int کے زیر قبضہ ہے۔
-
BYTES دو ہندسوں کے نمبر سسٹم میں بائٹس کی وہ تعداد ہے جس پر قسم int کا قبضہ ہے۔
-
MAX_VALUE وہ زیادہ سے زیادہ قدر ہے جسے int قسم رکھ سکتی ہے۔
-
MIN_VALUE وہ کم از کم قدر ہے جسے int قسم رکھ سکتی ہے۔
-
TYPE قسم int سے قسم کی کلاس کا ایک آبجیکٹ واپس کرتا ہے۔
انٹیجر کلاس کے سب سے مفید طریقے
آئیے اب انٹیجر کلاس کے سب سے زیادہ استعمال ہونے والے طریقوں پر ایک جھلک دیکھتے ہیں۔ ان میں سب سے زیادہ مقبول، میرے خیال میں، String سے نمبر کو تبدیل کرنے کے طریقے ہیں ، یا اس کے برعکس۔-
static int parseInt(String s) یہ طریقہ String کو int میں تبدیل کرتا ہے ۔ اگر تبدیلی ممکن نہیں ہے تو، NumberFormatException پھینک دیا جائے گا۔
-
static int parseInt(String s, int radix) یہ طریقہ بھی s پیرامیٹر کو int میں تبدیل کرتا ہے ۔ ریڈکس پیرامیٹر اشارہ کرتا ہے کہ نمبر سسٹم s اصل میں لکھا گیا تھا۔
-
static Integer valueOf(int i) ایک انٹیجر لوٹاتا ہے جس کی قدر ہے i ؛
-
static Integer valueOf(String s) parseInt(String s) کی طرح کام کرتا ہے ، لیکن نتیجہ ہوگا Integer ، نہیں int ؛
-
static Integer valueOf(String s, int radix) parseInt(String s, int radix) کی طرح کام کرتا ہے ، لیکن نتیجہ ایک Integer ہے ، int نہیں ۔
کیا انٹیجر کلاس میں کوئی مسئلہ ہے؟ اوہ ہاں، وہاں ہے…
تو جاوا میں انٹیجرز (جو 32 بٹس میں فٹ ہوتے ہیں) کے لیے دو قسمیں ہیں: int اور Integer ۔ ان میں سے ہر ایک کی تفصیلات کو سمجھنے کے لیے ہمیں JVM میموری ماڈل کے بارے میں درج ذیل کو جاننے کی ضرورت ہے: آپ جو کچھ بھی اعلان کرتے ہیں وہ یا تو Stack Memory (ہر تھریڈ کے لیے مخصوص JVM Stack)، یا Heap Space میں محفوظ ہے۔ قدیم قسمیں ( int , long , float , boolean , double , char , byte , etc ) Stack میموری میں محفوظ ہیں۔ تمام آبجیکٹ اور ارے ہیپ اسپیس میں محفوظ ہیں۔ ان اشیاء کے حوالہ جات اور طریقوں کے لیے درکار صفیں Stack میں محفوظ ہیں۔ تو ہم کیوں پرواہ کرتے ہیں؟ ٹھیک ہے، آپ نے دیکھا، Stack Heap (a con) سے چھوٹا ہے، لیکن اسٹیک میں قدریں مختص کرنا ہیپ (ایک پرو) کے مقابلے میں بہت تیز ہے۔ آئیے ایک قدیم قسم کے ساتھ شروع کرتے ہیں 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]
نتائج: primitives array باکسڈ قدروں کی صف سے 4 گنا زیادہ تیز ہے ( Integer s)؛ باکسڈ اقدار کی ArrayList سے تقریباً چھ گنا تیز ( Integer s)؛ اور TIntArrayList سے دوگنا تیز (جو حقیقت میں قدیم انٹس کی ایک صف کو سجاتا ہے)۔ لہذا، اگر آپ کو عددی اقدار کے مجموعہ کو ذخیرہ کرنے کے لیے ڈیٹا سٹرکچر کی ضرورت ہے، اور اس کا سائز تبدیل نہیں ہو رہا ہے، تو int [] ; اگر سائز تبدیل ہونے جا رہا ہے تو - آپ tove4j لائبریری کو TIntArrayList کے ساتھ استعمال کرنا چاہیں گے ۔ اور یہاں میرے مضمون کا اختتام آتا ہے جہاں میں انٹیجر قسم کے استعمال کے نقصانات کی وضاحت کرتا ہوں۔ Integer کے کچھ دلچسپ جامد طریقے ہیں ، جن کے بارے میں مجھے ختم کرنے سے پہلے بات کرنی چاہیے۔ public static Integer getInteger(String nm, int val) وہ نہیں کرتا جو کوئی سوچ سکتا ہے، لیکن سسٹم پراپرٹی کی ایک عددی قدر بازیافت کرتا ہے۔ یہ پراپرٹی سیٹ نہ ہونے کی صورت میں Val ڈیفالٹ ہے۔ عوامی جامد String 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