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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
#چرا
💎 چرا در یک فایل جاوا ( .java ) فقط یک کلاس public میتونیم داشته باشیم؟


🔗 در مورد سطوح دسترسی از اینجا بخوانید

🟡 همونطور که میدونید داخل فایل جاوا میشه همزمان چند کلاس داشت ولی فقط یک کلاس سطح دسترسی پابلیک داره. برای مثال فایل X.java زیر را در نظر بگیرید:
——X.java——
public class X{ .... }
class Y { .... }
class Z { .... }
——————--
اما چرا باقی کلاس ها نباید دارای سطح دسترسی پابلیک باشند؟
🟢 Short Answer: Because It's the law! 😁
———
🟢 Long Answer:

اول از همه به اینصورت تعریف کردن کلاس ها باعث میشه سطح دسترسی کلاس ها فقط محدود به پکیجی بشه که داخلش قرار دارن (توی این مورد کلاس Y و Z) و اصطلاحا به این حالت package private گفته میشه.

⁉️ اما چرا همزمان دو کلاس پابلیک نمیتونه داخل یک کلاس باشه؟
فایل جاوا معمولا فایل همنام با کلاس پابلیک هستش و برای همین نمیشه یک فایل جاوا با دو اسم متفاوت رو داشت. در اصل زبان جاوا طوری طراحی شده که فقط یک کلاس پابلیک میتونه در هر فایل جاوا وجود داشته باشه. غیر از این باشه کمپایلر نمیتونه کلاس همنام رو تشخیص بده و به مشکل میخوره و برای همینه که بهتون خطا میده و میگه کلاس دوم حتما باید داخل فایل جداگانه تعریف بشه.


💬 پیشنهاد میشه کلاس هارو در فایل های جداگونه تعریف کنید مگر در موارد خاص. بخصوص در رابطه با اینکه کدتون خوانا تره.

#class #access_modifiers #public
———
☕️ @pieceJava
👍7
💎 پیمایش کالکشن ها با Iterator

🔆 ایتریتور یک واسط است که برای پیمایش ترتیبی یک کالکشن (مانند ست، اری لیست، لینکدلیست و...) به کار برده میشود.

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


🔅 متد های واسط Iterator:
🟡 hasNext()
این متد بررسی میکند که آیا همچنان آیتمی داخل کالکشن وجود دارد یا نه. از این متد برای پیمایش کالکشن استفاده میشود:
List<Integer> myList = new ArrayList<>();
Iterator it = myList.iterator();
while(it.hasNext()){ ....}

🟡 next()
این متد آیتم بعدی کالکشن را بازگشت میدهد. در صورتی که ایتم بعدی وجود نداشته باشد، استثنای NoSuchElementException ایجاد خواهد کرد.

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

🔍 درک مفهومی
ایتریتور دارای یک مکان نما (cursor) میباشد. بصورت پیش فرض مکان نما قبل از اولین آیتم لیست قرار گرفته است. زمانی که متد next رو صدا میزنیم، مکان نما بر روی ایتم اول قرار میگیره و بهمین ترتیب با هربار صدا زدن متد next میتوان آیتم های لیست موردنظر را پیمایش کرد.
ضمنا به یاد داشته باشید که مکان نمای ایتریتور فقط رو به جلو حرکت میکند.

#Iterator
———
☕️ @pieceJava
👍9
✏️ #راه_حل
📃موضوع: معکوس کردن رشته

1️⃣ روش اول:
public static String reverse(String input){
String reversed = "";
for(int i = input.length()-1;i>=0;i--){
reversed+=g.charAt(i);
}
return reversed;
}

2️⃣روش دوم (بوسیله StringBuilder):

public static String reverse1(String input){
StringBuilder sb = new StringBuilder(input);
return sb.reverse().toString();
}
🔗 در مورد String Builder از اینجا بخوانید
———
☕️@PieceJava
8👍3
💎 آرگومان های متغیر (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