نمونه کد جاوا — نمونه کدهای کاربردی برای برنامه نویسان جاوا

۹۶۵۱ بازدید
آخرین به‌روزرسانی: ۰۵ شهریور ۱۴۰۲
زمان مطالعه: ۳۷ دقیقه
نمونه کد جاوا — نمونه کدهای کاربردی برای برنامه نویسان جاوا

جاوا یکی از محبوب‌ترین زبان‌های برنامه‌نویسی است و در حوزه وب‌اپلیکیشن، اپلیکیشن‌های ویندوزی، موبایل، شبکه، کالاهای مصرفی الکترونیک، دستگاه‌های گیرنده دیجیتال و تقریباً همه جا حضور دارد. جاوا اینک روی بیش از 3 میلیارد دستگاه اجرا می‌شود. بر اساس گزارش اوراکل هم اینک بیش از 5 میلیارد جاوا کارت در حال استفاده هستند. بیش از 9 میلیون توسعه‌دهنده به زبان جاوا کدنویسی می‌کنند و محبوبیت زیادی میان توسعه‌دهندگان دارد و به یکی از رایج‌ترین پلتفرم‌های توسعه تبدیل شده است. در این مطلب به بررسی انواع مختلفی از نمونه کد جاوا و الگوریتم‌های کاربردی این زبان برنامه‌نویسی می‌پردازیم.

فهرست مطالب این نوشته

تاریخچه جاوا

جاوا از سوی شرکت «سان مایکروسیستمز» (Sun Microsystems) در سال 1991 توسعه یافت و متعاقباً از سوی شرکت «اوراکل» (Oracle) خریداری شد. این پلتفرم توسط «جیمز گاسلنیگ» (James Gosling) و «پاتریک ناتون» (Patrick Naughton) توسعه یافته است. جاوا یک زبان ساده برنامه‌نویسی است که موجب شده نوشتن، کامپایل کردن و دیباگ برنامه‌ها آسان شود. با استفاده از جاوا می‌توان کد‌های با قابلیت استفاده مجدد و برنامه‌های ماژولار ساخت.

جاوا مبتنی بر کلاس و در واقع یک زبان شیء‌گرا است و طوری طراحی شده که تا حد امکان وابستگی‌های پیاده‌سازی کمی داشته باشد. جاوا زبان برنامه‌نویسی چندمنظوره است و توسعه‌دهندگان با بهره‌گیری از آن می‌توانند یک بار کد بنویسند و آن را هر کجا اجرا کند. برنامه‌های جاوا کامپایل شده و روی همه پلتفرم‌هایی که از جاوا پشتیبانی کنند، اجرا می‌شوند. اپلیکیشن‌های جاوا به «بایت کد» (Byte Code) کامپایل می‌شوند که می‌تواند روی هر ماشین مجازی جاوا اجرا شود. ساختار جاوا شبیه زبان‌های ++c/c است.

در 13 نوامبر سال 2006 شرکت سان اغلب کدهای ماشین مجازی جاوا را به صورت متن-باز و رایگان عرضه کرد. در 9 می 2007 این شرکت این فرایند را تکمیل کرده و همه کد JVM را تحت شرایط توزیع متن-باز عرضه کرد.

نمونه کد جاوا

اصطلاحات جاوا

برای این که شروع به یادگیری جاوا بکنید، قبلاً باید با برخی اصطلاحاتی که در این پلتفرم رواج دارند، آشنا شوید.

  • ماشین مجازی جاوا (Java Virtual Machine | JVM): هر برنامه جاوا سه فاز دارد. این برنامه ابتدا نوشته می‌شود، سپس کامپایل می‌شود و در نهایت اجرا خواهد شد. مرحله نوشتن برنامه از سوی توسعه‌دهندگان جاوا انجام می‌یابد. فرایند کامپایل کد از سوی کامپایلر JAVAC اجرا می‌شود که کامپایلر اصلی جاوا است و شامل کیت توسعه جاوا (JDK) است. این کامپایلر برنامه جاوا را دریافت کرده و بایت کد را به عنوان خروجی تولید می‌کند.
    در مرحله اجرای یک برنامه جاوا، JVM بایت کد تولید شده از سوی کامپایلر را اجرا می‌کند. بدین ترتیب متوجه می‌شویم که وظیفه ماشین مجازی جاوا، اجرای بایت کد تولید شده از سوی کامپایلر است. هر سیستم عامل یک JVM متفاوت دارد، اما خروجی تولید شده پس از اجرای بایت کد روی همه سیستم‌های عامل مختلف، یکسان است. به همین دلیل است که جاوا یک زبان مستقل از پلتفرم محسوب می‌شود.
  • بایت کد (Bytecode): چنان که توضیح دادیم کامپایلر JAVAC سورس کد جاوا را به بایت کد کامپایل می‌کند، به طوری که JVM بتواند آن را اجرا کند. این بایت کد به صورت فایل class. ذخیره می‌شوند. برای مشاهده بایت کد باید از دی‌اسمبلرهایی مانند ‌javap استفاده کنید.
  • کیت توسعه جاوا (Java Development Kit | JDK): کیت توسعه جاوا چنان که از نامش برمی‌آید یک کیت توسعه کامل است که همه چیز از کامپایلر تا «محیط زمان اجرای جاوا» (JRE)، دیباگرهای جاوا، مستندات جاوا و غیره را شامل می‌شود. برای این که یک برنامه جاوا اجرا شود باید JDK را رویی رایانه نصب کنیم تا امکان نوشتن، کامپایل و اجرای برنامه‌های جاوا را بیابیم.
  • محیط زمان اجرای جاوا (Java Runtime Environment | JRE): JRE زیرمجموعه JDK است که در بخش قبل توضیح دادیم. با نصب JRE روی رایانه می‌توانیم یک برنامه جاوا را اجرا کنیم، اما نمی‌توانیم آن را کامپایل کنیم. JRE شامل یک مرورگر، JVM، پشتیبانی از اپلت و پلاگین‌ها است. بنابراین برای اجرای برنامه جاوا به JRE نیاز داریم.
  • گاربج کلکتور (Garbage Collector): برنامه‌نویسان در محیط جاوا امکان حذف اشیا را ندارند. JVM برای حذف اشیا و به دست آوردن مجدد حافظه از ابزاری به نام Garbage Collector بهره می‌گیرد. این ابزار اشیایی که ارجاعی به آن‌ها وجود ندارد را حذف می‌کند. بدین ترتیب جاوا با بر عهده گرفتن وظیفه مدیریت حافظه، موجب شده که کار برنامه‌نویسان آسان‌تر شود. با این حال برنامه‌نویس‌ها باید در مورد شیوه کدنویسی خود مراقبت‌های به عمل آورند و در مواردی که به شیئی نیاز ندارند آن را ارجاع زدایی کنند تا از سوی Garbage Collector حذف شود، زیرا این ابزار نمی‌تواند اشیایی که هنوز ارجاعی در حافظه دارند را جمع کند.
  • مسیر کلاس (ClassPath): ClassPath در واقع یک مسیر فایل است که محیط زمان اجرای جاوا و کامپایلر جاوا در آن به دنبال بارگذاری فایل‌های class. می‌گردند. به طور پیش‌فرض JDK کتابخانه‌های زیادی دارد. اگر می‌خواهید کتابخانه‌های اکسترنال را نیز بگنجانید، باید آن‌ها را به ClassPath اضافه کنید.

نمونه کد جاوا

ویژگی‌های اصلی زبان جاوا

در این بخش برخی قابلیت‌ها و ویژگی‌های عمده زبان برنامه‌نویسی جاوا را اجمالاً مرور می‌کنیم.

  • جاوا مستقل از پلتفرم است: کامپایلر جاوا سورس کد را به بایت کد تبدیل می‌کند و در ادامه JVM این بایت کد تولید شده از سوی کامپایلر را اجرا خواهد کرد. این بایت کد می‌تواند روی هر پلتفرمی چه ویندوز، لینوکس، مک‌اواس و یا غیره اجرا شود. بنابراین اگر کامپایلر برنامه‌ای را روی ویندوز کامپایل کند، می‌توانیم آن را روی لینوکس اجرا کنیم و یا به طور عکس عمل نماییم. هر سیستم عامل یک JVM متفاوت دارد، اما خروجی تولید شده از سوی همه سیستم‌های عامل پس از اجرای بایت کد یکسان خواهد بود. از این رو جاوا را یک زبان مستقل از پلتفرم می‌نامیم.
  • جاوا زبان شیءگرا است: زبان جاوا به عنوان یک زبان شیءگرایی واجد خصوصیات زیر است:
    • انتزاع (Abstraction)
    • کپسوله‌سازی (Encapsulation)
    • وراثت (Inheritance)
    • چندریختی (Polymorphism)
  • جاوا ساده است: جاوا یکی از زبان‌های ساده است، زیرا قابلیت‌های پیچیده‌ای مانند اشاره‌گر، اورلود عملگر، وراثت چندگانه، تخصیص صریح حافظه ندارد.
  • جاوا پایدار است: زبان جاوا دارای ثبات و پایداری است، زیرا طوری توسعه یافته که تلاش زیادی برای بررسی خطاها در نخستین مراحل کار انجام دهد. به همین جهت است که کامپایلر جاوا می‌تواند حتی آن خطاهایی را که شناسایی‌شان در زبان‌های دیگر برنامه‌نویسی آسان نیست هم شناسایی کند. قابلیت‌های اصلی جاوا که موجب ثبات آن شده گاربج کلکتور، مدیریت استثنا و تخصیص حافظه است.
  • جاوا امن است: ما در جاوا اشاره‌گر نداریم و از این رو نمی‌توانیم به آرایه‌ها در خارج از دامنه‌شان دسترسی پیدا کنیم، یعنی در صورتی که چنین تلاشی بکنیم، استثنای ArrayIndexOutOfBoundsException مشاهده می‌شود. به همین دلیل است که امکان سوءاستفاده از چند نقص امنیتی رایج مانند stack corruption یا سرریز بافر در جاوا وجود ندارد.
  • جاوا توزیع یافته است: امکان ساخت اپلیکیشن‌های توزیع یافته با استفاده از زبان برنامه‌نویسی جاوا وجود دارد. احضار متد ریموت و Enterprise Java Beans برای ایجاد اپلیکیشن‌های توزیع یافته در جاوا است. برنامه‌های جاوا می‌توانند به آسانی روی یک یا چند سیستم توزیع یابند و از طریق اتصال اینترنتی با همدیگر ارتباط بگیرند.
  • جاوا چندنخی است: جاوا از «چندنخی» (Multithreading) پشتیبانی می‌کند. این یک قابلیت جاوا است که امکان اجرای موازی دو یا چند بخش از برنامه را برای بیشینه بهره‌گیری از پردازنده فراهم می‌سازد.
  • جاوا پرتابل است: چنان که می‌دانیم کد جاوا که روی یک ماشین نوشته می‌شود، می‌تواند روی دستگاه‌های دیگر هم اجرا شود. قابلیت مستقل از پلتفرم جاوا به این معنی است که بایت کد مستقل از پلتفرم می‌تواند روی هر پلتفرمی اجرا شود.

لازم است قبل از ادامه دادن این مطلب یادآور شویم که پیش از این در مجله فرادرس مقاله‌ای با عنوان «زبان برنامه نویسی جاوا (Java) — از صفر تا صد» به انتشار رسیده است که به صورت مفصل و با جزئیات کامل به زبان برنامه‌نویسی جاوا پرداخته و آن را به کامل‌ترین شکل ممکن معرفی کرده است. پس اگر مشتاق هستید در مورد این زبان بیشتر یاد بگیرید، توصیه می‌کنیم این مطلب را حتماً مطالعه کنید.

نمونه کد جاوا

نکات، ترفندها و نمونه کد جاوا

در این بخش از مقاله نمونه کد جاوا به معرفی برخی نکات و ترفندهای مهم که در مراحل ابتدایی یادگیری این زبان باید رعایت کنید می‌پردازیم.

به جای Null کالکشن خالی بازگردانید

اگر برنامه‌ای یک کالکشن بازگرداند که هیچ مقداری ندارد، باید مطمئن شوید که یک کالکشن خالی و نه Null بازگشت می‌یابد. به این ترتیب دیگر لازم نیست مقدار زیادی کدهای if…else روی عناصر Null اجرا کنید.

1public class getLocationName {
2    return (null==cityName ? "": cityName);
3}

از رشته‌ها با دقت استفاده کنید

اگر دو رشته با استفاده از عملگر (+) در یک حلقه for به هم الحاق شوند، یک هر بار «شیء رشته» (String Object) جدید ایجاد می‌شود. این کار موجب هدر رفتن حافظه و کاهش عملکرد زمانی می‌شود. همچنین در زمان وهله‌سازی از شیء رشته، نباید از سازنده‌ها استفاده کنید و باید این وهله‌سازی به صورت مستقیم انجام یابد. به مثال زیر توجه کنید:

1//Slower Instantiation
2String bad = new String("Yet another string object");
3      
4//Faster Instantiation
5String good = "Yet another string object"

از ایجاد اشیای غیرضروری اجتناب کنید

یکی از پرهزینه‌ترین انواع عملیات از نظر مصرف حافظه در جاوا عملیات ایجاد شیء است. از این رو توصیه شده که شیء‌ها تنها در صورت لزوم ساخته یا وهله‌سازی شوند. در کد زیر نمونه‌ای از این موضوع را مشاهده می‌کنید:

1import java.util.ArrayList;
2import java.util.List;
3 
4public class Employees {
5 
6    private List Employees;
7 
8    public List getEmployees() {
9 
10        //initialize only when required
11        if(null == Employees) {
12            Employees = new ArrayList();
13        }
14        return Employees;
15    }
16}

مسئله دشوار انتخاب Array یا ArrayList

در اغلب اوقات توسعه‌دهندگان در مورد انتخاب یکی از ساختمان‌های داده Array و ArrayList دچار تردید می‌شوند. هر دوی این موارد نقاط ضعف و قوت خاص خود را دارند. انتخاب یکی از این دو در عمل به الزامات شما بستگی دارد.

1import java.util.ArrayList;
2 
3public class arrayVsArrayList {
4 
5    public static void main(String[] args) {
6        int[] myArray = new int[6];
7        myArray[7]= 10; // ArraysOutOfBoundException
8 
9        //Declaration of ArrayList. Add and Remove of elements is easy.
10        ArrayList<Integer> myArrayList = new ArrayList<>();
11        myArrayList.add(1);
12        myArrayList.add(2);
13        myArrayList.add(3);
14        myArrayList.add(4);
15        myArrayList.add(5);
16        myArrayList.remove(0);
17         
18        for(int i = 0; i < myArrayList.size(); i++) {
19        System.out.println("Element: " + myArrayList.get(i));
20        }
21         
22        //Multi-dimensional Array 
23        int[][][] multiArray = new int [3][3][3]; 
24    }
25}

آرایه‌‌ها دارای اندازه ثابتی هستند، اما لیست‌آرایه‌ها اندازه متغیری دارند. از آنجا که اندازه آرایه ثابت است حافظه‌ی آن در زمان اعلان متغیر از نوع array تخصیص می‌یابد. از این رو آرایه‌ها عملکرد بسیار سریعی دارند. از سوی دیگر، اگر اندازه داده‌ها را از پیش ندانیم، در این صورت قرار دادن داده‌های بیش از ظرفیت آرایه موجب بروز استثنای ArrayOutOfBoundException می‌شود و درج موارد کمتر هم موجب هدر رفتن حافظه خواهد شد.

  • حذف و اضافه کردن عناصر به ArrayList آسان‌تر از Array است.
  • آرایه می‌تواند چندبعدی باشد، اما ArrayList تنها یک بعد می‌توان داشته باشد.

گاهی اوقات Finally پس از Try اجرا نمی‌شود

قطعه کد زیر را در نظر بگیرد:

1public class shutDownHooksDemo {
2    public static void main(String[] args) {
3        for(int i=0;i<5;i++)
4        {
5            try {
6                if(i==4) {
7                    System.out.println("Inside Try Block.Exiting without executing Finally block.");
8                    System.exit(0);
9                }
10            }
11            finally {
12                System.out.println("Inside Finally Block.");
13            }
14        }
15    }
16}

با بررسی این قطعه کد شاید فکر کنید که println درون بلوک finally 5 بار اجرا می‌شود، اما اگر برنامه را اجرا کنید، متوجه خواهید شد که بلوک finally تنها چهار بار اجرا می‌شود. در اجرای پنجم تابع exit فراخوانی می‌شود و در نتیجه finally هرگز برای بار پنجم فراخوانی نخواهد شد. دلیل این مسئله آن است که System.exit اجرای همه نخ‌های در حال اجرا از جمله نخ کنونی را متوقف می‌کند. حتی بلوک finally پس از try نیز در صورت اجرای exit اجرا نخواهد شد.

هنگامی که System.exit فراخوانی می‌شود، JVM وظایف پاک‌سازی پیش از خاموشی را اجرا می‌کند. بدین ترتیب ابتدا همه قلاب‌های shutdown که با استفاده از قلاب Runtime.addShutdownHook ثبت شده‌اند را اجرا می‌کند. این حالت مفیدی است زیرا منابع بیرونی به JVM را آزادسازی می‌کند.

دلیل دیگر این موضوع با Finalizer-ها مرتبط است که یا System.runFinalizersOnExit و یا Runtime.runFinalizersOnExit هستند. استفاده از Finalizer-ها مدت‌های زیادی است که منسوخ شده است. Finalizer-ها تنها می‌توانند روی اشیای زنده در زمانی که از سوی نخ‌های دیگر دست‌کاری می‌شوند اجرا گردند. به این ترتیب نتایج غیر قابل پیش‌بینی و یا حتی بن‌بست رخ می‌دهد.

1public class shutDownHooksDemo {
2 
3    public static void main(String[] args) {
4            for(int i=0;i<5;i++)
5            {
6                    final int final_i = i;
7                    try {
8                            Runtime.getRuntime().addShutdownHook(
9                                            new Thread() {
10                                            public void run() {
11                                            if(final_i==4) {
12                                            System.out.println("Inside Try Block.Exiting without executing Finally block.");
13                                            System.exit(0);
14                                            }
15                                            }
16                                            });
17                    }
18                    finally {
19                            System.out.println("Inside Finally Block.");
20                    }
21 
22            }
23    }
24}

بررسی فرد بودن

خطوط کد زیر را بررسی کرده و بگویید آیا این کد می‌تواند فرد بودن یک عدد را با دقت پیش‌بینی کند؟

1public boolean oddOrNot(int num) {
2    return num % 2 == 1;
3}

این خطوط کد صحیح به نظر می‌رسند، اما در یک‌چهارم موارد نتایج نادرستی بازگشت می‌دهند. اگر یک عدد فرد منفی را در نظر بگیریم، باقیمانده تقسیم بر 2 عدد 1 نخواهد بود. بنابراین نتیجه بازگشتی نادرست خواهد بود که نتیجه اشتباهی است. برای اصلاح این مشکل، کد را به صورت زیر بازنویسی می‌کنیم:

1public boolean oddOrNot(int num) {
2    return (num & 1) != 0;
3}

با استفاده از کد فوق نه تنها مشکل اعداد منفی حل می‌شود، بلکه کد به مقدار زیادی بهینه‌تر نیز شده است. از آنجا که عملیات حسابی و منطقی بسیار سریع‌تر از ضرب و تقسیم هستند، نتایج در قطعه کد فوق با سرعت بسیار بالاتری اجرا می‌شوند.

اختلاف بین گیومه تکی و دوبل

به کد زیر توجه کنید:

1public class Haha {
2    public static void main(String args[]) {
3    System.out.print("H" + "a");
4    System.out.print('H' + 'a');
5    }
6}

در این کد به نظر می‌رسد که باید مقدار HaHa بازگشت یابد، اما در عوض مقدار Ha169 بازگشت خواهد یافت. دلیل این مسئله آن است که در صورت استفاده از گیومه‌های دوبل، کاراکترها مانند رشته تصور می‌شوند، اما زمانی که از گیومه تکی استفاده کنیم، عملوندهای با ارزش char از طریق فرایندی به نام «تبدیل اولیه عریض‌سازی» (widening primitive conversion) به مقادیر int تبدیل می‌شوند. پس از تبدیل عدد صحیح، اعداد مورد نظر اضافه شده و مقدار 169 بازگشت می‌یابد.

اجتناب از نشت حافظه با ترفندهای ساده

نشت حافظه در اغلب موارد موجب کاهش عملکرد نرم‌افزار می‌شود. از آنجا که جاوا اقدام به مدیریت خودکار حافظه می‌کند، توسعه‌دهندگان کنترل زیادی روی آن ندارند. اما با این حال برخی رویه‌های استاندارد وجود دارند که می‌توانند برای حفاظت در برابر نشت حافظه مورد استفاده قرار گیرند.

  1. همیشه وقتی کوئری دیتابیس پایان یافت، اتصال پایگاه داده را آزاد کنید.
  2. همواره تلاش کنید بلوک Finally را مورد استفاده قرار دهید.
  3. وهله‌های ذخیره شده در جدول‌های استاتیک را همواره آزاد کنید.

جلوگیری از بروز بن‌بست در جاوا

«بن‌بست‌ها» (Deadlocks) به دلایل مختلفی رخ می‌دهند. هیچ دستورالعمل واحدی برای جلوگیری از بن‌بست وجود ندارد. به طور معمول بن‌بست‌ها زمانی رخ می‌دهند که اشیای همگام‌سازی‌شده منتظر یک قفل روی منبعی باشند که از سوی شیء همگام‌سازی‌شده دیگری قفل شده است.

برنامه زیر را اجرا کنید تا به طور عملی با یک بن‌بست آشنا شوید. این بن‌بست به این دلیل رخ می‌دهد که هر دو نخ منظر منبعی هستند که توسط نخ دیگری اشغال شده است. هر دوی این نخ‌ها در حالت انتظار می‌مانند و هیچ کدام آزاد نمی‌شوند.

1public class DeadlockDemo {
2   public static Object addLock = new Object();
3   public static Object subLock = new Object();
4 
5   public static void main(String args[]) {
6 
7      MyAdditionThread add = new MyAdditionThread();
8      MySubtractionThread sub = new MySubtractionThread();
9      add.start();
10      sub.start();
11   }
12private static class MyAdditionThread extends Thread {
13      public void run() {
14         synchronized (addLock) {
15        int a = 10, b = 3;
16        int c = a + b;
17            System.out.println("Addition Thread: " + c);
18            System.out.println("Holding First Lock...");
19            try { Thread.sleep(10); }
20            catch (InterruptedException e) {}
21            System.out.println("Addition Thread: Waiting for AddLock...");
22            synchronized (subLock) {
23               System.out.println("Threads: Holding Add and Sub Locks...");
24            }
25         }
26      }
27   }
28   private static class MySubtractionThread extends Thread {
29      public void run() {
30         synchronized (subLock) {
31        int a = 10, b = 3;
32        int c = a - b;
33            System.out.println("Subtraction Thread: " + c);
34            System.out.println("Holding Second Lock...");
35            try { Thread.sleep(10); }
36            catch (InterruptedException e) {}
37            System.out.println("Subtraction  Thread: Waiting for SubLock...");
38            synchronized (addLock) {
39               System.out.println("Threads: Holding Add and Sub Locks...");
40            }
41         }
42      }
43   }
44}

خروجی برنامه فوق چنین است:

=====
Addition Thread: 13
Subtraction Thread: 7
Holding First Lock...
Holding Second Lock...
Addition Thread: Waiting for AddLock...
Subtraction Thread: Waiting for SubLock...

اما اگر ترتیب فراخوانی نخ‌ها تغییر یابد، مشکل بن‌بست حل می‌شود:

1public class DeadlockSolutionDemo {
2   public static Object addLock = new Object();
3   public static Object subLock = new Object();
4 
5   public static void main(String args[]) {
6 
7      MyAdditionThread add = new MyAdditionThread();
8      MySubtractionThread sub = new MySubtractionThread();
9      add.start();
10      sub.start();
11   }
12 
13 
14private static class MyAdditionThread extends Thread {
15      public void run() {
16         synchronized (addLock) {
17        int a = 10, b = 3;
18        int c = a + b;
19            System.out.println("Addition Thread: " + c);
20            System.out.println("Holding First Lock...");
21            try { Thread.sleep(10); }
22            catch (InterruptedException e) {}
23            System.out.println("Addition Thread: Waiting for AddLock...");
24            synchronized (subLock) {
25               System.out.println("Threads: Holding Add and Sub Locks...");
26            }
27         }
28      }
29   }
30    
31   private static class MySubtractionThread extends Thread {
32      public void run() {
33         synchronized (addLock) {
34        int a = 10, b = 3;
35        int c = a - b;
36            System.out.println("Subtraction Thread: " + c);
37            System.out.println("Holding Second Lock...");
38            try { Thread.sleep(10); }
39            catch (InterruptedException e) {}
40            System.out.println("Subtraction  Thread: Waiting for SubLock...");
41            synchronized (subLock) {
42               System.out.println("Threads: Holding Add and Sub Locks...");
43            }
44         }
45      }
46   }
47}

خروجی برنامه فوق چنین است:

=====
Addition Thread: 13
Holding First Lock...
Addition Thread: Waiting for AddLock...
Threads: Holding Add and Sub Locks...
Subtraction Thread: 7
Holding Second Lock...
Subtraction Thread: Waiting for SubLock...
Threads: Holding Add and Sub Locks...

رزرو حافظه برای جاوا

برخی اپلیکیشن‌های جاوا ممکن است پردازش‌های سنگینی داشته باشند و یا از حافظه زیادی استفاده کنند. این اپلیکیشن‌ها به طور کلی به کندی اجرا می‌شوند، زیرا نیاز به RAM زیادی دارند. برای بهبود عملکرد این اپلیکیشن‌ها اقدام به رزرو کردن حافظه برای جاوا می‌کنیم. بنابراین برای نمونه اگر یک وب‌سرور تامکت داشته باشیم که 10 گیگابایت رم داشته باشد، اگر بخواهیم این مقدار RAM را به جاوا تخصیص بدهیم، از دستور زیر روی سرور استفاده می‌کنیم:

export JAVA_OPTS="$JAVA_OPTS -Xms5000m -Xmx6000m -XX:PermSize=1024m -XX:MaxPermSize=2048m"

پارامترهای دستور فوق چنین هستند:

  • Xms - کمینه استخر تخصیص حافظه (Minimum memory allocation pool)
  • Xmx - بیشینه استخر تخصیص حافظه (Maximum memory allocation pool)
  • XX:PermSize - اندازه اولیه تخصیص یافته در طی راه‌اندازی اولیه JVM
  • XX:MaxPermSize – بیشینه اندازه قابل تخصیص در طی راه‌اندازی اولیه JVM

زمان‌بندی عملیات مختلف در جاوا

دو روش استاندارد برای زمان‌بندی انواع عملیات در جاوا وجود دارد که یکی با استفاده از ()System.currentTimeMillis و دیگری با ()System.nanoTime انجام می‌یابد. اکنون سؤال این است که باید از کدام یک از این دو استفاده کنیم و هر کدام در چه شرایطی بهتر عمل می‌کنند. از لحاظ نظری هر دوی این متدها کار یکسانی را اجرا می‌کنند، اما تفاوت‌هایی دارند که به صورت زیر است:

  • System.currentTimeMillis چیزی بین یک‌هزارم تا پانزده‌هزارم ثانیه (بسته به سیستم) طول می‌کشد، اما ()System.nanoTime حدود یک‌میلیونیم ثانیه (1000 نانو) طول خواهد کشید.
  • System.currentTimeMillis چند چرخه ساعت برای عملیات Read می‌گیرد، اما ()System.nanoTime به بیش از 100 چرخه ساعت نیاز دارد.
  • System.currentTimeMillis زمان مطلق (Epoch Time) را نمایش می‌دهد، اما ()System.nanoTime لزوماً هیچ نقطه مرجع زمانی ندارد.

انتخاب میان Float و Double

نوع دادهبایت‌های مورد استفادهارقام معنی‌دار (ده‌دهی)
Float47
Double815

در حوزه نرم‌افزار، جایی که دقت اعداد حائز اهمیت باشد، نوع داده Double معمولاً نسبت به Float ترجیح دارد، زیرا اغلب پردازنده‌ها به زمان تقریباً یکسانی برای پردازش نوع‌های Float و Double نیاز دارند. از سوی دیگر نوع Double دقت بیشتری را در زمان پردازشی یکسان در اختیار ما قرار می‌دهد.

محاسبه توان

جاوا برای محاسبه توان (^) از عملگر XOR بهره می‌گیرد. در واقع جاوا برای محاسبه توان یک عدد دو گزینه دارد که یکی ضرب و دیگری متد pow است.

ضرب

1double square = double a * double a;                            // Optimized
2double cube = double a * double a * double a;                   // Non-optimized
3double cube = double a * double square;                         // Optimized
4double quad = double a * double a * double a * double a;            // Non-optimized
5double quad = double square * double square;                    // Optimized

متد pow

متد pow برای محاسبه مواردی استفاده می‌شود که ضرب ممکن نیست:

1double cube = Math.pow(base, exponent);

متد Math.pow باید تنها در مواردی که ضروری است، استفاده شود. برای نمونه از آن برای محاسبه توان یک مقدار کسری استفاده می‌کنیم. دلیل این امر آن است که متد ()Math.pow به طور معمول حدود 300 تا 600 بار سریع‌تر از ضرب است.

مدیریت استثنای اشاره‌گر تهی

«استثناهای اشاره‌گر تهی» (Null Pointer Exceptions) در جاوا بسیار رایج هستند. این استثنا زمانی رخ می‌دهد که تلاش کنیم یک متد را روی یک مرجع شیء تهی فراخوانی کنیم. به مثال زیر توجه کنید.

1int noOfStudents = school.listStudents().count;

در مثال فوق، اگر یک NullPointerException دریافت شود، در این صورت یا school و یا ()listStudents مقدار null داشته‌اند. بنابراین هماره بهتر است که مقادیر Null را در اولین فرصت ممکن بررسی کنیم:

1private int getListOfStudents(File[] files) {
2      if (files == null)
3        throw new NullPointerException("File list cannot be null");
4    }

Encode در JSON

JSON اختصاری برای عبارت «نمادگذاری شیء جاوا اسکریپت» (JavaScript Object Notation) است و برای ذخیره و تبادل داده‌ها مورد استفاده قرار می‌گیرد. JSON یک جایگزین با کاربری آسان برای فرمت داده XML محسوب می‌شود. این فرمت داده به جهت مشخصات خود و همچنین سبک بودنش این روزها در اینترنت محبوبیت زیادی کسب کرده است. یک ساختمان داده نرمال را می‌توان به JSON انکود کرد و به سادگی روی وب به اشتراک گذاشت. پیش از شروع به کدنویسی باید یک JSON parser را نصب کنیم. در مثال‌های زیر ما از json.simple (+) استفاده کرده‌ایم. در ادامه مثال ساده‌ای از انکودینگ JSON را مشاهده می‌کنید:

1import org.json.simple.JSONObject;
2import org.json.simple.JSONArray;
3 
4public class JsonEncodeDemo {
5     
6    public static void main(String[] args) {
7         
8        JSONObject obj = new JSONObject();
9        obj.put("Novel Name", "Godaan");
10        obj.put("Author", "Munshi Premchand");
11  
12        JSONArray novelDetails = new JSONArray();
13        novelDetails.add("Language: Hindi");
14        novelDetails.add("Year of Publication: 1936");
15        novelDetails.add("Publisher: Lokmanya Press");
16         
17        obj.put("Novel Details", novelDetails);
18         
19        System.out.print(obj);
20    }
21}

خروجی کد فوق چنین است:

{"Novel Name":"Godaan","Novel Details": ["Language: Hindi","Year of Publication: 1936","Publisher: Lokmanya Press"],"Author":"Munshi Premchand"}

دیکد از JSON

برای دیکد کردن JSON باید از اسکیمای آن اطلاع داشته باشیم. جزییات کار را در مثال زیر می‌بینید:

1import java.io.FileNotFoundException;
2import java.io.FileReader;
3import java.io.IOException;
4import java.util.Iterator;
5 
6import org.json.simple.JSONArray;
7import org.json.simple.JSONObject;
8import org.json.simple.parser.JSONParser;
9import org.json.simple.parser.ParseException;
10 
11public class JsonParseTest {
12 
13    private static final String filePath = "//home//user//Documents//jsonDemoFile.json";
14     
15    public static void main(String[] args) {
16 
17        try {
18            // read the json file
19            FileReader reader = new FileReader(filePath);
20            JSONParser jsonParser = new JSONParser();
21            JSONObject jsonObject = (JSONObject)jsonParser.parse(reader);
22             
23            // get a number from the JSON object
24            Long id =  (Long) jsonObject.get("id");
25            System.out.println("The id is: " + id);         
26 
27            // get a String from the JSON object
28            String  type = (String) jsonObject.get("type");
29            System.out.println("The type is: " + type);
30 
31            // get a String from the JSON object
32            String  name = (String) jsonObject.get("name");
33            System.out.println("The name is: " + name);
34 
35            // get a number from the JSON object
36            Double ppu =  (Double) jsonObject.get("ppu");
37            System.out.println("The PPU is: " + ppu);
38             
39            // get an array from the JSON object
40            System.out.println("Batters:");
41            JSONArray batterArray= (JSONArray) jsonObject.get("batters");
42            Iterator i = batterArray.iterator();
43            // take each value from the json array separately
44            while (i.hasNext()) {
45                JSONObject innerObj = (JSONObject) i.next();
46                System.out.println("ID "+ innerObj.get("id") + 
47                        " type " + innerObj.get("type"));
48            }
49 
50            // get an array from the JSON object
51            System.out.println("Topping:");
52            JSONArray toppingArray= (JSONArray) jsonObject.get("topping");
53            Iterator j = toppingArray.iterator();
54            // take each value from the json array separately
55            while (j.hasNext()) {
56                JSONObject innerObj = (JSONObject) j.next();
57                System.out.println("ID "+ innerObj.get("id") + 
58                        " type " + innerObj.get("type"));
59            }
60             
61 
62        } catch (FileNotFoundException ex) {
63            ex.printStackTrace();
64        } catch (IOException ex) {
65            ex.printStackTrace();
66        } catch (ParseException ex) {
67            ex.printStackTrace();
68        } catch (NullPointerException ex) {
69            ex.printStackTrace();
70        }
71 
72    }
73 
74}

فایل jsonDemoFile.json

1{
2    "id": 0001,
3    "type": "donut",
4    "name": "Cake",
5    "ppu": 0.55,
6    "batters":
7        [
8            { "id": 1001, "type": "Regular" },
9            { "id": 1002, "type": "Chocolate" },
10            { "id": 1003, "type": "Blueberry" },
11            { "id": 1004, "type": "Devil's Food" }
12        ],
13    "topping":
14        [
15            { "id": 5001, "type": "None" },
16            { "id": 5002, "type": "Glazed" },
17            { "id": 5005, "type": "Sugar" },
18            { "id": 5007, "type": "Powdered Sugar" },
19            { "id": 5006, "type": "Chocolate with Sprinkles" },
20            { "id": 5003, "type": "Chocolate" },
21            { "id": 5004, "type": "Maple" }
22        ]
23}

خروجی آن چنین است:

The id is: 1
The type is: donut
The name is: Cake
The PPU is: 0.55
Batters:
ID 1001 type Regular
ID 1002 type Chocolate
ID 1003 type Blueberry
ID 1004 type Devil's Food
Topping:
ID 5001 type None
ID 5002 type Glazed
ID 5005 type Sugar
ID 5007 type Powdered Sugar
ID 5006 type Chocolate with Sprinkles
ID 5003 type Chocolate
ID 5004 type Maple

جستجوی ساده رشته

جاوا یک متد کتابخانه به نام ()indexOf دارد که برای کار با شیء String کاربرد دارد و موقعیت اندیس یک رشته مطلوب را داخل این شیء بازگشت می‌دهد. اگر رشته مورد نظر پیدا نشود، مقدار 1- بازگشت می‌یابد.

1public class StringSearch {
2 
3    public static void main(String[] args) {
4        String myString = "I am a String!";
5         
6        if(myString.indexOf("String") == -1) {
7            System.out.println("String not Found!");
8        }
9        else {
10            System.out.println("String found at: " + myString.indexOf("String"));
11        }
12    }
13}

فهرست‌بندی محتوای یک دایرکتوری

به منظور فهرست کردن محتوای یک دایرکتوری، می‌توانید از برنامه زیر استفاده کنید. این برنامه صرفاً نام‌های همه زیردایرکتوری‌ها و فایل‌های درون یک پوشه را داخل یک آرایه دریافت کرده و سپس این آرایه را به صورت ترتیبی پیمایش می‌کند تا همه محتوایش را لیست کند:

1import java.io.*;
2 
3public class ListContents {
4    public static void main(String[] args) {
5        File file = new File("//home//user//Documents/");
6        String[] files = file.list();
7 
8        System.out.println("Listing contents of " + file.getPath());
9        for(int i=0 ; i < files.length ; i++)
10        {
11            System.out.println(files[i]);
12        }
13    }
14}

برنامه ساده IO

جاوا برای خواندن از یک فایل و نوشتن داخل آن دو کلاس FileInputStream و FileOutputStream را ارائه کرده است. سازنده FileInputStream یک آرگومان filepath برای فایل ورودی می‌گیرد و استریم File Input را تولید می‌کند. به طور مشابه سازنده FileOutputStream آرگومان filepath مربوط به فایل خروجی را دریافت کرده و استریم File Output را ایجاد می‌کند. پس از این که مدیریت فایل پایان یافت، حتماً باید این استریم‌ها را Close کنید.

1import java.io.*;
2 
3public class myIODemo {
4    public static void main(String args[]) throws IOException {
5        FileInputStream in = null;
6        FileOutputStream out = null;
7         
8        try {
9            in = new FileInputStream("//home//user//Documents//InputFile.txt");
10            out = new FileOutputStream("//home//user//Documents//OutputFile.txt");
11             
12            int c;
13            while((c = in.read()) != -1) {
14                out.write(c);
15            }
16        } finally {
17            if(in != null) {
18                in.close();
19            }
20            if(out != null) {
21                out.close();
22            }
23        }
24    }
25}

اجرای یک فرمان Shell از جاوا

جاوا یک کلاس Runtime برای اجرای فرمان‌های Shell ارائه کرده است. از آنجا که این‌ها فرمان‌های اکسترنال هستند، مدیریت استثنا اهمیت بسیار زیادی دارد. در مثال زیر این کاربرد را با طرح یک مثال معرفی کرده‌ایم. در این نمونه کد تلاش می‌کنیم تا یک فایل PDF را با استفاده از دستور Shell باز کنیم.

1import java.io.BufferedReader;
2import java.io.InputStream;
3import java.io.InputStreamReader;
4 
5public class ShellCommandExec {
6 
7    public static void main(String[] args) {
8        String gnomeOpenCommand = "gnome-open //home//user//Documents//MyDoc.pdf";
9 
10        try {
11            Runtime rt = Runtime.getRuntime();
12            Process processObj = rt.exec(gnomeOpenCommand);
13 
14            InputStream stdin = processObj.getErrorStream();
15            InputStreamReader isr = new InputStreamReader(stdin);
16            BufferedReader br = new BufferedReader(isr);
17 
18            String myoutput = "";
19 
20            while ((myoutput=br.readLine()) != null) {
21                myoutput = myoutput+"\n";
22            }
23            System.out.println(myoutput);
24        }
25        catch (Exception e) {
26            e.printStackTrace();
27        }
28    }
29}

استفاده از Regex

در جدول زیر خلاصه‌ای از سازه‌های «عبارت منظم» (Regular Expression) در جاوا را مشاهده می‌کنید.

کاراکترها
xکاراکتر xمثال
\\کاراکتر بک‌اسلش-
\0nکاراکتر با مقدار هشت‌هشتی 0n (0 <= n <= 7)
\0nnکاراکتر با مقدار هشت‌هشتی 0nn (0 <= n <= 7)
\0mnnکاراکتر با مقدار هشت‌هشتی 0mnn  (0 <= m <= 3, 0 <= n <= 7)
\xhhکاراکتر با مقدار هگزادسیمال 0xhh-
\uhhhhکاراکتر با مقدار هگزادسیمال 0xhhhh-
\x{h…h}کاراکتر با مقدار هگزادسیمال 0xh…h-
\tکاراکتر tab (‘\u0009’)
\nکاراکتر خط جدید (‘\u000A’)
\rکاراکتر بازگشت کارتریج  (‘\u000D’)
\fکاراکتر form-feed (‘\u000C’)
\aکاراکتر alert (bell) (‘\u0007’)
\eکاراکتر escape (‘\u001B’)
\cxکاراکتر کنترل مرتبط با x-
دسته‌های کاراکتری
[abc]a  یا b یا  c (کلاس ساده)
[^abc]هر کاراکتری به جز a یا b یا c (منفی)
[a-zA-Z]a تا z یا A تا Z، شمولی (بازه)
[a-d[m-p]]a تا d، یا m تا p به صورت  [a-dm-p] (اتحادی)
[a-z&&[def]]d یا e یا f (تقاطع)
[a-z&&[^bc]]a تا z  به جز b  و c یعنی  [ad-z] (تفریق)
[a-z&&[^m-p]]a تا z و نه m تا p یعنی [a-lq-z] (تفریق)
دسته‌های از پیش تعریف شده کاراکتر
.هر کاراکتری را شامل می‌شود و ممکن است با کاراکتر انتهای خط تطبیق یابد یا نیابد-
\dیک کاراکتر رقمی[0-9]
\Dیک کاراکتر غیر رقمی[^0-9]
\sکاراکتر فاصله[ \t\n\x0B\f\r]
\S کاراکتر غیر  فاصله[^\s]
\wکاراکتر کلمه[a-zA-Z_0-9]
\Wکاراکتر غیر کلمه [^\w]
تطبیق‌دهنده کران
^ابتدای خط
$انتهای خط
\bکران کلمه
\Bکران غیر کلمه
\Aابتدای ورودی
\Gانتهای تطبیق قبلی
\Zانتهای ورودی را مشخص می‌کند اما در صورت وجود خاتمه‌دهنده تنهایی مشخص می‌شود.
\zانتهای ورودی
1import java.util.regex.Matcher;
2import java.util.regex.Pattern;
3 
4public class RegexMatches
5{
6    private static String pattern =  "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
7    private static Pattern mypattern = Pattern.compile(pattern);
8     
9    public static void main( String args[] ){
10 
11        String valEmail1 = "testemail@domain.com";
12        String invalEmail1 = "....@domain.com";
13        String invalEmail2 = ".$$%%@domain.com";
14        String valEmail2 = "test.email@domain.com";
15 
16        System.out.println("Is Email ID1 valid? "+validateEMailID(valEmail1));
17        System.out.println("Is Email ID1 valid? "+validateEMailID(invalEmail1));
18        System.out.println("Is Email ID1 valid? "+validateEMailID(invalEmail2));
19        System.out.println("Is Email ID1 valid? "+validateEMailID(valEmail2));
20 
21    }
22     
23    public static boolean validateEMailID(String emailID) {
24        Matcher mtch = mypattern.matcher(emailID);
25        if(mtch.matches()){
26            return true;
27        }
28        return false;
29    }   
30}

نمونه‌ای از Java Swing

با کمک Java Swing می‌توان رابط‌های گرافیکی کاربر ایجاد کرد. جاوا کتابخانه javax را عرضه کرده است که حاوی swing است. آن رابط کاربری گرافیکی که از Java Swing استفاده بکند، باید بسط دادن JFrame آغاز شود. در این حالت باکس‌ها به نحوی اضافه می‌شوند که می‌توانند شامل کامپوننت‌های GUI از قبیل دکمه، دکمه رادیویی، کادر متنی و غیره باشند. این کادرها بر مبنای Container تنظیم می‌شوند.

1import java.awt.*; 
2import javax.swing.*;  
3 
4public class SwingsDemo extends JFrame 
5{ 
6    public SwingsDemo() 
7    {
8        String path = "//home//user//Documents//images";
9        Container contentPane = getContentPane(); 
10        contentPane.setLayout(new FlowLayout());   
11         
12        Box myHorizontalBox = Box. createHorizontalBox();  
13        Box myVerticleBox = Box. createVerticalBox();   
14         
15        myHorizontalBox.add(new JButton("My Button 1")); 
16        myHorizontalBox.add(new JButton("My Button 2")); 
17        myHorizontalBox.add(new JButton("My Button 3"));   
18 
19        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image1.jpg"))); 
20        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image2.jpg"))); 
21        myVerticleBox.add(new JButton(new ImageIcon(path + "//Image3.jpg")));   
22         
23        contentPane.add(myHorizontalBox); 
24        contentPane.add(myVerticleBox);   
25         
26        pack(); 
27        setVisible(true);
28    } 
29     
30    public static void main(String args[]) { 
31        new SwingsDemo(); 
32    }  
33}

پخش صدا با جاوا

پخش صدا یکی از کاربردهای متداول در جاوا است که به طور خاص در بازی‌ها اهمیت زیادی دارد. در دموی زیر شیوه پخش یک فایل صوتی را با استفاده از کد جاوا نشان داده‌ایم:

1import java.io.*;
2import java.net.URL;
3import javax.sound.sampled.*;
4import javax.swing.*;
5 
6// To play sound using Clip, the process need to be alive.
7// Hence, we use a Swing application.
8public class playSoundDemo extends JFrame {
9 
10   // Constructor
11   public playSoundDemo() {
12      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
13      this.setTitle("Play Sound Demo");
14      this.setSize(300, 200);
15      this.setVisible(true);
16 
17      try {
18         URL url = this.getClass().getResource("MyAudio.wav");
19         AudioInputStream audioIn = AudioSystem.getAudioInputStream(url);
20         Clip clip = AudioSystem.getClip();
21         clip.open(audioIn);
22         clip.start();
23      } catch (UnsupportedAudioFileException e) {
24         e.printStackTrace();
25      } catch (IOException e) {
26         e.printStackTrace();
27      } catch (LineUnavailableException e) {
28         e.printStackTrace();
29      }
30   }
31 
32   public static void main(String[] args) {
33      new playSoundDemo();
34   }
35}

اکسپورت PDF

اکسپورت کردن یک جدول PDF الزام رایجی در برنامه‌های جاوا محسوب می‌شود. این کار با استفاده از itextpdf به سادگی هر چه تمام انجام می‌یابد.

1import java.io.FileOutputStream;
2import com.itextpdf.text.Document;
3import com.itextpdf.text.Paragraph;
4import com.itextpdf.text.pdf.PdfPCell;
5import com.itextpdf.text.pdf.PdfPTable;
6import com.itextpdf.text.pdf.PdfWriter;
7 
8public class DrawPdf {
9 
10      public static void main(String[] args) throws Exception {
11        Document document = new Document();
12        PdfWriter.getInstance(document, new FileOutputStream("Employee.pdf"));
13        document.open();
14         
15        Paragraph para = new Paragraph("Employee Table");
16        para.setSpacingAfter(20);
17        document.add(para);
18         
19        PdfPTable table = new PdfPTable(3);
20        PdfPCell cell = new PdfPCell(new Paragraph("First Name"));
21 
22        table.addCell(cell);
23        table.addCell("Last Name");
24        table.addCell("Gender");
25        table.addCell("Ram");
26        table.addCell("Kumar");
27        table.addCell("Male");
28        table.addCell("Lakshmi");
29        table.addCell("Devi");
30        table.addCell("Female");
31 
32        document.add(table);
33         
34        document.close();
35      }
36    }

ارسال ایمیل از کد جاوا

ارسال ایمیل از جاوا کار آسانی است. کافی است Java Mail Jar را نصب کنیم و مسیر آن را برابر با classpath برنامه تعیین کنیم.

مشخصه‌های اصلی در کد تعیین می‌شوند و بهتر است از روشی که در کد زیر استفاده شده برای ارسال ایمیل استفاده کنیم:

1import java.util.*;
2import javax.mail.*;
3import javax.mail.internet.*;
4 
5public class SendEmail
6{
7    public static void main(String [] args)
8    {    
9        String to = "recipient@gmail.com";
10        String from = "sender@gmail.com";
11        String host = "localhost";
12 
13        Properties properties = System.getProperties();
14        properties.setProperty("mail.smtp.host", host);
15        Session session = Session.getDefaultInstance(properties);
16 
17        try{
18            MimeMessage message = new MimeMessage(session);
19            message.setFrom(new InternetAddress(from));
20 
21            message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
22 
23            message.setSubject("My Email Subject");
24            message.setText("My Message Body");
25            Transport.send(message);
26            System.out.println("Sent successfully!");
27        }
28        catch (MessagingException ex) {
29            ex.printStackTrace();
30        }
31    }
32}

اندازه‌گیری زمان

اپلیکیشن‌های زیادی نیازمند اندازه‌گیری کاملاً دقیق زمان هستند. به این منظور جاوا برخی متد‌های استاتیک را در کلاس System به شرح زیر عرضه کرده است:

currentTimeMillis()‎: این متد زمان جاری را بر حسب میلی‌ثانیه‌های سپری شده از Epoch Time و در فرمت Long بازگشت می‌‌دهد.

1long startTime = System.currentTimeMillis();
2long estimatedTime = System.currentTimeMillis() - startTime;

()nanoTime: این متد، مقدار جاری دقیق‌ترین تایمر سیستم موجود را بر حسب نانوثانیه و در فرمت Long بازگشت می‌دهد. متد ()nanoTime به منظور اندازه‌گیری بازه‌های زمانی نسبی به جای زمان‌بندی مطلق مورد استفاده قرار می‌گیرد.

1long startTime = System.nanoTime();
2long estimatedTime = System.nanoTime() - startTime;

تغییر مقیاس تصویر

برای تغییر ابعاد تصاویر می‌توان از usingAffineTransform استفاده کرد. قبل از هر چیز باید Image Buffer از روی تصویر ورودی ایجاد شود و سپس تصویر مقیاس‌بندی‌شده رندر می‌شود:

1import java.awt.Graphics2D;
2import java.awt.geom.AffineTransform;
3import java.awt.image.BufferedImage;
4import java.io.File;
5import javax.imageio.ImageIO;
6 
7public class RescaleImage {
8  public static void main(String[] args) throws Exception {
9    BufferedImage imgSource = ImageIO.read(new File("images//Image3.jpg"));
10    BufferedImage imgDestination = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
11    Graphics2D g = imgDestination.createGraphics();
12    AffineTransform affinetransformation = AffineTransform.getScaleInstance(2, 2);
13    g.drawRenderedImage(imgSource, affinetransformation);
14    ImageIO.write(imgDestination, "JPG", new File("outImage.jpg"));
15  }
16}

به دست آوردن مختصات محل قرارگیری ماوس

با پیاده‌سازی اینترفیس MouseMotionListener در جاوا می‌توان رویدادها ماوس را پیگیری کرد. هنگامی که ماوس وارد منطقه خاصی شود، رویداد MouseMoved تحریک می‌شود و مختصات حرکت را می‌توان به دست آورد. در مثال زیر این کارکرد را نشان داده‌ایم:

1import java.awt.event.*;
2import javax.swing.*;
3 
4public class MouseCaptureDemo extends JFrame implements MouseMotionListener
5{
6    public JLabel mouseHoverStatus;
7 
8    public static void main(String args[]) 
9    {
10        new MouseCaptureDemo();
11    }
12 
13    MouseCaptureDemo() 
14    {
15        setSize(500, 500);
16        setTitle("Frame displaying Coordinates of Mouse Motion");
17 
18        mouseHoverStatus = new JLabel("No Mouse Hover Detected.", JLabel.CENTER);
19        add(mouseHoverStatus);
20        addMouseMotionListener(this);
21        setVisible(true);
22    }
23 
24    public void mouseMoved(MouseEvent e) 
25    {
26        mouseHoverStatus.setText("Mouse Cursor Coordinates => X:"+e.getX()+" | Y:"+e.getY());
27    }
28 
29    public void mouseDragged(MouseEvent e) 
30    {}
31}

FileOutputStream در برابر FileWriter

نوشتن فایل در جاوا به طور عمده به دو روش با استفاده از FileOutputStream و FileWriter انجام می‌یابد. گاهی اوقات توسعه‌دهندگان در زمینه انتخاب یکی از این دو دچار تردید می‌شوند. در مثال زیر به انتخاب یکی از این دو روش کمک می‌کنیم. و توضیح می‌دهیم که کدام یک برای چه شرایطی مناسب‌تر است. ابتدا به بررسی بخش پیاده‌سازی می‌پردازیم.

استفاده از FileOutputStream

1File foutput = new File(file_location_string);
2FileOutputStream fos = new FileOutputStream(foutput);
3BufferedWriter output = new BufferedWriter(new OutputStreamWriter(fos));
4output.write("Buffered Content");

استفاده از FileWriter

1FileWriter fstream = new FileWriter(file_location_string);
2BufferedWriter output = new BufferedWriter(fstream);
3output.write("Buffered Content");

FileOutputStream به منظور نوشتن استریم‌هایی از بایت‌های خام مانند داده‌های تصویر استفاده می‌شود. برای نوشتن استریم‌های کاراکتری باید از FileWriter استفاده شود. با توجه به توضیح فوق کاملاً روشن می‌شود که برای نوع داده‌های تصویری باید از FileOutputStream استفاده شود، در حالی که برای نوع داده متنی بهتر است FileWriter مورد استفاده قرار گیرد.

پیشنهاد‌های متفرقه

در این بخش برخی پیشنهادی عمومی را ارائه کرده‌ایم که در زمان کدنویسی به زبان جاوا برای شما مفید واقع خواهند شد.

از کالکشن‌ها استفاده کنید

جاوا به طور پیش‌فرض چند دست از کالکشن‌ها دارد. برای مثال می‌توان به Vector، Stack، Hashtable، Array و غیره اشاره کرد. عموماً توصیه می‌شود که توسعه‌دهندگان در حد امکان از کالکشن‌ها بهره بگیرند. دلایل این توصیه به شرح زیر هستند:

  • استفاده از کالکشن‌ها موجب می‌شود که کد قابلیت استفاده مجدد را یافته و «قابل مبادله» (interoperable) شود.
  • کالکشن‌ها موجب ساختار یافتن کد می‌شوند و به این ترتیب درک و نگهداری کد آسان می‌شود.
  • کلاس‌های کالکشن پیش‌فرض جاوا به طور کامل تست شده‌اند و از این رو با بهره‌گیری از آن‌ها کیفیت کد افزایش می‌یابد.

قاعده 10-50-500

در پکیج‌های بزرگ نرم‌افزاری، موضوع نگهداری کد بسیار چالش‌برانگیز می‌شود. توسعه‌دهندگانی که به تازگی وارد پروژه‌های پشتیبانی از چنین کدهایی شده‌اند در اغلب موارد از وجود کد Monolithic و کد اسپاگتی شکایت دارند. یک قاعده ساده برای جلوگیری از بروز این حالت و نوشتن کد تمیز و قابل نگهداری وجود دارد که به نام قاعده 10-50-500 شناخته می‌شود.

  • 10: هیچ پکیجی نمی‌تواند بیش از 10 کلاس داشته باشد.
  • 50: هیچ متدی نمی‌تواند بیش از 50 خط کد داشته باشد.
  • 500: هیچ کلاسی نمی‌تواند بیش از 500 خط کد داشته باشد.

اصول طراحی کلاس SOLID

SOLID یک اختصار برای اصول طراحی است که از سوی «رابرت مارتین» (Robert Martin) پیشنهاد شده است. توضیح این اصول به شرح جدول زیر است.

قاعدهتوضیح
اصل مسئولیت منفرد (Single responsibility principle)یک کلاس باید تنها و تنها یک وظیفه/مسئولیت داشته باشد. اگر کلاسی بیش از یک کار را اجرا می‌کند، موجب بروز سردرگمی خواهد شد.
اصل باز/بسته (Open/closed principle)توسعه‌دهندگان باید روی بسط موجودیت‌های نرم‌افزاری و نه تغییر دادن آن‌ها تمرکز کنند.
اصل جایگزینی لیسکف (Liskov substitution principle)باید امکان جایگزینی کلاس مشتق‌شده با کلاس مبنا وجود داشته باشد.
اصل تفکیک اینترفیس (Interface segregation principle)این اصل مشابه اصل مسئولیت منفرد است، اما روی اینترفیس‌ها کاربرد دارد. هر اینترفیس باید مسئول یک وظیفه خاص باشد. توسعه‌دهندگان نباید متد‌هایی که اینترفیس نیاز ندارد را پیاده‌سازی کنند.
اصل وارونه‌سازی وابستگی (Dependency inversion principle )شما باید به انتزاع‌ها و نه مبانی وابسته باشید. معنی این حرف آن است که هر ماژول باید با استفاده از یک لایه انتزاع از ماژول دیگر جدا شود که مسیر ارتباطی آن‌ها را تشکیل می‌دهد.

کاربرد الگوهای طراحی

«الگوهای طراحی» (Design Patterns) به توسعه‌دهندگان کمک می‌کنند تا بهترین اصول طراحی نرم‌افزار را در پروژه‌های خود به کار بگیرند. همچنین پلتفرم مشترکی برای همکاری توسعه‌دهندگان سراسر دنیا فراهم می‌سازند. با استفاده از الگوهای طراحی می‌توانید مطمئن باشید که مجموعه اصطلاح‌های استانداردی وجود دارد که توسعه‌دهندگان مختلف با بهره‌گیری از آن می‌توانند با یکدیگر همکاری کرده و راحت‌تر با هم ارتباط برقرار کنند.

ایده‌های خود را مستند کنید

هرگز بدون فراهم ساختن پیش‌نیازها دست به کدنویسی نزنید. ابتدا باید استراتژی تهیه کرده و اقدام به آماده‌سازی، مستندسازی و بررسی و مرور کنید تا بتوانید اقدام به پیاده‌سازی نمایید. قبل از هر چیز الزامات خود را لیست کنید یک سند طراحی آماده کنید. سپس فرضیات صحیحی تهیه نمایید و با ارائه مستندات برای «مرور همکاران» (Peer Review) از درستی آن‌ها مطمئن شوید.

از Equals به جای == استفاده کنید.

عملگر == مرجع‌های شیء را مقایسه می‌کند و با استفاده از آن می‌توانیم متوجه شویم آیا دو عملوند به شیء یکسانی اشاره می‌کنند یا نه. اما عملگر عمل مقایسه واقعی دو رشته را اجرا می‌کند.

از اعداد اعشاری احتراز کنید

اعداد اعشاری تنها باید در مواردی که کاملاً ضروری باشد، مورد استفاده قرار گیرند. برای نمونه استفاده از اعداد اعشاری برای نمایش مبالغ کمتر از واحد می‌تواند دردسرساز باشد. در این موارد بهتر است از BigDecimal استفاده شود. اعداد اعشاری در اندازه‌گیری‌ها مفید هستند.

نمونه کد جاوا

الگوریتم‌ها و برنامه‌های کاربردی جاوا

در بخش قبلی این راهنما به طور عمده با نکات و ترفندهای کاربردی جاوا آشنا شدیم. در این بخش از مقاله می‌خواهیم برخی الگوریتم‌ها و برنامه‌های مهمی که به عنوان یک برنامه‌نویس جاوا باید با آن‌ها آشنا باشید را ارائه کنیم. در بخش نخست با برنامه‌های ابتدایی جاوا آشنا می‌شویم و در ادامه برخی برنامه‌های پیشرفته جاوا را نیز معرفی خواهیم کرد.

برنامه‌های کاربردی ساده جاوا

در ابتدا برخی الگوریتم‌ها و نمونه کد جاوا را با هم مرور می‌کنیم که برای اجرای برخی وظایف ساده و مقدماتی به شما کمک می‌کنند.

برنامه جاوا برای اجرای عملیات ابتدایی ماشین حساب

هنگامی که به یک ماشین حساب فکر می‌کنیم، عملیاتی مانند جمع، تفریق، ضرب و تقسیم به ذهن متبادر می‌شود. در ادامه این موارد عملیات ابتدایی را به کمک برنامه زیر پیاده‌سازی می‌کنیم.

1package MyPackage;
2import java.util.Scanner;
3public class Calculator {
4public static void main(String[] args) {
5Scanner reader = new Scanner(System.in);
6System.out.print("Enter two numbers: ");
7// nextDouble() reads the next double from the keyboard
8double first = reader.nextDouble();
9double second = reader.nextDouble();
10System.out.print("Enter an operator (+, -, *, /): ");
11char operator = reader.next().charAt(0);
12double result;
13//switch case for each of the operations
14switch(operator)
15{
16case '+':
17result = first + second;
18break;
19case '-':
20result = first - second;
21break;
22case '*':
23result = first * second;
24break;
25case '/':
26result = first / second;
27break;
28// operator doesn't match any case constant (+, -, *, /)
29 
30 
31default:
32System.out.printf("Error! operator is not correct");
33return;
34}
35//printing the result of the operations
36System.out.printf("%.1f %c %.1f = %.1f", first, operator, second, result);
37}
38}

هنگامی که برنامه فوق را اجرا کنیم، یک خروجی مانند زیر مشاهده می‌کنیم:

Enter two numbers: 20 98
Enter an operator (+, -, *, /): /
20.0 / 98.0 = 0.2

برنامه جاوا برای یافتن فاکتوریل یک عدد

فاکتوریل یک عدد، حاصل‌ضرب همه اعداد مثبت کمتر یا برابر با آن عدد است. فاکتوریل یک عدد n به صورت!n نمایش می‌یابد. در ادامه یک برنامه به روش بازگشتی برای پیدا کردن فاکتوریل عدد ورودی می‌نویسیم.

1package MyPackage;
2import java.util.Scanner;
3public class Factorial {
4public static void main(String args[]){
5//Scanner object for capturing the user input
6Scanner scanner = new Scanner(System.in);
7System.out.println("Enter the number:");
8//Stored the entered value in variable
9int num = scanner.nextInt();
10//Called the user defined function fact
11int factorial = fact(num);
12System.out.println("Factorial of entered number is: "+factorial);
13}
14static int fact(int n)
15{
16int output;
17if(n==1){
18return 1;
19}
20//Recursion: Function calling itself!!
21output = fact(n-1)* n;
22return output;
23}
24}

با اجرای برنامه فوق، فاکتوریل عدد به صورت زیر به دست می‌آید:

Enter the number:
12
Factorial of entered number is: 47900160

برنامه جاوا برای محاسبه سری فیبوناچی تا n عدد

سری فیبوناچی یک سری است که در آن عنصر بعدی مجموعه دو عنصر قبلی باشد. برای نمونه عناصر نخست این سری به صورت 0 1 1 2 3 5 8 13… است. در ادامه برنامه‌ای می‌نویسیم که سری‌های فیبوناچی را محاسبه کند:

1package MyPackage;
2public class Fibonacci {
3public static void main(String[] args) {
4//initializing the constants
5int n = 100, t1 = 0, t2 = 1;
6System.out.print("Upto " + n + ": ");
7//while loop to calculate fibonacci series upto n numbers
8while (t1<= n)
9{
10System.out.print(t1 + " + ");
11int sum = t1 + t2;
12t1 = t2;
13t2 = sum;
14}
15}
16}

خروجی کد فوق به صورت زیر است:

Upto 100: 0 + 1 + 1 + 2 + 3 + 5 + 8 + 13 + 21 + 34 + 55 + 89 +

برنامه یافتن پالیندروم بودن یا نبودن یک رشته

«پالیندروم» (Palindrome) عدد، رشته یا دنباله‌ای است که پس از معکوس شدن هم دقیقاً همانند حالا اولش باشد. برای نمونه کلمه «درد» را اگر از آخر به اول بنویسید، همچنان «درد» خواهد بود.

1package MyPackage;
2import java.util.Scanner;
3public class Palindrome {
4static void checkPalindrome(String input) {
5//Assuming result to be true
6boolean res = true;
7int length = input.length();
8//dividing the length of the string by 2 and comparing it.
9for(int i=0; i<= length/2; i++) {
10if(input.charAt(i) != input.charAt(length-i-1)) {
11res = false;
12break;
13}
14}
15System.out.println(input + " is palindrome = "+res);
16}
17public static void main(String[] args) {
18Scanner sc = new Scanner(System.in);
19System.out.print("Enter your Statement: ");
20String str = sc.nextLine();
21//function call
22checkPalindrome(str);
23}
24}

هنگامی که کد فوق را اجرا کنیم، بررسی می‌کند آیا رشته مفروض یک پالیندروم است یا نه:

Enter your Statement: RACECAR
RACECAR is palindrome = true

Enter your Statement: MyPackage
MyPackage is palindrome = false

برنامه محاسبه جایگشت و ترکیب دو عدد

جایگشت و ترکیب دو مجموعه، به چیدمان متفاوت تعداد مفروضی از عناصر آن دو مجموعه گفته می‌شود که یک به یک، یا به یک‌باره انتخاب شوند. پیاده‌سازی آن چنین است:

1package MyPackage;
2import java.util.Scanner;
3public class nprandncr {
4//calculating a factorial of a number
5public static int fact(int num)
6{
7int fact=1, i;
8for(i=1; i<=num; i++)
9{
10fact = fact*i;
11}
12return fact;
13}
14public static void main(String args[])
15{
16int n, r;
17Scanner scan = new Scanner(System.in);
18System.out.print("Enter Value of n : ");
19n = scan.nextInt();
20System.out.print("Enter Value of r : ");
21r = scan.nextInt();
22// NCR and NPR of a number
23System.out.print("NCR = " +(fact(n)/(fact(n-r)*fact(r))));
24System.out.print("nNPR = " +(fact(n)/(fact(n-r))));
25}
26}

با اجرای کد فوق، یک خروجی مانند زیر به دست می‌آید:

Enter Value of n: 5
Enter Value of r: 3
NCR = 10
NPR = 60

برنامه پرینت الگوی الفبایی (A) و الماس

در این مثال از حلقه برای پرینت الگوهای مختلف در جاوا استفاده می‌کنیم. ما دو الگوی متفاوت را پیاده‌سازی می‌کنیم که یکی الگوی الفبایی و دیگری الگوی شکل الماس است. پیاده‌سازی الگوی الفبایی حرف ‌َ A چنین است:

1package MyPackage;
2import java.util.Scanner;
3public class PatternA {
4// Java program to print alphabet A pattern
5void display(int n)
6{
7// Outer for loop for number of lines
8for (int i = 0; i<=n; i++) {
9// Inner for loop for logic execution
10for (int j = 0; j<= n / 2; j++) {
11// prints two column lines
12if ((j == 0 || j == n / 2) && i != 0 ||
13// print first line of alphabet
14i == 0  && j != n / 2 ||
15// prints middle line
16i == n / 2)
17System.out.print("*");
18else
19System.out.print(" ");
20}
21System.out.println();
22}
23}
24public static void main(String[] args)
25{
26Scanner sc = new Scanner(System.in);
27PatternA a = new PatternA();
28a.display(7);
29}
30}

خروجی کد فوق چنین است:

برنامه پرینت الگوی الماس نیز در جاوا به صورت زیر است:

1package MyPackage;
2import java.util.Scanner;
3public class DiamondPattern
4{
5public static void main(String args[])
6{
7int n, i, j, space = 1;
8System.out.print("Enter the number of rows: ");
9Scanner s = new Scanner(System.in);
10n = s.nextInt();
11space = n - 1;
12for (j = 1; j<= n; j++)
13{
14for (i = 1; i<= space; i++)
15{
16System.out.print(" ");
17}
18space--;
19for (i = 1; i <= 2 * j - 1; i++)
20{
21System.out.print("*");
22}
23System.out.println("");
24}
25space = 1;
26for (j = 1; j<= n - 1; j++)
27{
28for (i = 1; i<= space; i++)
29{
30System.out.print(" ");
31}
32space++;
33for (i = 1; i<= 2 * (n - j) - 1; i++)
34{
35System.out.print("*");
36}
37System.out.println("");
38}
39}
40}

خروجی برنامه فوق مانند زیر است:

Enter the number of rows: 5

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

برنامه معکوس‌سازی حروف موجود در یک رشته

این برنامه جاوا ترتیب حروف موجود در یک رشته متنی را که کاربر وارد کرده است، معکوس می‌سازد. برای نمونه عبارت Hello People به صورت olleH elpoeP تبدیل می‌شود. کد جاوا چنین است:

1package MyPackage;
2public class stringreverse {
3public static void main(String[] args) {
4// TODO Auto-generated method stub
5String str = "Welcome To MyPackage";
6String[] strArray = str.split(" ");
7for (String temp: strArray){
8System.out.println(temp);
9}
10for(int i=0; i<3; i++){ char[] s1 = strArray[i].toCharArray(); for (int j = s1.length-1; j>=0; j--)
11{System.out.print(s1[j]);}
12System.out.print(" ");
13}
14}
15}

خروجی برنامه فوق مانند زیر است:

Welcome
To
MyPackage
emocleW oT akerudE

برنامه‌ای برای بررسی خصوصیت بازتاب آینه‌ای در یک آرایه

یک آرایه زمانی دارای خصوصیت «بازتاب آینه‌ای» (Mirror–Inverse) گفته می‌شود که معکوس آن برابر با خودش باشد. اکنون برنامه‌ای می‌نویسیم که وجود خصوصیت بازتاب آینه‌ای را در یک آرایه بررسی کند:

1package MyPackage;
2//Java implementation of the approach
3public class MirrorInverse {
4// Function that returns true if
5// the array is mirror-inverse
6static boolean isMirrorInverse(int arr[])
7{
8for (int i = 0; i<arr.length; i++) {
9// If condition fails for any element
10if (arr[arr[i]] != i)
11return false;
12}
13// Given array is mirror-inverse
14return true;
15}
16 
17public static void main(String[] args)
18{
19int arr[] = { 1, 2, 3, 0 };
20if (isMirrorInverse(arr))
21System.out.println("Yes");
22else
23System.out.println("No");
24}
25}

خروجی این کد چنین است: No

بنابراین آرایه ورودی دارای خصوصیت بازتاب آینه‌ای نبوده است. اما اگر از آرایه {3,4,2,0,1} استفاده کنیم، خروجی yes چاپ می‌شود، زیرا آرایه خصوصیت مورد نظر را دارد.

نمونه کد جاوا

برنامه‌های کاربردی پیشرفته جاوا

در این بخش برخی برنامه‌های جاوا را بررسی می‌کنیم که شاید کمی فراتر از سطح مبتدی باشند و برای افرادی که در سطح متوسط و یا حتی پیشرفته یادگیری جاوا هستند، مفید خواهند بود.

برنامه پیاده‌سازی الگوریتم جستجوی دودویی

جستجوی دودویی (Binary Search) یک الگوریتم جستجو است که موقعیت مقدار هدف را درون یک آرایه مرتب‌شده پیدا می‌کند. جستجوی دودویی مقدار مورد نظر را با عنصر میانه آرایه مقایسه می‌کند. پیاده‌سازی آن در جاوا به صورت زیر است:

1package MyPackage;
2public class BinarySearch {
3// Java implementation of recursive Binary Search
4// Returns index of x if it is present in arr[l..
5// r], else return -1
6int binarySearch(int arr[], int l, int r, int x)
7{
8if (r >= l) {
9int mid = l + (r - l) / 2;
10// If the element is present at the
11// middle itself
12if (arr[mid] == x)
13return mid;
14// If element is smaller than mid, then
15// it can only be present in left subarray
16if (arr[mid] >x)
17return binarySearch(arr, l, mid - 1, x);
18// Else the element can only be present
19// in right subarray
20return binarySearch(arr, mid + 1, r, x);
21}
22// We reach here when element is not present
23// in array
24return -1;
25}
26public static void main(String args[])
27{
28BinarySearch ob = new BinarySearch();
29int arr[] = { 2, 3, 4, 10, 40 };
30int n = arr.length;
31int x = 40;
32int result = ob.binarySearch(arr, 0, n - 1, x);
33if (result == -1)
34System.out.println("Element not present");
35else
36System.out.println("Element found at index " + result);
37}
38}

با اجرای کد فوق، عنصر موجود در یک ایندکس خاص را جستجو می‌کند. خروجی کد فوق چنین است:

Element found at index 4

برنامه پیاده‌سازی الگوریتم HeapSort

مرتب‌سازی هیپ یک تکنیک مرتب‌سازی مبتنی بر مقایسه است که روی ساختمان داده Heap اجرا می‌شود. این الگوریتم مشابه مرتب‌سازی انتخابی است که در آن بزرگ‌ترین عنصر پیدا شده و سپس در انتهای لیست قرار می‌گیرد. در ادامه همین فرایند برای بقیه عناصر تکرار می‌شود. کد برنامه مرتب‌سازی هیپ در جاوا به صورت زیر است:

1package MyPackage;
2public class HeapSort
3{
4public void sort(int arr[])
5{
6int n = arr.length;
7// Build heap (rearrange array)
8for (int i = n / 2 - 1; i >= 0; i--)
9heapify(arr, n, i);
10// One by one extract an element from heap
11for (int i=n-1; i>=0; i--)
12{
13// Move current root to end
14int temp = arr[0];
15arr[0] = arr[i];
16arr[i] = temp;
17// call max heapify on the reduced heap
18heapify(arr, i, 0);
19}
20}
21void heapify(int arr[], int n, int i)
22{
23int largest = i; // Initialize largest as root
24int l = 2*i + 1; // left = 2*i + 1
25int r = 2*i + 2; // right = 2*i + 2
26// If left child is larger than root
27if (l< n && arr[l] >arr[largest])
28largest = l;
29// If right child is larger than largest so far
30if (r < n && arr[r] > arr[largest])
31largest = r;
32 
33// If largest is not root
34if (largest != i)
35{
36int swap = arr[i];
37arr[i] = arr[largest];
38arr[largest] = swap;
39// Recursively heapify the affected sub-tree
40heapify(arr, n, largest);
41}
42}
43/* A utility function to print array of size n */
44static void printArray(int arr[])
45{
46int n = arr.length;
47for (int i=0; i<n; ++i)
48System.out.print(arr[i]+" ");
49System.out.println();
50}
51// Driver program
52public static void main(String args[])
53{
54int arr[] = {12, 11, 13, 5, 6, 7};
55int n = arr.length;
56HeapSort ob = new HeapSort();
57ob.sort(arr);
58System.out.println("Sorted array is");
59printArray(arr);
60}
61}

خروجی کد فوق چنین است:

5,6,7,11,12,13

برنامه حذف عناصر از یک لیست‌آرایه

ArrayList یک پیاده‌سازی از اینترفیس لیست است که در آن عناصر می‌توانند به صورت دینامیک به لیست حذف یا اضافه شوند. همچنین اندازه لیست در صورت نیاز به افزون عناصر بیشتر از مقدار اولیه، به طور دینامیک افزایش می‌یابد. در برنامه زیر ابتدا برخی عناصر را دریک ArrayList درج می‌کنیم و سپس عناصر را بر اساس مشخصاتی از لیست حذف خواهیم کرد:

1package MyPackage;
2 
3import java.util.ArrayList;
4import java.util.List;
5import java.util.function.Predicate;
6 
7public class ArrayListExample {
8public static void main(String[] args) {
9List<String> programmingLanguages = new ArrayList<>();
10programmingLanguages.add("C");
11programmingLanguages.add("C++");
12programmingLanguages.add("Java");
13programmingLanguages.add("Kotlin");
14programmingLanguages.add("Python");
15programmingLanguages.add("Perl");
16programmingLanguages.add("Ruby");
17 
18System.out.println("Initial List: " + programmingLanguages);
19 
20// Remove the element at index `5`
21programmingLanguages.remove(5);
22System.out.println("After remove(5): " + programmingLanguages);
23 
24// Remove the first occurrence of the given element from the ArrayList
25// (The remove() method returns false if the element does not exist in the ArrayList)
26boolean isRemoved = programmingLanguages.remove("Kotlin");
27System.out.println("After remove(\"Kotlin\"): " + programmingLanguages);
28 
29// Remove all the elements that exist in a given collection
30List<String> scriptingLanguages = new ArrayList<>();
31scriptingLanguages.add("Python");
32scriptingLanguages.add("Ruby");
33scriptingLanguages.add("Perl");
34 
35programmingLanguages.removeAll(scriptingLanguages);
36System.out.println("After removeAll(scriptingLanguages): " + programmingLanguages);
37 
38// Remove all the elements that satisfy the given predicate
39programmingLanguages.removeIf(new Predicate<String>() {
40@Override
41public boolean test(String s) {
42return s.startsWith("C");
43}
44});
45 
46System.out.println("After Removing all elements that start with \"C\": " + programmingLanguages);
47 
48// Remove all elements from the ArrayList
49programmingLanguages.clear();
50System.out.println("After clear(): " + programmingLanguages);
51}
52}

خروجی کد فوق چنین است:

Initial List: [C, C++, Java, Kotlin, Python, Perl, Ruby]
After remove(5): [C, C++, Java, Kotlin, Python, Ruby]
After remove("Kotlin"): [C, C++, Java, Python, Ruby]
After removeAll(scriptingLanguages): [C, C++, Java]
After Removing all elements that start with "C": [Java]
After clear(): []

برنامه پیاده‌سازی HashMap در جاوا

HashMap یک Map بر اساس کلاس کالکشن است که برای ذخیره‌سازی جفت‌های «کلید-مقدار» مورد استفاده قرار می‌گیرد. این ساختمان داده به صورت <HashMap<Key, Value یا <HashMap<K, V نشان داده می‌شود. این کلاس هیچ تضمینی در مورد ترتیب Map ارائه نمی‌کند. در واقع HashMap کاملاً مشابه کلاس Hashtable است و تنها تفاوت در این است که همگام‌سازی نشده است و امکان درج مقادیر Null (کلیدهای Null و مقادیر Null) را دارد. در کد زیر شیوه پیاده‌سازی منطق HashMap را در جاوا مشاهده می‌کنید:

1package MyPackage;
2 
3import java.util.HashMap;
4import java.util.Map;
5 
6public class Hashmap
7{
8public static void main(String[] args)
9{
10HashMap<String, Integer> map = new HashMap<>();
11print(map);
12map.put("abc", 10);
13map.put("mno", 30);
14map.put("xyz", 20);
15 
16System.out.println("Size of map is" + map.size());
17 
18print(map);
19if (map.containsKey("abc"))
20{
21Integer a = map.get("abc");
22System.out.println("value for key \"abc\" is:- " + a);
23}
24map.clear();
25print(map);
26}
27public static void print(Map<String, Integer> map)
28{
29if (map.isEmpty())
30{
31System.out.println("map is empty");
32}
33else
34{
35System.out.println(map);
36}
37}
38}

خروجی کد فوق چنین است:

map is empty
Size of map is:- 3
{abc=10, xyz=20, mno=30}
value for key "abc" is:- 10
map is empty

برنامه پرینت گره‌های حاضر در لیست پیوندی حلقوی

برنامه‌ای که در این بخش می‌نویسیم از اصل «FIFO» پیروی می‌کند در این برنامه منظور از گرهْ عنصر لیست است که دو بخش به صورت Data و Next دارد. بخش Data نشان‌دهنده داده‌های ذخیره شده درون گره و بخش Next نیز یک اشاره‌گر به گره بعدی است. کد پیاده‌سازی این برنامه به صورت زیر است:

1package MyPackage;
2 
3public class CircularlinkedList {
4//Represents the node of list.
5public class Node{
6int data;
7Node next;
8public Node(int data) {
9this.data = data;
10}
11}
12//Declaring head and tail pointer as null.
13public Node head = null;
14public Node tail = null;
15 
16//This function will add the new node at the end of the list.
17public void add(int data){
18//Create new node
19Node newNode = new Node(data);
20//Checks if the list is empty.
21if(head == null) {
22//If list is empty, both head and tail would point to new node.
23head = newNode;
24tail = newNode;
25newNode.next = head;
26}
27else {
28//tail will point to new node.
29tail.next = newNode;
30//New node will become new tail.
31tail = newNode;
32//Since, it is circular linked list tail will point to head.
33tail.next = head;
34}
35}
36 
37//Displays all the nodes in the list
38public void display() {
39Node current = head;
40if(head == null) {
41System.out.println("List is empty");
42}
43else {
44System.out.println("Nodes of the circular linked list: ");
45do{
46//Prints each node by incrementing pointer.
47System.out.print(" "+ current.data);
48current = current.next;
49}while(current != head);
50System.out.println();
51}
52}
53 
54public static void main(String[] args) {
55CircularlinkedList cl = new CircularlinkedList();
56//Adds data to the list
57cl.add(1);
58cl.add(2);
59cl.add(3);
60cl.add(4);
61//Displays all the nodes present in the list
62cl.display();
63}
64}

با اجرای این برنامه، یک خروجی مانند زیر به دست می‌آید:

Nodes of the circular linked list:
1 2 3 4

برنامه اتصال به یک پایگاه داده SQL

JDBC یک API استاندارد جاوا برای اتصال‌پذیری وابسته به پایگاه داده بین زبان برنامه‌نویسی جاوا و طیف گسترده‌ای از دیتابیس‌ها است. این اینترفیس برنامه کاربردی امکان انکود کردن گزاره‌های درخواست دسترسی را به «زبان کوئری ساخت‌یافته» (Structured Query Language | SQL) فراهم ساخته است. در ادامه این گزاره‌ها به برنامه‌ای که دیتابیس را مدیریت می‌کند، ارسال خواهند شد. JDBC به طور عمده به منظور اجرای وظایف باز کردن یک اتصال به دیتابیس، ایجاد یک دیتابیس SQL، اجرای کوئری‌های SQL، و همچنین دریافت خروجی استفاده می‌شود.

در کد نمونه زیر یک پایگاه داده ایجاد کرده و پس از برقراری اتصال با آن اقدام به اجرای کوئری می‌کنیم.

1package MyPackage;
2import java.sql.*;
3import java.sql.DriverManager;
4public class Example {
5// JDBC driver name and database URL
6static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
7static final String DB_URL = "jdbc:mysql://localhost/emp";
8// Database credentials
9static final String USER = "root";
10static final String PASS = "MyPackage";
11public static void main(String[] args) {
12Connection conn = null;
13Statement stmt = null;
14try{
15//STEP 2: Register JDBC driver
16Class.forName("com.mysql.cj.jdbc.Driver");
17//STEP 3: Open a connection
18System.out.println("Connecting to database...");
19conn = DriverManager.getConnection(DB_URL,"root","MyPackage");
20//STEP 4: Execute a query
21System.out.println("Creating statement...");
22stmt = conn.createStatement();
23String sql;
24sql = "SELECT id, first, last, age FROM Employees";
25ResultSet rs = stmt.executeQuery(sql);
26//STEP 5: Extract data from result set
27while(rs.next()){
28//Retrieve by column name
29int id = rs.getInt("id");
30int age = rs.getInt("age");
31String first = rs.getString("first");
32String last = rs.getString("last");
33//Display values
34System.out.print("ID: " + id);
35System.out.print(", Age: " + age);
36System.out.print(", First: " + first);
37System.out.println(", Last: " + last);
38}
39//STEP 6: Clean-up environment
40rs.close();
41stmt.close();
42conn.close();
43}catch(SQLException se){
44//Handle errors for JDBC
45se.printStackTrace();
46}catch(Exception e){
47//Handle errors for Class.forName
48e.printStackTrace();
49}finally{
50//finally block used to close resources
51try{
52if(stmt!=null)
53stmt.close();
54}catch(SQLException se2){
55}// nothing can be done
56try{
57if(conn!=null)
58conn.close();
59}catch(SQLException se){
60se.printStackTrace();
61}//end finally try
62}//end try
63System.out.println("Goodbye!");
64}//end main
65} // end Example

با اجرای کد فوق، یک اتصال با دیتابیس برقرار می‌شود و داده‌های موجود در پایگاه داده بازگشت می‌یابد:

Connecting to database...
Creating statement...
ID: 100, Age: 18, First: Zara, Last: Ali
ID: 101, Age: 25, First: Mahnaz, Last: Fatma
ID: 102, Age: 30, First: Zaid, Last: Khan
ID: 103, Age: 28, First: Sumit, Last: Mittal
Goodbye!

برنامه یافتن ترانهاده یک ماتریس

ترانهاده یک ماتریس از طریق تعویض ردیف‌ها با ستون‌ها و ستون‌ها با ردیف‌های ماتریس به دست می‌آید. به بیان دیگر ترانهاده ماتریس A[][] i از طریق تعویض A[i][j] با A[j][i]. به دست می‌آید.

1package MyPackage;
2 
3public class Transpose
4{
5static final int N = 4;
6 
7// This function stores transpose
8// of A[][] in B[][]
9static void transpose(int A[][], int B[][])
10{
11int i, j;
12for (i = 0; i< N; i++)
13for (j = 0; j <N; j++)
14B[i][j] = A[j][i];
15}
16 
17public static void main (String[] args)
18{
19int A[][] = { {1, 1, 1, 1},
20{2, 2, 2, 2},
21{3, 3, 3, 3},
22{4, 4, 4, 4}};
23 
24int B[][] = new int[N][N], i, j;
25 
26transpose(A, B);
27 
28System.out.print("Result matrix is n");
29for (i = 0; i<N; i++)
30{
31for (j = 0; j<N; j++)
32System.out.print(B[i][j] + " ");
33System.out.print("n");
34}
35}
36}

با اجرای کد فوق، خروجی زیر به دست می‌آید:

Result matrix is
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
نمونه کد جاوا

سخن پایانی

به این ترتیب به پایان این مقاله با موضوع معرفی نمونه‌ کد جاوا می‌رسیم. جاوا یکی از محبوب‌ترین زبان‌های برنامه‌نویسی است که از زمان معرفی شدن، همواره جزء یکی از سه زبان محبوب توسعه‌دهندگان بوده است.

در این مقاله تلاش کردیم با ارائه انواع نمونه کد جاوا شما را چه در ابتدای مسیر یادگیری این زبان باشید و چه در زمینه یادگیری جاوا به سطح متوسطی رسیده باشید، کمک کنیم. همچنین نمونه کدها و الگوریتم‌های معرفی شده در بخش انتهایی این راهنما احتمالاً حتی برای توسعه‌دهندگان حرفه‌ای و باتجربه نیز به عنوان یک یادآوری سریع و عملی، مفید واقع خواهند شد.

بر اساس رای ۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
geeksforgeeksjavacodegeeksedureka
۱ دیدگاه برای «نمونه کد جاوا — نمونه کدهای کاربردی برای برنامه نویسان جاوا»

من C# کار کردم شنیده بودم شبیه جاواست ولی نمیدانستم تا این حد شبیه هم هستند.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *