Fragment wykładu z mentorem w ramach kursu Codegym University. Zapisz się na pełny kurs.


„Cześć, Amigo! Dzisiaj przeanalizujemy kilka typowych scenariuszy pracy ze strunami. Na przykład, czy wiesz, jak podzielić strunę na kilka części?”

– Nie powiem ci od razu, Ellie. Ale ty mi powiesz, prawda?

split()metoda

„Istnieje kilka sposobów, aby to zrobić. Pierwszym sposobem na podzielenie łańcucha na wiele części jest użycie metody split(). Wyrażenie regularne, które definiuje specjalny łańcuch ograniczający, musi zostać przekazane jako parametr. Dowiesz się, czym jest wyrażenie regularne zadanie Kolekcje Java .

Przykład:

Kod Wynik
String str = "Good news everyone!";
String[] strings = str.split("ne");
System.out.println(Arrays.toString(strings));
Wynikiem będzie tablica trzech łańcuchów:
["Good ", "ws everyo", "!"]

Proste, ale czasami takie podejście jest przesadne. Jeśli jest dużo ograniczników (na przykład spacji, znaków nowego wiersza, tabulacji, kropek), musisz skonstruować dość złożone wyrażenie regularne.

„Cóż, jasne. A jeśli jest to trudne do odczytania, trudno jest wprowadzić zmiany.

StringTokenizerklasa

Fragment wykładu z mentorem w ramach kursu Codegym University. Zapisz się na pełny kurs.


„Java ma specjalną klasę, której całe zadanie polega na podzieleniu łańcucha na podciągi.

„Ta klasa nie używa wyrażeń regularnych: zamiast tego po prostu przekazujesz ciąg składający się z ograniczników. Zaletą tego podejścia jest to, że nie dzieli całego łańcucha na części na raz, ale zamiast tego przesuwa się od początku do końca o jeden krok po kroku.

Klasa ma konstruktora i dwie metody. Przekazujemy konstruktorowi ciąg znaków, który podzieliliśmy na części, oraz ciąg składający się z zestawu znaków ograniczających.

Metody Opis
String nextToken()
Zwraca następny podciąg
boolean hasMoreTokens()
Sprawdza, czy istnieje więcej podciągów.

„Ta klasa w jakiś sposób przypomina mi klasę Scanner, która również ma metody nextLine()i hashNextLine().

„To dobra obserwacja, którą poczyniłeś. Możesz utworzyć StringTokenizerobiekt za pomocą tego polecenia:

StringTokenizer name = new StringTokenizer(string, delimiters);

Gdzie string jest łańcuchem, który ma zostać podzielony na części. A ograniczniki to ciąg znaków, a każdy znak w nim jest traktowany jako ogranicznik. Przykład:

Kod Wyjście konsoli
String str = "Good news everyone!";

StringTokenizer tokenizer = new StringTokenizer(str,"ne");
while (tokenizer.hasMoreTokens())
{
   String token = tokenizer.nextToken();
   System.out.println(token);
}
Good 
ws 
v
ryo
!

„Zauważ, że każdy znak w łańcuchu przekazanym w drugim łańcuchu do StringTokenizerkonstruktora jest uważany za separator.

String.format()metoda i StringFormatterklasa

„Inną interesującą metodą klasy String jest metoda format().

„Powiedzmy, że masz różne zmienne przechowujące dane. Jak wyświetlić je na ekranie w jednym wierszu? Na przykład mamy trochę danych (lewa kolumna) i pożądane wyjście (prawa kolumna):

Kod Wyjście konsoli
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;
User = {name: Amigo, age: 12 years, friend: Diego, weight: 200 kg.}

Kod takiego programu będzie wyglądał mniej więcej tak:

Kod programu
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + name + ", age:" + age + " years, friend: " + friend+", weight: " + weight + " kg.}");

„Zgodzicie się ze mną, że kod jest mało czytelny. A gdyby nazwy zmiennych były dłuższe, to kod stałby się jeszcze trudniejszy:

Kod programu
String name = "Amigo";
int age = 12;
String friend = "Diego";
int weight = 200;

System.out.println("User = {name: " + user.getName() + ", age:" + user.getAge() + " years, friend: " + user.getFriends().get(0) + ", weight: " + user.getExtraInformation().getWeight() + " kg.}");

„Tak, to trudna lektura!”

„Nie martw się. Jest to powszechna sytuacja w rzeczywistych programach, więc chcę ci opowiedzieć o sposobie pisania tego kodu w prostszy i bardziej zwięzły sposób.

String.format

StringKlasa posiada metodę statyczną format(): pozwala określić wzór składania ciągu znaków z danymi. Ogólny wygląd polecenia jest następujący:

String name = String.format(pattern, parameters);

Przykład:

Kod Wynik
String.format("Age=%d, Name=%s", age, name);
Age=12, Name=Amigo
String.format("Width=%d, Height=%d", width, height);
Width=20, Height=10
String.format("Fullname=%s", name);
Fullname=Diego

format()Pierwszym parametrem metody jest ciąg formatu, który zawiera cały żądany tekst wraz ze znakami specjalnymi zwanymi specyfikatorami formatu (takimi jak %di %s) w miejscach, w których należy wstawić dane.

format()Metoda zastępuje te %si %dspecyfikatory formatu parametrami, które następują po ciągu formatu na liście parametrów. Jeśli chcemy wstawić ciąg znaków, piszemy . %sJeśli chcemy wstawić liczbę, specyfikatorem formatu jest %d. Przykład:

Kod Wynik
String s = String.format("a=%d, b=%d, c=%d", 1, 4, 3);
sjest równe"a=1, b=4, c=3"

„Oto krótka lista specyfikatorów formatu, których można użyć w ciągu formatu:

Specyficzny Oznaczający
%s
String
%d
interger: byte, short, int,long
%f
liczba rzeczywista: float,double
%b
boolean
%c
char
%t
Date
%%
%postać

"Te specyfikatory wskazują typ danych, ale są też specyfikatory, które wskazują kolejność danych. Aby uzyskać argument według jego numeru (numeracja zaczyna się od jedynki), należy napisać " % 1$ d " zamiast " %d ". Przykład:

Kod Wynik
String s = String.format("a=%3$d, b=%2$d, c=%d", 11, 12, 13);
sjest równe"a=13, b=12, c=11"

%3$dotrzyma trzeci argument, %2$dotrzyma drugi argument i %dotrzyma pierwszy argument. Specyfikatory formatu %si %dodnoszą się do argumentów niezależnie od specyfikatorów, takich jak %3$dlub%2$s

Basen sznurkowy

„Każdy ciąg określony w kodzie jako literał łańcuchowy jest przechowywany w obszarze pamięci zwanym podczas StringPooldziałania programu. StringPoolJest to specjalna tablica do przechowywania ciągów. Jej celem jest optymalizacja przechowywania ciągów:

„Po pierwsze, łańcuchy określone w kodzie muszą być gdzieś przechowywane, prawda? Kod składa się z poleceń, ale dane (zwłaszcza duże łańcuchy) muszą być przechowywane w pamięci oddzielnie od kodu. W kodzie pojawiają się tylko odniesienia do obiektów łańcuchowych.

„Po drugie, wszystkie identyczne literały łańcuchowe muszą być przechowywane w pamięci tylko raz. I tak to właśnie działa. Kiedy kod twojej klasy jest ładowany przez maszynę Java, wszystkie literały łańcuchowe są dodawane do, jeśli jeszcze ich tam nie ma StringPool. już tam jest, po prostu używamy odwołania do ciągu z pliku StringPool.

W związku z tym, jeśli przypiszesz ten sam literał do kilku zmiennych łańcuchowych w swoim kodzie, zmienne te będą zawierały to samo odwołanie. Literał zostanie dodany StringPooltylko raz. We wszystkich innych przypadkach kod otrzyma odniesienie do łańcucha już załadowanego w pliku StringPool.

Oto mniej więcej jak to działa:

Kod Praca z StringPollem
String a = "Hello";
String b = "Hello";
String c = "Bye";
String[] pool = {"Hello", "Bye"};
a = pool[0];
b = pool[0];
c = pool[1];

„Dlatego zmienne ai bbędą przechowywać te same odniesienia”.

„Mam nadzieję, że wszystko dobrze zrozumiałem.

intern()metoda.

„A najlepsze jest to, że możesz programowo dodać dowolny ciąg do StringPool. Aby to zrobić, wystarczy wywołać metodę Stringzmiennej intern().

intern()Metoda doda ciąg do, StringPooljeśli jeszcze go tam nie ma, i zwróci odwołanie do ciągu w pliku StringPool.

„A co się stanie, jeśli do metody StringPoolprzy użyciu metody zostaną dodane dwa identyczne ciągi znaków intern()?”

„Metoda zwróci te same referencje. Można jej użyć do porównania ciągów według referencji. Przykład:

Kod Notatka
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);


false
String a = new String("Hello");
String b = new String("Hello");

String t1 = a.intern();
String t2 = b.intern();
System.out.println(a == b);
System.out.println(t1 == t2);





false
true

Jest mało prawdopodobne, aby często używać tej metody. To powiedziawszy, ludzie lubią o to pytać podczas rozmów kwalifikacyjnych.

„Więc lepiej o tym wiedzieć, niż nie wiedzieć. Dzięki, Ellie!”