JavaRush /Blog Java /Random-PL /Ciąg Java. Pytania i odpowiedzi na rozmowie kwalifikacyjn...
Andrey
Poziom 26

Ciąg Java. Pytania i odpowiedzi na rozmowie kwalifikacyjnej, część 1

Opublikowano w grupie Random-PL
Klasa ta Stringjest jedną z najczęściej używanych klas w Javie. W tym artykule przedstawiono kilka ważnych pytań i odpowiedzi dotyczących rozmów kwalifikacyjnych w języku Java String. Ciąg Java.  Pytania i odpowiedzi na rozmowie kwalifikacyjnej, część 1 - 1Będą bardzo pomocni w uzyskaniu pełnego obrazu klasy Stringi przygotują Cię do wszelkich Stringpytań związanych z rozmową kwalifikacyjną.

1. Co to jest ciąg w Javie? Jaki to typ danych?

String to klasa w Javie zdefiniowana w pakiecie java.lang. Nie jest to prymitywny typ danych, taki jak int i long. Klasa String reprezentuje zestaw znaków ciągu. Ciągi są używane w prawie wszystkich aplikacjach Java i jest kilka faktów, które powinniśmy wiedzieć o klasie String. Jest to niezmienny ( immutable) i sfinalizowany typ danych w Javie, a Stringmaszyna wirtualna przechowuje wszystkie obiekty klasy w puli ciągów. Kolejną cechą Stringjest sposób uzyskiwania obiektów klas Stringprzy użyciu podwójnych cudzysłowów i przeciążania operatora „+” w celu konkatenacji.

2. Jakie są różne sposoby tworzenia obiektu String?

Możemy tworzyć obiekty za pomocą operatora new, tak jak każdą inną klasę w Javie, lub możemy używać podwójnych cudzysłowów, aby utworzyć obiekt String. Istnieje również kilka konstruktorów klas Stringumożliwiających uzyskanie ciągu znaków z tablicy znaków, tablicy bajtów, a także użycie StringBufferor StringBuilder.
String str = new String("abc");
String str1 = "abc";
Kiedy tworzymy ciąg znaków, używając podwójnych cudzysłowów, wirtualna maszyna Java szuka w puli ciągów innego ciągu o tej samej wartości. Jeśli ciąg znaków zostanie znaleziony, zwracane jest tylko odwołanie do istniejącego obiektu klasy String, w przeciwnym razie tworzony jest nowy obiekt z otrzymaną wartością i zapisywany w puli. Kiedy używamy operatora new, maszyna wirtualna tworzy obiekt, Stringale nie przechowuje go w puli ciągów. Możemy użyć tej metody intern()do przechowywania ciągu znaków w puli ciągów lub uzyskania referencji, jeśli taki ciąg znaków już znajduje się w puli.

3. Napisz metodę sprawdzającą, czy ciąg znaków jest palindromem.

Ciąg nazywa się palindromem, jeśli czyta się go tak samo w obu kierunkach. Na przykład „aba” jest ciągiem palindromicznym. Klasa Stringnie udostępnia żadnej metody odwracania ciągu znaków, ale klasy StringBufferposiadają StringBuildermetodę odwracania, za pomocą której możemy sprawdzić, czy nasz ciąg znaków jest palindromem, czy nie.
private static boolean isPalindrome(String str) {
        if (str == null)
            return false;
        StringBuilder strBuilder = new StringBuilder(str);
        strBuilder.reverse();
        return strBuilder.toString().equals(str);
    }
Czasami osoba przeprowadzająca wywiad może poprosić, aby do tego sprawdzenia nie używać innych klas, w takim przypadku możemy porównać znaki w ciągu po obu stronach, aby sprawdzić palindrom.
private static boolean isPalindromeString(String str) {
        if (str == null)
            return false;
        int length = str.length();
        System.out.println(length / 2);
        for (int i = 0; i < length / 2; i++) {

            if (str.charAt(i) != str.charAt(length - i - 1))
                return false;
        }
        return true;
    }

4. Napisz metodę usuwania danego znaku z ciągu znaków.

Możemy użyć metody replaceAllzastępującej wszystkie wystąpienia ciągu znaków innym ciągiem. Należy pamiętać, że metoda przyjmuje jako argument ciąg znaków, dlatego używamy klasy Characterdo utworzenia ciągu znaków ze znaku i zastąpienia wszystkich znaków pustym ciągiem.
private static String removeChar(String str, char ch) {
        if (str == null)
            return null;
        return str.replaceAll(Character.toString(ch), "");
    }

5. Jak możemy zamienić ciąg znaków na wielkie lub małe litery?

Możemy użyć metod klasowych, String toUpperCaseaby toLowerCaceuzyskać ciągi znaków zawierające duże i małe litery. Metody te mają przeciążenie, które pobiera argument Localei używa reguł lokalizacji do konwersji ciągu na wielkie lub małe litery.

6. Do czego służy metoda subSequence?

W Javie 1.4 wprowadzono interfejs CharSequence, klasa Stringdziedziczy ten interfejs i jest to jedyny powód, aby zaimplementować metodę subSequencew klasie String. Wewnętrznie wywołuje substring. Prosty przykład użycia metody:
public class StringSubsequence {

    public static void main(String[] args) {
        String str = "www.journaldev.com";
        System.out.println("Last 4 char String: "+str.subSequence(str.length()-4, str.length()));
        System.out.println("First 4 char String: "+str.subSequence(0, 4));
        System.out.println("website name: "+str.subSequence(4, 14));

        //substring vs subSequence
        System.out.println("substring == subSequence ? "
			+(str.substring(4, 14) == str.subSequence(4, 14)));

        System.out.println("substring equals subSequence ? "
			+(str.substring(4, 14).equals(str.subSequence(4, 14))));
    }
}
Dane wyjściowe programu pokażą co następuje:
Last 4 char String: .com
First 4 char String: www.
website name: journaldev
substring == subSequence ? false
substring equals subSequence ? true
Idealnie byłoby, gdybyś zawsze używał substring.

7. Jak porównać dwa ciągi znaków w Javie?

Klasa Stringdziedziczy interfejs Comparablei ma dwie opcje metod compareTo(). Metoda compareTo(String anotherString)porównuje obiekt Stringz otrzymanym argumentem Stringpod względem leksykograficznym. Jeśli bieżąca linia poprzedza odebrany ciąg, metoda zwraca ujemną liczbę całkowitą, a jeśli ciąg znaków następuje po odebranym argumencie, zwraca dodatnią liczbę całkowitą integer. Jeśli metoda zwróci 0, wówczas ciąg znaków będzie miał tę samą wartość i w takim przypadku metoda equals(String str)również zwróci wartość true. compareToIgnoreCase(String str): Ta metoda jest podobna do poprzedniej, z tą różnicą, że ignoruje wielkość liter. Używa komparatora CASE_INSENSITIVE_ORDER do porównywania bez rozróżniania wielkości liter. Jeśli zwrócona wartość wynosi zero, metoda equalsIgnoreCase(String str)również zwróci wartość true. Spójrzmy na mały przykład wyjaśniający te metody:
public class StringCompareToExample {
    public static void main(String[] args) {
        String str = "ABC";
        System.out.println(str.compareTo("DEF"));
        System.out.println(str.compareToIgnoreCase("abc"));
    }
}
Program wyświetli następujące informacje:
-3
0

8. Jak zamienić ciąg znaków na znak i odwrotnie?

To podchwytliwe pytanie, ponieważ ciąg znaków jest sekwencją znaków, więc możemy go przekonwertować tylko na pojedynczy znak. Możemy użyć metody charAt, aby umieścić znak w określonej pozycji, lub możemy użyć metody, toCharArray()aby przekonwertować ciąg znaków na tablicę znaków. Prosty przykład pokazujący, jak przekonwertować ciąg na znak i znak na ciąg w Javie.
import java.util.Arrays;

public class StringToCharToString {
    public static void main(String[] args) {
        //String to char array
        String str = "123";
        char[] chArr = str.toCharArray();
        System.out.println("String to char array: "+Arrays.toString(chArr));
        //String to char
        char c = str.charAt(1);
        System.out.println("String to char: "+c);
        //char to String
        String s = Character.toString(c);
        System.out.println("char to String: "+s);
        //удалить все заданные символы из строки
        System.out.println("removing all chars from String: "
                                 +removeCharFromString("1ABCD12DW", '1'));
    }

    private static String removeCharFromString(String str, char c) {
        return str.replaceAll(Character.toString( c ), "");
    }
}
Program wyświetli następujące informacje:
String to char array: [1, 2, 3]
String to char: 2
char to String: 2
removing all chars from String: ABCD2DW

9. Jak przekonwertować ciąg znaków na tablicę bajtów i odwrotnie?

Możemy użyć metody getBytes()do konwersji ciągu znaków na tablicę bajtów i możemy użyć konstruktora new String(byte[] arr)do przekonwertowania tablicy bajtów na ciąg znaków.
import java.util.Arrays;

public class StringByteArray {
     public static void main(String[] args) {
        String str = "www.journaldev.com";
        //преобразование String в byte array
        byte[] byteArr = str.getBytes();
        System.out.println("String to byte array : "+Arrays.toString(byteArr));
        //преобразование byte array и String
        String str1 = new String(byteArr);
        System.out.println("byte array to String : "+str1);
        //посмотрим, str и str1 одинаковые Lub нет
        System.out.println("str == str1? " + (str == str1));
        System.out.println("str.equals(str1)? " + (str.equals(str1)));
    }
}
Program wyświetli następujące informacje:
String to byte array : [119, 119, 119, 46, 106, 111, 117, 114, 110, 97, 108, 100, 101, 118, 46, 99, 111, 109]
byte array to String : www.journaldev.com
str == str1? false
str.equals(str1)? true

10. Czy w konstrukcji przełącznika można użyć łańcucha?

To podchwytliwe pytanie służy do sprawdzenia Twojej wiedzy na temat obecnego rozwoju języka. Java 7 rozszerza instrukcję switch tak, aby używała ciągów znaków; wcześniejsze wersje Java tego nie obsługują. Jeśli implementujesz przepływ warunkowy dla ciągów, możesz użyć warunków if-else, a jeśli używasz języka Java 7 lub nowszego, możesz użyć instrukcji switch. Mały przykład użycia ciągu w instrukcji switchi innej metody, która pokazuje tę samą logikę przy użyciu warunków if-else.
public class SwitchStringExample {

    public static void main(String[] args) {
        printColorUsingSwitch("red");
        printColorUsingIf("red");
        // оператор switch регистрозависимый
        printColorUsingSwitch("RED");
        printColorUsingSwitch(null);
    }

    private static void printColorUsingIf(String color) {
        if (color.equals("blue")) {
            System.out.println("BLUE");
        } else if (color.equals("red")) {
            System.out.println("RED");
        } else {
            System.out.println("INVALID COLOR CODE");
        }
    }

    private static void printColorUsingSwitch(String color) {
        switch (color) {
        case "blue":
            System.out.println("BLUE");
            break;
        case "red":
            System.out.println("RED");
            break;
        default:
            System.out.println("INVALID COLOR CODE");
        }
    }
}
Program wyświetli następujące informacje:
RED
RED
INVALID COLOR CODE
Exception in thread "main"
java.lang.NullPointerException
    at com.journaldev.util.SwitchStringExample.printColorUsingSwitch(SwitchStringExample.java:24)
    at com.journaldev.util.SwitchStringExample.main(SwitchStringExample.java:10)
Kluczowe punkty użycia switchciągów w Javie.
  • użycie ciągów znaków w projekcie switchsprawia, że ​​kod jest bardziej czytelny, eliminując wiele łańcuchów warunków if-else.
  • w switchciągach znaków rozróżniana jest wielkość liter, powyższy przykład pokazuje to.
  • operator switchużywa metody String.equals()do porównywania wartości wynikowej z wartościami przypadków , dlatego aby tego uniknąć, zaznacz wartość NULL NullPointerException.
  • Zgodnie z dokumentacją Java 7 dotyczącą ciągów znaków switch, kompilator Java generuje bardziej wydajny kod bajtowy dla ciągów w konstrukcji switchniż dla warunków połączonych if-else.
  • upewnij się, że będzie to używane z Javą 7 lub nowszą, w przeciwnym razie otrzymasz xception.

11. Napisz program, który wypisuje wszystkie permutacje ciągu.

To trudne pytanie i musimy użyć rekurencji, aby znaleźć wszystkie permutacje ciągu, na przykład permutacje „AAB” mogą mieć postać „AAB”, „ABA” i „BAA”. Musimy także użyć Set, aby upewnić się, że nie mamy zduplikowanych wierszy. Aby uzyskać wszystkie permutacje, najpierw bierzemy pierwszy znak ciągu i zmieniamy kolejność pozostałych znaków. Jeśli ciąg = „ABC” Pierwszy znak char = A i pozostałe permutacje BC i CB. Teraz możemy wstawić pierwszy znak w dostępne pozycje w permutacjach. BC -> ABC, BAC, BCA CB -> ACB, CAB, CBA Przykładowy program:
import java.util.HashSet;
import java.util.Set;

public class StringHelper {
    public static Set<String> permutationFinder(String str) {
        Set<String> perm = new HashSet<String>();
        //Handling error scenarios
        if (str == null) {
            return null;
        } else if (str.length() == 0) {
            perm.add("");
            return perm;
        }
        char initial = str.charAt(0); // первый символ
        String rem = str.substring(1); // полная строка без первого символа
        Set<String> words = permutationFinder(rem);
        for (String strNew : words) {
            for (int i = 0;i<=strNew.length();i++){
                perm.add(charInsert(strNew, initial, i));
            }
        }
        return perm;
    }

    public static String charInsert(String str, char c, int j) {
        String begin = str.substring(0, j);
        String end = str.substring(j);
        return begin + c + end;
    }

    public static void main(String[] args) {
        String s = "AAC";
        String s1 = "ABC";
        String s2 = "ABCD";
        System.out.println("\nPermutations for " + s + " are: \n" + permutationFinder(s));
        System.out.println("\nPermutations for " + s1 + " are: \n" + permutationFinder(s1));
        System.out.println("\nPermutations for " + s2 + " are: \n" + permutationFinder(s2));
    }
}
Dane wyjściowe programu:
Permutations for AAC are:
[AAC, ACA, CAA]

Permutations for ABC are:
[ACB, ABC, BCA, CBA, CAB, BAC]

Permutations for ABCD are:
[DABC, CADB, BCAD, DBAC, BACD, ABCD, ABDC, DCBA, ADBC, ADCB, CBDA, CBAD, DACB, ACBD, CDBA, CDAB, DCAB, ACDB, DBCA, BDAC, CABD, BADC, BCDA, BDCA]
Ciąg dalszy artykułu
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION