JavaRush /Java Blog /Random-ID /String Jawa. Pertanyaan dan jawaban wawancara, bagian 2
Andrey
Level 26

String Jawa. Pertanyaan dan jawaban wawancara, bagian 2

Dipublikasikan di grup Random-ID
Sayangnya artikel tersebut tidak muat dalam satu fragmen, saya harus membaginya menjadi dua bagian. Lihat permulaannya di sini String Jawa.  Pertanyaan dan jawaban wawancara, bagian 2 - 1

12. Tuliskan fungsi untuk mencari palindrom terpanjang dalam string tertentu

Sebuah string dapat berisi string palindromik, dan menemukan palindrom terpanjang adalah masalah pemrograman. Poin kuncinya di sini adalah bahwa dari tengah palindrom mana pun, jika kita ke kanan dan ke kiri sebanyak 1 karakter, karakternya akan selalu sama. Misalnya, 12321, tengahnya adalah 3, dan jika kita terus bergerak dari posisi saat ini di kedua arah, kita akan mendapatkan 2 lalu 1. Kita menggunakan logika serupa dalam program Java untuk mencari palindrom terpanjang. Namun jika panjang palindromnya genap maka panjang tengahnya juga genap, jadi kita perlu memastikan bahwa ini juga disediakan di program kita, misalnya 12333321, tengahnya adalah 33, dan jika kita terus bergerak di kedua arah, kita akan mendapatkan 3, 2 dan 1. Dalam program kita, kita menelusuri string yang dihasilkan dengan bagian tengah di tempat pertama dan memeriksa karakter kiri dan kanan. Kami juga memiliki dua variabel global untuk menyimpan posisi awal palindrom. Kita juga perlu memeriksa apakah sudah ditemukan palindrom yang lebih panjang, karena kita dapat menemukan beberapa palindrom dalam string tertentu. Di bawah ini adalah contoh program yang berfungsi dengan baik di semua kasus. Kita dapat memperbaiki kode di atas dengan memindahkan loop while ke metode terpisah, tapi saya serahkan bagian itu untuk Anda. Tolong beri tahu saya jika Anda memiliki implementasi yang lebih baik atau jika program tersebut gagal.
package com.journaldev.util;

public class LongestPalindromeFinder {

    public static void main(String[] args) {
        System.out.println(longestPalindromeString("1234"));
        System.out.println(longestPalindromeString("12321"));
        System.out.println(longestPalindromeString("9912321456"));
        System.out.println(longestPalindromeString("9912333321456"));
        System.out.println(longestPalindromeString("12145445499"));
    }

    public static String longestPalindromeString(String in) {
        char[] input = in.toCharArray();
        int longestPalindromeStart = 0;
        int longestPalindromeEnd = 0;

        for (int mid = 0; mid < input.length; mid++) {
            // для случая нечетного палиндрома How 12321, 3 будет серединой
            int left = mid-1;
            int right = mid+1;
            // нам необходимо двигаться влево и вправо на 1 позицию до конца
            while (left >= 0 && right < input.length) {
                // ниже проверка, является ли это палиндромом
                if (input[left] == input[right]) {
                    // обновление глобальных позиций, только если палиндром длиннее имеющегося
                    if (right - left > longestPalindromeEnd
                            - longestPalindromeStart) {
                        longestPalindromeStart = left;
                        longestPalindromeEnd = right;
                    }
                }
                left--;
                right++;
            }
            // для четного палиндрома у нас должна быть подобная логика с размером середины 2
            // для этого мы начнем на одну позицию правее
            left = mid-1;
            right = mid + 2;// к примеру, для 12333321 мы выбрали 33 в качестве середины
            while (left >= 0 && right < input.length)
            {
                if (input[left] == input[right]) {
                    if (right - left > longestPalindromeEnd
                            - longestPalindromeStart) {
                        longestPalindromeStart = left;
                        longestPalindromeEnd = right;
                    }
                }
                left--;
                right++;
            }
        }
        // теперь у нас есть позиции для самого длинного палиндрома
        return in.substring(longestPalindromeStart, longestPalindromeEnd + 1);
    }
}
Program akan menampilkan keluaran berikut:
1
12321
12321
12333321
454454

13. Apa perbedaan antara String, StringBuffer dan StringBuilder

Sebuah string tidak dapat diubah dan diselesaikan di Java, jadi semua manipulasi string kita akan selalu membuat string baru. Manipulasi string membutuhkan banyak sumber daya, sehingga Java menyediakan dua kelas yang berguna untuk manipulasi string - StringBufferdan StringBuilder. StringBufferdan StringBuildermerupakan kelas yang bisa berubah. Operasi dengan StringBufferthread aman dan tersinkronisasi, namun metodenya StringBuildertidak aman untuk thread. Jadi ketika beberapa thread bekerja pada string yang sama kita harus menggunakan StringBuffer, tetapi dalam lingkungan thread tunggal kita harus menggunakan StringBuilder. StringBuilderlebih produktif dibandingkan StringBufferkarena tidak dibebani sinkronisasi.

14. Mengapa string tidak dapat diubah dan diselesaikan di Java?

Ada beberapa keuntungan dari kekekalan string:
  1. Penggabungan string hanya dimungkinkan karena string tidak dapat diubah di Java, sehingga mesin virtual menghemat banyak ruang heap karena variabel string yang berbeda menunjuk ke variabel yang sama di kumpulan. Jika suatu string tidak dapat diubah, maka interning string tidak akan mungkin dilakukan, karena jika ada variabel yang mengubah nilainya, variabel lain yang merujuk pada string tersebut juga akan terpengaruh.

  2. Jika string dapat diubah, hal ini akan menimbulkan risiko keamanan yang serius bagi aplikasi. Misalnya, nama pengguna dan kata sandi database diteruskan sebagai string untuk mendapatkan koneksi ke database dan dalam pemrograman soket, detail host dan port diteruskan sebagai string. Karena string tidak dapat diubah, nilainya tidak dapat diubah, jika tidak, peretas mana pun dapat mengubah nilai tautan dan menyebabkan masalah pada keamanan aplikasi.

  3. Karena string tidak dapat diubah, maka string tersebut aman untuk thread dan satu instance string dapat dibagikan di antara thread yang berbeda. Hal ini menghindari sinkronisasi untuk keamanan thread, string sepenuhnya aman untuk thread.

  4. String digunakan di Java classloaderdan kekekalan memastikan bahwa kelas dimuat dengan benar menggunakan Classloader. Misalnya, bayangkan sebuah instance kelas ketika Anda mencoba memuat java.sql.Connectionsebuah kelas, namun nilai referensinya diubah menjadi myhacked.Connectionkelas yang mungkin melakukan hal-hal yang tidak diinginkan pada database Anda.

  5. Karena string tidak dapat diubah, string hashcodedisimpan dalam cache pada saat pembuatan dan tidak perlu menghitungnya lagi. Hal ini menjadikan string kandidat yang sangat baik untuk kunci masuk Mapdan pemrosesannya akan lebih cepat dibandingkan kunci lainnya HashMap. Inilah alasan mengapa string adalah objek yang paling umum digunakan sebagai kunci HashMap.

15. Bagaimana cara membagi string menjadi beberapa bagian?

Kita dapat menggunakan metode split(String regex)untuk membagi string menjadi array string menggunakan ekspresi reguler sebagai pembatas.
import java.util.Arrays;

public class JavaSplitString {
    public static void main(String[] args) {
        String line = "I am a java developer";
        String[] words = line.split(" ");
        String[] twoWords = line.split(" ", 2);
        System.out.println("String split with delimiter: "+Arrays.toString(words));
        System.out.println("String split into two: "+Arrays.toString(twoWords));
        //split string delimited with special characters
        String wordsWithNumbers = "I|am|a|java|developer";
        String[] numbers = wordsWithNumbers.split("\\|");
        System.out.println("String split with special character: "+Arrays.toString(numbers));
    }
}
Metode ini split(String regex, int numOfStrings)adalah metode kelebihan beban untuk membagi string menjadi sejumlah baris tertentu. Kita dapat menggunakan garis miring terbalik untuk menggunakan karakter khusus ekspresi reguler sebagai karakter biasa. Program akan menampilkan keluaran berikut:
String split with delimiter: [I, am, a, java, developer]
String split into two: [I, am a java developer]
String split with special character: [I, am, a, java, developer]

16. Mengapa array string lebih disukai daripada string untuk menyimpan kata sandi?

Sebuah string tidak dapat diubah di Java dan disimpan di kumpulan string. Setelah dibuat, kata sandi tersebut tetap berada di kumpulan sampai sampah dikumpulkan, jadi ketika kami merasa sudah selesai dengan kata sandinya, kata sandi tersebut tetap tersedia di memori untuk sementara waktu dan tidak ada cara untuk menghindarinya. Ini merupakan risiko keamanan karena siapa pun yang memiliki akses ke dump memori akan dapat menemukan kata sandi dalam bentuk teks biasa. Jika kita menggunakan array karakter untuk menyimpan kata sandi, kita dapat menghapusnya setelah selesai. Dengan cara ini kita dapat mengontrol berapa lama string tersebut tersimpan di memori, menghindari risiko keamanan yang melekat pada sebuah string.

17. Bagaimana Anda memeriksa kesamaan dua string di Java?

Ada dua cara untuk memeriksa apakah dua string setara - menggunakan ==operator “ ”, atau menggunakan operator equals. Saat kita menggunakan operator “ ==”, ia memeriksa nilai string sebagai referensi, tetapi dalam pemrograman sering kali kita memeriksa kesetaraan string hanya untuk nilainya. Oleh karena itu, kita harus menggunakan metode sama dengan untuk menguji kesetaraan dua string. Ada juga metode equalsIgnoreCaseyang bisa kita gunakan untuk mengabaikan kasus.
String s1 = "abc";
String s2 = "abc";
String s3= new String("abc");
System.out.println("s1 == s2 ? "+(s1==s2)); //true
System.out.println("s1 == s3 ? "+(s1==s3)); //false
System.out.println("s1 equals s3 ? "+(s1.equals(s3))); //true

18. Apa yang dimaksud dengan kumpulan string?

Seperti namanya, string pool adalah kumpulan string yang disimpan di heap Java. Kita tahu bahwa Stringini adalah kelas khusus di Java dan kita dapat membuat objek kelas ini menggunakan operator baru seperti kita dapat membuat objek dengan memberikan nilai string dalam tanda kutip ganda. Diagram di bawah menjelaskan bagaimana kumpulan string dialokasikan di heap Java dan apa yang terjadi jika kita menggunakan berbagai cara untuk membuat string. String Jawa.  Pertanyaan dan jawaban wawancara, bagian 2 - 2Penggabungan string dimungkinkan semata-mata karena kekekalan string di Java dan penerapan gagasan magang string. String pool juga merupakan contoh pola Flyweight. Kumpulan string membantu menghemat banyak memori, tetapi di sisi lain, membuat baris membutuhkan lebih banyak waktu. Saat kita menggunakan tanda kutip ganda untuk membuat string, pertama-tama ia mencari string di kumpulan dengan nilai yang sama, jika ditemukan maka cukup mengembalikan referensi, jika tidak, string baru akan dibuat di kumpulan dan kemudian mengembalikan referensi. Namun, ketika kita menggunakan operator baru, kita memaksa kelas Stringuntuk membuat objek string baru, dan kemudian kita dapat menggunakan metode ini intern()untuk memasukkan string ke dalam kumpulan, atau mendapatkan referensi dari kumpulan ke objek lain Stringdengan nilai yang sama. Di bawah ini adalah contoh yang menunjukkan cara kerja kumpulan string.
public class StringPool {
    public static void main(String[] args) {
        String s1 = "Cat";
        String s2 = "Cat";
        String s3 = new String("Cat");

        System.out.println("s1 == s2 :"+(s1==s2));
        System.out.println("s1 == s3 :"+(s1==s3));
    }
}
Program akan menampilkan keluaran berikut:
s1 == s2 :true
s1 == s3 :false

19. Apa yang dilakukan metode magang()?

Saat metode intern()dipanggil, jika kumpulan string sudah berisi string yang setara dengan objek kita, sebagaimana diverifikasi oleh metode equals(Object), maka referensi ke string dari kumpulan tersebut dikembalikan. Jika tidak, objek string akan ditambahkan ke kumpulan dan referensi ke objek tersebut dikembalikan. Metode ini selalu mengembalikan string yang memiliki nilai yang sama dengan string saat ini, namun menjamin bahwa string tersebut akan berupa string dari kumpulan string unik. Di bawah ini adalah contoh cara kerja metode ini intern():
public class StringPool {
    public static void main(String[] args) {
        String a = "string a";
        String b = new String("string a");
        String c = b.intern();

        System.out.println(a == b);
        System.out.println(b == c);
        System.out.println(a == c);
    }
}
Программа выведет следующее:false
false
true

20. Apakah string string aman di Java?

String tidak dapat diubah, jadi kita tidak dapat mengubah nilainya dalam program. Oleh karena itu, mereka aman untuk thread dan dapat digunakan dengan aman di lingkungan multi-thread.

21. Mengapa String merupakan kunci populer di HashMap di Java?

Karena string tidak dapat diubah, kode hashnya disimpan dalam cache pada saat pembuatan dan tidak memerlukan penghitungan ulang. Hal ini membuat string menjadi kandidat yang bagus untuk sebuah kunci Mapdan diproses lebih cepat dibandingkan objek kunci lainnya HashMap. Inilah sebabnya mengapa string sebagian besar digunakan sebagai kunci HashMap. Saya harap pertanyaan yang tercantum dalam artikel ini akan membantu Anda dalam wawancara Anda, beri tahu saya jika saya melewatkan sesuatu. Tautan ke artikel asli Penulis: Pankaj Kumar
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION