JavaRush /Java блогу /Random-KY /Java String. Интервью суроолору жана жооптору, 2-бөлүк
Andrey
Деңгээл

Java String. Интервью суроолору жана жооптору, 2-бөлүк

Группада жарыяланган
Тилекке каршы, макала бир фрагментке батпай, аны эки бөлүккө бөлүүгө туура келди. Башын бул жерден көрүңүз Java String.  Интервью суроолору жана жооптору, 2-1-бөлүк

12. Берилген катардагы эң узун палиндромду табуу функциясын жазыңыз

Сапта палиндромдук саптар болушу мүмкүн жана эң узун палиндромду табуу программалоо маселеси. Бул жерде эң негизги нерсе, ар кандай палиндромдун ортосунан баштап, оңго жана солго 1 белгиге бара турган болсок, ал ар дайым бирдей болуп калат. Мисалы, 12321, ортосу 3, эгер азыркы абалдан эки тарапка тең жылышыбызды улантсак, анда 2, андан кийин 1 болот. Эң узун палиндромду табуу үчүн Java программабызда ушундай логиканы колдонобуз. Бирок, эгерде палиндромдун узундугу жуп болсо, ортосунун узундугу да жуп, андыктан бул биздин программада да каралганын текшеришибиз керек, мисалы, 12333321, ортосу 33, эгер биз жыла берсек эки багытта, биз 3, 2 жана 1 алабыз. Биздин программада, биз биринчи орунда ортосу менен пайда болгон сап аркылуу өтүп, сол жана оң символдорду текшеребиз. Бизде ошондой эле палиндромдун баштапкы абалын сактоо үчүн эки глобалдык өзгөрмө бар. Биз ошондой эле узунураак палиндромдун табылганын текшеришибиз керек, анткени биз берилген сапта бир нече палиндром таба алабыз. Төмөндө бардык учурларда жакшы иштеген мисал программа болуп саналат. Биз жогорудагы codeду 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 тorнде жыйынтыкталган, ошондуктан биздин бардык саптык манипуляциялар ар дайым жаңы сапты жаратат. Сап менен иштөө ресурстарды көп талап кылат, ошондуктан Java сап менен иштөө үчүн эки пайдалуу классты камсыз кылат - StringBufferжана StringBuilder. StringBufferжана StringBuilderөзгөрүлүүчү класстар. менен операциялар StringBufferжип коопсуз жана синхрондоштуруу, бирок ыкмалары StringBuilderжип коопсуз эмес. Ошентип, бир сапта бир нече жип иштеп жатканда биз колдонушубуз керек StringBuffer, бирок бир жиптүү чөйрөдө биз колдонушубуз керек StringBuilder. синхрондоштуруу менен жүк болбогондуктан StringBuilderжемиштүү .StringBuffer

14. Эмне үчүн Java тorнде сап өзгөрүлгүс жана жыйынтыкталган?

Саптын өзгөрбөшүнүн бир нече артыкчылыктары бар:
  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 тorндеги эки саптын окшоштугун кантип текшересиз?

Эки саптын эквиваленттүү экендигин текшерүүнүн эки жолу бар - “ ==” операторун же 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 үймөгүндө сакталган саптардын жыйындысы. Бул Java тorндеги өзгөчө класс экенин билебиз Stringжана биз бул класстын an objectтерин кош тырмакчага саптын маанисин берүү аркылуу an objectтерди түзгөндөй эле, жаңы оператордун жардамы менен түзө алабыз. Төмөнкү диаграмма Java үймөгүндө сап пулунун кантип бөлүштүрүлгөнүн жана саптарды түзүүнүн ар кандай жолдорун колдонгондо эмне болоорун түшүндүрөт. Java String.  Интервью суроолору жана жооптору, 2-2-бөлүкСаптарды бириктирүү Javaнын саптардын өзгөрбөстүгү жана сап интернинг идеясын ишке ашыруунун аркасында гана мүмкүн болот. Сап бассейни да Flyweight үлгүсүнүн мисалы болуп саналат. String pool көп эстутумду үнөмдөөгө жардам берет, бирок экинчи жагынан, сапты түзүү көбүрөөк убакытты талап кылат. Сапты түзүү үчүн кош тырмакчаларды колдонгондо, ал адегенде бассейнден бирдей маанидеги сапты издейт, эгер табылса, анда жөн гана шилтемени кайтарат, антпесе бассейнде жаңы сап түзүлүп, андан кийин маалымдаманы кайтарат. Бирок, биз жаңы операторду колдонгондо, классты Stringжаңы сап an objectин түзүүгө мажбурлайбыз, андан кийин intern()сапты бассейнге салуу ыкмасын колдоно алабыз, же бассейнден Stringошол эле маанидеги башка an objectке шилтеме ала алабыз. Төмөндө сап пулдун кантип иштээрин көрсөткөн мисал келтирилген.
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(), метод менен текшерилгендей, сап бассейни биздин 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 тorнде жиптер коопсузбу?

Саптар өзгөрүлгүс, ошондуктан программадагы алардын маанисин өзгөртө албайбыз. Ошондуктан алар жип коопсуз жана көп жиптүү чөйрөдө коопсуз колдонсо болот.

21. Эмне үчүн String Javaдагы HashMap'те популярдуу ачкыч болуп саналат?

Саптар өзгөрүлгүс болгондуктан, алардын хэш-codeу түзүлгөн учурда кэште сакталат жана кайра эсептөөнү талап кылbyte. Бул саптарды ачкыч үчүн эң сонун талапкер кылат Mapжана алар башка негизги an objectтерге караганда тезирээк иштетилет HashMap. Ошондуктан саптар көбүнчө ачкыч катары колдонулат HashMap. Бул макалада келтирилген суроолор маектериңизге жардам берет деп үмүттөнөм, эгер мен бир нерсени өткөрүп жиберсем, мага кабарлаңыз. Баштапкы макалага шилтеме Author: Pankaj Kumar
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION