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

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

🔆 کلیدواژه throws یک مفهوم از مدیریت استثنا در جاوا میباشد. در واقع از این کلیدواژه زمانی استفاده میشود که مشخص کنیم کدام استثنا در رابطه با یک اجرا شدن یک متد ایجاد خواهد شد.

🔅 کلیدواژه throws دقیقا قبل از باز کردن بدنه متد نوشته میشود:
void func() throws Exception { }

🔰 مثال:
public void createFile(String path, String text) throws IOException {
FileWriter writer = new FileWriter(path);
writer.write(text);
writer.close();
}

برای مثال این متد استثنای IOException را پرتاب میکند. این استثنا زمانی ایجاد خواهد شد که یک شی از کلاس FileWriter ایجاد شود. البته به یاد داشته باشید که خود متد عملی در زمینه مدیریت استثنا انجام نخواهد داد و این مدیریت باید در صورت استفاده از متد انجام شود (این مدیریت یا باید بوسیله ترای کچ و یا پرتاب دوباره استثنا توسط متد صورت گیرد. هر دو مورد را میتوانید در تصویر مشاهده کنید).


💡 معمولا کلید واژه throws در رابطه با استثنا های تیک خورده (Checked Exceptions) به کار برده میشود. استثنا های تیک خورده در جاوا استثنا هایی هستند که حتما باید مدیریت شوند. در کل استفاده از throws برای استثنا های عادی بی معنی خواهد بود. نمونه ای از استثنا های تیک خورده:
1. IOException
2. ClassNotFoundException
3. InterruptedException
4. FileNotFoundEception
5. InstantiationException
6. SQLException

برای مطالعه درباره باقی کلیدواژه ها، بروی هشتگ #keywords کلیک کنید.
#throws #keywords
———
☕️@peceJava
👍10
#چرا
💎 چرا در یک فایل جاوا ( .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