JavaRush /Java Blog /Random-ID /Rehat kopi #92. 20 Pertanyaan Wawancara Java yang Sering ...

Rehat kopi #92. 20 Pertanyaan Wawancara Java yang Sering Diajukan

Dipublikasikan di grup Random-ID
Sumber: Dev.to Halo rekan-rekan pengembang, saya telah menyusun daftar pertanyaan wawancara dasar Java yang harus diketahui oleh setiap pembuat kode.

1. Bagaimana cara membalikkan string di Java tanpa menggunakan metode reverse()?

Jawaban: Tidak ada metode reverse() standar di Java , meskipun metode reverse() ada di beberapa perpustakaan seperti StringBuffer atau StringBuilder . Oleh karena itu, pertanyaan tentang pembalikan susunan sering muncul dalam wawancara. Di bawah ini adalah algoritma sederhana yang dapat digunakan untuk membalikkan array.
public class StringReverse {

    public static void main(String[] args) {

        String str = "Flexiple";
        System.out.println(reverse(str));
    }

    public static String reverse(String in) {
        if (in == null)
            throw new IllegalArgumentException("Null is not valid");

        StringBuilder out = new StringBuilder();

        char[] chars = in.toCharArray();

        for (int i = chars.length - 1; i >= 0; i--)
            out.append(chars[i]);

        return out.toString();
    }
}

2. Tulis cuplikan kode untuk mengimplementasikan deret Fibonacci menggunakan rekursi

Jawaban: Cuplikan kode di bawah ini mengimplementasikan deret Fibonacci menggunakan rekursi. Pertanyaan ini juga sangat umum dalam wawancara Java.
public class FibonacciNumbers {
    public static int fibonacci(int n) {
        if (n <= 1)
            return n;
        return fibonacci(n - 1) + fibonacci(n - 2);
    }


    public static void main(String args[]) {
        int n = 10;
        System.out.println(fibonacci(n));
    }
}

3. Bagaimana cara menghilangkan spasi dari string di Java?

Jawaban: Metode strip() adalah metode string yang menghilangkan semua spasi di awal dan akhir. Strip() menggunakan metode Character.isWhitespace() secara internal untuk memeriksa spasi. Ini mendeteksi spasi menggunakan karakter Unicode dan merupakan cara yang disarankan untuk menghilangkan spasi. Metode alternatif stripLeading() dan stripTrailing() juga dapat digunakan . Mereka akan membantu jika Anda hanya ingin menghapus spasi di depan dan di belakang. Kode di bawah ini adalah contoh penggunaan metode strip() .
String s = "  flexiple ";

s = s.strip();

System.out.println(s);

4. Apa yang menyebabkan skenario kebuntuan? Tulis kode untuk membuat kebuntuan

Jawaban: Skenario kebuntuan terjadi ketika dua thread memerlukan kunci yang sama untuk dieksekusi. Skenario ini terjadi ketika kedua thread telah memperoleh satu kunci dan menunggu untuk memperoleh kunci lainnya. Namun, karena kedua thread menunggu eksekusi yang lain, maka keduanya saling memblokir sehingga menyebabkan kebuntuan. Program multithread mengalami kebuntuan karena kata kunci sinkronisasi digunakan untuk membuat metode thread aman. Artinya hanya satu thread yang dapat memblokir dan menggunakan metode tersinkronisasi. Thread lain harus menunggu thread saat ini selesai. Kode di bawah ini membuat dua thread yang menemui jalan buntu.
class Util
{
    static void sleep(long millis)
    {
        try
        {
            Thread.sleep(millis);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
}
class Shared
{
    synchronized void test1(Shared s2)
    {
        System.out.println("test1-begin");
        Util.sleep(1000);

        s2.test2();
        System.out.println("test1-end");
    }

    synchronized void test2()
    {
        System.out.println("test2-begin");
        Util.sleep(1000);

        System.out.println("test2-end");
    }
}

class Thread1 extends Thread
{
    private Shared s1;
    private Shared s2;

    public Thread1(Shared s1, Shared s2)
    {
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public void run()
    {
        s1.test1(s2);
    }
}

class Thread2 extends Thread
{
    private Shared s1;
    private Shared s2;

    public Thread2(Shared s1, Shared s2)
    {
        this.s1 = s1;
        this.s2 = s2;
    }

    @Override
    public void run()
    {
        s2.test2(s1);
    }
}

public class Deadlock
{
    public static void main(String[] args)
    {
        Shared s1 = new Shared();

        Shared s2 = new Shared();

        Thread1 t1 = new Thread1(s1, s2);
        t1.start();

        Thread2 t2 = new Thread2(s1, s2);
        t2.start();

        Util.sleep(2000);
    }
}

5. Tulis Kode Java untuk Mencetak Tanggal dalam Format Tertentu

Jawaban: Kelas SimpleDateFormat membantu mengonversi tanggal dari satu format ke format lainnya. Metode ini juga memungkinkan pengguna untuk menggunakan format string tanggal dan mengubahnya ke format yang diinginkan. Kode di bawah ini mengubah tanggal ke format standar: DD/MM/YYYY
import java.text.SimpleDateFormat;
import java.util.Date;
public class CurrentDateTimeExample2 {
public static void main(String[] args) {
    SimpleDateFormat formatter = new SimpleDateFormat("DD/MM/YYYY HH:mm:ss");
    Date date = new Date();
    System.out.println(formatter.format(date));
}
}
Cuplikan kode untuk mengonversi tanggal ke MM/DD/YYYY:
import java.text.SimpleDateFormat;
import java.util.Date;
public class CurrentDateTimeExample2 {
public static void main(String[] args) {
    SimpleDateFormat formatter = new SimpleDateFormat("MM/DD/YYYY HH:mm:ss");
    Date date = new Date();
    System.out.println(formatter.format(date));
}
}

6. Bagaimana cara mengurutkan HashMap berdasarkan nilainya?

Jawaban: HashMaps digunakan untuk mengimplementasikan antarmuka peta. Mereka mengizinkan pengguna untuk menyimpan pasangan nilai kunci, namun kuncinya harus unik. HashMaps bukanlah kumpulan yang diurutkan dan mengurutkannya tidak masuk akal, tetapi karena mengurutkan hashmap bisa sangat rumit, ini adalah pertanyaan umum dalam wawancara Java. Kode di bawah ini menunjukkan implementasi HashMaps .
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class SortHashMap {

    public static void main(String[] args) {
        Map scores = new HashMap<>();

        scores.put("John", 6);
        scores.put("Carol", 8);
        scores.put("Martin", 9);
        scores.put("Mona", 7);
        scores.put("Eric", 5);

        System.out.println(scores);

        scores = sortByValue(scores);

        System.out.println(scores);

    }

    private static Map sortByValue(Map scores) {
        Map sorted = new LinkedHashMap<>();

        Set> entrySet = scores.entrySet();
        System.out.println(entrySet);

        List> entryList = new ArrayList<>(entrySet);
        System.out.println(entryList);

        entryList.sort((x, y) -> x.getValue().compareTo(y.getValue()));
        System.out.println(entryList);

        for (Entry e : entryList)
            sorted.put(e.getKey(), e.getValue());

        return sorted;
    }

}

7. Apa yang dilakukan metode forEach()? Jelaskan dengan sebuah contoh

Jawab: forEach() adalah metode yang digunakan untuk mengulangi objek di Java. Namun tidak seperti loop lainnya, di sini penghitung loop tidak dideklarasikan atau diinisialisasi, melainkan variabel dilewatkan sebagai sebuah iterable. Oleh karena itu, forEach() biasanya digunakan dengan array atau kelas koleksi. Sintaksis:
for (type var : array)
{
    statements using var;
}
Contoh penggunaan forEach() :
class ExampleForEach
{
    public static void main(String[] arg)
    {
        {
            int[] scores = { 10, 13, 9, 11, 11};

            int highest_score = maximum(scores);
            System.out.println(highest_scores);
        }
    }
    public static int maximum(int[] numbers)
    {
        int max = numbers[0];

        // for each loop
        for (int n : numbers)
        {
            if (n > max)
            {
                max = n;
            }
        }
    return max;
    }
}

8. Apa yang dimaksud dengan antarmuka fungsional dan bagaimana cara pembuatannya?

Jawab: Antarmuka yang hanya berisi satu metode abstrak disebut antarmuka fungsional. Selanjutnya, antarmuka fungsional hanya dapat memiliki satu fungsi, namun dapat berisi beberapa metode default. Di Java 8, ekspresi lambda dapat digunakan untuk membuat instance antarmuka fungsional, sehingga segalanya menjadi lebih mudah. Contoh antarmuka fungsional: ActionListener , Comparable . Berikut adalah kode yang digunakan untuk mendefinisikan antarmuka fungsional.
@FunctionalInterface
interface Foo {
    void test();
}

9. Jelaskan Kelebihan Beban dengan sebuah contoh

Jawaban: Overloading adalah proses penyelesaian beberapa metode dengan nama yang sama tetapi berbeda tergantung pada tanda tangan, tipe data, atau jumlah parameternya. Overloading memungkinkan pengguna untuk menggunakan kembali satu metode daripada membuat dan mengingat banyak metode. Singkatnya, kelebihan beban terkait dengan polimorfisme waktu kompilasi. Contoh kode kelebihan metode:
public class Sum {

    public int sum(int x, int y)
    {
        return (x + y);
    }

    public int sum(int x, int y, int z)
    {
        return (x + y + z);
    }

    public double sum(double x, double y)
    {
        return (x + y);
    }

    public static void main(String args[])
    {
        Sum s = new Sum();
        System.out.println(s.sum(10, 20));
        System.out.println(s.sum(10, 20, 30));
        System.out.println(s.sum(10.5, 20.5));
    }
}

10. Jelaskan Overriding dengan sebuah contoh

Jawab: Overriding adalah fitur di Java yang memungkinkan subkelas atau kelas anak menyediakan implementasi terpisah untuk metode yang ada di kelas induk. Ketika metode dalam subkelas memiliki nama, parameter, dan tipe kembalian yang sama dengan kelas induk, metode tersebut akan menggantikan metode di kelas induk. Dan versi metode yang dipanggil menentukan metode mana yang akan dijalankan. Overriding adalah cara untuk mencapai polimorfisme saat runtime. Contoh kode penggantian metode:
class Parent {
    void show()
    {
        System.out.println("Parent's show()");
    }
}

class Child extends Parent {
    @Override
    void show()
    {
        System.out.println("Child's show()");
    }
}

class Main {
    public static void main(String[] args)
    {
        Parent obj1 = new Parent();
        obj1.show();

        Parent obj2 = new Child();
        obj2.show();
    }
}

11. Apa itu pencarian biner? Bagaimana ini diterapkan?

Jawaban: Algoritma pencarian biner digunakan untuk mencari nilai dalam array yang diurutkan atau tipe koleksi. Metode pencarian ini jauh lebih cepat dibandingkan metode pencarian linier. Pencarian biner memecah array menjadi kumpulan yang lebih kecil dan kemudian menerapkan aturan untuk memeriksa kunci input. Tahapan penerapan pencarian biner (binary):
  • Urutkan array dalam urutan menaik.
  • Temukan nilai rata-rata array dan bandingkan dengan kuncinya.
  • Jika kuncinya sama dengan mean, kembalikan nilai true.
  • Jika salah, periksa apakah kuncinya lebih besar atau lebih kecil dari nilai rata-rata.
  • Selanjutnya, berdasarkan hasilnya, periksa masing-masing kunci di bagian atas atau bawah.
  • Ulangi dan bandingkan setiap nilai dengan kunci.
Cuplikan kode yang mengimplementasikan pencarian biner:
import java.util.Scanner;

public class BinarySearch {

    public static void main(String[] args) {

        Scanner commandReader = new Scanner(System.in);
        System.out.println("Enter total number of elements : ");
        int length = commandReader.nextInt();
        int[] input = new int[length];

        System.out.printf("Enter %d integers %n", length);
        for (int i = 0; i < length; i++) {
            input[i] = commandReader.nextInt();
        }

        System.out.println("Please enter number to be searched in array
                                    (sorted order)");
        int key = commandReader.nextInt();

        int index = performBinarySearch(input, key);

        if (index == -1) {
            System.out.printf("Sorry, %d is not found in array %n", key);
        } else {
            System.out.printf("%d is found in array at index %d %n", key,
                                                         index);
        }

        commandReader.close();

    }


    public static int performBinarySearch(int[] input, int number) {
        int low = 0;
        int high = input.length - 1;

        while (high >= low) {
            int middle = (low + high) / 2;
            if (input[middle] == number) {
                return middle;
            } else if (input[middle] < number) {
                low = middle + 1;
            } else if (input[middle] > number) {
                high = middle - 1;
            }
        }
        return -1;
    }

}

12. Apa saja metode terbaik untuk mencegah kebuntuan di Java?

Menjawab:
  • Kunci Bersarang: Penyebab utama kebuntuan adalah ketika kunci diteruskan ke beberapa thread. Menghindari pemblokiran beberapa thread jika thread dengan blok sudah ada dapat membantu mencegah kebuntuan.
  • Menggunakan Thread.join() : Kebuntuan juga dapat terjadi ketika sebuah thread sedang menunggu sumber daya dari thread lain. Namun, dalam kasus seperti itu, Thread.join() dapat digunakan dengan waktu eksekusi maksimum.
  • Menggunakan penguncian hanya jika diperlukan: Berlatihlah menggunakan kunci hanya pada elemen bila diperlukan. Kunci yang tidak perlu adalah penyebab utama kebuntuan.

13. Tulis kode untuk mengimplementasikan caching LRU di Java

Jawaban: LRU adalah singkatan dari Least Used Cache. Skema caching LRU digunakan untuk menghapus cache yang terakhir digunakan. Proses ini terjadi ketika cache yang ada sudah penuh dan halaman baru yang direferensikan tidak ada dalam cache yang ada. Kode di bawah ini menunjukkan implementasinya:
import java.util.Deque;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Iterator;

public class LRUCache {

    private Deque doublyQueue;

    private HashSet hashSet;

    private final int CACHE_SIZE;

    LRUCache(int capacity) {
        doublyQueue = new LinkedList<>();
        hashSet = new HashSet<>();
        CACHE_SIZE = capacity;
    }

    public void refer(int page) {
        if (!hashSet.contains(page)) {
            if (doublyQueue.size() == CACHE_SIZE) {
                int last = doublyQueue.removeLast();
                hashSet.remove(last);
            }
        }
        else {/* The found page may not be always the last element, even if it's an
            intermediate element that needs to be removed and added to the start
            of the Queue */
            doublyQueue.remove(page);
        }
        doublyQueue.push(page);
        hashSet.add(page);
    }

    public void display() {
        Iterator itr = doublyQueue.iterator();
        while (itr.hasNext()) {
            System.out.print(itr.next() + " ");
        }
    }

    public static void main(String[] args) {
        LRUCache cache = new LRUCache(4);
        cache.refer(1);
        cache.refer(2);
        cache.refer(3);
        cache.refer(1);
        cache.refer(4);
        cache.refer(5);
        cache.refer(2);
        cache.refer(2);
        cache.refer(1);
        cache.display();
    }
}

14. Bagaimana cara rotasi array tergantung pada posisi K, misalnya k = 2?

Jawaban: Fragmen kode memutar (mengembalikan) array tergantung pada posisi yang ditentukan. Meskipun tampak sederhana, ini menguji pemahaman Anda tentang loop dan array dan karenanya merupakan pertanyaan umum dalam wawancara Java.
public static int[] rotateBruteForce(int[] nums, int k) {
 for (int i = 0; i < k; i++) {
 for (int j = nums.length - 1; j > 0; j--) {
 // move each number by 1 place
 int temp = nums[j];
 nums[j] = nums[j - 1];
 nums[j - 1] = temp;
 }
 System.out.println("Array rotation after "+(i+1)+" step");
 printArray(nums);
 System.out.println();
 }
 return nums;
 }

15. Apa itu Antrian di Java? Implementasikannya menggunakan array.

Jawaban: Antrian adalah struktur linier yang menunjukkan urutan operasi dengan cara siapa cepat dia dapat. Java memang menyediakan implementasi yang lebih sederhana untuk tipe data abstrak seperti antrian, tumpukan, dan sebagainya. Namun, mengimplementasikannya menggunakan array adalah pertanyaan yang menguji pemahaman Anda tentang konsep tersebut. Ingatlah bahwa implementasi array dari antrian tidak dinamis.
package org.arpit.java2blog;

public class QueueUsingArrayMain {

    private int capacity;
    int queueArr[];
    int front;
    int rear;
    int currentSize = 0;

    public QueueUsingArrayMain(int sizeOfQueue) {
        this.capacity = sizeOfQueue;
        front = 0;
        rear = -1;
        queueArr = new int[this.capacity];
    }

16. Apa itu HeapSort? Tulis kode untuk mengimplementasikannya

Jawaban: HeapSort adalah metode pengurutan berdasarkan struktur data heap biner. Heap biner adalah pohon biner yang elemennya disimpan sedemikian rupa sehingga nilai di node induk lebih besar (max-heap) atau lebih kecil (min-heap) daripada nilai di node anak. Kode untuk mengimplementasikan HeapSort terlihat seperti ini:
public class HeapSort {
    public void sort(int arr[])
    {
        int n = arr.length;

        // Build heap (rearrange array)
        for (int i = n / 2 - 1; i >= 0; i--)
            heapify(arr, n, i);

        // One by one extract an element from heap
        for (int i = n - 1; i > 0; i--) {
            // Move current root to end
            int temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;

            // call max heapify on the reduced heap
            heapify(arr, i, 0);
        }
    }

    // To heapify a subtree rooted with node i which is
    // an index in arr[]. n is size of heap
    void heapify(int arr[], int n, int i)
    {
        int largest = i; // Initialize largest as root
        int l = 2 * i + 1; // left = 2*i + 1
        int r = 2 * i + 2; // right = 2*i + 2

        // If left child is larger than root
        if (l < n && arr[l] > arr[largest])
            largest = l;

        // If right child is larger than largest so far
        if (r < n && arr[r] > arr[largest])
            largest = r;

        // If largest is not root
        if (largest != i) {
            int swap = arr[i];
            arr[i] = arr[largest];
            arr[largest] = swap;

            // Recursively heapify the affected sub-tree
            heapify(arr, n, largest);
        }
    }

    /* A utility function to print array of size n */
    static void printArray(int arr[])
    {
        int n = arr.length;
        for (int i = 0; i < n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }

    // Driver code
    public static void main(String args[])
    {
        int arr[] = { 12, 11, 13, 5, 6, 7 };
        int n = arr.length;

        HeapSort ob = new HeapSort();
        ob.sort(arr);

        System.out.println("Sorted array is");
        printArray(arr);
    }
}

17. Apa itu Memoisasi?

Jawaban: Memoisasi adalah pendekatan yang membantu memecahkan masalah yang disebabkan oleh pemrograman dinamis. Proses ini memastikan bahwa metode tertentu tidak akan dieksekusi lebih dari satu kali untuk data masukan yang sama. Nilai yang dikembalikan disimpan dalam tabel hash atau peta hash dan digunakan kembali sesuai kebutuhan. Kode di bawah ini adalah contoh memoisasi pada deret Fibonacci.
import java.io.*;

class GFG
{

// Fibonacci Series
// using Recursion
static int fib(int n)
{

    // Base case
    if (n <= 1)
        return n;

    // recursive calls
    return fib(n - 1) +
        fib(n - 2);
}

// Driver Code
public static void main (String[] args)
{
    int n = 6;
    System.out.println(fib(n));
}
}

18. Tuliskan sepotong kode untuk mengimplementasikan penyortiran gelembung

Jawaban: Kode di bawah ini adalah solusi untuk bubble sort, yang juga merupakan pertanyaan umum dalam wawancara Java.
public class BubbleSortExample {
    static void bubbleSort(int[] arr) {
        int n = arr.length;
        int temp = 0;
         for(int i=0; i < n; i++){
                 for(int j=1; j < (n-i); j++){
                          if(arr[j-1] > arr[j]){
                                 //swap elements
                                 temp = arr[j-1];
                                 arr[j-1] = arr[j];
                                 arr[j] = temp;
                         }
                 }
         }
    }
    public static void main(String[] args) {
                int arr[] ={3,60,35,2,45,320,5};
                System.out.println("Array Before Bubble Sort");
                for(int i=0; i < arr.length; i++){
                        System.out.print(arr[i] + " ");
                }
                System.out.println();
                bubbleSort(arr);//sorting array elements using bubble sort
                System.out.println("Array After Bubble Sort");
                for(int i=0; i < arr.length; i++){
                        System.out.print(arr[i] + " ");
                }

        }
}

19. Apa yang dimaksud dengan struktur data percobaan di Java?

Jawab: Trie adalah struktur data yang menyimpan data dalam struktur pohon terurut menggunakan kunci penyimpanan. Posisi sebuah node di pohon menentukan kunci yang terkait dengan node tersebut, dan keturunan node tersebut berbagi awalan yang sama. Berkat struktur ini, percobaan menawarkan kinerja yang lebih baik dan juga mengambil data lebih cepat. Namun, satu-satunya kelemahan menggunakan kayu adalah membutuhkan lebih banyak ruang penyimpanan.

20. Tulis cuplikan kode untuk mengubah HashMap menjadi ArrayList

Jawaban: Kode di bawah ini digunakan untuk mengubah HashMap menjadi ArrayList .
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
public class Java8MapToListExamples
{
    public static void main(String[] args)
    {
        //Creating a HashMap object

        HashMap studentPerformanceMap = new HashMap();

        //Adding elements to HashMap

        studentPerformanceMap.put("John Kevin", "Average");

        studentPerformanceMap.put("Rakesh Sharma", "Good");

        studentPerformanceMap.put("Prachi D", "Very Good");

        studentPerformanceMap.put("Ivan Jose", "Very Bad");

        studentPerformanceMap.put("Smith Jacob", "Very Good");

        studentPerformanceMap.put("Anjali N", "Bad");

        //Getting Set of keys

        Set keySet = studentPerformanceMap.keySet();

        //Creating an ArrayList of keys

        ArrayList listOfKeys = new ArrayList(keySet);

        System.out.println("ArrayList Of Keys :");

        for (String key : listOfKeys)
        {
            System.out.println(key);
        }

        System.out.println("--------------------------");

        //Getting Collection of values

        Collection values = studentPerformanceMap.values();

        //Creating an ArrayList of values

        ArrayList listOfValues = new ArrayList(values);

        System.out.println("ArrayList Of Values :");

        for (String value : listOfValues)
        {
            System.out.println(value);
        }

        System.out.println("--------------------------");

        //Getting the Set of entries

        Set> entrySet = studentPerformanceMap.entrySet();

        //Creating an ArrayList Of Entry objects

        ArrayList> listOfEntry = new ArrayList>(entrySet);

        System.out.println("ArrayList of Key-Values :");

        for (Entry entry : listOfEntry)
        {
            System.out.println(entry.getKey()+" : "+entry.getValue());
        }
    }
}
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION