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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
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
💎 اینترفیس یا واسط چیست و چرا استفاده میکنیم؟

🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند.

☕️ @PIECEJAVA
👍7
تیکه پاره های جاوا
💎 اینترفیس یا واسط چیست و چرا استفاده میکنیم؟ 🔆 اینترفیس یا واسط در واقع یک نوع قرار داد میان کلاس ها خواهد بود. به این صورت که هر کلاسی که اینترفیس موردنظر را پیاده سازی کند، موظف است تمامی متد های آن را هم پیاده سازی کند. ☕️ @PIECEJAVA
🔰 برای مثال فرض کنید قرار است انواع گوشی های هوشمند از کلاس موبایل ارث بری کنند که ویژگی های اولیه یک گوشی را پیاده سازی میکنند. مثلا لازم است که تمامی گوشی ها بخش گالری، دوربین و مرورگر و... داشته باشند. حالا هر کلاسی از مجموعه گوشی های هوشمند که واسط موبایل را پیاده سازی کند، موظف است متد های مربوط به موبایل را هم پیدا سازی کند. در نتیجه به کمک اینترفیس میتوان این اطمینان را حاصل کرد که تمامی کلاس های گوشی این ویژگی ها را پیاده سازی میکنند:
public interface Mobile {
void browser();
void camera();
void gallery();
}
💡 به متد هایی که فقط تعریف شوند و بدنه ای نداشته باشند (پیاده سازی نشده باشند) آبسترکت گفته میشود. یعنی فقط امضای متد method signature نوشته میشود. منظور از امضای متد، ساختار اولیه متد میباشد که نشان دهنده سطح دسترسی، نوع خروجی، اسم متد و ورودی های متد است. برای مثال:
void browser();
💡 اینترفیس حاوی متد های ابسترکت میباشد.
💡 از آنجا که متد های ابسترکت باید پیاده سازی شوند، در نتیجه لزومی به نوشتن سطح دسترسی متد ابسترکت نیست.

برای پیاده سازی اینترفیس بعد از اسم کلاس از کلیدواژه implements و سپس اسم اینترفیس مورد نظر استفاده میشود. برای مثال:
public class Note8Pro implements Mobile{
@Override
public void browser() { }

@Override
public void camera() { }

@Override
public void gallery() { }
}

حالا برای هر کلاس متد های browser , camera و gallery را پیاده سازی میکنیم. دقت داشته باشید که حذف هر کدام از متد های بالا، خطای کمپایلر را خواهد داشت. زیرا همانطور که گفتیم، کلاس ها موظفند این متد ها را پیاده سازی کنند.

💬البته از بعد جاوای 8 متد های دیفالت و استاتیک هم به اینترفیس ها اضافه شده که انشالله در فرصتی دیگر حتما بررسی میشه :)
#interface
———
☕️ @PIECEJAVA
👍11
#مثبت_برنامه_نویس
#پیشنهاد
🟨 داکیومنت های آفلاین با نرم افزار Zeal


- از طریق 🔗 لینک وارد سایت Zeal بشید و برنامه Zeal رو دانلود کنید.
- بعد از دانلود و نصب، از طریق منوی
Tools > Docsets > Available
میتونید داکیومنت مربوط به زبان دلخواهتون رو یکبار برای همیشه دانلود و بصورت آفلاین استفاده کنید.

💬 البته نه فقط جاوا، بلکه داکیومنت هر زبونی که بخواید رو داره و میتونید برای همیشه بصورت آفلاین داشته باشید. (لیست داکیومنت زبان ها از طریق خود سایت قابل دسترسیه) :)


⭕️ اگه احیانا داکیومنت مدنظرتون داخل Docset وجود نداشت (مثلا کاتلین، three.js یا... )، از طریق 🔗آدرس لینک یکی از پکیج های XML یا JSON مربوط به زبان رو کپی کنید و از بخش Docset از طریق گزینه Add Feed آدرس پکیج رو به برنامه بدید تا دانلود رو شروع کنه.

~موفق باشید❤️

☕️@PIECEJAVA
👍9
🧊 انواع بلاک ها در جاوا (قسمت اول)

🔆 در جاوا به مجموعه ی خطوط کد که در یک بدنه { } قرار گرفته اند ، بلاک گفته میشود. از بلاک عموما برای دسته بندی خطوط کد (statement) استفاده میشود. برای مثال چهار خط زیر نشان دهنده یک بلاک میباشد. :
{
int x = 0;
x++
}
در حالت کلی سه نوع بلاک در جاوا داریم که در این قسمت بلاک محلی را بررسی خواهیم کرد.
👍9