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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💎 کلیدواژه new و مراحل ایجاد یک شی
🔸 در جاوا کلیدواژه new برای ایجاد شی بکار میرود. همچنین بعد از کلیدواژه new متد سازنده (constructor) نیز فراخوانی و اجرا میشود.
=========


🟨 ایجاد هر شی سه مرحله دارد:
Object myObj = new Object();

1️⃣ Object myObj 2️⃣new 3️⃣Object();
1️⃣ بخش اعلام یا تعریف شی(Declaration). اینکار برای کمپایلر مشخص میکند که myObj برای مراجعه به یک داده از نوع Object میباشد. لزوما نباید هنگام ایجاد شی، آن را مقدار دهی کرد. میتوانید این کار را درخطوط بعدی انجام دهید. در نتیجه خط کد زیر هیچ خطایی نخواهد داشت و صرفا نوع داده مشخص شده است:
Object myObj;

2️⃣ بخش نمونه سازی که شی را بعد از تعریف، ایجاد میکند. یعنی در حافظه یک مقدار به آن اختصاص میدهد. (Instantiation) در این بخش کلیدواژه نیو اضافه میشود.

3️⃣ بخش مقدار دهی اولیه که بعد از کلیدواژه نیو، بوسیله سازنده انجام میشود (Initialization)
Object myObj = new Object();


#new #keywords #Objects #delecaration #decelare #init #initialize #instantiation
———
☕️@pieceJava
👍32
💎 لینکدلیست استفاده کنیم یا اری لیست؟ LinkedList Vs ArrayList

#یکبار_برای_همیشه

🔆 تماما بستگی به این داره که چه کاری رو بخوایم انجام بدیم و در نتیجه میبایست ساختمان داده مناسب را انتخاب کنیم.

📃 جستجو:
جستجو در اری لیست بسیار سریع تر از لینکد لیست میباشد. از اونجا که اری لیست یک ساختار داده بر پایه ایندکس یا اندیس میباشد (Index based DS) زمان کمتری برای جستجو احتیاج دارد. در صورتی که لینکدلیست اینگونه نیست و باید تمامی عناصر را تا خونه مورد نظر پیمایش کند.

📃 حذف و اضافه:
حذف و اضافه در لینکدلیست زمان خیلی کمتری نسبت به اری لیست دارد. پیچیدگی زمانی در لینکدلیست برای این عملیات O(1) و در اری لیست در بدترین حالت (حذف اولین عنصر) زمان O(n) و در بهترین حالت (حذف آخرین عنصر) O(1) است.

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

#LinkedList #ArrayList
———
☕️@pieceJava
👍7
💎 استثنای NullPointerException و چگونگی رفع خطا

#یکبار_برای_همیشه
🟨 استثنای NullPointerException یک نوع استثنای در زمان اجراست (RuntimeException). این استثنا زمانی رخ میدهد که بخواهیم از ابجکت (شی، نمونه) ای استفاده کنیم که مقداری برابر null دارد.

🔗 در مورد کلیدواژه null از اینجا بخوانید

🔅در موارد زیر استثنای NullPointerException رخ میدهد:
💬 (برای خوانایی بهتر گوشی رو در حالت افقی قرار بدین و یا از تلگرام دسکتاپ استفاده کنین)
1️⃣ فراخوانی متد از یک ابجکت نال:
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
2️⃣ دسترسی یا تغییر مقدار یک فیلد در یک ابجکت نال:
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
Test instance = null;
instance.xField = 5;
}
}
class Test{
int xField;
}
3️⃣ تلاش برای دسترسی به یک خانه نال در آرایه:
💬این مورد خیلی مهمه. فرض کنین یه ارایه با ظرفیت ذخیره 100 دانشجو داره. اونوقت اگه قسمتی از ارایه همچنان پر نشده باشه و به هر دلیلی بخواین ارایه رو پیمایش کنین، باید حواستون به خطای NullPointerException باشه :)
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
Object[] x = null;
System.out.println(x[0]);
}
}
4️⃣ بررسی طول یک آرایه در زمان اجرا درصورتی که مقدار نال داشته باشد:
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
Object[] x = null;
System.out.println(x.length);
}
}
5️⃣ زمانی که null پرتاب (thrown) شود.
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
throw null;
}
}
6️⃣ ارسال مقدار نال به یک متد:
public class ITHOOLOO {
//@pieceJava
public static void main(String[] args) {
println(null);
}
private static void println(String s){
System.out.println(s.toLowerCase());
}
}

⁉️ چطور این استثنا رو شناسایی کنیم؟
شناسایی NullPointer... بسیار ساده است. به خروجی ایجاد شده بواسطه خطا نگاه کنید و خواهید دید که خطای NullPointerException ایجاد شده دقیقا از چه کلاسی و از چه خطی رخ داده است. بعد از پیدا کردن محل خطا، بررسی کنید که کدام یک از موارد ذکر شده باعث رخ دادن این استثنا شده است.

⁉️ چطور این استثنا رو رفع کنیم؟
در هر کجا که با ابجکت ها سر و کار دارید، سعی کنید شرایط null بودن ابجکت رو هم بررسی کنید و یا در بدنه متد، ورودی ها را کنترل کنید.
🔰 برای مثال:
private static void println(String s){
if(s!=null)
System.out.println(s.toLowerCase());
}
🔰 مثال 2:
if(user!=null && user.getUserName() !=null) {
System.out.println("User Name: "+user.getUserName().toLowerCase());
}
if(user!=null && user.getUserName() !=null) {
System.out.println("User ID: "+user.getUserId().toLowerCase());
}
———
#null #nullpointerexception #exception #uncheckedexception

☕️@pieceJava
👍8
This media is not supported in your browser
VIEW IN TELEGRAM
#یکبار_برای_همیشه
#الگوها
⁉️دقیقا چطور با حلقه های تو در تو الگو هارو چاپ میکنن؟ چه منطقی پشتشه؟ :)

⭕️ قسمت اول
#star_pattern
———
☕️@pieceJava
👏31
💎 وارد کردن ایستا (import static )
🔗 پیش از همه در مورد کلیدواژه ایستا (static) از اینجا بخوانید


🔆 وارد کردن ( import) یک پکیج در جاوا به برنامه نویس اجازه استفاده از کلاس های پکیج مورد نظر را میدهد ولی اگر بخواهیم فقط از متد های استاتیک کلاس وارد شده استفاده کنیم، میتوان بجای ایمپورت کردن عادی، کلاس را بصورت ایستا ایمپورت کنیم (import static...)

ایمپورت کردن ایستا کاملا مشابه ایمپورت کردن عادی است. همانطور که در ایمپورت عادی احتیاجی به صدا زدن دوباره اسم پکیج برای استفاده از کلاس نیست، در حالت ایمپورت ایستا، لزومی به صدا زدن اسم کلاس نیست و میتوان بصورت مستقیم از اعضای ایستای کلاس مورد نظر استفاده کرد.
✏️ برای مثال:

import static java.lang.System.out;

public class Ithooloo {
//Telegram: @pieceJava
public static void main(String[] args) {
out.println("hello");
}
}
✏️ مثال 2:
import static java.lang.Math.*;
public class Ithooloo {
//Telegram: @pieceJava
public static void main(String[] args) {
double number1 = pow(2,3);
double number2 = sqrt(4);
double number3 = PI;
}
}
✏️ مثال 3:
import java.time.LocalDate;
import static java.time.LocalDate.*;
public class Ithooloo {
//Telegram: @pieceJava
public static void main(String[] args) {
LocalDate time = now();
}
}


مهم!
⭕️ چه زمانی از این حالت استفاده کنیم؟
💬 اولا بهتره خیلی کم اینکارو انجام بدین! دلیلش هم برمیگرده به خوانایی کد. مثلا اگه همزمان از خاصیت ارث بری هم دارین استفاده میکنین، بهتره به اینصورت ایمپورت نکنین. چون ممکنه در آینده هم خودتون و هم توسعه دهنده ای که با کد شما سر و کار داره، سردرگم بشه :) و نه فقط توی بحث ارث بری بلکه در کل بهتره کم از این خاصیت استفاده بشه.

#import #static
———
☕️@pieceJava
👍3
مثال های وارد کردن (ایمپورت) بصورت ایستا

☕️@pieceJava
2
💎 کلیدواژه NaN

🔆 کلید واژه نان (یا کلا هرجور که میخونیدش😁) مخفف Not a Number میباشد که نشاندهنده مقادیر تعریف نشده در عملیات های اعشاری ریاضی است.

🔰 برای مثال تمامی حالات زیر نتیجه NaN را در بردارد:
👈 تقسیم صفر بر صفر 0.0/0.0
👈 رادیکال یک عدد منفی با فرجه زوج Math.sqrt(-1)
👈 عملیات های مابین بینهایت (بینهایت - بینهایت/بینهایت * صفر)، ∞-∞ / ∞*0
👈 لگاریتم -1 و ... Math.log(-1)

⭕️ جاوا یکسری ثابت NaN برای هر دو نوع داده float و double تعریف کرده است که از طریق Float.NaN و Double.NaN قابل دستیابی هستند.

⚙️ مقایسه NaN ها:
💬 موقع نوشتن متد ها سعی کنید ورودی هارو کنترل کنید و از اونجا که NaN یک مقدار نامعتبره، بهتره چک بشه که مقدار داده ورودی NaN نباشه. ولی مورد اصلی اینجاست که NaN با هیچ مقدار دیگه ای قابل مقایسه نیست و هر مقایسه ای با NaN (حتی NaN== NaN) نتیجه فالس داره. البته بجز مقایسه != که مقدار ترو داره:
System.out.println("NaN == 1 = " + (NAN == 1));
System.out.println("NaN > 1 = " + (NAN > 1));
System.out.println("NaN < 1 = " + (NAN < 1));
System.out.println("NaN != 1 = " + (NAN != 1));
System.out.println("NaN == NaN = " + (NAN == NAN));
System.out.println("NaN > NaN = " + (NAN > NAN));
System.out.println("NaN < NaN = " + (NAN < NAN));
System.out.println("NaN != NaN = " + (NAN != NAN));
——OUTPUT:
NaN == 1 = false
NaN > 1 = false
NaN < 1 = false
NaN != 1 = true
NaN == NaN = false
NaN > NaN = false
NaN < NaN = false
NaN != NaN = true
———
💡 در نتیجه از اونجا که نمیشه هیچ مقداری رو با NaN بوسیله == یا != مقایسه کرد، بهتره NaN رو بوسیله != فقط با خودش مقایسه کنیم! شاید کمی عجیب بنظر برسه ولی جواب میده:
public class Ithooloo {
//Telegram: @pieceJava
public static void main(String[] args) {
checkNaN(Double.NaN);
checkNaN(1.1);
}

public static void checkNaN(double input){
if(input!=input)
System.out.println("Run! Its NaN");
else
System.out.println("Everything is Fine :)");
}
}
—OUTPUT—
Run! Its NaN
Everything is Fine :)

💡 در واقع x != x (با فرض اینکه x یه داده اعشاری باشه) فقط برای NaN مقدار ترو داره.

💡البته لزومی به تعریف یک تابع جداگانه برای بررسی NaN نیست. بطور مستقیم میتوان از متد های Double.isNaN() و ()Float.isNaN هم استفاده کرد:
System.out.println(Double.isNaN(0.0/0.0));
خروجی True خواهد داشت.
#NaN #keywords
———
☕️@pieceJava
👍5
مثال هایی از کلیدواژه NaN

☕️@pieceJava
👍5
#مثبت_برنامه_نویس
#خیلی_سریع_و_کوتاه

⚠️ اگه این عادت هارو داری، همین الان بذار کنار :)


🚫 دست کشیدن از یادگیری
از اونجا که تکنولوژی روز به روز در حال پیشرفته ممکنه چیزی رو که دیروز یادگرفتی، امروز منسوخ شده باشه. پس همیشه در حال یادگیری باش.

🚫 انتقاد پذیر نبودن!
متاسفانه بین خیلی از برنامه نویسا این تعصب و غرور وجود داره که بشدت به کدشون پایبند اند و هر گونه انتقاد رو رد میکنند.. ولی یادتون باشه: "برنامه نویسی که انتقاد پذیر نیست، چیزی هم یاد نمیگیره" اگر کسی در مورد کدتون انتقاد یا پیشنهادی رو مطرح کرد، با دقت گوش بدید. شاید همین شامل نکته ارزشمندیه برای شما و باعث بهبود عملکردتون میشه. پس غرور و تعصب روی کد نداشته باشین :)

🚫 سوال نپرسیدن!
سوال گرفتن نه تنها نشانه ی ضعف نیست، بلکه حرکتی کاملا هوشمندانه است. اگه در حال توسعه پروژه یا دارین تمرین میکنین، کمک گرفتن و سوال پرسیدن میتونه شمارو سریعتر به مقصد برسونه ( البته نحوه سوال پرسیدن برای رسیدن به جواب خیلی مهمه :) )

🚫 وسط کار رها کردن
این یکی از بزرگترین عادت هاییه که در بین بعضی از برنامه نویسان وجود داره! خیلی ها دقیقا زمانی دست از کار میکشن که به راه حل نزدیک شدن. پس به همین زودی دست نکش

🚫 سند نویسی نکردن
کامنت گذاری (سند نویسی) یکی از ضروریات هر پروژه هست. البته کامنت باید کوتاه و مختصر باشه. شاید اندک زمانی ازتون گرفته بشه ولی همینکار آینده از وقت گذاشتن برای رمزگشایی کردن کدتون جلوگیری میکنه!

💬 تاحالا شده بعد یه مدت برگردین رو سر پروژه بگین یا خدا اینا چی نوشتم.. 👨🏻‍🦯

@piecejava
👍51
✏️ #راه_حل
📃موضوع: مقدار رندم در یک بازه

1️⃣ Math.random()
این تابع یک مقدار رندم مابین بازه 0 تا 1 تولید میکند.
🔅در نتیجه برای تولید یک مقدار در بازه 0 تا max باید تابع را در max ضرب کرد:
Math.random() * max

🔅 برای تولید یک مقدار رندم در بازه min تا max میبایست بصورت زیر عمل کرد:
Math.random() * (max - min) + max

🔅 برای اینکه بازه شامل خود max هم باشه [min,max] باید نتیجه max-min را با 1 جمع کرد:
Math.random() * ((max - min) + 1) + max
———————
2️⃣ random.nextInt()
🔅 برای چاپ در یک بازه 0 تا max میبایست بصورت زیر عمل کرد:
Random random = new Random();
random.nextInt(max);
🔅 برای اینکه خود max هم جز این بازه باشد، باید max را با 1 جمع زد:
random.nextInt(max + 1);

🔅 برای اینکه عدد رندم در بازه min تا max باشد بصورت زیر عمل میکنیم:
random.nextInt(max - min + 1) + min;
———————
4️⃣ random.inits()

🔅 این متد از کلاس random مقداری رو در یک بازه خاص بازگشت میده:
random.inits(min,max);
اما از اونجا که داده هارو بصورت intStream بازگشت میده، برای تبدیل باید از متد findFirst استفاده کنیم و بوسیله این متد، متد getAsInt برای بازگشت بصورت مقدار داده پیشین استفاده کنیم:
random.ints(min, max).findFirst().getAsInt();
———————
💬 تابع Math.random فقط یک مقدار صحیح و یا اعشاری میتونه بعنوان عدد رندم بازگشت بده. از اونجا که خودش پیشفرض داده اعشاری تولید میکنه، برای داده صحیح باید typecasting انجام داد:
(int) (Math.random())
💬 برای کلاس Random علاوه بر nextInt برای باقی داده ها هم متد داریم.



#random #math
———
☕️@piecejava
👍51
#یکبار_برای_همیشه
#خیلی_سریع_و_کوتاه

🟡 آرگومان، متغیر یا داده ایه که به عنوان ورودی به متد داده میشه
🟡 پارامتر، متغیریه که داخل متد تعریف شده
———
☕️ @pieceJava
👍61
#چرا
💎 چرا پردازش یک آرایه مرتب بسیار سریع تر از پردازش یک آرایه نامرتب است؟

🔰 مثال بالا رو در نظر بگیرید:
یک آرایه به طول خیلی بزرگ داریم. در این آرایه داده ها بصورت رندم مقدار دهی شده اند. قرار است صد هزار بار مجموع کل داده هایی که بزرگ تر از عدد 128 هستند رو جمع بزنیم.

اجرای همین تکه کد تقریبا 15 ثانیه برای من زمان میبره. اما اگر همین آرایه رو پیش از عملیات مرتب کنیم، زمان تقریبا به نصف کاهش پیدا میکنه (البته برای هر پردازنده زمان اجرا میتونه متفاوت ظاهر بشه).
———
☕️@pieceJava
👍5