/ / Łączenie dwóch ciągów Java [duplikat] - java, ciąg, konkatenacja

Konkatenacja dwóch ciągów Java [duplicate] - java, string, concatenation

  1. Kiedy piszę następujący kod

    int a = "Java";
    

    kompilator Java wyświetla następujący błąd:

    nie można przekonwertować z String na int

    Więc stała Java jest uważany za obiekt uzyskany z String klasa.

    - Czy to prawda, że ​​każda lista znaków zawarta pomiędzy "" jest uważany za obiekt pochodzący z klasy String?

  2. Kiedy próbuję połączyć dwa ciągi, użyłem dwóch następujące przykłady:

    String ch1 = "Java " ;
    String ch2 = "is cool";
    String ch3 = ch1 + ch2;
    

    po użyciu polecenia javap -c na mojej skompilowanej klasie znalazłem że kompilator używa instancji StringBuilder dołączyć dwa sznurki.

    ale z drugim przykładem:

    String ch = "Java " + "is cool";
    

    Chociaż dwie stałe „Java” i „is cool” są dwoma obiektami pochodnymi String klasy, kompilator nie korzysta z instancji klasy StringBuilder do dołącz dwa ciągi.

    - Więc jakie podejście zastosowano w drugim przykładzie?

Odpowiedzi:

1 dla odpowiedzi № 1

Stąd.

„+” tworzy nowy obiekt String za każdym razem, gdy coś konkatenuje, z wyjątkiem sytuacji, gdy konkatenacja jest wykonywana w czasie kompilacji.

Chociaż nie jest to renomowane źródło, z tego, co pamiętam z moich podręczników, brzmi to poprawnie. Zasadniczo, stosując to do swojego kodu:

String ch = "Java " + "is cool";

Zostanie obsłużony w czasie kompilacji, odkąd maszzdefiniowano dwie stałe i połączyły je razem, co oznacza, że ​​wynik jest w rzeczywistości również stałą, a zatem może być traktowany jako taki i obliczany w czasie kompilacji. Byłoby ciekawie zobaczyć, czy skompilowałeś ten kod, a następnie zdekompilowałeś, żeby zobaczyć, jak to zdanie by się odczytało, wyobrażam sobie, że może to przeczytać:

String ch = "Java is cool";

Co do drugiego stwierdzenia:

String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;

Ponieważ ch3 jest obliczany na podstawie ch1 i ch2, odbywa się to w czasie wykonywania, ponieważ ch1 i ch2 są zmiennymi zamiast stałych.

Co do twojego pierwszego pytania, nie mogę znaleźć żadnegoreferencje dokładnie, ale z tego, co pamiętam, „” oznacza ciąg, podobnie jak „” oznacza znak. Nie jestem do końca pewien, co próbujesz zrobić z tym stwierdzeniem, ale wyobrażam sobie, że możesz przekonwertować swój ciąg znaków na tablicę char, a następnie rzutować ją na tablicę int.


0 dla odpowiedzi nr 2

Nie jestem pewien, jakie jest Twoje drugie pytanie, ale pierwsze pytanie: „Java” to ciąg znaków, a Ty próbujesz zapisać go jako typ int. To nie jest liczba całkowita. Zmienna a musi być typu string.

   String a = "Java ";

0 dla odpowiedzi № 3

W pierwszym przykładzie utworzyłeś 2 ciągivars, ch1 i ch2, które mogłyby być użyte w innych częściach kodu, więc ... kiedy zainicjujesz ch3, w pamięci tworzony jest nowy ciąg znaków z zawartością obu vars (tutaj jest to, gdzie działa StringBuilder). Jest to konieczne, ponieważ możesz zmienić wartość ch2, a ch3 nie ulegnie zmianie.

W drugim przykładzie oba ciągi są końcowe i nigdy więcej nie są używane w kodzie, więc Java po prostu tworzy unikalny ciąg „Java jest fajny”.

Nie wiem, czy dobrze to wytłumaczyłem.


0 dla odpowiedzi nr 4

Kiedy zrobisz następujący wiersz

String ch1 = "Java " ;
String ch2 = "is cool";
String ch3 = ch1 + ch2;

Zarówno ch1, jak i ch2 są dosłowne, a Kompilatorutworzy instancję String za pomocą StringBuilder. We wcześniejszych dniach (gdy kompilator nie był wystarczająco inteligentny, aby to zrobić) marnowalibyśmy pamięć dla każdego wykonania operacji konkat

ale kiedy tego użyjesz

String ch = "Java " + "is cool";

Kompilator zrozumiał, że dosłowne napisy „Java” + „is cool” nie mogą być modyfikowane w żadnym momencie. Tak więc kompilatory przetłumaczyłyby to na

String ch = "Java is cool";

jako kod bajtowy. i tylko jeden literał ciąg utworzyłby czas działania.