سلام دوستان :)
امیدوارم حالتون خوب باشه
این کانال رو از این جهت راه اندازی کردم که نکاتی در مورد جاوا هر چند کوچک یا ساده رو اینجا قرار بدم... ناگفته نمونه که بعضی از اینها، شاید روز ها زمان برد تا بدست بیارم :)
دوست داشتین ازمون حمایت کنین :)
موفق باشین❤️
امیدوارم حالتون خوب باشه
این کانال رو از این جهت راه اندازی کردم که نکاتی در مورد جاوا هر چند کوچک یا ساده رو اینجا قرار بدم... ناگفته نمونه که بعضی از اینها، شاید روز ها زمان برد تا بدست بیارم :)
دوست داشتین ازمون حمایت کنین :)
موفق باشین❤️
👍5
✏️ #راه_حل
📃موضوع: رد کردن ورودی nextLine توسط اسکنر
اگه دقت کرده باشید گاهی اوقات اسکنر ورودی nextLine رو جا میذاره. این اتفاق معمولا زمانی رخ میده که شما بترتیب بخواین یک داده عددی و یک داده رشته ای رو از طریق ورودی بدست بیارید:
❌چرا همچین اتفاقی رخ میده؟
در واقع تنها داده ای که nextInt میتونه دریافت کنه، داده ی عددی هست. زمانی که شما اینتر میزنین، کاراکتر newline ایجاد میشه (یه کاراکتر برای رفتن به سر خط) و این کاراکتر داخل nextLine قرار میگیره. بهمین دلیل، از اونجا که nextLine هم پر میشه، برنامه خاتمه پیدا میکنه یا به هر صورتی ورودی رشته ای انجام نمیشه.
✅راه حل چیه؟
سه تا راه حل داریم :)
🔅راه حل یک:
اگر ورودیتون فقط یک کلمه هستش، بجای nextLine از next استفاده کنین در غیر اینصورت باقی راه حل هارو چک کنید.
🔅راه حل دو:
بعد از هر ورودی nextInt، یه ورودی nextLine خالی برای گرفتن کاراکتر newline قرار بدید:
ورودی عدد رو از طریق nextLine بخونید ولی در نهایت برای ذخیره داده، به عدد تبدیلش کنید:
int x = Integer.parseInt(scanner.nextLine());
تو راه حل دوم، با استفاده از (try catch) جهت کنترل ورودی :)
@pieceJava
📃موضوع: رد کردن ورودی nextLine توسط اسکنر
اگه دقت کرده باشید گاهی اوقات اسکنر ورودی nextLine رو جا میذاره. این اتفاق معمولا زمانی رخ میده که شما بترتیب بخواین یک داده عددی و یک داده رشته ای رو از طریق ورودی بدست بیارید:
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
String y = scanner.nextLine();
مثلا توی کد بالا داده عددی رو میتونید از کاربر بگیرید ولی برنامه قبل از گرفتن داده رشته ای خاتمه پیدا میکنه (امتحان کنین :) )❌چرا همچین اتفاقی رخ میده؟
در واقع تنها داده ای که nextInt میتونه دریافت کنه، داده ی عددی هست. زمانی که شما اینتر میزنین، کاراکتر newline ایجاد میشه (یه کاراکتر برای رفتن به سر خط) و این کاراکتر داخل nextLine قرار میگیره. بهمین دلیل، از اونجا که nextLine هم پر میشه، برنامه خاتمه پیدا میکنه یا به هر صورتی ورودی رشته ای انجام نمیشه.
✅راه حل چیه؟
سه تا راه حل داریم :)
🔅راه حل یک:
اگر ورودیتون فقط یک کلمه هستش، بجای nextLine از next استفاده کنین در غیر اینصورت باقی راه حل هارو چک کنید.
🔅راه حل دو:
بعد از هر ورودی nextInt، یه ورودی nextLine خالی برای گرفتن کاراکتر newline قرار بدید:
int x = scanner.nextInt();
scanner.nextLine();
String y = scanner.nextLine();
🔅راه حل سه:ورودی عدد رو از طریق nextLine بخونید ولی در نهایت برای ذخیره داده، به عدد تبدیلش کنید:
int x = Integer.parseInt(scanner.nextLine());
تو راه حل دوم، با استفاده از (try catch) جهت کنترل ورودی :)
try {
int x = Integer.parseInt(input.nextLine());
} catch (NumberFormatException e) {
e.printStackTrace();
}
#Scanner #nextInt #try_catch #NumberFormatException #nextLine@pieceJava
👍8
✏️ #راه_حل
📃موضوع: تعداد ارقام
پایه ای ترین متد برای بدست اوردن تعداد ارقام، تعداد تقسیم هاییه که عدد رو به صفر میرسونه:
⭕️ راه حل اول (ساده ترین روش):
تبدیل عدد به رشته و بدست اوردن طول رشته:
تو این روش لگاریتم عدد در مبنای ده محاسبه و رو به بالا گرد میکنیم:
📃موضوع: تعداد ارقام
پایه ای ترین متد برای بدست اوردن تعداد ارقام، تعداد تقسیم هاییه که عدد رو به صفر میرسونه:
int numberOfDigits = 0;تو این مثال متغیر numberOfDigits بعد از پایان حلقه تعداد ارقام رو برمیگردونه اما خوبه که دو راه حل سریعتر برای اینکار رو هم ببینید:
int number = 4755;
while(n!=0){
n=n/10;
numberOfDigits++;
}
⭕️ راه حل اول (ساده ترین روش):
تبدیل عدد به رشته و بدست اوردن طول رشته:
int length = String.valueOf(number).length();⭕️ راه حل دوم:
تو این روش لگاریتم عدد در مبنای ده محاسبه و رو به بالا گرد میکنیم:
int length = (int) (Math.log10(number) + 1);@pieceJava
👍5
💎 تفاوت BufferedWriter و FileWriter
⭕️ بافر چیست؟
یه حافظه موقت که اطلاعات تا زمانی که کامل نشده اونجا ذخیره میشه.
⭕️ فلاش flush چیست؟
یعنی تمیز کردن جریان (stream) و ارسال داده ها به مقصد (file)
⭕️ نوشتن یا write چیست؟
این متد برای نوشتن در فایل استفاده میشه
🔆 کلاس BufferedWriter
این کلاس حرف به حرف رو داخل بافر ذخیره میکنه و بعد از کامل شدن، یکباره به مقصد ارسال میکنه. حافظه بافر محدوده ولی به اندازه کافی برای اکثر اهداف و استفاده ها جا داره. BufferedWriter یه ذره کند عمل میکنه (چون تا پر شدن بافر صبر میکنه) ولی در کل برای نوشتن فقط یکبار flush میکنه یا بهتر بگم، یک بار system call میکنه که این میتونه در مقیاس بالاتر کارآمد باشه.
🔆 کلاس FileWriter
این کلاس نسبت به BufferedWriterسریعتره ولی از لحاظ پرفورمنس ناکارآمده! فایل رایتر با هر بار صدا زدن متد write، پشتش اطلاعات رو ارسال میکنه
مثال:
⭕️ از کدوم استفاده کنیم؟
زمانی از فایل رایتر استفاده کنید که اطلاعات کمی برای ذخیره دارید. چون همونطور که گفتم در مقیاس بالاتر، باعث کندی برنامه میشه.
زمانی از بافرد رایتر استفاده کنید که لزوم به نوشتن داخل فایل به دفعات بالا باشه.
#FileWriter #BufferedWriter #Buffer #flush #write #flush() #write() #IO #File
@pieceJava
⭕️ بافر چیست؟
یه حافظه موقت که اطلاعات تا زمانی که کامل نشده اونجا ذخیره میشه.
⭕️ فلاش flush چیست؟
یعنی تمیز کردن جریان (stream) و ارسال داده ها به مقصد (file)
⭕️ نوشتن یا write چیست؟
این متد برای نوشتن در فایل استفاده میشه
🔆 کلاس BufferedWriter
این کلاس حرف به حرف رو داخل بافر ذخیره میکنه و بعد از کامل شدن، یکباره به مقصد ارسال میکنه. حافظه بافر محدوده ولی به اندازه کافی برای اکثر اهداف و استفاده ها جا داره. BufferedWriter یه ذره کند عمل میکنه (چون تا پر شدن بافر صبر میکنه) ولی در کل برای نوشتن فقط یکبار flush میکنه یا بهتر بگم، یک بار system call میکنه که این میتونه در مقیاس بالاتر کارآمد باشه.
🔆 کلاس FileWriter
این کلاس نسبت به BufferedWriterسریعتره ولی از لحاظ پرفورمنس ناکارآمده! فایل رایتر با هر بار صدا زدن متد write، پشتش اطلاعات رو ارسال میکنه
مثال:
for(int i = 0; i < 100; i++) {
writer.write("foorbar");
writer.write(NEW_LINE);
}
writer.close();
تو این مثال اگه از فایل رایتر استفاده کرده باشید، باید 200 بار (100*2) بار سیستم کال کنید و اطلاعات رو داخل دیسک ذخیره کنید! که این خودش دلیلی بر ناکارآمدیه ولی اگه از بافرد رایتر استفاده کنید، فقط 1 بار لازم به system call هست⭕️ از کدوم استفاده کنیم؟
زمانی از فایل رایتر استفاده کنید که اطلاعات کمی برای ذخیره دارید. چون همونطور که گفتم در مقیاس بالاتر، باعث کندی برنامه میشه.
زمانی از بافرد رایتر استفاده کنید که لزوم به نوشتن داخل فایل به دفعات بالا باشه.
#FileWriter #BufferedWriter #Buffer #flush #write #flush() #write() #IO #File
@pieceJava
👍1
💎 ساختار Try With Resources
🔅 یه حالت دیگه از ترای کچ داریم به نام Try With Resources که از نسخه 7 جاوا اضافه شده.
بیشترین استفاده رو با ریسورس ها داره. ریسورس اصطلاحا به ابجکتی گفته میشه که بعد از اتمام کار لازمه که کلوز بشه. مثل فایل ها، سوکت ها و... پیش از این بستن ابجکت لازم به تعریف بخش فاینلی داشت. مثلا:
اما با Try With Resources احتیاجی به بخش فاینلی نیست و خود استیتمنت بصورت خودکار فایل رو کلوز میکنه. کلوز کردن فایل میتونه جلوی خیلی از مشکلات از جمله خراب شدن فایل و ... رو بگیره.
🔅 باز نویسی کد بالا با ساختار ترای ویز ریسورسز:
@pieceJava
🔅 یه حالت دیگه از ترای کچ داریم به نام Try With Resources که از نسخه 7 جاوا اضافه شده.
بیشترین استفاده رو با ریسورس ها داره. ریسورس اصطلاحا به ابجکتی گفته میشه که بعد از اتمام کار لازمه که کلوز بشه. مثل فایل ها، سوکت ها و... پیش از این بستن ابجکت لازم به تعریف بخش فاینلی داشت. مثلا:
FileWriter fw = null;بخش فاینلی چه درصورتی که برنامه دارای خطا یا چه بدون خطا بود در هر صورت اجرا میشه.
try{
fw = new FileWriter("....txt");
...
}catch(IOException e){
...
}finally{
fw.close();
}
اما با Try With Resources احتیاجی به بخش فاینلی نیست و خود استیتمنت بصورت خودکار فایل رو کلوز میکنه. کلوز کردن فایل میتونه جلوی خیلی از مشکلات از جمله خراب شدن فایل و ... رو بگیره.
🔅 باز نویسی کد بالا با ساختار ترای ویز ریسورسز:
try(FileWriter fw = new FileWriter("...txt")){
...
}catch(IOException e){
...
}
#Try_Catch #Try_With_resources #File #IO #FileWriter #close #Exception@pieceJava
💎 اضافه کردن به فایل بدون حذف شدن اطلاعات قبلی
یک راه برای نوشتن داخل فایل، استفاده از FileWriter هست.
👈 برای اینکه اطلاعات جدید به اطلاعات قبلی append بشه (به خطوط بعدی اضافه بشه) کنار ادرس فایل ، true رو قرار میدیم:
#IO #FileWriter
@pieceJava
یک راه برای نوشتن داخل فایل، استفاده از FileWriter هست.
FileWriter fw = new FileWriter("myText.txt");
اما با هر بار باز کردن و نوشتن داخل فایل ، اطلاعات قبلی پاک میشه و باید دوباره نوشته بشه. 👈 برای اینکه اطلاعات جدید به اطلاعات قبلی append بشه (به خطوط بعدی اضافه بشه) کنار ادرس فایل ، true رو قرار میدیم:
FileWriter fw = new FileWriter("myText.txt",true);
ترو به معنای فعال سازی قابلیت append هست.#IO #FileWriter
@pieceJava
💎 تفاوت Constructor و Static Factory Method
🔆 سازنده یا Constructor:
زمانی که یک شی (نمونه / آبجکت) از یک کلاس ایجاد میکنیم، برای مقدار دهی اولیه و استفاده از مشخصات شی، یک کنستراکتور هم ایجاد میکنیم. در این حالت میتوان یکسری مقدار دهی اولیه برای شی قرار داد:
- اسم سازنده باید هم نام با اسم کلاس باشد
- نوع بازگشتی نداشته باشد
- اگر برای کلاس سازنده ای تعریف نشده باشد، کمپایلر بصورت خودکار یک default constructor برای کلاس قرار خواهد داد.
- سازنده میتواند دارای سطوح دسترسی public, private, protected, default باشد. (اگر سازنده ای پرایوت تعریف شده باشد، خارج از خود کلاس قابل استفاده نخواهد بود.)
- سازنده میتواند بدون ورودی باشد. (default constructor)
- یک کلاس میتواند شامل چند سازنده با ورودی های مختلف باشد.
💡 در مقابل میتوانیم از Static Factory Method ها هم استفاده کنیم. اگر داخل کلاس متدی ایجاد کنیم که نوع بازگشتی یک شی از همین کلاس باشه، به این متد Static Factory Method گفته میشه.
🔆 در اینجا میتونید مزایای استفاده از Static Factory Methods رو مشاهده کنید:
✅ دارای اسم با معنی
✅ نوع بازگشتی دارند
✅ میتوان یک شی ( نمونه / ابجکت) بصورت کنترل شده از یک کلاس بوسیله این متد ها ایجاد کرد (برای مثال الگوی سینگلتون که در آینده با هم بررسی خواهیم کرد)
✅ از آنجا که Static Factory Methods دارای اسم با معنی میباشد، به خوانایی کد کمک میکند
🔰مثال:
#constructor #static #static_factory_method #static_method
@pieceJava
🔆 سازنده یا Constructor:
زمانی که یک شی (نمونه / آبجکت) از یک کلاس ایجاد میکنیم، برای مقدار دهی اولیه و استفاده از مشخصات شی، یک کنستراکتور هم ایجاد میکنیم. در این حالت میتوان یکسری مقدار دهی اولیه برای شی قرار داد:
MyClass class = new Class();🔆 مشخصات و ویژگی های سازنده:
- اسم سازنده باید هم نام با اسم کلاس باشد
- نوع بازگشتی نداشته باشد
- اگر برای کلاس سازنده ای تعریف نشده باشد، کمپایلر بصورت خودکار یک default constructor برای کلاس قرار خواهد داد.
- سازنده میتواند دارای سطوح دسترسی public, private, protected, default باشد. (اگر سازنده ای پرایوت تعریف شده باشد، خارج از خود کلاس قابل استفاده نخواهد بود.)
- سازنده میتواند بدون ورودی باشد. (default constructor)
- یک کلاس میتواند شامل چند سازنده با ورودی های مختلف باشد.
💡 در مقابل میتوانیم از Static Factory Method ها هم استفاده کنیم. اگر داخل کلاس متدی ایجاد کنیم که نوع بازگشتی یک شی از همین کلاس باشه، به این متد Static Factory Method گفته میشه.
🔆 در اینجا میتونید مزایای استفاده از Static Factory Methods رو مشاهده کنید:
✅ دارای اسم با معنی
✅ نوع بازگشتی دارند
✅ میتوان یک شی ( نمونه / ابجکت) بصورت کنترل شده از یک کلاس بوسیله این متد ها ایجاد کرد (برای مثال الگوی سینگلتون که در آینده با هم بررسی خواهیم کرد)
✅ از آنجا که Static Factory Methods دارای اسم با معنی میباشد، به خوانایی کد کمک میکند
🔰مثال:
LocalDateTime now = LocalDateTime.now();ایجاد یک نمونه از کلاس LocalDateTime بدون استفاده از کنستراکتور و بوسیله متد استاتیک now
String str = String.valueOf(4);ایجاد یک نمونه از کلاس String و استفاده از متد استاتیک valueOf برای تبدیل عدد به رشته
#constructor #static #static_factory_method #static_method
@pieceJava
👍4
💎 اورراید در جاوا (Override🌀)
🌀اورراید زمانی اتفاق می افتد که کلاس فرزند (زیر کلاس، subclass)، متدی دقیقا مشابه یکی از متد های کلاس پدر (والد / superclass / parent) داشته باشد.
🔰 مثال:
1. متد باید همنام متد کلاس والد باشد
2. پارامتر ها و نوع بازگشتی متد نیز باید مشابه متد کلاس والد باشد
3. باید رابطه ارث بری میان کلاس ها برقرار باشد
4. در صورتی که کلاس والد بصورت انتزاعی (abstract) باشد، باید تمامی متد های آن در کلاس فرزند اورراید شود.
❔ چه متد هایی قابل اورراید کردن نیست؟
❌ متد های فاینال (Final methods):
متد های فاینل قابل اورراید کردن نیستند.
❌ سازنده (Constructor methods):
از انجا که سازنده ها باید هم نام کلاس باشند، قابل اورراید کردن نیستند.
❌ متد های ایستا (Static methods):
مانند متد های فاینال، متد های ایستا قابل اورراید کردن نیستند. متد های ایستا معمولا نسبت به کلاس فرزند، مخفی میمانند.
#Override #inheritence
@pieceJava
🌀اورراید زمانی اتفاق می افتد که کلاس فرزند (زیر کلاس، subclass)، متدی دقیقا مشابه یکی از متد های کلاس پدر (والد / superclass / parent) داشته باشد.
🔰 مثال:
class Parent{
public void job()
{
System.out.println("Programmer");
}
}
class child extends Parent{
@Override
public void job()
{
System.out.println("Programmer too :)");
}
}
🔆 قوانین اورراید کردن یک متد:1. متد باید همنام متد کلاس والد باشد
2. پارامتر ها و نوع بازگشتی متد نیز باید مشابه متد کلاس والد باشد
3. باید رابطه ارث بری میان کلاس ها برقرار باشد
4. در صورتی که کلاس والد بصورت انتزاعی (abstract) باشد، باید تمامی متد های آن در کلاس فرزند اورراید شود.
❔ چه متد هایی قابل اورراید کردن نیست؟
❌ متد های فاینال (Final methods):
متد های فاینل قابل اورراید کردن نیستند.
❌ سازنده (Constructor methods):
از انجا که سازنده ها باید هم نام کلاس باشند، قابل اورراید کردن نیستند.
❌ متد های ایستا (Static methods):
مانند متد های فاینال، متد های ایستا قابل اورراید کردن نیستند. متد های ایستا معمولا نسبت به کلاس فرزند، مخفی میمانند.
#Override #inheritence
@pieceJava
👍3
💎 اورلود در جاوا (Overload🌀)
🔆 توی جاوا اگر دو یا چند متد وجود داشته باشند، بطوریکه همنام ولی دارای پارامتر های متفاوت (تفاوت در تعداد پارامتر ها، نوع پارامتر ها) باشند، به این متد ها متد های اورلود شده گفته میشود و به این ویژگی اورلودینگ گفته میشود.
🔰مثال ( 1 ):
🔰مثال ( 2 ):
با توجه به تصویر، متد اول دو پارامتر ورودی از نوع int دریافت میکند در حالی که متد دوم دو پارامتر ورودی از نوع دابل دریافت میکند.
⭕️ قوانین اورلود کردن متد:
✅ متد ها باید همنام ولی در تعداد، نوع پارامتر ها تفاوت داشته باشند.
✅ نوع بازگشتی تعیین کننده اورلودینگ نیست (void, int ,....)
@pieceJava
🔆 توی جاوا اگر دو یا چند متد وجود داشته باشند، بطوریکه همنام ولی دارای پارامتر های متفاوت (تفاوت در تعداد پارامتر ها، نوع پارامتر ها) باشند، به این متد ها متد های اورلود شده گفته میشود و به این ویژگی اورلودینگ گفته میشود.
🔰مثال ( 1 ):
void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }
برای مثال توی این مورد متد func() اورلود شده است. همانطور که پیش تر اشاره شد، این متد ها همنام ولی در تعداد و نوع پارامتر های ورودی متفاوتند.🔰مثال ( 2 ):
با توجه به تصویر، متد اول دو پارامتر ورودی از نوع int دریافت میکند در حالی که متد دوم دو پارامتر ورودی از نوع دابل دریافت میکند.
⭕️ قوانین اورلود کردن متد:
✅ متد ها باید همنام ولی در تعداد، نوع پارامتر ها تفاوت داشته باشند.
✅ نوع بازگشتی تعیین کننده اورلودینگ نیست (void, int ,....)
@pieceJava
👍3
💎 مقایسه اشیا (ابجکت ها) در جاوا
🔆 توی جاوا هر کلاس بصورت پیشفرض از کلاس Object ارث بری میکند. کلاس Object شامل متد هایی مثل hashCode, equals, toString و... میشود که کاربرد گسترده ای در رابطه با کار با ابجکت ها دارند. به همین منظور برای مقایسه ابجکت ها از متد equals و hashCode از کلاس Object استفاده میشود.
🔗در مورد کلاس آبجکت از اینجا بخوانید
🔅هش کد در جاوا یک عدد صحیح 32 بیتی میباشد. هش کد یک مقدار منحصر بفرده که بصورت پیشفرض توسط JVM برای هر نمونه (شی / ابجکت) تعریف میشود.
👈 طبق این تعریف اگر دو ابجکت دارای هش کد برابر باشند، یعنی با هم برابرند با توجه به متد equals ولی لزوما دو ابجکت با هش کد برابر، با هم برابر نیستند. یعنی این شرط لازم و کافی نیست.
برای بررسی برابر بودن ابجکت ها، لازم است متد equals پیاده سازی شود.
🔰 مثال:
💠 کلاس Employee
داخل کلاس متد equals را اورراید میکنیم و فیلد هارا با هم مقایسه میکنیم (البته بستگی به این داره که برابری از نظر شما چه شرایطی داشته باشد. توی این مثال من شرط برابری را برابر بودن فیلد ها قرار دادم).
(برای بهتر دیده شدن کد ها، گوشی را در حالت افقی نگه دارید)
(❔) شرط اول: this == o به این معناست که اگر هر دو ابجکت به یک ادرس از حافظه اشاره کنند، یعنی با هم برابرند و مقدار ترو را برگرداند.
(❔) شرط دوم: اگر ابجکت o از یک کلاس نباشد و یا مقدار null را داشته باشد، یعنی با هم برابر نیستند و مقدار فالس را برگرداند.
✅ اگر شرط یک و دو با موفقیت پشت سر گذاشته شود، نوع o را که از نوع Object میباشد، به نوع Employee تغییر میدهیم (type casting) و سپس سراغ شرط آخر میرویم.
(❔) شرط آخر: با توجه به برابر بودن یا نبودن فیلد های کلاس، مقدار ترو یا فالس را برمیگرداند.
🔰 بعنوان مثال با توجه به متد equals باید این دو ابجکت شرط برابری را داشته باشند:
@pieceJava
🔆 توی جاوا هر کلاس بصورت پیشفرض از کلاس Object ارث بری میکند. کلاس Object شامل متد هایی مثل hashCode, equals, toString و... میشود که کاربرد گسترده ای در رابطه با کار با ابجکت ها دارند. به همین منظور برای مقایسه ابجکت ها از متد equals و hashCode از کلاس Object استفاده میشود.
🔗در مورد کلاس آبجکت از اینجا بخوانید
🔅هش کد در جاوا یک عدد صحیح 32 بیتی میباشد. هش کد یک مقدار منحصر بفرده که بصورت پیشفرض توسط JVM برای هر نمونه (شی / ابجکت) تعریف میشود.
👈 طبق این تعریف اگر دو ابجکت دارای هش کد برابر باشند، یعنی با هم برابرند با توجه به متد equals ولی لزوما دو ابجکت با هش کد برابر، با هم برابر نیستند. یعنی این شرط لازم و کافی نیست.
برای بررسی برابر بودن ابجکت ها، لازم است متد equals پیاده سازی شود.
🔰 مثال:
💠 کلاس Employee
داخل کلاس متد equals را اورراید میکنیم و فیلد هارا با هم مقایسه میکنیم (البته بستگی به این داره که برابری از نظر شما چه شرایطی داشته باشد. توی این مثال من شرط برابری را برابر بودن فیلد ها قرار دادم).
(برای بهتر دیده شدن کد ها، گوشی را در حالت افقی نگه دارید)
public class Employee {
private String firstName;
private String lastName;
public Employee(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee a = (Employee) o;
return firstName.equals(a.firstName) && lastName.equals(a.lastName);
}
}
بعد از اورراید کردن متد، شرایط زیر را بررسی میکنیم:(❔) شرط اول: this == o به این معناست که اگر هر دو ابجکت به یک ادرس از حافظه اشاره کنند، یعنی با هم برابرند و مقدار ترو را برگرداند.
(❔) شرط دوم: اگر ابجکت o از یک کلاس نباشد و یا مقدار null را داشته باشد، یعنی با هم برابر نیستند و مقدار فالس را برگرداند.
✅ اگر شرط یک و دو با موفقیت پشت سر گذاشته شود، نوع o را که از نوع Object میباشد، به نوع Employee تغییر میدهیم (type casting) و سپس سراغ شرط آخر میرویم.
(❔) شرط آخر: با توجه به برابر بودن یا نبودن فیلد های کلاس، مقدار ترو یا فالس را برمیگرداند.
🔰 بعنوان مثال با توجه به متد equals باید این دو ابجکت شرط برابری را داشته باشند:
Employee e1 = new Employee("A","B");
Employee e2 = new Employee("A","B");
System.out.println(e1.equals(e2));//returns true
#equals #object #hashCode #hash #inheritence@pieceJava
Telegram
تیکه پاره های جاوا
💎 کلاس Object در جاوا
هر کلاس جاوا بصورت مستقیم یا غیر مستقیم از کلاس Object ارث بری میکند. این به این معناست که هر کلاسی میتواند متد های کلاس Object را که به نحوی private یا final نیستند، اورراید کند.
⭕️متد HashCode مقدار هش کد را برای شی بازگشت میدهد.…
هر کلاس جاوا بصورت مستقیم یا غیر مستقیم از کلاس Object ارث بری میکند. این به این معناست که هر کلاسی میتواند متد های کلاس Object را که به نحوی private یا final نیستند، اورراید کند.
⭕️متد HashCode مقدار هش کد را برای شی بازگشت میدهد.…
👍5
تیکه پاره های جاوا pinned «💎 تفاوت Constructor و Static Factory Method 🔆 سازنده یا Constructor: زمانی که یک شی (نمونه / آبجکت) از یک کلاس ایجاد میکنیم، برای مقدار دهی اولیه و استفاده از مشخصات شی، یک کنستراکتور هم ایجاد میکنیم. در این حالت میتوان یکسری مقدار دهی اولیه برای شی قرار…»
💎 تفاوت equals و compareTo برای مقایسه رشته ها
🔆 هر دو متد برای مقایسه رشته کاربرد دارند ولی این بین تفاوت هایی وجود دارد. شاید بزرگترین تفاوت این باشد که equals ابجکت ها و comareTo حروف را با هم مقایسه میکند. طبق این قضیه میتوان نتیجه گرفت که در مقایسه ی null :
🔆 متد equals فقط دو مقدار false و true را بازگشت میدهد و آنهم زمانیست که مقدار دو رشته برابر یا نابرابر باشد. ضمنا همانطور که اشاره کردیم متد equals در هنگام مقایسه، از رخ دادن خطای NullPointerException جلو گیری میکند.
🔆 متد compareTo با توجه به اسناد جاوا، رشته ها را بصورت حرف به حرف (لغوی / lexographically) و همینطور از نظر طول رشته مقایسه میکند. طبق این مقایسه، این متد سه مقدار صفر، مثبت و منفی را بازگشت میدهد.
🔅مقدار صفر مختص زمانیست که رشته ها هم از لحاظ لغت و هم طول مقدار برابر داشته باشند.
🔅 مقدار منفی مختص زمانیست که رشته اول نسبت به رشته دوم طول کمتری داشته باشد.
🔅مقدار مثبت نیز مختص زمانیست که رشته اول نسبت به رشته دوم طول بیشتری داشته باشد
🔰 مثال:
#equals #string #compareto #lexographically
@pieceJava
🔆 هر دو متد برای مقایسه رشته کاربرد دارند ولی این بین تفاوت هایی وجود دارد. شاید بزرگترین تفاوت این باشد که equals ابجکت ها و comareTo حروف را با هم مقایسه میکند. طبق این قضیه میتوان نتیجه گرفت که در مقایسه ی null :
"foo".equals((String) null)
مقدار فالس را بازگشت میدهد. این در صورتی است که"foo".compareTo( (String) null)
استثنای NullPointerException را به همراه خواهد داشت.🔆 متد equals فقط دو مقدار false و true را بازگشت میدهد و آنهم زمانیست که مقدار دو رشته برابر یا نابرابر باشد. ضمنا همانطور که اشاره کردیم متد equals در هنگام مقایسه، از رخ دادن خطای NullPointerException جلو گیری میکند.
🔆 متد compareTo با توجه به اسناد جاوا، رشته ها را بصورت حرف به حرف (لغوی / lexographically) و همینطور از نظر طول رشته مقایسه میکند. طبق این مقایسه، این متد سه مقدار صفر، مثبت و منفی را بازگشت میدهد.
🔅مقدار صفر مختص زمانیست که رشته ها هم از لحاظ لغت و هم طول مقدار برابر داشته باشند.
🔅 مقدار منفی مختص زمانیست که رشته اول نسبت به رشته دوم طول کمتری داشته باشد.
🔅مقدار مثبت نیز مختص زمانیست که رشته اول نسبت به رشته دوم طول بیشتری داشته باشد
🔰 مثال:
⭕️ System.out.println("Aaaa".compareTo("Aa"));
یک مقدار مثبت را بازگشت میدهد. زیرا رشته اول نسبت به رشته دوم طول بیشتری دارد.⭕️ System.out.println("Aa".compareTo("Aaaaa"));
یک مقدار منفی را برمیگرداند. زیرا رشته دوم نسبت به رشته اول طول بیشتری دارد.⭕️ System.out.println("Aa".compareTo("Aa"));
مقدار صفر را دارد زیرا در این مقایسه رشته ها مقدار برابر را دارند.⭕️ System.out.println("A".compareTo("B"));
در این مثال از آنجا که از نظر لغوی (lexographically) حرف "B" نسبت به حرف "A" در ترتیب الفبا جلوتر قرار گرفته است، خروجی مقدار منفی خواهد بود.#equals #string #compareto #lexographically
@pieceJava
👍4
💎معنی Mutable و Immutable بودن کلاس ها (قابل تغییر و غیر قابل تغییر بودن)
🔅به آبجکت هایی که بعد از ایجاد شدن قابل تغییر هستند، Mutable گفته میشود. برای مثال کلاس Date یا StringBuilder
🔅در مقابل به ابجکت هایی که پس از ایجاد شدن قابل تغییر نیستند، Immutable گفته میشود. برای مثال کلاس String, Integer, Long,...
🔰 نمونه کلاس String:
(در اینباره بیشتر بخوانید)
🔆تفاوت های کلاس های Mutable و Immutable
⭕️در کلاس های Mutable فیلد ها بعد از ایجاد ابجکت قابل تغییر هستند در صورتی که در کلاس های Immutable چنین چیزی ممکن نیست.
⭕️کلاس های Mutable دارای متد هایی برای تغییر مقادیر فیلد ها مانند setter & getter هستند. در صورتی که کلاس های Immutable فقط دارای متد های getter میباشند.
⁉️چرا بعضی از کلاس ها Immutable هستند و یا چرا باید باشند؟
- همانطور که گفتیم مقادیر این کلاس ها غیر قابل تغییر است و از لحاظ مدیریت حافظه بصرفه است.
- کلاس های Immutable اصطلاحا Thread Safe هستند (در محیط های چند نخی (multithreading)) در واقع Thread safety به فرایند امن سازی برنامه در محیط های چند نخی گفته میشود.
🔗 نحوه ایجاد کلاس Immutable
#immutable #mutable #threadsafe #thread_safe #StringBuilder #Date #String
@pieceJava
🔅به آبجکت هایی که بعد از ایجاد شدن قابل تغییر هستند، Mutable گفته میشود. برای مثال کلاس Date یا StringBuilder
🔅در مقابل به ابجکت هایی که پس از ایجاد شدن قابل تغییر نیستند، Immutable گفته میشود. برای مثال کلاس String, Integer, Long,...
🔰 نمونه کلاس String:
String str = "Test";
str.replaceAll("T","s);
System.out.println(str)
;//prints Test
در قطعه کد بالا پس از خروجی گرفتن رشته str خواهید دید که رشته بدون هیچ تغییر خاصی نمایش داده خواهد شد.(در اینباره بیشتر بخوانید)
🔆تفاوت های کلاس های Mutable و Immutable
⭕️در کلاس های Mutable فیلد ها بعد از ایجاد ابجکت قابل تغییر هستند در صورتی که در کلاس های Immutable چنین چیزی ممکن نیست.
⭕️کلاس های Mutable دارای متد هایی برای تغییر مقادیر فیلد ها مانند setter & getter هستند. در صورتی که کلاس های Immutable فقط دارای متد های getter میباشند.
⁉️چرا بعضی از کلاس ها Immutable هستند و یا چرا باید باشند؟
- همانطور که گفتیم مقادیر این کلاس ها غیر قابل تغییر است و از لحاظ مدیریت حافظه بصرفه است.
- کلاس های Immutable اصطلاحا Thread Safe هستند (در محیط های چند نخی (multithreading)) در واقع Thread safety به فرایند امن سازی برنامه در محیط های چند نخی گفته میشود.
🔗 نحوه ایجاد کلاس Immutable
#immutable #mutable #threadsafe #thread_safe #StringBuilder #Date #String
@pieceJava
Telegram
تیکه پاره های جاوا
#چرا
💎چرا رشته ها غیر قابل تغییر یا Immutable هستند؟
در مورد Immutable و Mutable بودن کلاس ها از اینجا بخوانید.
فرض کنید رشته ای بصورت زیر داریم:
String str = "Hello";
حال بوسیله متد concat یک رشته را به رشته فعلی اضافه میکنیم:
str.concat(" World");
و در…
💎چرا رشته ها غیر قابل تغییر یا Immutable هستند؟
در مورد Immutable و Mutable بودن کلاس ها از اینجا بخوانید.
فرض کنید رشته ای بصورت زیر داریم:
String str = "Hello";
حال بوسیله متد concat یک رشته را به رشته فعلی اضافه میکنیم:
str.concat(" World");
و در…
👍3
