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

📝برای تدریس پیام دهید
محمدرضا عظیمی‌فرد
🆔 @mrvj475
Download Telegram
💎بررسی مقدار و کلیدواژه null در جاوا


🔆 یکی از کلمات رزرو شده در جاوا کلمه null میباشد. مقدار null فقط مختص داده های مرجع میباشد. زمانی که یک شی از یک داده مرجع (Reference type) مقدار دهی نشده باشد (به هیچ خانه ای از حافظه اشاره نکند) بصورت پیشفرض مقدار اولیه آن برابر null خواهد بود.
🔰برای مثال:
public class ITHOOLOO {
private static Object object;
public static void main(String[] args) {
System.out.println(object);
}
}
خروجی نال را خواهد داشت. زیرا شی مقدار دهی نشده است.

🔅ویژگی های نال:
⭕️ کلیدواژه null حتما باید با حروف کوچک نوشته شود زیرا در غیر این صورت کمپایلر در شناسایی آن به مشکل خواهد خورد.

⭕️ همانطور که پیش تر نیز اشاره کردیم، مقدار null مختص داده های مرجع میباشد و در صورت اختصاص به داده های نوع پیشین (primitive data types) خطای کمپایلر را به همراه خواهد داشت:
int a = null; //error

⭕️مقدار پیشفرض هر داده مرجع (رفرنس، reference) پیش از مقدار دهی نال میباشد.

⭕️ از آنجا که نال یک مقدار خاص میباشد، میتواند به انواع داده های مرجع نیز تبدیل شود:
// Typecasting null to String type
String myStr = (String) null;
// Typecasting to an Integer class
Integer myItr = (Integer) null;
// Typecasting to a Double class
Double myDbl = (Double) null;
⭕️تلاش برای دسترسی به یک آبجکت نال استثنای NullPointerException را به همراه خواهد داشت. برای مثال پیمایش آرایه ای از ابجکت ها (اشیا) که شامل یک یا چند ابجکت نال باشد. در حین پیمایش، زمانی که حلقه به آبجکت نال برخورد کرد، اسثتنای NullPointerException رخ میدهد

⭕️ یکی از اپراتور های جاوا instanceof میباشد که بررسی میکند آیا یک ابجکت نمونه ای از یک کلاس هست یا خیر. برای مثال:
public class ITHOOLOO {
public static void main(String[] args) {
Object a = new Object();
System.out.println(a instanceof Object);
}
}
مقدار ترو را برمیگرداند زیرا a یک شی (ابجکت) از کلاس Object میباشد. حال اگر مقدار یک ابجکت null باشد، در بررسی با اپراتور instanceof مقدار فالس بازگشت میدهد. این نشان میدهد که null به معنای هیچ است. یعنی هیچ خانه ای در حافظه به ابجکت ساخته شده اختصاص داده نشده است:
public class ITHOOLOO {
public static void main(String[] args) {
Integer b = null;
System.out.println(b instanceof Integer);//return false
}
}

#null #nullpointerException #instanceof

@pieceJava
👍4
💎 کلاس Scanner و متد هایuserDelimeter و delimeter

🔆 همانطور که میدانید، کلاس اسکنر برای خواندن داده های ورودی کاربرد دارد. برای مثال برای هر کدام از ورودی های از نوع اینتجر، دابل، استرینگ و... کلاس اسکنر متد هایی را فراهم کرده است.

🔅یکی از متد های پر کاربرد کلاس Scanner، متد useDelimeter میباشد. بوسیله ی این متد میتوان یک جداکننده برای داده ورودی در نظر گرفت. برای مثال "," را جدا کننده رشته "Hello,From,ITHOOLOO" قرار میدیم و ورودی هارو چاپ میکنیم:
import java.util.Scanner;

public class ITHOOLOO {
public static void main(String[] args) {
String text = "HELLO,FROM,ITHOOLOO";
Scanner input = new Scanner(text);
input.useDelimiter(",");
while(input.hasNext())
{
System.out.println(input.next());
}
}
}
در این صورت خروجی به صورت زیر خواهد بود:
HELLO
FROM
ITHOOLOO
💡متد delimeter جدا کننده را برگشت میدهد:
input.delimiter(); // return ,

⭕️ یکی از کاربرد های useDelimeter در هنگام خواندن فایل و جدا کردن داده ها میباشد.
🔰برای مثال:
فرض کنید یک فایل در زیرشاخه src به نام test.txt داریم که شامل رشته زیر میباشد:
Mohammad,23,Iran

حال برای خواندن و ذخیره اطلاعات داریم:
public class ITHOOLOO {
public static void main(String[] args) {
File file = new File("src\\Test.txt");
String name = "";
int age = 0;
String country = "";
Scanner input = null;
try {
input = new Scanner(file);
input.useDelimiter(",");
while(input.hasNext())
{
name = input.next();
age = Integer.parseInt(input.next());
country = input.next();
}

} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(input!=null)
input.close();
}
System.out.println(name);
System.out.println(age);
System.out.println(country);
}
}
در این مثال خروجی بصورت زیر خواهد بود:
Mohammad
23
Iran
#scanner #delimeter #useDelimeter

@pieceJava
👍3
💎 داده های نوع پیشین و داده های مرجع
📝 #سوالات_مصاحبه

🔆داده های نوع پیشین (Primitive data types)
⭕️داده های نوع پیشین عبارتند از :
byte, boolean, char, short, int ,float, long , double

⭕️داده های نوع پیشین همیشه یک مقدار ذخیره دارند. اگر مقدار دهی نشده باشند، یک مقدار پیشفرض خواهند داشت. البته این مقدار پیش فرض مختص متغیر های نمونه ای هست که در سطح کلاس تعریف میشوند و متغیر های محلی که در یک بلاک کد تعریف میشوند، بطور خودکار هیچ مقدار پیشفرضی ندارند و شما پیش از استفاده باید آن را مقدار دهی کنید.
⭕️وجه تمایز بین داده long و int ، حرف L (یا l اِل کوچک)میباشد که آخر عدد اضافه میشود. حرف L نشاندهنده نوع داده long میباشد.
⭕️وجه تمایز بین داده float و double، حرف F(یا f کوچک) میباشد که بعد از عدد اعشاری برای داده فلوت به کار برده میشود. به همین صورت برای متغیر double میتوان بعد از عدد حرف D (یا d) قرار داد.
⭕️اختصاص یک داده نوع پیشین به یک متغیر، باعث ذخیره یک کپی از داده در متغیر خواهد شد:
int x = 4;
int y = x;


🔆داده های مرجع (reference data types / non-primitive data types)
⭕️داده های مرجع شامل تمامی داده ها غیر از داده های نوع پیشین میباشد.
⭕️داده های نوع مرجع بعنوان اشیا (objects) شناخته میشوند.
⭕️داده های مرجع در واقع به یک خانه از حافظه اشاره میکنند.
⭕️برای یک داده مرجع در صورتی که تعریف نشده باشد، مقدار null تعلق میگیرد.
⭕️داده های مرجع (اشیا) شامل متغیر ها و متد ها میشوند که وضعیت و رفتار شی ساخته شده را تعریف میکنند.
⭕️زمانی که یک داده مرجع به یک داده دیگر نسبت داده میشود، در این صورت هر دو به یک خانه از حافظه اشاره میکنند و کپی ایجاد نمیشود. این به این معناست که هر تغییر در ابجکت دوم، ابجکت اول را هم دچار تغییر میکند:
class myClass{
String name;
}

class Main{
public static void main(String[] args){
Class o1 = new Class();
Class o2 = o1;
o2.name = "Object Name";
System.out.println(o1.name);//prints Object Name
}
}
در مثال بالا هر چند که مقدار ابجکت o2 را تغییر داده ایم ولی از آنجا که هر دو ابجکت به یک خانه از حافظه اشاره میکنند، این تغییر باعث میشود که o1 نیز دچار تغییر شود.

(⁉️) سوالات:
داده نوع پیشین چیست؟
اگر به داده نوع پیشین مقداری نسبت داده نشود، چه مقداری در متغیر ذخیره خواهد شد؟
پیشوند های D و F و L به ترتیب برای کدام داده ها و چرا به کار میروند؟
اگر که یک داده پیشین به داده پیشین دیگر نسبت دهیم چه اتفاقی خواهد افتاد؟
داده مرجع چیست؟
اگر که یک داده مرجع را به داده مرجع دیگر نسبت دهیم چه اتفاقی خواهد افتاد؟
تفاوت داده مرجع و داده نوع پیشین را توضیح دهید؟
هدف از نوشتن متدها و متغیر در داده های مرجع چیست؟
اگر داده مرجع مقدار دهی نشود، بصورت پیشفرض چه مقداری در بر میگیرد؟

#primitive #reference #dataTypes #data_types #primitive_data
@pieceJava
👍3
💎تفاوت پیش افزاینده و پس افزاینده در جاوا

🔅 پس افزاینده (Post-Increment ) زمانی مناسب است که قرار باشد از مقدار فعلی داده استفاده و سپس مقدار داده افزایش پیدا کند.
🔰برای مثال:
int i = 1;
System.out.println(i++); // prints 1
System.out.println(i); // prints 2


🔅 پیش افزاینده (Pre-Increment) بر خلاف پس افزاینده زمانی مناسب است که قرار باشد مقدار فعلی را افزایش و سپس استفاده کنیم.
🔰برای مثال:
int i = 1;
System.out.println(++i);// prints 2
System.out.println(i); // prints 2

#increment
@pieceJava
👍2
💎 مفهوم استخر رشته (String pool) و کارایی آن در جاوا

🔆 همانطور که میدانید رشته ها از نوع داده مرجع میباشند و هر داده مرجع برای ایجاد شدن هم از لحاظ زمان و هم حافظه هزینه بر است. یکی از راه هایی که در جهت بهینه سازی این موضوع بکار برده شده است، بوجود آوردن استخر رشته (String pool) است. پیش از آنکه این مفهوم را بررسی کنیم، اجازه دهید به نحوه ایجاد رشته ها در جاوا بپردازیم. در جاوا به دو صورت میتوان رشته ایجاد کرد:

⭕️ ذخیره مستقیم رشته بصورت یک ثابت :
String str = "ITHOOLOO";
💡
به این نوع رشته ها، لیترال گفته میشود (String literal)


⭕️ تعریف رشته بوسیله ی کلیدواژه new:
String str2 = new String("ITHOOLOO");


حال اگر رشته سومی با مقدار تکراری داشته باشیم:
String str3 = "ITHOOLOO";

در این صورت خواهیم داشت:
System.out.println(str==str2); //false
System.out.println(str==str3); // true
System.out.println(str2==str3); // false

دلیل برابری رشته اول و سوم به مفهوم استخر رشته برمیگردد.

🔆 استخر رشته:
همان
طور که گفتیم در جهت بهینه سازی در هزینه، هر بار که یک رشته لیترال ایجاد میکنیم، JVM بررسی میکند که آیا در استخر رشته، رشته مشابه وجود دارد یا خیر. در صورت وجود آدرس رشته تکراری را برگشت میدهد و در غیر اینصورت آن را در استخر رشته ایجاد میکند. در نتیجه دلیل برابری رشته اول و سوم به این خاطر میباشد که در حافظه هر دو به یک آدرس مراجعه میکنند. اما کلیدواژه new یک ابجکت جدا ایجاد میکند و از آنجا که هر دو رشته دو آدرس متفاوت دارند، نتیجه مقایسه == برابر فالس میشود.

💡 برای مقایسه رشته ها بهتر است از متد equals و یا compareTo استفاده شود.
🔗 نحوه صحیح مقایسه رشته ها
🔗 کلاس های Immutable و Mutable
🔗 چرا رشته ها غیر قابل تغییر یا Immutable هستند
👍4
#چرا
💎چرا رشته ها غیر قابل تغییر یا Immutable هستند؟
در مورد Immutable و Mutable بودن کلاس ها از اینجا بخوانید.
فرض کنید رشته ای بصورت زیر داریم:
String str = "Hello";

حال بوسیله متد concat یک رشته را به رشته فعلی اضافه میکنیم:
str.concat(" World");
و در نهایت از رشته تولید شده خروجی میگیریم:
System.out.println(str);
خروجی مثال بالا همان رشته Hello خواهد بود. این موضوع به غیر قابل تغییر بودن رشته ها برمیگردد. در واقع در سطح حافظه رشته Hello World ایجاد شده است. اما رشته فعلی همچنان به خانه قبلی در حافظه اشاره میکند. برای ارجاع به ادرس جدید، الحاق رشته باید بصورت زیر انجام شود:
str = str.concat(" World");

در این صورت خروجی زیر برابر با Hello World خواهد بود:
System.out.println(str);


چرا رشته ها غیر قابل تغییر هستند؟

⭕️ فرض کنید چند رشته لیترال داشتیم که هر کدام فقط به یک خانه از حافظه اشاره میکردند. حال اگر مقدار یکی از رشته ها را به اینصورت تغییر دهیم، این تغییر باقی رشته ها را تحت تاثیر قرار میداد.

⭕️ غیر قابل تغییر بودن رشته ها در مدیریت حافظه نیز تاثیر دارد. (از اینجا بخوانید)
👍7
💎 کلاس Object در جاوا

هر کلاس جاوا بصورت مستقیم یا غیر مستقیم از کلاس Object ارث بری میکند. این به این معناست که هر کلاسی میتواند متد های کلاس Object را که به نحوی private یا final نیستند، اورراید کند.

⭕️متد HashCode مقدار هش کد را برای شی بازگشت میدهد.
⭕️متد equals برابری دو شی را بررسی میکند 🔗 (درباره مقایسه ابجکت ها(اشیا) و هش کد از اینجا بخوانید)
⭕️متد clone یک کپی از شی مورد نظر ایجاد میکند. البته برای clone کردن، کلاس مورد نظر باید اینترفیس Cloneable را پیاده سازی و از این کلاس متد clone() را تعریف کند.
⭕️متد toString رشته ای را در مورد شی ایجاد شده بازگشت میدهد. این رشته میتواند اطلاعات شی یا هرچیز دیگری باشد. برای مثال بصورت پیشفرض متد toString رشته @هش کد را بازگشت میدهد.
⭕️متد finalize متدی است که بصورت خودکار توسط گاربیج کالکشن قبل از حذف و از بین بردن شی صدا زده میشود. برای مثال زمانی که یک شی از هیچ یک از منابع استفاده نکند و هیچ شیی به آن مراجعه نکند، بصورت خودکار توسط گاربیج کالکشن برای ازاد سازی و مدیریت حافظه، حذف خواهد شد.
👍5
تیکه پاره های جاوا
Photo
💎 کلاس Wrapper ها و مفهوم Unboxing و Auto-Boxing

🔆در جاوا کلاس wrapper (به فارسی کلاس پوشاننده یا کلاس بسته بندی کننده) به کلاس هایی گفته میشود که هشت داده ی نوع پیشین را به شی تبدیل میکند. لیست کلاس wrapper ها در تصویر بالا قابل مشاهده است.

🔰برای مثال برای تبدیل داده int به Integer از متد زیر استفاده میشود:
int x = 475;
Integer number = Integer.valueOf(x);
🛑 به این شیوه از تبدیل autoBoxing گفته میشود.
در این مورد برای تبدیلدوباره شی ایجاد شده به داده نوع پیشین از متد IntValue استفاده میشود:
int y =number.intValue();
🛑 به این شیوه از تبدیل شی به داده نوع پیشین، unboxing گفته میشود

💡البته در نسخه های اخیر جاوا نیازی به استفاده از این متد ها برای تبدیل نیست. این تغییر مقدار بصورت خودکار توسط کمپایلر انجام میشود:
Integer number = 475; //auto-boxing
int y = number; //unboxing

⁉️ چرا از کلاس wrapper ها استفاده کنیم؟
⭕️ بعضی از ساختار ها بجای داده های نوع پیشین با اشیا سروکار دارند. برای مثال کالکشن ها مانند اری لیست، لینک لیست و ... در نتیجه برای استفاده لازم است که داده های نوع پیشین را بوسیله ی کلاس wrapper ها به شی تبدیل کنید:
ArrayList<Integer> list = new ArrayList<>();

⭕️ از انجا که این داده ها به شی تبدیل میشوند، میتوان مقدار ذخیره ی آن را برابر null قرار داد.

Integer number = null;

⭕️یکی از متد های پرکاربرد در این کلاس ها متد ...parse میباشد. متد parse... برای تبدیل رشته به داده دیگر کاربرد دارد.
برای مثال:
int x = Integer.parseInt("475");//Converts String to integer
double y = Double.parseDouble("12.3");

💡 البته از لحاظ کارآمدی داده های نوع پیشین بیشتر کارآمد خواهند بود. پیشنهاد میشود که فقط در صورت لزوم از کلاس Wrapper ها به جای داده های نوع پیشین استفاده کنید.

#Wrapper #Integer #parseInt #parse #unboxing #AutoBoxing

@pieceJava
👍6
💎 کلیدواژه static

🔆 یکی از 57 کلیدواژه رزرو شده در جاوا، کلیدواژه استاتیک static میباشد.

💡 از کلیدواژه های رزرو شده برای اسامی متغیر ها و... نمیتوان استفاده کرد.

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

🔅 بلاک استاتیک (static block)
معمولا از این نوع بلاک برای مقدار دهی اولیه داده های استاتیک استفاده میشود. در واقع هر زمانی که کلاس داخل حافظه بارگذاری شد، خطوط داخل بلاک هم اجرا میشوند نکته حائز اهمیت آن است که بلاک های استاتیک پیش از سازنده ها (کنستراکتور) اجرا میشوند:
(برای خوانایی بهتر کد ها، گوشی خود را در حالت افقی قرار دهید و یا در ادامه از تصاویر زیر پست استفاده کنید)

public class PieceJava {
//Telegram: @PieceJava
public static void main(String[] args) {
new staticSample();
// OUTPUT: Inside static block
// Inside constructor
}
}
class staticSample{
static int x;
static {
System.out.println("Inside static block");
x=x*6;
}
public staticSample(){
System.out.println("Inside constructor");
}
}
🔅 متغیر استاتیک
زمانی که یک متغیر استاتیک ایجاد میکنید، فقط یک کپی از آن ایجاد و میان باقی نمونه(ابجکت، شی، اشیا) های کلاس به اشتراک گذاشته میشود. با توجه به این تعریف، به این نوع متغیر ها متغیر های سراسری (global variables) نیز گفته میشود. زیرا میان نمونه ها مشترک هستند. متغیر های استاتیک فقط در سطح کلاس میتوانند تعریف شوند.
🔰 برای مثال:

public class PieceJava {
public static void main(String[] args) {
staticSample sample = new staticSample();
staticSample sample2 = new staticSample();
sample.setNumber(4);
System.out.println(sample2.getNumber()); // prints 4
}
}
class staticSample{
private static int number;

public void setNumber(int number){
this.number = number;
}
public int getNumber(){
return number;
}
}
در این مورد مقدار متغیر را در ابجکت sample مقدار دهی کردیم و در ادامه مقدار ذخیره شده را از ابجکت sample2 چاپ کردیم. این به این معناست که مقدار متغیر میان نمونه های ایجاد شده، ثابت میباشد.

🔅 متد استاتیک
این متد ها چند ویژگی خاص دارند:
⭕️ متد های استاتیک وابسته به نمونه های ایجاد شده از کلاس نیستند. در واقع متعلق به خود کلاس هستند. این یعنی بدون ایجاد نمونه از کلاس میتوانید از آنها استفاده کنید.
⭕️ متد های استاتیک فقط میتوانند به داده های استاتیک و دیگر متد های استاتیک دسترسی داشته باشند.

👈 بهمین خاطر معمولا متد هایی که پیش از متد main برای استفاده در این متد تعریف میکنید حتما باید استاتیک تعریف شوند. زیرا در غیر این صورت باید یک نمونه از خود کلاس در متد main تعریف کنید.

مثال:
public class PieceJava {
//Telegram: @PieceJava
public static void main(String[] args) {
staticSample.print();
//OUTPUT: Inside static method
}
}
class staticSample{
public static void print(){
System.out.println("Inside static method");
}
}

——
#static #keywords
از اینجا بخوانید:
👈 کلیدواژه final
👈 تفاوت Constructor و Static Factory Method
@pieceJava
👍51
This media is not supported in your browser
VIEW IN TELEGRAM
#ساختمان_داده
نحوه پیمایش پیش ترتیب در ساختار درختی و پیاده سازی به زبان جاوا
Pre order traversal

#dsa
@piecejava
👍8
💎 سطوح دسترسی در جاوا

🔆 سطوح دسترسی (access modifiers) برای تعیین کردن میزان دسترسی یک کلاس به فیلد ها یا متد های یک کلاس کاربرد دارد.

🔅 در جاوا چهار نوع سطح دسترسی داریم:
⭕️ سطح دسترسی default
: این سطح دسترسی فقط به پکیج شامل کلاس محدود میشود و باقی کلاس ها از باقی پکیج ها نمیتوانند به فیلد ها و متد های با سطح دیفالت، دسترسی داشته باشند. در واقع سطح دیفالت برای حالتی گفته میشود که هیچ سطح دسترسی برای فیلد یا متد تعریف نکنید.

⭕️ سطح دسترسی protected: اعضای کلاس با این سطح دسترسی فقط از طریق پکیج شامل کلاس قابل دسترسی هستند و در باقی پکیج ها فقط از طریق زیرکلاس هایش قابل دسترسی هستند. در غیر این صورت قابل دسترسی نیستند.

⭕️ سطح دسترسی private: این سطح دسترسی فقط به خود کلاس محدود میشود. یعنی اعضای کلاس با این سطح دسترسی فقط از داخل خود کلاس قابل دسترسی هستند.


⭕️ سطح دسترسی public: این سطح دسترسی به این معناست که اعضای کلاس از هر جایی قابل دسترسی هستند.

منظور از اعضا، متد(متد ها) یا فیلدی (فیلد ها) است که دارای سطح(سطوح) دسترسی پابلیک/پرایوت/دیفالت و یا پروتکتد میباشد (میباشند).

#access_modifiers #سطح_دسترسی #public #private #protected #default
———
☕️ @PieceJava
👍10