JavaRush /Java Blog /Random-TK /Java setiri. Soraglar we jogaplar, 2-nji bölüm
Andrey
Dereje

Java setiri. Soraglar we jogaplar, 2-nji bölüm

Toparda çap edildi
Gynansagam, makala bir bölege gabat gelmedi, ony iki bölege bölmeli boldum. Başlangyjy şu ýere serediň Java setiri.  Soraglar we jogaplar, 2-nji bölüm

12. Berlen setirde iň uzyn palindromy tapmak üçin bir funksiýa ýazyň

Bir setirde palindrom setirleri bolup biler we iň uzyn palindromy tapmak programmirlemek meselesidir. Bu ýerde esasy zat, islendik palindromyň ortasyndan saga we çepe 1 simwol bilen gitsek, elmydama şol bir häsiýet bolar. Mysal üçin, 12321, ortasy 3, häzirki ýagdaýdan iki tarapa hereket etmegi dowam etdirsek, 2-den soň alarys. Iň uzyn palindromy tapmak üçin Java programmamyzda şuňa meňzeş logikany ulanýarys. Şeýle-de bolsa, palindromyň uzynlygy deň bolsa, ortanyň uzynlygy hem deňdir, şonuň üçin munuň hem programmamyzda üpjün edilendigine göz ýetirmeli, mysal üçin 12333321, ortasy 33, we hereketimizi dowam etdirsek iki tarapa-da 3, 2 we 1 alarys. Programmamyzda emele gelen setiri ilki bilen ortasy bilen geçýäris we çep we sag nyşanlary barlaýarys. Palindromyň başlangyç ýagdaýyny saklamak üçin iki sany global üýtgeýjimiz bar. Şeýle hem, eýýäm tapylan has uzyn palindromyň bardygyny ýa-da ýokdugyny barlamaly, sebäbi belli bir setirde birnäçe palindrom tapyp bileris. Aşakda ähli ýagdaýlarda gowy işleýän mysal programmasy. Wagt aýlawyny aýratyn usula geçirip, ýokardaky kody gowulaşdyryp bileris, ýöne bu bölümi size goýaryn. Has gowy durmuşa geçirilendigiňizi ýa-da programma haýsydyr bir derejede şowsuz bolsa, maňa habar bermegiňizi haýyş edýärin.
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);
    }
}
Programma aşakdakylary çykarar:
1
12321
12321
12333321
454454

13. String, StringBuffer we StringBuilder arasynda nähili tapawutlar bar

Bir setir üýtgewsiz we Java-da gutarýar, şonuň üçin ähli setir manipulýasiýalarymyz elmydama täze setir döreder. Setir manipulýasiýasy resurslary köp talap edýär, şonuň üçin Java simli manipulýasiýa üçin iki sany peýdaly synp berýär - StringBufferwe StringBuilder. StringBufferwe StringBuilderüýtgeýän synplardyr. Amallar StringBuffersapak ygtybarly we sinhron, ýöne usullar StringBuilderhowpsuz däl. Şonuň üçin şol bir setirde birnäçe sapak işleýän mahaly ulanmaly StringBuffer, ýöne ýekeje sapakly gurşawda ulanmaly StringBuilder. sinhronizasiýa ýüklenmändigi sebäpli StringBuilderhas öndürijidir .StringBuffer

14. Näme üçin Java-da setir üýtgewsiz we gutarnykly?

Setir üýtgewsizliginiň birnäçe artykmaçlygy bar:
  1. Setirli basseýn diňe Java-da üýtgewsiz bolany üçin mümkindir, şonuň üçin wirtual maşyn dürli üýşmeleňleri howuzdaky şol bir üýtgeýjini görkezýändigi sebäpli köp üýşmek ýerini tygşytlaýar. Eger setir üýtgewsiz bolmadyk bolsa, onda setiriň kesilmegi mümkin bolmazdy, sebäbi haýsydyr bir üýtgeýjiniň bahasy üýtgese, şol setiri görkezýän beýleki üýtgeýjiler hem täsir eder.

  2. Setir üýtgäp bilýän bolsa, bu programma üçin çynlakaý howpsuzlyk töwekgelçiligine öwrülýär. Mysal üçin, maglumat bazasynyň ulanyjy ady we paroly maglumatlar bazasyna birikmek üçin setir hökmünde geçirilýär we rozetka programmirlemesinde öý eýesi we port jikme-jiklikleri setir hökmünde geçirilýär. Setir üýtgewsiz bolansoň, onuň bahasyny üýtgedip bolmaýar, ýogsam islendik haker baglanyşygyň bahasyny üýtgedip, programmanyň howpsuzlygynda kynçylyk döredip biler.

  3. Setir üýtgewsiz bolansoň, sapakdan howpsuz we setiriň bir mysalyny dürli sapaklaryň arasynda paýlaşyp bolýar. Bu sapaklaryň howpsuzlygy üçin sinhronlaşmakdan gaça durýar, setirler doly sapaklydyr.

  4. Setirler Java-da ulanylýar classloaderwe üýtgewsizlik synpyň dogry ulanylmagyny üpjün edýär Classloader. Mysal üçin, synp ýüklejek bolanyňyzda synp meselesi barada pikir ediň , ýöne maglumat bazasyna islenmeýän zatlary edip biljek synp java.sql.Connectionbahasy üýtgedilýär .myhacked.Connection

  5. Setir üýtgewsiz bolansoň, hashcodedöredilen wagty keş görnüşinde saklanýar we ony täzeden hasaplamagyň zerurlygy ýok. Bu setiri açar üçin ajaýyp kandidat edýär Mapwe gaýtadan işlemek beýleki düwmelerden has çalt bolar HashMap. Bu setiriň açar hökmünde iň köp ulanylýan obýekt bolmagynyň sebäbi HashMap.

15. Setiri böleklere nädip bölmeli?

split(String regex)Aýrylyşma hökmünde yzygiderli aňlatmany ulanyp, bir setiri setirleriň hataryna bölmek usulyny ulanyp bileris .
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));
    }
}
Bu usul, split(String regex, int numOfStrings)setiri belli bir setire bölmek üçin artykmaç usuldyr. Yzygiderli aňlatma aýratyn nyşanlary yzygiderli nyşan hökmünde ulanmak üçin arka çyzgydan peýdalanyp bileris. Programma aşakdakylary çykarar:
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. Näme üçin parol saklamak üçin setir massiwinden has ileri tutulýar?

Setir Java-da üýtgewsiz we simli howuzda saklanýar. Döredilenden soň, zibil ýygnanýança howuzda galar, şonuň üçin parol bilen gutardyk öýdüp, biraz wagtlap ýatda galar we munuň öňüni alyp bolmaz. Bu howpsuzlyk töwekgelçiligi, sebäbi ýat zibilhanasyna girip bilýänler paroly açyk tekstde tapyp bilerler. Paroly saklamak üçin simwol massiwini ulansak, ony gutaranymyzdan soň arassalap bileris. Şeýlelik bilen, setirde saklanýan howpsuzlyk töwekgelçiliklerinden gaça durup, onuň näçe wagt ýatda saklanýandygyny dolandyryp bileris.

17. Java-da meňzeşligi üçin iki setiri nädip barlamaly?

Iki setiriň deňdigini ýa-da ýokdugyny barlamagyň iki usuly bar - “ ==” operatory ulanmak ýa-da ulanmak equals. “” Operatoryny ulananymyzda ==, setiriň bahasyny salgylanma hökmünde barlaýar, ýöne programmirlemekde köplenç setiriň ekwiwalentligini diňe bahasy üçin barlaýarys. Şonuň üçin iki setiriň deňdigini ýa-da ýokdugyny barlamak üçin deň usuly ulanmalydyrys. equalsIgnoreCaseKazyýeti äsgermezlik etmek üçin ulanyp boljak usulymyz hem bar .
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. Setli howuz näme?

Adyndan görnüşi ýaly, simli howuz Java üýşmesinde saklanýan setirleriň ýygyndysydyr. Munuň Java-da aýratyn bir synpdygyny bilýäris Stringwe goşa sitatada bir setiriň bahasyny üpjün edip, obýekt döredip bilşimiz ýaly täze operator ulanyp, bu synpyň obýektlerini döredip bileris. Aşakdaky diagramma, Java üýşmesinde setir howzunyň nähili bölünip berilýändigini we setirleri döretmek üçin dürli usullary ulananymyzda nämeleriň bolýandygyny düşündirýär. Java setiri.  Soraglar we jogaplar, 2-nji bölümSetirli basseýn diňe Java-yň setirleriň üýtgewsizligi we setir interning ideýasynyň durmuşa geçirilmegi sebäpli mümkindir. Setli howuz, “Flyweight” nagşynyň mysalydyr. Setir howzy köp ýady tygşytlamaga kömek edýär, beýleki tarapdan hatar döretmek has köp wagt alýar. Setir döretmek üçin goşa dyrnak ulananymyzda, ilki bilen şol bir gymmaty bolan howuzda bir setir gözleýär, eger tapylsa diňe salgylanmany yzyna gaýtaryp berýär, ýogsam howuzda täze setir döredilýär we soňra salgylanma gaýtarylýar. Şeýle-de bolsa, täze operatory ulananymyzda, synpy täze simli obýekt döretmäge mejbur edýäris , soňra bolsa basseýni goýmak üçin Stringusuly ulanyp bileris ýa-da howuzdan şol bir gymmaty bolan başga bir obýekte salgylanma alyp bileris. Aşakda setir howzunyň nähili işleýändigini görkezýän mysal getirilýär. intern()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));
    }
}
Programma aşakdakylary çykarar:
s1 == s2 :true
s1 == s3 :false

19. Intern () usuly näme edýär?

Usul intern()çagyrylanda, usul bilen tassyklanylan setir howuzynda eýýäm obýektimize ekwiwalent bir setir bar bolsa equals(Object), howuzdaky setire salgylanma yzyna gaýtarylýar. Otherwiseogsam, basseýn setir obýekti goşulýar we şol obýekte salgylanma yzyna gaýtarylýar. Bu usul elmydama häzirki setir bilen deň bahasy bolan, ýöne özboluşly setirleriň basseýninden bir setir boljakdygyny kepillendirýär. Aşakda usulyň işleýşiniň mysaly 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 setir sapaklary ygtybarlymy?

Setirler üýtgewsiz, şonuň üçin programmada olaryň bahasyny üýtgedip bilmeris. Şonuň üçin olar sapak howpsuz we köp sapakly gurşawda howpsuz ulanylyp bilner.

21. Näme üçin Java-da HashMap-da meşhur açar?

Setirler üýtgewsiz bolansoň, olaryň hash kody döredilen wagty keş görnüşinde saklanýar we gaýtadan hasaplamagy talap etmeýär. Bu setirleri açar üçin ajaýyp kandidat edýär Mapwe beýleki möhüm obýektlerden has çalt işlenýär HashMap. Şonuň üçin setirler esasan açar hökmünde ulanylýar HashMap. Bu makalada görkezilen soraglar, söhbetdeşlikleriňizde size kömek eder diýip umyt edýärin, haýsydyr bir zady sypdyranymy maňa habar bermegiňizi haýyş edýärin. Asyl makala baglanyşyk Awtor: Pankaj Kumar
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION