JavaRush /Java blogi /Random-UZ /Java String. Intervyu savollari va javoblari, 2-qism
Andrey
Daraja

Java String. Intervyu savollari va javoblari, 2-qism

Guruhda nashr etilgan
Afsuski, maqola bitta bo'lakka sig'madi, men uni ikki qismga bo'lishga majbur bo'ldim. Boshini shu yerda ko'ring Java String.  Suhbat uchun savollar va javoblar, 2 - 1 qism

12. Berilgan qatordagi eng uzun palindromni topish funksiyasini yozing

Satr palindromik satrlarni o'z ichiga olishi mumkin va eng uzun palindromni topish dasturlash masalasidir. Bu erda asosiy nuqta shundaki, har qanday palindromning o'rtasidan, agar biz 1 belgi bilan o'ngga va chapga borsak, u har doim bir xil belgi bo'ladi. Misol uchun, 12321, o'rtasi 3 va agar biz har ikki yo'nalishda hozirgi holatdan harakatlanishda davom etsak, biz 2 va keyin 1 ni olamiz. Biz Java dasturimizda eng uzun palindromni topish uchun shunga o'xshash mantiqdan foydalanamiz. Biroq, agar palindrom uzunligi juft bo'lsa, o'rtasi ham juft bo'ladi, shuning uchun bu bizning dasturimizda ham ko'rsatilganligiga ishonch hosil qilishimiz kerak, masalan, 12333321, o'rtasi 33 va agar biz harakatni davom ettirsak. har ikki yo'nalishda biz 3, 2 va 1 ni olamiz. Bizning dasturimizda biz birinchi navbatda o'rtasi bilan hosil bo'lgan satrdan o'tamiz va chap va o'ng belgilarni tekshiramiz. Palindromning dastlabki holatini saqlash uchun ikkita global o'zgaruvchimiz ham bor. Bundan tashqari, biz allaqachon topilgan uzunroq palindrom bor yoki yo'qligini tekshirishimiz kerak, chunki biz berilgan qatorda bir nechta palindromlarni topishimiz mumkin. Quyida barcha holatlarda yaxshi ishlaydigan misol dastur mavjud. Biz yuqoridagi kodni while siklini alohida usulga o'tkazish orqali yaxshilashimiz mumkin, lekin men bu qismni siz uchun qoldiraman. Iltimos, sizda yaxshiroq dastur bormi yoki dastur qandaydir tarzda muvaffaqiyatsiz bo'lsa, menga xabar bering.
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);
    }
}
Dastur quyidagilarni chiqaradi:
1
12321
12321
12333321
454454

13. String, StringBuffer va StringBuilder o'rtasidagi farqlar nimada

Satr o'zgarmasdir va Java-da yakunlanadi, shuning uchun bizning barcha string manipulyatsiyalarimiz har doim yangi satr yaratadi. String manipulyatsiyasi resurslarni talab qiladi, shuning uchun Java string manipulyatsiyasi uchun ikkita foydali sinfni taqdim etadi - StringBufferva StringBuilder. StringBufferva StringBuildero'zgaruvchan sinflardir. bilan operatsiyalar StringBufferip xavfsiz va sinxronlashtirilgan, lekin usullar StringBuilderip xavfsiz emas. Shunday qilib, bir qatorda bir nechta iplar ishlayotgan bo'lsa, biz foydalanishimiz kerak StringBuffer, lekin bitta tishli muhitda biz foydalanishimiz kerak StringBuilder. sinxronizatsiya yuklanmaganligidan ko'ra StringBuildersamaraliroq .StringBuffer

14. Nima uchun Java tilida satr o'zgarmas va yakunlanadi?

String o'zgarmasligining bir qancha afzalliklari bor:
  1. Satrlarni birlashtirish faqat Java-da string o'zgarmas bo'lgani uchun mumkin, shuning uchun virtual mashina juda ko'p yig'ish maydonini tejaydi, chunki turli qator o'zgaruvchilari hovuzdagi bir xil o'zgaruvchiga ishora qiladi. Agar satr o'zgarmas bo'lsa, u holda string interning mumkin bo'lmaydi, chunki agar biron bir o'zgaruvchi o'z qiymatini o'zgartirsa, ushbu satrga havola qiluvchi boshqa o'zgaruvchilar ham ta'sir qiladi.

  2. Agar satr o'zgaruvchan bo'lsa, u ilova uchun jiddiy xavfsizlik xavfiga aylanadi. Masalan, ma'lumotlar bazasi foydalanuvchi nomi va paroli ma'lumotlar bazasiga ulanish uchun satr sifatida uzatiladi va soket dasturlashda xost va port tafsilotlari satr sifatida uzatiladi. Satr o'zgarmas bo'lgani uchun uning qiymatini o'zgartirib bo'lmaydi, aks holda har qanday xaker havola qiymatini o'zgartirishi va ilova xavfsizligida muammolarni keltirib chiqarishi mumkin.

  3. Satr o'zgarmas bo'lgani uchun u iplar uchun xavfsizdir va satrning bir nusxasi turli mavzular orasida bo'lishishi mumkin. Bu ip xavfsizligi uchun sinxronlashdan qochadi, satrlar butunlay xavfsizdir.

  4. Java-da satrlar qo'llaniladi classloaderva o'zgarmaslik sinfning to'g'ri yuklanishini ta'minlaydi Classloader. Misol uchun, siz sinfni yuklamoqchi bo'lganingizda sinf misoli haqida o'ylab ko'ring , lekin mos yozuvlar qiymati ma'lumotlar bazasiga kiruvchi narsalarni qilishi mumkin bo'lgan sinfga java.sql.Connectiono'zgartiriladi .myhacked.Connection

  5. Satr o'zgarmas bo'lgani uchun u hashcodeyaratilish vaqtida keshda saqlanadi va uni qayta hisoblashning hojati yo'q. Bu stringni kalit uchun ajoyib nomzod qiladi Mapva uni qayta ishlash boshqa kalitlarga qaraganda tezroq bo'ladi HashMap. Bu string kalit sifatida ishlatiladigan eng ko'p ishlatiladigan ob'ekt bo'lishining sababidir HashMap.

15. Satrni qismlarga qanday ajratish mumkin?

split(String regex)Biz chegaralovchi sifatida muntazam ifodadan foydalanib, satrni qatorlar qatoriga bo'lish usulidan foydalanishimiz mumkin .
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));
    }
}
Usul split(String regex, int numOfStrings)satrni belgilangan miqdordagi qatorlarga bo'lish uchun haddan tashqari yuklangan usuldir. Muntazam ifodali maxsus belgilarni oddiy belgilar sifatida ishlatish uchun teskari chiziqdan foydalanishimiz mumkin. Dastur quyidagilarni chiqaradi:
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. Nima uchun parolni saqlash uchun satr massivi ustundir?

Java-da satr o'zgarmasdir va string hovuzida saqlanadi. U yaratilgandan so'ng, u axlat yig'ilmaguncha hovuzda qoladi, shuning uchun biz parol bilan yakunlangan deb o'ylaganimizda, u xotirada bir muncha vaqt mavjud bo'lib qoladi va bundan qochishning iloji yo'q. Bu havfsizlik uchun xavf tug'diradi, chunki xotira dumpiga kirish huquqiga ega bo'lgan har bir kishi parolni aniq matnda topishi mumkin. Agar biz parolni saqlash uchun belgilar qatoridan foydalansak, u bilan ishlashni tugatgandan so'ng uni tozalashimiz mumkin. Shunday qilib, biz uning xotirada qancha vaqt qolishini nazorat qila olamiz, bu esa qatorga xos bo'lgan xavfsizlik xatarlaridan qochamiz.

17. Java-da ikkita satrning o'xshashligini qanday tekshirasiz?

Ikki qatorning ekvivalentligini tekshirishning ikki yo'li mavjud - “ ==” operatori yoki equals. “ ” operatoridan foydalansak ==, u havola sifatida satrning qiymatini tekshiradi, lekin dasturlashda biz ko'pincha satr ekvivalentligini faqat qiymat uchun tekshiramiz. Shuning uchun, tenglik uchun ikkita satrni sinab ko'rish uchun teng usulidan foydalanishimiz kerak. equalsIgnoreCaseVaziyatni e'tiborsiz qoldirish uchun foydalanishimiz mumkin bo'lgan usul ham mavjud .
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. Tarmoqli hovuz nima?

Nomidan ko'rinib turibdiki, string puli Java to'plamida saqlanadigan satrlar to'plamidir. Biz bilamizki, Stringbu Java-da maxsus sinf va biz ushbu sinf ob'ektlarini yangi operator yordamida yaratishimiz mumkin, xuddi biz ikkita tirnoq ichida satr qiymatini taqdim etish orqali ob'ektlar yaratishimiz mumkin. Quyidagi diagramma Java to'plamida string pulining qanday taqsimlanishi va satrlarni yaratishning turli usullaridan foydalanganda nima sodir bo'lishini tushuntiradi. Java String.  Suhbat uchun savollar va javoblar, 2 - 2 qismSatrlarni birlashtirish faqat Java-ning satrlarning o'zgarmasligi va string interning g'oyasini amalga oshirish tufayli mumkin. String puli ham Flyweight naqshiga misoldir. String pool ko'p xotirani tejashga yordam beradi, lekin boshqa tomondan, qator yaratish ko'proq vaqt talab etadi. Satr yaratish uchun qo‘sh tirnoqdan foydalansak, u avval hovuzda bir xil qiymatga ega satrni qidiradi, agar topilsa, shunchaki havolani qaytaradi, aks holda hovuzda yangi satr yaratiladi va keyin havolani qaytaradi. Biroq, biz new operatoridan foydalanganda, biz sinfni Stringyangi string ob'ektini yaratishga majbur qilamiz va keyin biz intern()satrni hovuzga qo'yish usulidan foydalanishimiz yoki hovuzdan Stringxuddi shu qiymatga ega bo'lgan boshqa ob'ektga havola olishimiz mumkin. Quyida string pulining qanday ishlashini ko'rsatadigan misol keltirilgan.
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));
    }
}
Dastur quyidagilarni chiqaradi:
s1 == s2 :true
s1 == s3 :false

19. Intern() usuli nima qiladi?

Usul intern()chaqirilganda, agar string hovuzida bizning ob'ektimizga ekvivalent satr mavjud bo'lsa, bu usul bilan tasdiqlangan bo'lsa equals(Object), u holda hovuzdan satrga havola qaytariladi. Aks holda, string ob'ekti hovuzga qo'shiladi va bu ob'ektga havola qaytariladi. Bu usul har doim joriy satr bilan bir xil qiymatga ega bo'lgan satrni qaytaradi, lekin u noyob satrlar hovuzidan satr bo'lishini kafolatlaydi. Quyida usul qanday ishlashiga misol keltirilgan 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. Java-da strings thread xavfsizmi?

Satrlar o'zgarmasdir, shuning uchun biz ularning qiymatini dasturda o'zgartira olmaymiz. Shuning uchun ular ip bilan xavfsiz va ko'p tarmoqli muhitda xavfsiz foydalanish mumkin.

21. Nima uchun String Java-da HashMap-da mashhur kalit hisoblanadi?

Satrlar o'zgarmas bo'lgani uchun ularning xesh-kodi yaratilish vaqtida keshlanadi va qayta hisoblashni talab qilmaydi. Bu satrlarni kalit uchun ajoyib nomzod qiladi Mapva ular boshqa asosiy ob'ektlarga qaraganda tezroq qayta ishlanadi HashMap. Shuning uchun strings asosan kalit sifatida ishlatiladi HashMap. Umid qilamanki, ushbu maqolada keltirilgan savollar intervyuda sizga yordam beradi, agar biror narsani o'tkazib yuborgan bo'lsam, menga xabar bering. Asl maqolaga havola Muallif: Pankaj Kumar
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION