تیکه پاره های جاوا
526 subscribers
93 photos
24 videos
7 files
58 links
سلام خوش اومدید. اینجا یادداشت ها و تکه های جاوا رو کنار هم قرار میدیم :) مطالب کاملا اختصاصی و دستنویس هستند. کپی فقط با ذکر منبع و آیدی کانال❤️

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💎 آرگومان های متغیر (Varargs) در جاوا

🔆 این مفهوم به متدی نسبت داده میشود که دارای تعداد آرگومان های ورودی متغیر باشد.
برای تعریف varargs بعد از مشخص کردن نوع ورودی، از 3 دات استفاده میشود:
int... numbers / String... names / double... grades

💡 در حقیقت varargs بصورت خودکار از یک آرایه یک بعدی برای ذخیره مقادیر ورودی استفاده میکند. در نتیجه تمامی اعمال روی آرایه نیز برای varargs بر قرار است.

🔰 برای مثال محاسبه مجموع ورودی های یک متد:

static int total(int... numbers){
int sum = 0;
for(int x:numbers) sum+=x;
return sum;
}

🔰 ماکزیمم مقدار بین ورودی ها:

static double max(double... numbers){
double max = numbers[0];
for(double i : numbers)
if(i>max) max = i;
return max;
}
#varargs
———
☕️@PieceJava
👍8
🔆 مثال varargs در جاوا
☕️ @pieceJava
👍11
💎 پیمایش لیست با ListIterator


🔗 در مورد ایتریتور از اینجا بخوانید
🔆 مانند ایتریتور، لیست ایتریتور نیز مانند ایتریتور برای پیمایش یک به یک ایتم های یک لیست به کار برده میشود و البته بر خلاف ایتریتور، لیست ایتریتور میتواند در هر دو جهت جابجا شود و همینطور بر خلاف ایتریتور هر چهار عملیات CRUD را پشتیبانی میکند.
🔷 ———CRUD———
🔹CREATE
: اضافه کردن یک ایتم جدید به ابجکت کالکشن
🔹READ: بازخوانی ایتم های موجود در ابجکت کالکشن
🔹UPDATE: تغییر و یا مقدار دهی دوباره یک ایتم موجود در ابجکت کالکشن
🔹DELETE: حذف یک آیتم از ابجکت کالکشن

لیست ایتریتور علاوه بر اینکه متد های واسط ایتریتور را پیاده سازی میکند، شامل متد های زیر نیز میشود:

🟡 add(E e)
اضافه کردن یک آیتم داخل لیست

🟡 hasNext()
این متد بررسی میکند در صورتی که ایتمی برای پیمایش رو به جلو وجود داشته باشد، مقدار ترو را بازگشت میدهد.

🟡 hasPrevious()
این متد در صورتی که آیتمی برای پیمایش رو به عقب وجود داشته باشد، مقدار ترو را بازگشت میدهد.

🟡 next()
ایتم بعدی موجود در لیست را بازگشت میدهد.

🟡 nextIndex()
اندیس آیتم بعد از فراخوانی next() را بازگشت میدهد.

🟡 previous()
آیتم قبلی موجود در لیست را بازگشت میدهد

🟡 previousIndex()
اندیس آیتم قبلی بعد از فراخوانی previous را بازگشت میدهد.

🟡 remove()
آخرین آیتمی که توسط متد previous یا next بازگشت داده شده است را حذف میکند.

🟡 set(E e)
آخرین آیتم بازگشت داده شده توسط next و یا previous را مقدار دهی میکند.

#ListIterator
———
☕️@piecejava
👍10
💎 حافظه استک

🔆 حافظه استک در واقع فضاییست که به اجرا شدن توابع، داده های نوع پیشین، متغیر های محلی و متغیر های مرجع موجود در توابع اختصاص داده شده است. دسترسی به حافظه استک بصورت خروج به ترتیب عکس ورود یا Last in First Out میباشد. هر متدی که اجرا میشود در حافظه استک یک بلاک حافظه به آن اختصاص داده میشود و هر داده پیشین و ارجاع به آبجکت های موجود در بدنه متد، در این بلاک حافظه ذخیره میشود. وقتی متد بصورت کامل اجرا میشود، بلاک حافظه از حافظه استک حذف و این حافظه برای استفاده مجدد در دسترس قرار میگیرد. عمر مقادیر و داده های موجود در حافظه استک وابسته به زمان اجرای متدی است که این مقادیر را در حافظه ایجاد کرده است.

طول حافظه استک ثابت میباشد و بعد از ایجاد شدن قابل تغییر نیست. خطای استک اور فلو (سر ریز پشته) نیز زمانی که استک پر شده باشد رخ میدهد. یعنی دقیقا زمانی که هیچ حافظه ای برای اجرا شدن متد بعدی وجود نداشته باشد. برای مثال وقتی که یک متد بازگشتی بی نهایت بار خودش را صدا بزند:
public static int recursiveFunc(){
return recursiveFunc();
}
#Stack #Stack_Memory #Memory
———
☕️@PieceJava
👍10
Stack Memory Example.jpg
399.5 KB
🟢 مرحله به مرحله اجرا شدن متد ها در استک
☕️@PieceJava
👍9
Stack Model.jpg
271.8 KB
⭕️ خطای استک اور فلو
☕️@PieceJava
👏10
💎 حافظه هیپ


حافظه هیپ در ذخیره آبجکت های ایجاد شده در زمان اجرای یک برنامه جاوا بسیار موثر است. البته مسیر ارجاع به آبجکت ایجاد شده همچنان در حافظه استک ذخیره میشود که به همان آبجکت ایجاد شده در حافظه هیپ اشاره میکند. حافظه هیپ در مقایسه با حافظه استک، فضای خیلی بزرگتری در اختیار دارد. در حافظه هیپ ابجکت های بلااستفاده توسط گاربیج کالکتور برای ازاد سازی حافظه حذف میشوند.

🔗 درباره گاربیج کالکشن از اینجا بخوانید

🔆 تقسیم بندی حافظه هیپ
حافظه هیپ به سه بخش تقسیم میشود: نسل جدید، نسل قدیم و نسل دائمی.

🔅نسل جدید
نسل جدید بخشی است که به آبجکت های تازه ایجاد شده اختصاص داده میشود. نسل جدید نیز به سه بخش Eden و Survivor 1 و Survivor 2 تقسیم میشود. در ابتدا تمامی آبجکت ها در داخل حافظه Eden قرار گرفته میشوند. پس از پر شدن حافظه Eden، یک گاربیج کالکشن جزئی اتفاق می افتد تا آبجکت های بلااستفاده از سطح حافظه حذف شوند. در این حالت آبجکت های باقیمانده به بخش Survivor 1 و سپس به بخش Survivor 2 انتقال میابند.

🔅نسل قدیم
در ادامه آبجکت های باقیمانده به بخش نسل قدیم انتقال می یابند. در این بخش معمولا کمی از ابجکت ها دوباره توسط گاربیج کالکشن جمع اوری میشوند تا این اطمینان حاصل شود که در این بخش فقط ابجکت های ماندگار وجود دارند.

🔅نسل دائمی
در این بخش JVM برای ذخیره متادیتا (فراداده) در مورد کلاس ها و متد ها استفاده میکند. البته یک نظر اینجا وجود دارد که بیان میکند نسل دائمی جزئی از حافظه هیپ نیست و به یک بخش دیگر اختصاص دارد.

🚫 استثنای OutOfMemoryError
اگر یک ابجکت وجود داشته باشد که فضایی بیشتر از فضای موجود در حافظه هیپ در بر داشته باشد، استثنای OutOfMemoryError رخ خواهد داد. برای مثال:
public class ITHooloo {
public static void main(String[] args) {
int[] array = new int[1000*1000*1000];
}
}
🔗درباره حافظه استک از اینجا بخوانید
#Heap_Memory #Memory #Heap
———
☕️ @PIECEJAVA
11
Heap Memory Model.jpg
77.4 KB
🔵 مثال از حافظه هیپ در جاوا
OutOfMemory.jpg
286.7 KB
⭕️ استثنای OutOfMemory
Heap Memory parts.jpg
54.5 KB
🔹بخش های حافظه هیپ

☕️@PIECEJAVA
👍12
💎 مقایسه و مرتب سازی اشیا با Comparable

(برای خوانایی بهتر تکه کد ها از تلگرام دسکتاپ استفاده کنید و یا گوشی خود را در حالت افقی نگه دارید )
🔆 اینترفیس Comparable به شی این اجازه را خواهد داد که با یک شی دیگر از جنس خودش مقایسه شود. این مقایسه بر اساس داده های موجود در کلاس انجام میشود. برای مثال مرتب سازی اشیا از کلاس Person بر اساس قد. برای استفاده از Comparable میبایست اینترفیس Comparable را پیاده سازی کرد. این مقایسه توسط متد compareTo صورت میگیرد. ورودی متد، یک ابجکت از نوع همین کلاس میباشد که مشخص میکند مرتب سازی بر اساس کدام داده از کلاس باشد.
🔅برای استفاده از Comparable باید آن را در کلاس موردنظر پیاده سازی کنیم. برای مثال:
class T implements Comparable<T> {
@Override
public int compareTo(T t) {
return 0;//by default
}
}
فرض کنید قرار است شی x را با y مقایسه کنیم. از آنجا که خروجی تابع از نوع Int میباشد ، سه حالت در رابطه با compareTo بوجود خواهد آمد:
1️⃣ اگر در این مقایسه دیتای انتخاب شده از کلاس Y با دیتای کلاس X برابر باشد، خروجی تابع 0 خواهد بود.
2️⃣ اگر در این مقایسه دیتای کلاس Y از دیتای کلاس X کوچکتر باشد، خروجی تابع یک مقدار منفی خواهد بود.
3️⃣ اگر در این مقایسه دیتای کلاس Y از دیتای کلاس X بزرگتر باشد، خروجی تابع یک مقدار مثبت خواهد بود.

🔰 برای مثال در کلاس زیر مقایسه بر اساس قد افراد صورت میگیرد:
public class Person implements Comparable<Person>{

private String name;
private int height;

public Person(String name, int height) {
this.name = name;
this.height = height;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public int compareTo(Person o) {
return o.height - this.height;
}

@Override
public String toString(){
return "Name: " + name + " | Height: "+height;
}
}
حالا از آنجا که کلاس Member اینترفیس Comparable را پیاده سازی میکند، میتوانیم برای مرتب سازی ابجکت ها از سایر متد های مرتب سازی استفاده کنیم. برای مثال:
🟢 متد Arrays.sort() برای مرتب سازی آرایه کاربرد دارد. در نتیجه برای مرتب سازی آرایه ای شامل اشیا از جنس Member داریم:
public class Main {
public static void main(String[] args) {
Person[] people = {
new Person("Ali",150),
new Person("Hossein", 190),
new Person("Mohammad",157),
new Person("Reza",177)
};
Arrays.sort(people);
for(Person p :people){
System.out.println(p);
}
}
}
==OUTPUT==
Name: Hossein | Height: 190
Name: Reza | Height: 177
Name: Mohammad | Height: 157
Name: Ali | Height: 150

🟢 در رابطه با لیست ها، از متد sort از کلاس Collections میتوان استفاده کرد:
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>(List.of(new Person("Ali",150),
new Person("Hossein", 190),
new Person("Mohammad",157),
new Person("Reza",177)));
Collections.sort(people);
for(Person p: people){
System.out.println(p);
}
}
}
==OUTPUT==
Name: Hossein | Height: 190
Name: Reza | Height: 177
Name: Mohammad | Height: 157
Name: Ali | Height: 150

#Comparable #Arrays #Collections
———
☕️ @PIECEJAVA
9👍1
#موقت
چون این پست به محتوای کانال مربوط نمیشه، پیشاپیش از تمامی دوستان عذرخواهی میکنم.
خواستم دو کلام در خصوص حق ناشر یا تولید کننده نرم افزار ها یا کانتنت های غیررایگان فارسی صحبتی با هم داشته باشیم.
به وفور عزیزانی رو می بینیم که تو گروه های تلگرامی به دنبال دریافت رایگان دوره های آکادمی x یا y هستند و رایجاً سه توجیه برای این موضوع دارند

⭕️ اول اینکه چرا ناشر میاد این دوره رو به صورت نامحدود میفروشه
⭕️ دوم اینکه دوره های فارسی بدرد نمی خوره (درواقع اگه تونستم از این دوره کسب درآمد کنم یعنی بدردم خورده و برمیگردم پولش رو هم میدم)
⭕️ و سوم اینکه این دوره خیلی گرونه!!! اینقدر نمیرزه!

به طور کلی خواستم عرض کنم هر مولف یا ناشر مختاره که برای دوره ای که منتشر می کنه شرایطی را تعیین کنه همانطور که منِ مشتری مختارم که آن شرایط را بپذیرم و دوره را خریداری کنم یا اینکه کلاً منصرف بشوم!
تصورش رو بکنید ناشری دوره اش رو به صورت محدود بفروشه! بعد از مدتی تعداد خرید به سقف میرسه و نیازه که برای اون دوره تصمیم گیری ای صورت بگیره، اگر کلاً فروشش رو متوقف کنیم که بعد از مدتی کانتنت فارسی برای موضوعی خاص رو به انقراض میره یا کیفیت دوره های جدید فوق العاده پایین میاد... یا شایدم نیاز باشه مدرس دوره رو مجدداً ضبط کنه (که اصلا عقلانی نیست) و قطعاً اگر بنده بودم با یه ترفند دوره قبلی رو مجدداً منتشر می کردم تا اینکه بیام دوباره حرفمو تو دوره ضبطی جدید تکرار کنم... اگرم دوره رو رایگان بزاریم، تکلیف کسانی که با قیمت بالا دوره رو تهیه کردند چیه؟؟؟ فرض کنید بعد یک هفته سقف تعیین شده پر شد شما هم تو همین یک هفته دوره رو خریداری کردید و بنده در هفته آینده این دوره خیلی گرون رو رایگان دانلود میکنم دیگه خود حدیث مفصل بخوان از این مجمل.

در مورد اینکه کانتنت فارسی بدرد نمیخوره که باید بگم برادر جان، پس دلیل استفادت از کانتنتی که بدرد نمی خوره چیه؟ میخوای بعد از گذروندن 100 ساعت دوره به خودت اثبات کنی که دیدی بدرد نمی خورده؟!

و در مورد فلسفه آخر عزیزانی که میگن گرونه و اینقدر نمیرزه! و حالا که نمیرزه میرم رایگان پیدا و دانلودش میکنم!!! سوالی پیش میاد، تصورش رو بکنید رفتید یه لپ تاپ بخرید فروشنده میگن 40 میلیون قیمتشه! آیا برمیگردید به خودتون بگید نه بابا این لپتاپ اینقدر نمیرزه بجاش امشب میام میدزدمش؟؟؟ (البته دور از جون همتون)

ببخشید دل پری داشتم خوشحال میشم نظر شما دوستان رو هم در این مورد بدونم
👍12👏2
💎 کلاس های رکورد در جاوا

🔆 در جاوا یک روش ذخیره داده ها، استفاده از رکورد است. رکورد یک نوع خاص کلاس در جاوا است و عموما برای ذخیره داده های ساده کاربرد دارد. برای مثال ذخیره داده های فایل CSV.

🔅رکورد بر خلاف کلاس به نوشتن ستر و گتر احتیاج ندارد و یا به عبارتی دارای کد های بلند و غیر ضروری (بویلرپلت کد) نیست. در واقع زمانی که یک رکورد ایجاد میکنید، کمپایلر بصورت خودکار متد های گتر، هش کد و equals و همینطور toString را برای آن ایجاد میکند.

✒️ قواعد (Syntax)
برای ایجاد رکورد از کلیدواژه record استفاده میکنیم و مقابل کلیدواژه رکورد، اسم رکورد (Person) قرار میگیرد. بعد از نام گذاری، باید فیلد های مورد استفاده در رکورد و همینطور نوع آنها را مشخص کنیم:

public record Person(String name,
String email,
int age) {}
به همین سادگی یک رکورد ایجاد کردیم که اطلاعات یک شخص اعم از نام، ایمیل و سن را در خود ذخیره میکند.

📝 نحوه استفاده
دقیقا مشابه کلاس ها، برای رکورد هم میتوانیم به راحتی با کلیدواژه new یک نمونه ایجاد کنیم.
Person first = new Person("Ali","[email protected]",42);

از آنجا که کمپایلر بصورت خودکار متد های گتر را برای رکورد قرار داده است، میتوانیم از این متد ها نیز به راحتی استفاده کنیم:
public class Main {
public static void main(String[] args){
Person first = new Person("Ali","[email protected]",27);
System.out.println(first.name());
System.out.println(first.email());
System.out.println(first.age());
System.out.println(first);
}
}
OUTPUT:
Ali
[email protected]
27
Person[name=Ali, [email protected], age=27]

🟡 نکاتی در رابطه با رکورد ها در جاوا
🔸 رکورد یک کلاس فاینال است. در نتیجه قابل ارث بری نیست.
🔸 داده های رکورد، ایممیوتبل (غیرقابل تغییر) اند. در نتیجه برای داده های رکورد متد های ستر نداریم.
🔸 رکورد میتواند دارای چند کنستراکتور(سازنده) باشد:
public record Person(String name, String email, int age) {
public Person(String name,int age){
this(name,null,age);
}
}
البته به این نکته توجه داشته باشید که برای کنستراکتور جدید، از دیفالت کنستراکتور استفاده کرده ایم. زیرا در غیر اینصورت خطای کمپایل در برخواهد داشت.
🔸 برای رکورد میتوان یک کنستراکتور فشرده (compact constructor) ایجاد کرد. در واقع این نوع کنستراکتور ها هیچ ورودی نمیگیرند و هنگام ایجاد شدن صدا زده خواهند شد:
public record Person(String name,String email, int age) {
public Person{
System.out.println("Compact Constructor");
}
}
———
☕️ @PIECEJAVA
👍9