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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
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
تیکه پاره های جاوا
#چرا 💎 چرا پردازش یک آرایه مرتب بسیار سریع تر از پردازش یک آرایه نامرتب است؟ 🔰 مثال بالا رو در نظر بگیرید: یک آرایه به طول خیلی بزرگ داریم. در این آرایه داده ها بصورت رندم مقدار دهی شده اند. قرار است صد هزار بار مجموع کل داده هایی که بزرگ تر از عدد 128 هستند…
⁉️ دلیلش چی میتونه باشه؟
تو بحث معماری کامپیوتر یه تکنیک وجود داره به نام Branch Prediction (به فارسی پیشبینی شاخه). زمانی که یه عملیات شرطی مثل if..else نیاز به پردازش داره، اول از همه branch predictor (پیش بینی گر شاخه) میاد با توجه به یکسری احتمالات حدس میزنه که کدوم حالت از شرط به احتمال زیاد اجرایی میشه و همون رو اجرا میکنه. در ادامه اگه اشتباه حدس زده باشه، پردازنده حالت دیگه از شرط (شاخه دیگه، برنچ دیگه) رو اجرایی میکنه که البته این برگشتن و اجرا کردن یکم زمان بره. ولی اگه درست حدس زده باشه، دیگه لزومی به برگشت نیست و همین زمان اجرا رو کاهش میده.

پیش تر گفتیم، branch predictor با توجه به احتمالات حدس میزنه. اما دفعات اولیه branch predictor اطلاعات زیادی برای حدس دقیق تر نداره و وقتی یک عملیات به دفعات تکرار بشه، این حدس میتونه هر بار دقیق تر بشه. چون الگویی برای حدس پیدا میکنه که باعث دقیق تر شدن حدس میشه.
در نتیجه اگر همه داده ها مرتب باشن، پردازنده از یک جایی لازم به عوض کردن شاخه نداره. یعنی براحتی برای branch predictor قابل حدسه که تا داده 127 داده ها انتخاب نمیشن و از داده 128 به بعد، همه داده ها انتخاب میشن (بدون اینکه شاخه ای اشتباه انتخاب بشه).
در مقابل اگر داده ها نا مرتب باشند، هر لحظه امکان داره branch predictor یک شاخه اشتباه رو حدس بزنه که در نتیجه باعث افزایش زمان اجرا میشه.
———
☕️@pieceJava
👍41
این نکته خیلی مهمه. شاید موقع شروع ازش غافل شده باشین:

اشیا تو حافظه فقط و فقط یک جا دارن. از هر جا که بخواین میتونین بهش دسترسی پیدا کنین. چه داخل یه لیست باشه چه یه جای دیگه.. هر کجا که تغییرش بدین تو کل ساختار همون یدونه تغییر میکنه :)

اگه بین کلاسا میخواین ابجکتی رو جابجا کنین فقط کافیه ادرس ابجکت رو پاس بدین به اون یکی کلاس که روش کار کنه.. تمام😁
@piecejava
5👍3
♻️ مفهوم گاربیج کالکشن (Garbage Collection) در جاوا

🟡 گاربیج کالکشن (زباله روب) یک ویژگی جاوا برای مدیریت حافظه است. گاربیج کالکشن اشیا بلا استفاده در سطح حافظه را حذف میکند.
🔰 مثال زیر رو در نظر بگیرید:
Point blank = new Point(3, 4);
blank = null;
خط اول یک شی از کلاس Point ایجاد میکند. اما خط دوم این آدرس را عوض میکند و آن را به نال (هیچ) نسبت میدهد.

🔗در مورد Null از اینجا بخوانید
🔗 در مورد خطای NullPointer از اینجا بخوانید

زمانی که هیچ ارجاعی به یک شی وجود نداشته باشد، به هیچ صورت نمیتوان از متد ها و یا صفات شی مورد نظر استفاده کرد. هرچند که شی در حافظه همچنان وجود دارد اما از دیدگاه برنامه این شی از بین رفته است (فقط هیچ آدرسی به سمت آن وجود ندارد و انگار که در سطح حافظه گم شده باشد).

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

💡 گاربیج کالکشن یک روند خودکار است.
#Garbage_collection #garbage
📙Think Java
———
☕️@pieceJava
👍42
✏️ #راه_حل
📃موضوع: تبدیل آرایه به لیست

فرض کنید آرایه ای بصورت زیر داریم:
Integer[] a = {1,2,3,4,5,6,7,8};
برای تبدیل آرایه به لیست، چند روش داریم:
———
1️⃣ استفاده از متد asList از کلاس Arrays:
List<Integer> x = Arrays.asList(a);
این متد یک لیست از نوع ArrayList از داده های آرایه رو برمیگردونه.
———
2️⃣ استفاده از متد of از کلاس List:
List<Integer> y = List.of(a);
این متد یک لیست immutable رو برمیگردونه. یعنی فقط میتونید از عناصر لیست استفاده کنید. حذف و اضافه توی این حالت خطای کمپایلر رو داره.

برای تبدیل لیست به یک لیست mutable مثلا اری لیست، بصورت زیر تبدیل رو انجام
دهید
:
List<Integer> y = new ArrayList<>(List.of(a));

3️⃣ بوسیله استریم:
Integer[] number={1,3,6};
List<Integer> list = Arrays.stream(number).collect(Collectors.toList());

🔗 در مورد مفهوم Immutable و mutable از اینجا بخوانید

#List #ArrayList #Arrays
———
☕️@piecejava
👍4
تیکه پاره های جاوا
جاوا رو تو چه سطحی هستین؟
دوستان قراره مطالب هدفمند تر داخل کانال قرار بگیره
تا اکثریت استفاده رو ببرین ^ ^

پیشنهاد یا انتقادی هم داشتین حتما زیر پست کامنت کنین🙏🏻🌹❤️
9👍1
تیکه پاره های جاوا pinned «جاوا رو تو چه سطحی هستین؟»