کار با عدد صحیح
به عنوان یک کلاس wrapper، Integer متدهای مختلفی را برای کار با int و همچنین تعدادی روش برای تبدیل int به String و String به int ارائه میکند . کلاس دو سازنده دارد:-
public Integer(int i) که i یک مقدار اولیه برای مقداردهی اولیه است. این یکی یک شی عدد صحیح ایجاد می کند که با مقدار int مقداردهی اولیه می شود .
-
عمومی Integer(String s) NumberFormatException را می اندازد . در اینجا s یک نمایش رشته ای از مقدار int است . این سازنده یک شی عدد صحیح ایجاد می کند که با مقدار int ارائه شده توسط نمایش رشته مقداردهی اولیه شده است .
ایجاد شی عدد صحیح
گزینه های مختلف ایجاد شی عدد صحیح وجود دارد . یکی از پرکاربردترین آنها ساده ترین است. به عنوان مثال:Integer myInteger = 5;
مقداردهی اولیه متغیر Integer در این مورد مشابه مقداردهی اولیه متغیر int اولیه است . به هر حال شما می توانید یک متغیر Integer را با مقدار int مقداردهی اولیه کنید . به عنوان مثال:
int myInt = 5;
Integer myInteger = myInt;
System.out.println(myInteger);
خروجی در اینجا این است:
Integer myInteger = new Integer(5);
می توانید با متغیر Integer مانند int (جمع، تفریق، ضرب، تقسیم، افزایش، کاهش) را انجام دهید. با این حال، مهم است که به یاد داشته باشید که Integer یک نوع داده مرجع است و متغیری از این نوع می تواند null باشد. در این صورت بهتر است از انجام چنین عملیاتی خودداری کنید.
Integer myInteger1 = null;
Integer myInteger2 = myInteger1 + 5;
در اینجا یک استثنا خواهیم داشت:
ثابت های کلاس صحیح
کلاس Integer ثابت ها و روش های مختلفی را برای کار با اعداد صحیح ارائه می دهد. آن ها اینجا هستند:-
SIZE به معنای تعداد بیت های موجود در سیستم اعداد دو رقمی است که توسط نوع 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 تبدیل می کند . پارامتر radix نشان می دهد که سیستم اعداد s در ابتدا نوشته شده است.
-
static Integer valueOf(int i) یک عدد صحیح را برمی گرداند که مقدار آن i است .
-
static Integer valueOf(String s) مانند parseInt(String s) عمل می کند ، اما نتیجه عدد صحیح خواهد بود نه int .
-
static Integer valueOf(string s, int radix) مانند parseInt (رشته s، int radix) کار می کند ، اما نتیجه یک عدد صحیح است ، نه یک int .
آیا کلاس Integer مشکلی دارد؟ اوه بله وجود دارد…
بنابراین دو نوع برای اعداد صحیح (که در 32 بیت قرار می گیرند) در جاوا وجود دارد: int و Integer . برای درک ویژگیهای هر یک از آنها، باید موارد زیر را در مورد مدل حافظه JVM بدانیم: هر چیزی که شما اعلام میکنید یا در حافظه پشته (پشته JVM مختص هر Thread) یا Heap Space ذخیره میشود. انواع اولیه ( int ، long ، float ، boolean ، double ، char ، byte و غیره) در حافظه Stack ذخیره می شوند. همه اشیا و آرایه ها در Heap Space ذخیره می شوند. ارجاع به این اشیاء و آرایه های مورد نیاز برای متدها در Stack ذخیره می شوند. بنابراین. چرا ما اهمیت می دهیم؟ خوب، می بینید که Stack از Heap کوچکتر است (یک con)، اما تخصیص مقادیر در 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]
نتایج: آرایه primitives بیش از 4 برابر سریعتر از آرایه مقادیر جعبه شده است ( S ). تقریباً شش برابر سریعتر از ArrayList از مقادیر کادر بندی شده ( عدد صحیح ). و دو برابر سریعتر از TIntArrayList (که در واقع آرایه ای از int های اولیه را تزئین می کند). بنابراین، اگر به یک ساختار داده برای ذخیره مجموعه ای از مقادیر صحیح نیاز دارید و اندازه آن تغییر نمی کند، از یک int[] استفاده کنید . اگر اندازه قرار است تغییر کند - ممکن است بخواهید از کتابخانه tove4j با TIntArrayList استفاده کنید . و در اینجا به پایان مقاله من می رسد که در آن معایب استفاده از نوع Integer را توضیح می دهم . چند روش استاتیک جالب از Integer وجود دارد که قبل از اتمام باید در مورد آنها صحبت کنم. عمومی static Integer getInteger (string nm، int val) آن چیزی را که ممکن است فکر کنید انجام نمی دهد، اما یک مقدار Integer از ویژگی سیستم را بازیابی می کند. در صورتی که این ویژگی تنظیم نشده باشد، Val پیش فرض است. Public Static String toBinaryString(int i) یک رشته را با نمایش دودویی یک عدد برمی گرداند. روشهایی برای بازیابی نمایشهای مبتنی بر ۱۶ ( toHexString ) و مبتنی بر ۸ ( toOctalString ) وجود دارد. روشی برای تجزیه رشته به int وجود دارد . حتی اگر رشته یک نمایش مبتنی بر ریشه 10 نباشد. در اینجا چند مثال آورده شده است: Integer.parseInt("-FF", 16) -255 Integer.parseInt("+42", 10) 42 Integer.parseInt("1100110", 2) را برمی گرداند 102
GO TO FULL VERSION