StringCzęść NR.3Co typ przechowujący napis w obu językach ma wspólnego? Deklaracja napisu do zmiennej jest dosyć prosta.

string s = “Cześć”;

Metody operujące na napisach są różne w Javie i w C#.

Typy te jednak mają pewne cechy wspólne w obu językach.

Najbardziej gryzie mnie to, że w Javie typ string nie może być określany z małej litery. W C# String i string to ten sam typ.

Łączenie napisów

Najłatwiej jest połączyć napisy używając operatora plus. Działa także operator += który do już istniejącego napisu doda kolejny.

String j = "Hello";
String j2 = " World";

String j3 = j + j2; // Hello World
String j4 = "Win the";
j4 += j2;

Gdy napis, który chcesz napisać okaże się za długi możesz jego deklaracje rozbić na dalsze linijki kodu. Przydaje się wtedy znak dodawania.

String k =
        "Najbardziej gryzie mnie to, że w Javie typ string " +
        "nie może być określany z małej litery. W C# String i " +
        "string to ten sam typ.";

Jak jednak do napisu dodać znak nowej linii.

Znaki ucieczki

Aby dodać znaki nowej linii trzeba skorzystać ze znaku ucieczki.

String k2 = "New line \nNew line";

Notacja ta zaczyna się od znaku backslash “\”. C# i Java pozwalają na używanie specjalnych znaków których normalnie nie może napisać.

Przykładowo co jeśli chcemy użyć znaku cudzysłowia. Znak cudzysłowia zamyka przecież napis. Na ratunek przychodzi znak ucieczki.

String k2 = "\"New line\" \n\"New line\"";
String k3 = "  \"   Cudzysłów   \" ";

Oto ich lista:

ZnakZnaczenie
\nNowa linia
\ttabulator horyzontalny
\vpionowy tabulator
\bbackspace. Przesuwa kursor o jeden znak do tyłu.
\rklawisz return. Przesuwa kursor na początek bieżącej linii.
\0null character
\’Apostrof
\”Cudzysłów
\\BackSlash
\u1D0ECUżycie symbolu unicode (4 litery HEX-owe)

W C#:

Znak ucieczki może być zignorowany poprzez użycie symbolu małpy “@” przed cudzysłowiem w którym znajduje się napis.

Przydaje się to gdy piszemy ścieżkę do pliku.

string e = "c:\\MojePliki\\text.txt";
string f = @"c:\MojePliki\text.txt";

W Javie możesz tylko skorzystać ze znaku ucieczki określonym podwójnym backslashem.

String k4 = "c:\\MojePliki\\text.txt";

Porównywanie napisów

W C# do porównywania napisów string wystarczy zastosować operator równości. Ten operator w przeciwieństwie do Javy nie będzie porównywał adresów do obiektów.

Oba napisy są sobie równe.

string e = "c:\\MojePliki\\text.txt";
string f = @"c:\MojePliki\text.txt";
bool c = (e == f); 

W C# metoda Equals() zmiennej string da ten sam rezultat. Nie występuje tutaj porównanie adresów do obiektów (bo są one różne) tylko samych napisów.

bool c2 = e.Equals(f);

W Javie sprawa jest trochę bardziej skomplikowana.

Metoda Equals porównuje napisy. Operator porównania równości porównuje adresy.

String l1 = "Motomyszy z Marsa";
String l2 = "Motomyszy z Marsa";
boolean eq1 = l1.equals(l2); // compares string
boolean eq2 = (l1 == l2); // compares address

Gdy uruchomisz ten przykład, zauważysz jednak, że oba wyrażenia zwracają prawdę. W czym problem. Czyżbym kłamał. Kompilator Javy analizuje wszystkie napisy. Widząc ten sam napis zadeklarowany tak samo automatycznie przypisał do niego ten sam obiekt.

Sprawa będzie wyglądała teraz inaczej. Teraz oba napisy są różnym obiektami.

String l = " z Marsa";
String l1 = "Motomyszy z Marsa";
String l2 = "Motomyszy" + l;
boolean eq1 = l1.equals(l2); // compares string
boolean eq2 = (l1 == l2); // compares address
System.out.println(eq1);
System.out.println(eq2); 

Teraz gdy oba napisy mają inne obiekty ale są tekstowo takie same. Możesz zobaczyć, że porównanie metodą Equals zwróci prawdę, a porównanie adresów już fałsz.

StringBulider i StringBuffer

Java i C# mają ten sam problem z typem string. Jakakolwiek jego zmiana tworzy nowy obiekt co może nieźle uderzyć w jakości działania danej aplikacji.

Aby uniknąć tego problemu w C# do dyspozycji mamy klasę “StringBulider”. W Javie mamy klasę StringBuffer.

StringBuilder żyje w przestrzeni nazw “System.Text”.

System.Text.StringBuilder sb = new StringBuilder();

sb.Append("Nowy kurs C# jako gra Alan Wake");
sb.Remove(0, 10);
sb.Insert(12, " opowieściowa ");

string s = sb.ToString();

Każda operacja dodania napisu “Append”, usuwania znaku od pewnego symbolu od do lub umieszczenia znaku od pewnego miejsca nie tworzy nowego obiektu.

Aby skonwertować typ StringBuilder na string wystarczy skorzystać z metody ToString().

Zobaczymy jak sprawa wygląda w Javie. Gdy pisałem ten wpis zapomniałem, że klasa stringBuilder istnieje w Javie. Ma ona zbliżone metody jak klasa o tej samej nazwie w C#.

Dla urozmaicenia postanowiłem pokazać użycie klasy “StringBuffer”.

StringBuffer sb = new StringBuffer();

sb.append("Nowy kurs C# jako gra Alan Wake"); // add to end of string
sb.delete(0, 10); // remove 10 first characters
sb.insert(0, " opowieściowa "); // insert string at beginning

String s = sb.toString();

System.out.println(s);