JavaRush /Java блогы /Random-KK /Java жолы. Сұхбат сұрақтары мен жауаптары, 2 бөлім
Andrey
Деңгей

Java жолы. Сұхбат сұрақтары мен жауаптары, 2 бөлім

Топта жарияланған
Өкінішке орай, мақала бір фрагментке сыймай қалды, мен оны екі бөлікке бөлуге тура келді. Бастауын мына жерден қараңыз Java жолы.  Сұхбат сұрақтары мен жауаптары, 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 тілінде аяқталады, сондықтан біздің барлық жол манипуляциялары әрқашан жаңа жолды жасайды. Жолды манипуляциялау ресурсты қажет етеді, сондықтан 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. Бұл жолдың кілт ретінде пайдаланылатын ең жиі қолданылатын нысан болып табылатын себебі 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 үймесінде сақталатын жолдар жинағы болып табылады. Біз бұл Java тіліндегі арнайы класс екенін білеміз Stringжәне біз қос тырнақшаға жолдың мәнін беру арқылы нысандарды жасай алатынымыз сияқты, жаңа операторды пайдаланып осы сыныптың нысандарын жасай аламыз. Төмендегі диаграмма Java үймесінде жол пулының қалай бөлінетінін және жолдарды жасаудың әртүрлі жолдарын пайдаланған кезде не болатынын түсіндіреді. Java жолы.  Сұхбат сұрақтары мен жауаптары, 2 - 2 бөлімЖолдарды біріктіру Java-ның жолдардың өзгермейтіндігінің және жолды интернинг идеясын жүзеге асырудың арқасында ғана мүмкін болады. Жолдық пул да Flyweight үлгісінің мысалы болып табылады. Жолдық пул көп жадты сақтауға көмектеседі, бірақ екінші жағынан, жолды жасау көп уақытты алады. Жолды жасау үшін қос тырнақшаларды пайдаланған кезде, ол алдымен пулда бірдей мәнге ие жолды іздейді, егер табылса, жай ғана сілтемені қайтарады, әйтпесе пулда жаңа жол жасалады, содан кейін сілтемені қайтарады. Дегенмен, біз new операторын пайдаланған кезде, біз сыныпты Stringжаңа жол нысанын жасауға мәжбүрлейміз, содан кейін 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()шақырылғанда, егер жол пулында әдіс арқылы тексерілген нысанға баламалы жол бар болса equals(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 Java тіліндегі HashMap жүйесінде танымал кілт болып табылады?

Жолдар өзгермейтін болғандықтан, олардың хэш-codeы жасау кезінде кэштеледі және қайта есептеуді қажет етпейді. Бұл жолдарды кілт үшін тамаша үміткер етеді Mapжәне олар басқа негізгі нысандарға қарағанда жылдамырақ өңделеді HashMap. Міне, сондықтан жолдар негізінен кілттер ретінде пайдаланылады HashMap. Осы мақалада келтірілген сұрақтар сұхбаттарыңызға көмектеседі деп үміттенемін, егер мен бірдеңені жіберіп алған болсам, маған хабарлаңыз. Түпнұсқа мақалаға сілтеме Authorы: Панкадж Кумар
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION