Klasa ta
String
jest 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. Będą bardzo pomocni w uzyskaniu pełnego obrazu klasy String
i przygotują Cię do wszelkich String
pytań 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 String
maszyna wirtualna przechowuje wszystkie obiekty klasy w puli ciągów. Kolejną cechą String
jest sposób uzyskiwania obiektów klas String
przy 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ć obiektString
. Istnieje również kilka konstruktorów klas String
umożliwiających uzyskanie ciągu znaków z tablicy znaków, tablicy bajtów, a także użycie StringBuffer
or 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, String
ale 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. KlasaString
nie udostępnia żadnej metody odwracania ciągu znaków, ale klasy StringBuffer
posiadają StringBuilder
metodę 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ć metodyreplaceAll
zastę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 Character
do 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 toUpperCase
aby toLowerCace
uzyskać ciągi znaków zawierające duże i małe litery. Metody te mają przeciążenie, które pobiera argument Locale
i 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 interfejsCharSequence
, klasa String
dziedziczy ten interfejs i jest to jedyny powód, aby zaimplementować metodę subSequence
w 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?
KlasaString
dziedziczy interfejs Comparable
i ma dwie opcje metod compareTo()
. Metoda compareTo(String anotherString)
porównuje obiekt String
z otrzymanym argumentem String
pod 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ć metodycharAt
, 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ć metodygetBytes()
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 instrukcjiswitch
i 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 switch
ciągów w Javie.
- użycie ciągów znaków w projekcie
switch
sprawia, że kod jest bardziej czytelny, eliminując wiele łańcuchów warunkówif-else
. - w
switch
ciągach znaków rozróżniana jest wielkość liter, powyższy przykład pokazuje to. - operator
switch
używa metodyString.equals()
do porównywania wartości wynikowej z wartościami przypadków , dlatego aby tego uniknąć, zaznacz wartość NULLNullPointerException
. - 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 konstrukcjiswitch
niż dla warunków połączonychif-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
GO TO FULL VERSION