JavaRush /Java Blogu /Random-AZ /Java String. Müsahibə sualları və cavabları, 2-ci hissə
Andrey
Səviyyə

Java String. Müsahibə sualları və cavabları, 2-ci hissə

Qrupda dərc edilmişdir
Təəssüf ki, məqalə bir fraqmentə sığmadı, onu iki hissəyə bölmək məcburiyyətində qaldım. Burada başlanğıca baxın Java String.  Müsahibə sualları və cavabları, 2-ci hissə - 1

12. Verilmiş sətirdə ən uzun palindromu tapmaq funksiyasını yazın

Sətirdə palindromik sətirlər ola bilər və ən uzun palindromu tapmaq proqramlaşdırma məsələsidir. Burada əsas məqam ondan ibarətdir ki, istənilən palindromun ortasından 1 simvolla sağa və sola getsək, həmişə eyni xarakter olacaq. Məsələn, 12321, orta 3-dür və hər iki istiqamətdə indiki mövqedən hərəkət etməyə davam etsək, 2 və sonra 1 alacağıq. Ən uzun palindromu tapmaq üçün Java proqramımızda oxşar məntiqdən istifadə edirik. Ancaq palindromun uzunluğu cütdürsə, ortanın uzunluğu da bərabərdir, ona görə də bunun proqramımızda da nəzərdə tutulduğuna əmin olmalıyıq, məsələn, 12333321, orta 33 və hərəkətə davam etsək hər iki istiqamətdə 3, 2 və 1 alacağıq. Proqramımızda ilk növbədə ortası olan sətirdən keçirik və sol və sağ simvolları yoxlayırıq. Palindromun ilkin mövqeyini saxlamaq üçün iki qlobal dəyişənimiz də var. Biz həmçinin artıq tapılmış daha uzun palindromun olub-olmadığını yoxlamaq lazımdır, çünki verilmiş sətirdə çoxlu palindrom tapa bilərik. Aşağıda bütün hallarda yaxşı işləyən bir proqram nümunəsidir. while dövrəsini ayrıca metoda köçürməklə yuxarıdakı kodu təkmilləşdirə bilərik, lakin mən o hissəni sizin üçün buraxacağam. Daha yaxşı bir tətbiqiniz varsa və ya proqram hansısa şəkildə uğursuz olarsa, mənə bildirin.
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);
    }
}
Proqram aşağıdakıları çıxaracaq:
1
12321
12321
12333321
454454

13. String, StringBuffer və StringBuilder arasındakı fərqlər nələrdir

Sətir dəyişməzdir və Java-da yekunlaşdırılır, ona görə də bizim bütün sətir manipulyasiyalarımız həmişə yeni sətir yaradacaq. String manipulyasiya resurs intensivdir, ona görə də Java simli manipulyasiya üçün iki faydalı sinif təqdim edir - StringBufferStringBuilder. StringBufferStringBuilderdəyişkən siniflərdir. ilə əməliyyatlar StringBuffermövzu təhlükəsizdir və sinxronlaşdırılır, lakin üsullar StringBuilderiplik təhlükəsiz deyil. Beləliklə, eyni sətirdə birdən çox mövzu işləyərkən istifadə etməliyik StringBuffer, ancaq bir yivli mühitdə istifadə etməliyik StringBuilder. sinxronizasiya ilə yüklənmədiyindən StringBuilderdaha məhsuldardır .StringBuffer

14. Java-da niyə sətir dəyişməz və yekunlaşdırılır?

Simli dəyişməzliyin bir sıra üstünlükləri var:
  1. Sətirlərin birləşdirilməsi yalnız Java-da sətir dəyişməz olduğu üçün mümkündür, beləliklə, virtual maşın çoxlu yığın sahəsinə qənaət edir, çünki müxtəlif simli dəyişənlər hovuzda eyni dəyişənə işarə edir. Əgər sətir dəyişməz olmasaydı, o zaman string interning mümkün olmazdı, çünki hər hansı dəyişən öz dəyərini dəyişərsə, həmin sətirə istinad edən digər dəyişənlər də təsirlənəcək.

  2. Sətir dəyişkəndirsə, o zaman proqram üçün ciddi təhlükəsizlik riskinə çevrilir. Məsələn, verilənlər bazası istifadəçi adı və parol verilənlər bazası ilə əlaqə əldə etmək üçün sətir kimi ötürülür və soket proqramlaşdırmasında host və port detalları sətir kimi ötürülür. Sətir dəyişməz olduğundan onun dəyərini dəyişmək mümkün deyil, əks halda istənilən haker linkin dəyərini dəyişə və proqramın təhlükəsizliyində problemlər yarada bilər.

  3. Sətir dəyişilməz olduğundan, o, ip üçün təhlükəsizdir və sətirin bir nümunəsi müxtəlif mövzular arasında paylaşıla bilər. Bu, iplik təhlükəsizliyi üçün sinxronizasiyadan qaçınır, simlər tamamilə təhlükəsizdir.

  4. Sətirlər Java-da istifadə olunur classloadervə dəyişməzlik sinifin istifadə edərək düzgün yüklənməsini təmin edir Classloader. Məsələn, bir sinfi yükləməyə çalışdığınız zaman bir sinif nümunəsi haqqında düşünün , lakin istinad dəyəri verilənlər bazanıza arzuolunmaz şeylər edə biləcək bir sinfə java.sql.Connectiondəyişdirilir .myhacked.Connection

  5. Sətir dəyişilməz olduğundan, hashcodeyaradılan zaman yaddaşda saxlanılır və onu yenidən hesablamağa ehtiyac yoxdur. Bu, simli açar üçün əla namizəd edir Mapvə onun işlənməsi digər açarlardan daha sürətli olacaq HashMap. Sətirin açar kimi istifadə olunan ən çox istifadə edilən obyekt olmasının səbəbi budur HashMap.

15. Simi hissələrə necə bölmək olar?

split(String regex)Biz ayırıcı kimi müntəzəm ifadədən istifadə edərək sətri sətirlər massivinə bölmək üçün metoddan istifadə edə bilərik .
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));
    }
}
Metod, split(String regex, int numOfStrings)sətri müəyyən sayda sətirə bölmək üçün həddindən artıq yüklənmiş bir üsuldur. Normal ifadəli xüsusi simvolları adi simvollar kimi istifadə etmək üçün tərs xəttdən istifadə edə bilərik. Proqram aşağıdakıları çıxaracaq:
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. Niyə parolun saxlanması üçün sətir massivi sətirdən üstündür?

Sətir Java-da dəyişməzdir və sətir hovuzunda saxlanılır. Yarandıqdan sonra zibil yığılana qədər hovuzda qalır, ona görə də parolla işimiz bitdiyini düşündüyümüz zaman bir müddət yaddaşda qalır və bundan qaçmaq üçün heç bir yol yoxdur. Bu təhlükəsizlik riskidir, çünki yaddaş zibilinə girişi olan hər kəs parolu aydın mətndə tapa biləcək. Şifrəni saxlamaq üçün simvol massivindən istifadə etsək, onunla işimiz bitdikdən sonra onu təmizləyə bilərik. Bu yolla onun yaddaşda nə qədər qalacağına nəzarət edə, sətirə xas olan təhlükəsizlik risklərindən qaça bilərik.

17. Java-da iki sətri oxşarlıq üçün necə yoxlamaq olar?

İki sətirin ekvivalent olub-olmadığını yoxlamağın iki yolu var - “ ==” operatorundan və ya equals. “ ” operatorundan istifadə etdikdə ==o, istinad kimi sətirin dəyərini yoxlayır, lakin proqramlaşdırmada biz çox vaxt sətir ekvivalentliyini yalnız qiymətə görə yoxlayırıq. Buna görə də, bərabərlik üçün iki sətri yoxlamaq üçün bərabər üsuldan istifadə etməliyik. equalsIgnoreCaseİşə məhəl qoymamaq üçün istifadə edə biləcəyimiz bir üsul da var .
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. Simli hovuz nədir?

Adından göründüyü kimi, simli hovuz Java yığınında saxlanılan sətirlər toplusudur. Biz bilirik ki, Stringbu, Java-da xüsusi bir sinifdir və biz ikiqat dırnaq içərisində sətirin dəyərini təqdim etməklə obyektlər yarada bildiyimiz kimi, yeni operatordan istifadə edərək bu sinifin obyektlərini yarada bilərik. Aşağıdakı diaqram sətir hovuzunun Java yığınında necə ayrıldığını və sətirlər yaratmaq üçün müxtəlif üsullardan istifadə etdikdə nə baş verdiyini izah edir. Java String.  Müsahibə sualları və cavabları, 2-ci hissəSətirlərin birləşdirilməsi yalnız Java-nın sətirlərin dəyişməzliyi və string interning ideyasının həyata keçirilməsi sayəsində mümkündür. Simli hovuz da Flyweight modelinə bir nümunədir. String pool çox yaddaşa qənaət etməyə kömək edir, lakin digər tərəfdən sıra yaratmaq daha çox vaxt aparır. Biz sətir yaratmaq üçün qoşa dırnaq işarələrindən istifadə etdikdə, o, əvvəlcə hovuzda eyni dəyərə malik sətir axtarır, tapılarsa, sadəcə istinadı qaytarır, əks halda hovuzda yeni sətir yaradılır və sonra istinadı qaytarır. Bununla belə, biz new operatorundan istifadə etdikdə biz sinfi Stringyeni string obyekt yaratmağa məcbur edirik və sonra sətri hovuza yerləşdirmək üçün metoddan istifadə edə bilərik intern()və ya hovuzdan Stringeyni qiymətə malik başqa obyektə istinad ala bilərik. Aşağıda simli hovuzun necə işlədiyini göstərən bir nümunə verilmişdir.
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));
    }
}
Proqram aşağıdakıları çıxaracaq:
s1 == s2 :true
s1 == s3 :false

19. Intern() metodu nə edir?

Metod çağırıldıqda intern(), əgər sətir hovuzu metodu ilə təsdiqləndiyi kimi obyektimizə ekvivalent sətir artıq ehtiva edirsə equals(Object), o zaman hovuzdan sətirə istinad qaytarılır. Əks halda, sətir obyekti hovuza əlavə edilir və həmin obyektə istinad qaytarılır. Bu üsul həmişə cari sətirlə eyni dəyərə malik olan sətri qaytarır, lakin onun unikal sətirlər hovuzundan sətir olacağına zəmanət verir. Aşağıda metodun necə işlədiyinə dair bir nümunə verilmişdir 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 sətirlər təhlükəsizdirmi?

Sətirlər dəyişməzdir, ona görə də proqramda onların dəyərini dəyişə bilmərik. Buna görə də onlar iplik təhlükəsizdir və çox yivli mühitdə təhlükəsiz şəkildə istifadə edilə bilər.

21. Nə üçün String Java-da HashMap-da populyar açardır?

Sətirlər dəyişməz olduğundan, onların hash kodu yaradılarkən yaddaşda saxlanılır və yenidən hesablama tələb etmir. Bu, sətirləri açar üçün əla namizəd edir Mapvə onlar digər əsas obyektlərdən daha sürətli işlənir HashMap. Buna görə də sətirlər əsasən açar kimi istifadə olunur HashMap. Ümid edirəm ki, bu məqalədə sadalanan suallar müsahibələrinizdə sizə kömək edəcək, zəhmət olmasa, nəyisə qaçırmışamsa, mənə bildirin. Orijinal məqaləyə keçid Müəllif: Pankaj Kumar
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION