JavaRush /Блоги Java /Random-TG /Java String. Саволҳо ва ҷавобҳои мусоҳиба, қисми 2
Andrey
Сатҳи

Java String. Саволҳо ва ҷавобҳои мусоҳиба, қисми 2

Дар гурӯҳ нашр шудааст
Мутаассифона, мақола дар як порча ҷойгир нашуд ва ман маҷбур шудам, ки онро ба ду қисм тақсим кунам. Аввалро дар ин ҷо бубинед Java String.  Саволҳо ва ҷавобҳои мусоҳиба, қисми 2 - 1

12. Функсияе нависед, ки дар сатри додашуда палиндроми дарозтаринро ёбад

Сатр метавонад дорои сатрҳои палиндромӣ бошад ва дарёфти дарозтарин палиндром масъалаи барномасозӣ аст. Нуқтаи асосӣ дар ин ҷо ин аст, ки аз мобайни ҳама гуна палиндром, агар мо 1 аломат ба рост ва чап равем, он ҳамеша як аломат хоҳад буд. Масалан, 12321, миёна 3 аст ва агар мо аз мавқеъи кунунӣ дар ҳар ду самт ҳаракатро идома диҳем, мо 2 ва баъд 1 мегирем. Мо дар барномаи Java-и худ мантиқи шабеҳро барои ёфтани палиндром дарозтарин истифода мебарем. Аммо, агар дарозии палиндром ҷуфт бошад, дарозии миёна ҳам ҷуфт аст, бинобар ин мо бояд боварӣ ҳосил кунем, ки ин дар барномаи мо низ пешбинӣ шудааст, масалан, 12333321, миёна 33 аст ва агар мо ҳаракатро идома диҳем. дар ҳарду самт, мо 3, 2 ва 1-ро мегирем. Дар барномаи мо мо сатри ҳосилшударо бо миёнаш дар ҷои аввал мегузарем ва аломатҳои чап ва ростро тафтиш мекунем. Мо инчунин ду тағирёбандаи глобалӣ дорем, ки мавқеи ибтидоии палиндромро нигоҳ доранд. Мо инчунин бояд тафтиш кунем, ки оё палиндромҳои дарозтар аллакай ёфт шудаанд, зеро мо метавонем дар сатри додашуда якчанд палиндромҳоро пайдо кунем. Дар зер як барномаи намунавӣ оварда шудааст, ки дар ҳама ҳолатҳо хуб кор мекунад. Мо метавонем рамзи дар боло зикршударо тавассути интиқол додани ҳалқаи while ба усули алоҳида такмил диҳем, аммо ман он қисматро барои шумо мегузорам. Лутфан ба ман хабар диҳед, ки оё шумо татбиқи беҳтаре доред ё барнома бо ягон роҳ ноком мешавад.
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);
    }
}
Барнома инҳоро мебарорад:
1
12321
12321
12333321
454454

13. Фарқи байни String, StringBuffer ва StringBuilder чист

Сатр дар Java тағирнопазир аст ва ба охир мерасад, аз ин рӯ ҳама коркардҳои сатри мо ҳамеша сатри нав эҷод мекунанд. Манипуляцияи сатр захираҳои пуршиддат аст, аз ин рӯ Java ду синфи муфидро барои коркарди сатр таъмин мекунад - StringBufferва StringBuilder. StringBufferва StringBuilderсинфҳои тағйирёбанда мебошанд. Амалиёт бо StringBufferришта бехатар ва ҳамоҳангшуда аст, аммо усулҳо StringBuilderришта бехатар нестанд. Ҳамин тавр, вақте ки риштаҳои сершумор дар як сатр кор мекунанд, мо бояд -ро истифода барем StringBuffer, аммо дар муҳити ягонаи ришта мо бояд -ро истифода барем StringBuilder. StringBuilderсермахсултар аз он StringBufferсабаб аст, ки бо синхронизатсия бори гарон нест.

14. Чаро сатр дар Java тағирнопазир ва ниҳоӣ карда мешавад?

Якчанд афзалиятҳои тағирнопазирии сатр мавҷуданд:
  1. Якҷоякунии сатрҳо танҳо имконпазир аст, зеро сатр дар Java тағирнопазир аст, аз ин рӯ мошини виртуалӣ фазои зиёдеро сарфа мекунад, зеро тағирёбандаҳои сатри гуногун ба як тағирёбанда дар ҳавз ишора мекунанд. Агар сатр ивазнашаванда намебуд, он гоҳ интернинги сатр имконнопазир буд, зеро агар ягон тағирёбанда арзиши худро тағир диҳад, дигар тағирёбандаҳое, ки ба ин сатр ишора мекунанд, низ таъсир хоҳанд кард.

  2. Агар сатр тағйирёбанда бошад, он гоҳ хатари ҷиддии амниятӣ барои барнома мегардад. Масалан, номи корбар ва пароли махзани маълумот ҳамчун сатр барои ба даст овардани пайвастшавӣ ба пойгоҳи додаҳо ва дар барномасозии розетка тафсилоти хост ва порт ҳамчун сатр интиқол дода мешаванд. Азбаски сатр тағирнопазир аст, арзиши онро тағир додан мумкин нест, вагарна ҳар як ҳакер метавонад арзиши пайвандро тағир диҳад ва дар амнияти барнома мушкилот эҷод кунад.

  3. Азбаски сатр тағирнопазир аст, он барои ришта бехатар аст ва як мисоли сатрро дар байни риштаҳои гуногун мубодила кардан мумкин аст. Ин синхронизатсияро барои бехатарии ришта пешгирӣ мекунад, сатрҳо комилан бехатар мебошанд.

  4. Сатрҳо дар Java истифода мешаванд classloaderва тағирнопазирӣ кафолат медиҳад, ки синф бо истифода аз Classloader. Масалан, ҳангоми кӯшиши бор кардани синф дар бораи як мисоли синф фикр кунед java.sql.Connection, аммо арзиши истинод ба myhacked.Connectionсинфе иваз карда мешавад, ки метавонад ба пойгоҳи додаи шумо корҳои номатлуб кунад.

  5. Азбаски сатр тағирнопазир аст, он hashcodeдар вақти офариниш кэш карда мешавад ва зарурати дубора ҳисоб кардани он нест. Ин сатрро номзади олӣ барои калид месозад Mapва коркарди он нисбат ба дигар калидҳо тезтар мешавад HashMap. Ин сабаби он аст, ки сатр an objectи маъмултаринест, ки ҳамчун калид истифода мешавад HashMap.

15. Сатрро чї тавр ба ќисмњо људо кардан мумкин аст?

Мо метавонем усули split(String regex)тақсим кардани сатрро ба массиви сатрҳо бо истифода аз ифодаи муқаррарӣ ҳамчун ҷудокунанда истифода барем.
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));
    }
}
Ин усул split(String regex, int numOfStrings)як усули аз ҳад зиёд барои тақсим кардани сатр ба шумораи муайяни сатрҳо мебошад. Мо метавонем хатҳои баръаксро истифода барем, то аломатҳои махсуси ифодаи муқаррариро ҳамчун аломатҳои муқаррарӣ истифода барем. Барнома инҳоро мебарорад:
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. Чаро массиви сатр барои нигахдории парол аз сатр афзалтар аст?

Сатр дар Java тағирнопазир аст ва дар ҳавзи сатр нигоҳ дошта мешавад. Пас аз он ки он сохта мешавад, он дар ҳавз мемонад, то он даме, ки партов ҷамъоварӣ карда шавад, аз ин рӯ, вақте ки мо фикр мекунем, ки парол кор карда шуд, он муддате дар хотира боқӣ мемонад ва ҳеҷ роҳе барои пешгирӣ кардани ин вуҷуд надорад. Ин хатари амният аст, зеро ҳар касе, ки ба партовҳои хотира дастрасӣ дорад, метавонад паролро дар матни равшан пайдо кунад. Агар мо барои нигоҳ доштани парол массиви аломатҳоро истифода барем, мо метавонем онро пас аз анҷом додани он тоза кунем. Бо ин роҳ, мо метавонем назорат кунем, ки то чӣ андоза он дар хотира боқӣ мемонад ва аз хатарҳои амниятӣ, ки ба сатр хос аст, канорагирӣ кунем.

17. Чӣ тавр шумо ду сатрро барои шабоҳат дар Java тафтиш мекунед?

Ду роҳи санҷиши баробар будани ду сатр вуҷуд дорад - бо истифода аз ==оператори “ ” ё бо истифода аз equals. Вақте ки мо оператори " =="-ро истифода мебарем, он арзиши сатрро ҳамчун истинод месанҷад, аммо дар барномасозӣ аксар вақт мо эквивалентии сатрро танҳо барои арзиш тафтиш мекунем. Аз ин рӯ, мо бояд усули баробарро барои санҷиши ду сатр барои баробарӣ истифода барем. Инчунин як усуле ҳаст, equalsIgnoreCaseки мо метавонем онро сарфи назар кунем.
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. Ҳавзи сатрӣ чист?

Тавре ки аз ном бармеояд, ҳавзи сатр маҷмӯи сатрҳоест, ки дар теппаи Java нигоҳ дошта мешаванд. Мо медонем, ки Stringин як синфи махсус дар Java аст ва мо метавонем an objectҳои ин синфро бо истифода аз оператори нав созем, ҳамон тавре ки мо метавонем an objectҳоро тавассути пешниҳоди арзиши сатр дар нохунакҳои дугона эҷод кунем. Диаграммаи зер мефаҳмонад, ки чӣ тавр ҳавзи сатр дар теппаи Java ҷудо карда мешавад ва вақте ки мо роҳҳои гуногуни эҷоди сатрҳоро истифода мебарем, чӣ мешавад. Java String.  Саволҳо ва ҷавобҳои мусоҳиба, қисми 2 - 2Якҷоякунии сатрҳо танҳо аз сабаби тағирнопазирии сатрҳои Java ва татбиқи идеяи интернинги сатр имконпазир аст. Ҳавзи сатр инчунин намунаи намунаи Flyweight мебошад. Пойгоҳи сатр барои сарфаи хотираи зиёд кӯмак мекунад, аммо аз тарафи дигар, сохтани сатр вақти бештарро талаб мекунад. Вақте ки мо барои сохтани сатр аз нохунакҳои дукарата истифода мебарем, он аввал дар ҳавз сатри дорои ҳамон арзишро меҷӯяд, агар пайдо шавад, он гоҳ истинодро бармегардонад, вагарна сатри нав дар ҳавз сохта мешавад ва сипас истинодро бармегардонад. Аммо, вақте ки мо оператори навро истифода мебарем, мо синфро маҷбур мекунем String, ки an objectи сатри нав эҷод кунад ва он гоҳ мо метавонем ин усулро барои гузоштани сатр ба ҳавз истифода барем ё аз ҳавз ба an objectи дигар бо ҳамон арзиш 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));
    }
}
Барнома инҳоро мебарорад:
s1 == s2 :true
s1 == s3 :false

19. Усули intern() чӣ кор мекунад?

Вақте ки усул intern()даъват карда мешавад, агар ҳавзи сатр аллакай сатри муодor an objectи моро дошта бошад, ки бо усули тасдиқшуда тасдиқ карда мешавад equals(Object), истинод ба сатр аз ҳавз баргардонида мешавад. Дар акси ҳол, an objectи сатр ба ҳавз илова карда мешавад ва истинод ба он an object баргардонида мешавад. Ин усул ҳамеша сатреро бармегардонад, ки дорои арзиши якхела бо сатри ҷорӣ аст, аммо кафолат медиҳад, ки он сатр аз ҳавзи сатрҳои беназир хоҳад буд. Дар зер намунаи кор кардани усул оварда шудааст 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 бехатаранд?

Сатрҳо тағирнопазиранд, аз ин рӯ мо арзиши онҳоро дар барнома тағир дода наметавонем. Аз ин рӯ, онҳо ришта бехатаранд ва метавонанд дар муҳити чанд ришта бехатар истифода шаванд.

21. Чаро String калиди маъмул дар HashMap дар Java аст?

Азбаски сатрҳо тағирнопазиранд, codeи хэш-и онҳо ҳангоми эҷод кэш карда мешавад ва ҳисобкунии дубораро талаб намекунад. Ин сатрҳоро номзади беҳтарин барои калид месозад Mapва онҳо нисбат ба дигар an objectҳои калидӣ зудтар коркард мешаванд HashMap. Аз ин рӯ сатрҳо асосан ҳамчун калидҳо истифода мешаванд HashMap. Умедворам, ки саволҳои дар ин мақола овардашуда ба шумо дар мусоҳибаҳои шумо кӯмак хоҳанд кард, лутфан ба ман хабар диҳед, ки агар ман чизеро гум карда бошам. Истинод ба мақолаи аслӣ Муаллиф: Панкаҷ Кумар
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION