JavaRush /جاوا بلاگ /Random-UR /جاوا سٹرنگ۔ انٹرویو کے سوالات اور جوابات، حصہ 2
Andrey
سطح

جاوا سٹرنگ۔ انٹرویو کے سوالات اور جوابات، حصہ 2

گروپ میں شائع ہوا۔
بدقسمتی سے، مضمون ایک ٹکڑے میں فٹ نہیں ہوا؛ مجھے اسے دو حصوں میں تقسیم کرنا پڑا۔ آغاز یہاں دیکھیں Java String. Вопросы к собеседованию и ответы на них, ч.2 - 1

12. دی گئی سٹرنگ میں سب سے طویل پیلینڈروم تلاش کرنے کے لیے فنکشن لکھیں۔

ایک تار میں پیلینڈرومک سٹرنگ ہو سکتی ہے، اور سب سے لمبا پیلینڈروم تلاش کرنا پروگرامنگ کا معاملہ ہے۔ یہاں اہم نکتہ یہ ہے کہ کسی بھی پیلینڈروم کے وسط سے، اگر ہم 1 کریکٹر سے دائیں اور بائیں جائیں، تو یہ ہمیشہ ایک ہی کردار ہوگا۔ مثال کے طور پر، 12321، درمیانی حصہ 3 ہے، اور اگر ہم موجودہ پوزیشن سے دونوں سمتوں میں آگے بڑھتے ہیں، تو ہمیں 2 اور پھر 1 ملے گا۔ ہم اپنے جاوا پروگرام میں سب سے لمبا پیلینڈروم تلاش کرنے کے لیے اسی طرح کی منطق استعمال کرتے ہیں۔ تاہم، اگر پیلینڈروم کی لمبائی برابر ہے، تو درمیان کی لمبائی بھی برابر ہے، لہذا ہمیں یہ یقینی بنانا ہوگا کہ یہ ہمارے پروگرام میں بھی فراہم کیا گیا ہے، مثال کے طور پر، 12333321، درمیانی 33 ہے، اور اگر ہم حرکت جاری رکھیں دونوں سمتوں میں، ہمیں 3، 2 اور 1 ملے گا۔ ہمارے پروگرام میں، ہم نتیجے میں آنے والی سٹرنگ کو پہلے درمیان میں رکھتے ہیں اور بائیں اور دائیں حروف کو چیک کرتے ہیں۔ ہمارے پاس پیلینڈروم کی ابتدائی پوزیشن کو ذخیرہ کرنے کے لیے دو عالمی متغیرات بھی ہیں۔ ہمیں یہ بھی چیک کرنے کی ضرورت ہے کہ آیا کوئی لمبا پیلینڈروم پہلے سے موجود ہے، کیونکہ ہم ایک دی گئی تار میں متعدد پیلینڈروم تلاش کر سکتے ہیں۔ ذیل میں ایک مثالی پروگرام ہے جو تمام معاملات میں ٹھیک کام کرتا ہے۔ ہم وائل لوپ کو الگ طریقہ میں منتقل کر کے مذکورہ کوڈ کو بہتر بنا سکتے ہیں، لیکن میں وہ حصہ آپ کے لیے چھوڑ دوں گا۔ براہ کرم مجھے بتائیں کہ کیا آپ کے پاس بہتر نفاذ ہے یا اگر پروگرام کسی طرح ناکام ہوجاتا ہے۔
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 کے درمیان کیا فرق ہے۔

ایک سٹرنگ جاوا میں ناقابل تغیر اور حتمی شکل ہے، لہذا ہماری تمام سٹرنگ ہیرا پھیری ہمیشہ ایک نئی سٹرنگ بنائے گی۔ سٹرنگ کی ہیرا پھیری وسائل پر مبنی ہے، اس لیے جاوا سٹرنگ ہیرا پھیری کے لیے دو مفید کلاسز فراہم کرتا ہے - StringBufferاور StringBuilder. StringBufferاور StringBuilderتغیر پذیر کلاسز ہیں۔ کے ساتھ آپریشن StringBufferتھریڈ محفوظ اور مطابقت پذیر ہیں، لیکن طریقے StringBuilderتھریڈ محفوظ نہیں ہیں۔ لہذا جب ایک سے زیادہ تھریڈز ایک ہی سٹرنگ پر کام کر رہے ہوں تو ہمیں استعمال کرنا چاہیے StringBuffer، لیکن ایک ہی تھریڈ والے ماحول میں ہمیں استعمال کرنا چاہیے StringBuilder۔ StringBuilderاس سے زیادہ نتیجہ خیز StringBufferکیونکہ اس پر ہم آہنگی کا بوجھ نہیں ہے۔

14. جاوا میں سٹرنگ غیر تبدیل اور حتمی کیوں ہے؟

تار کی تبدیلی کے کئی فوائد ہیں:
  1. سٹرنگ پولنگ صرف اس لیے ممکن ہے کیونکہ جاوا میں سٹرنگ ناقابل تغیر ہے، اس طرح ورچوئل مشین بہت زیادہ جگہ بچاتی ہے کیونکہ مختلف سٹرنگ متغیر پول میں ایک ہی متغیر کی طرف اشارہ کرتے ہیں۔ اگر کوئی سٹرنگ ناقابل تغیر نہ ہوتی، تو سٹرنگ انٹرننگ ممکن نہیں ہوتی، کیونکہ اگر کوئی ویری ایبل اپنی ویلیو کو تبدیل کرتا ہے تو اس سٹرنگ کا حوالہ دینے والے دوسرے متغیرات بھی متاثر ہوں گے۔

  2. Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности applications. Например, Name пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так How строка неизменяемая, её meaning не может быть изменено, в противном случае любой хакер может изменить meaning ссылки и вызвать проблемы в безопасности applications.

  3. Так How строка неизменная, она безопасна для много поточности и один экземпляр строки может быть совместно использован различными нитями. Это позволяет избежать синхронизации для потокобезопасности, строки fully потокобезопасны.

  4. Строки используются в Java classloader и неизменность обеспечивает правильность загрузки класса при помощи Classloader. К примеру, задумайтесь об экземпляре класса, когда вы пытаетесь загрузить java.sql.Connection класс, но meaning ссылки изменено на 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 и хранится в пуле строк. С тех пор, How она была создана, она остается в пуле, пока не будет удалена сборщиком мусора, поэтому, когда мы думаем, что закончor работу с паролем, он остается доступным в памяти некоторое время, и нет способа избежать этого. Это риск безопасности, поскольку кто-либо, имеющий доступ к дампу памяти сможет найти пароль в виде чистого текста. Если мы используем массив символов для хранения пароля, мы можем очистить его после того, How закончим с ним работать. Таким образом, мы можем контролировать, How долго он находится в памяти, что позволяет избежать риска безопасности, свойственного строке.

17. Как вы проверите две строки на подобность в Java?

Есть два способа проверить, являются ли две строки эквивалентными – используя оператор “==”, or используя метод equals. Когда мы используем оператор “==”, он проверяет meaning строки, How ссылки, но в программировании большую часть времени мы проверяем эквивалентность строки только для значения. Поэтому мы должны использовать метод 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. What такое пул строк?

Как подсказывает название, пул строк – это набор строк, который хранится в памяти Java heap. Мы знаем, что String это специальный класс в Java, и мы можем создавать an objectы этого класса, используя оператор new точно так же, How и создавать an objectы, предоставляя meaning строки в двойных кавычках. Диаграмма ниже объясняет, How пул строк размещается в памяти Java heap и что происходит, когда мы используем различные способы создания строк. Java String. Вопросы к собеседованию и ответы на них, ч.2 - 2Пул строк возможен исключительно благодаря неизменяемости строк в Java и реализации идеи интернирования строк. Пул строк также является примером паттерна Приспособленец (Flyweight). Пул строк помогает экономить большой объем памяти, но с другой стороны создание строки занимает больше времени. Когда мы используем двойные кавычки для создания строки, сначала ищется строка в пуле с таким же meaningм, если находится, то просто возвращается link, иначе создается новая строка в пуле, а затем возвращается link. Тем не менее, когда мы используем оператор new, мы принуждаем класс String создать новый an object строки, а затем мы можем использовать метод intern() для того, чтобы поместить строку в пул, or получить из пула ссылку на другой an objectString с таким же meaningм. Ниже приведен пример, показывающий работу пула строк.
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. What делает метод intern()?

Когда метод intern() вызван, если пул строк уже содержит строку, эквивалентную к нашему an objectу, что подтверждается методом equals(Object), тогда возвращается link на строку из пула. В противном случае an object строки добавляется в пул и link на этот an object возвращается. Этот метод всегда возвращает строку, которая имеет то же meaning, что что и текущая строка, но гарантирует что это будет строка из пула уникальных строк. Ниже приведен пример работы метода 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?

Строки являются неизменными, поэтому мы не можем изменить их meaning в программе. Следовательно они потокобезопасные и могут благополучно использоваться в мультипоточном окружении.

21. Почему строка является популярным ключем в HashMap в Java?

Поскольку строки неизменны, их хэшcode кэшируется в момент создания, и не требует повторного пересчета. Это делает строки отличным кандидатом для ключа в Map и они обрабатываются быстрее, чем другие an objectы-ключи HashMap. Вот почему строки преимущественно используются в качестве ключей HashMap. Надеюсь, что вопросы, перечисленные в этой статье помогут вам на собеседованиях, пожалуйста, дайте мне знать, если я что-то пропустил. Ссылка на оригинальную статью Author: Pankaj Kumar
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION