Dlaczego ciąg znaków jest niezmienny w Javie?


177

W wywiadzie zapytano mnie, dlaczego String jest niezmienny

Odpowiedziałem tak:

Kiedy tworzymy ciąg w java, String s1="hello";wtedy obiekt zostanie utworzony w puli stringów (hello), a s1 będzie wskazywać na hello. Teraz, jeśli znowu to zrobimy, String s2="hello";inny obiekt nie zostanie utworzony, ale s2 wskaże na, hello ponieważ JVM najpierw sprawdzi jeśli ten sam obiekt jest obecny w puli ciągów lub nie, jeśli nie jest obecny, tworzony jest tylko nowy obiekt, w przeciwnym razie nie.

Teraz, jeśli załóżmy, że java zezwala na modyfikowanie ciągu znaków, to jeśli zmienimy s1 na hello worldto, wartość s2 również będzie hello worldtaka, że ​​ciąg java jest niezmienny.

Czy ktoś może mi powiedzieć, czy moja odpowiedź jest dobra, czy zła ?


46
Dlaczego zawsze trudno odpowiedzieć. Prawdopodobnie najbardziej poprawna odpowiedź brzmi: ponieważ projektanci języka uznali, że to dobry pomysł.
Keppil

1
zobacz także tę odpowiedź

3
Twoja odpowiedź nie jest na temat. C ++ std::stringjest zmienny, ale mają również pulę ciągów (cóż, bardziej poprawnie, pula tablic znaków).
Siyuan Ren

1
@rocking Szczerze mówiąc, to, czy to prawda, czy nie, zależy od tego, jak to przeczytają. Chodzi o to, że Java może mieć pulę ciągów, ponieważ ciągi są niezmienne. Gdyby zdecydowali się uczynić ciągi zmiennymi, nie użyliby puli ciągów; więc może nie być dokładne określenie „pula strun, a więc niezmienne ciągi”; jest bardziej na odwrót. Te powody wyboru niezmienne ciągi są przedstawione poniżej, a basen ciąg jest strategia pracy z powodu tego. Twoja odpowiedź nie jest jednak nieprawidłowa , po prostu nie wydaje się kompletna. Musisz tylko poczekać i zobaczyć, co powiedzą.
Jason C

34
Po prostu nie mogę zrozumieć, dlaczego to pytanie zostało zamknięte. Domniemana powiązana odpowiedź nie dotyczy nawet Javy i nie odnosi się do głównego tematu tego pytania, czyli „dlaczego”. Dla mnie to jeden z tych przypadków nieodpowiedzialnej społeczności działającej w sprawie, o której nic nie wiedzą. Poprosiłem o ponowne otwarcie.
Edwin Dalorzo

Odpowiedzi:


163

String jest niezmienna z kilku powodów, oto podsumowanie:

  • Bezpieczeństwo : parametry są zwykle przedstawiane tak jak Stringw połączeniach sieciowych, adresach URL połączeń z bazą danych, nazwach użytkowników / hasłach itp. Gdyby były zmienne, można je łatwo zmienić.
  • Synchronizacja i współbieżność: automatyczna niezmienność String sprawia, że ​​są one bezpieczne wątkowo, rozwiązując w ten sposób problemy z synchronizacją.
  • Buforowanie : gdy kompilator optymalizuje obiekty typu String, widzi, że jeśli dwa obiekty mają tę samą wartość (a = "test" i b = "test"), a zatem potrzebujesz tylko jednego obiektu typu string (zarówno dla a i b, te dwa będą wskazują ten sam obiekt).
  • Ładowanie klas : Stringjest używane jako argumenty do ładowania klas. Jeśli jest zmienny, może to spowodować załadowanie niewłaściwej klasy (ponieważ zmienne obiekty zmieniają swój stan).

Biorąc to pod uwagę, niezmienność Stringoznacza tylko, że nie można jej zmienić za pomocą publicznego interfejsu API. W rzeczywistości możesz ominąć normalny interfejs API za pomocą odbicia. Zobacz odpowiedź tutaj .

W twoim przykładzie, jeśli Stringbyło zmienne, rozważ następujący przykład:

  String a="stack";
  System.out.println(a);//prints stack
  a.setValue("overflow");
  System.out.println(a);//if mutable it would print overflow

14
Jak to może wpłynąć na bezpieczeństwo?
Archit Maheshwari

2
Czy ktoś może wyjaśnić ładowanie klas na przykładzie, jeśli to możliwe?
Viraj

6
Jeśli chodzi o bezpieczeństwo, jeśli interesuje mnie zmiana parametrów połączenia, jest to proste w czasie wykonywania (z debugerem itp.). Jeśli chodzi o ładowanie klas, jeśli Stringjest zmienne, to program ładujący klasy pobierze przekazany ciąg, zrobi kopię i nie zmieni jej kopii. Myśląc o problemie ze zmiennymi java.lang.Strings, zastanów się, jak C ++ rozwiązuje ten problem (ponieważ ma mutowalne std::strings.
Limited Atonement

Jeśli chodzi o bezpieczeństwo, w jaki sposób można zmienić zmienny ciąg znaków podczas działania programu?
MasterJoe 2

Ponieważ String jest niezmienny, jego kod skrótu jest przechowywany w pamięci podręcznej w momencie tworzenia i nie trzeba go ponownie obliczać.
Abdul Alim Shakir,

45

Programiści Java decydują, że ciągi znaków są niezmienne ze względu na następujący projekt, wydajność i bezpieczeństwo .

Ciągi projektowe są tworzone w specjalnym obszarze pamięci w stercie Java znanym jako „pula ciągów wewnętrznych”. Podczas tworzenia nowego obiektu String (nie w przypadku korzystania z konstruktora String () lub innych funkcji String, które wewnętrznie używają konstruktora String () do tworzenia nowego obiektu String; Konstruktor String () zawsze tworzy w puli nową stałą łańcuchową, chyba że wywołaj zmienną metody intern () ), która przeszukuje pulę, aby sprawdzić, czy już istnieje. Jeśli istnieje, zwróć odwołanie do istniejącego obiektu String. Jeśli String nie jest niezmienny, zmiana String z jednym odwołaniem doprowadzi do niewłaściwej wartości dla innych odwołań.

Zgodnie z tym artykułem na DZone:

Ciąg bezpieczeństwa jest szeroko stosowany jako parametr dla wielu klas Java, np. Połączenia sieciowe, otwieranie plików itp. Gdyby ciąg znaków nie był niezmienny, połączenie lub plik zostałby zmieniony i prowadziłby do poważnego zagrożenia bezpieczeństwa. Zmienne ciągi mogą również powodować problemy z bezpieczeństwem w odbiciu, ponieważ parametry są ciągami.

Wydajność Kod skrótu łańcucha jest często używany w języku Java. Na przykład w HashMap. Niezmienność gwarantuje, że hashcode będzie zawsze taki sam, dzięki czemu można go buforować bez martwienia się o zmiany, co oznacza, że ​​nie ma potrzeby obliczania hashcode za każdym razem, gdy jest używany.


7
Twoje rozumienie puli strun jest nieprawidłowe. Stałe łańcuchowe są tworzone w puli stażystów, ale jest całkowicie możliwe, aby mieć więcej niż jeden obiekt typu string z tym samym tekstem. Zgadzam się, że niezmienne ciągi znaków umożliwiają łączenie w pulę, ale nie ma tak dużej puli.
Jon Skeet

@JonSkeet Masz rację. String s1 = new String ("test"); instrukcja tworzy nową stałą łańcuchową w puli stażystów, chyba że wywołasz metodę intern (). Dziękuję za pogłębienie mojej wiedzy na temat puli stażystów.
Alex Mathew

2
To coś więcej niż tylko użycie konstruktora napisów - prawie wszystko, co tworzy nowy ciąg, np. Podciąg, podział, konkatent itp., Utworzy nowe łańcuchy. Stałe czasu kompilacji są tutaj szczególnym przypadkiem, a nie normą ...
Jon Skeet

@JonSkeet substring (), concat (), replace () itp. Używają wewnętrznie konstruktora String do tworzenia nowego obiektu ciągu. Dziękuję za poprawienie mojej odpowiedzi.
Alex Mathew

2
@JonSkeet - Wszystkie te odpowiedzi mówią, że niezmienność poprawia „bezpieczeństwo”, ale nie wyjaśnia, jak to zrobić. Wszystkie prowadzą do niejasnego artykułu o dzone, który też nie pomaga. Odpowiedzi / link nie wyjaśniają, w jaki sposób zmienny ciąg znaków można zmienić, gdy kod jest uruchomiony. Czy mógłbyś wyjaśnić?
MasterJoe 2

25

Nie możemy być pewni, co właściwie myśleli projektanci Javy podczas projektowania, Stringale możemy tylko wywnioskować te powody na podstawie korzyści, jakie uzyskujemy z niezmienności ciągów. Niektóre z nich są

1. Istnienie puli stałych łańcuchów

Jak omówiono w artykule Dlaczego ciąg jest przechowywany w puli stałych ciągów , każda aplikacja tworzy zbyt wiele obiektów łańcuchowych, aby uchronić JVM przed tworzeniem wielu obiektów łańcuchowych, a następnie zbieraniem ich bezużytków. JVM przechowuje wszystkie obiekty łańcuchowe w oddzielnym obszarze pamięci o nazwie pula stałych ciągów i ponownie wykorzystuje obiekty z tej puli buforowanej.

Za każdym razem, gdy tworzymy literał łańcuchowy, JVM najpierw sprawdza, czy ten literał jest już obecny w stałej puli, czy nie, a jeśli tam jest, nowe odniesienie zacznie wskazywać na ten sam obiekt w SCP.

String a = "Naresh";
String b = "Naresh";
String c = "Naresh";

W powyższym przykładzie obiektu String o wartości Nareshdostanie utworzony w SCP tylko raz i wszystkie odniesienia a, b, cbędzie wskazywać na ten sam obiekt, ale co, jeśli staramy się zmianę anp a.replace("a", "").

Idealnie, apowinna mieć wartość Nresh, ale b, cpowinny pozostać niezmienione, ponieważ jako użytkownika końcowego jesteśmy dokonującej zmiany w atylko. I wiemy a, b, cwszystkie są skierowane do tego samego obiektu, więc jeśli mamy dokonać zmiany a, inne powinny również odzwierciedlać zmiany.

Ale niezmienność ciągów znaków ratuje nas od tego scenariusza, a ze względu na niezmienność obiektu string obiektu string Nareshnigdy się nie zmieni. Więc kiedy wprowadzamy jakąkolwiek zmianę azamiast zmiany w obiekcie łańcuchowym, NareshJVM tworzy nowy obiekt, przypisz go, aa następnie dokonamy zmiany w tym obiekcie.

Zatem pula String jest możliwa tylko ze względu na niezmienność String i gdyby String nie był niezmienny, wówczas buforowanie obiektów typu string i ponowne ich użycie nie byłoby możliwe, ponieważ każda zmienna zmieniłaby wartość i zepsułaby inne.

I dlatego jest obsługiwany przez JVM w bardzo specjalny sposób i otrzymał specjalny obszar pamięci.

2. Bezpieczeństwo wątków

Obiekt jest nazywany bezpiecznym wątkowo, gdy działa na nim wiele wątków, ale żaden z nich nie jest w stanie uszkodzić swojego stanu, a obiekt ma ten sam stan dla każdego wątku w dowolnym momencie.

Ponieważ niezmienny obiekt nie może być modyfikowany przez nikogo po jego utworzeniu, co sprawia, że ​​każdy niezmienny obiekt jest domyślnie bezpieczny dla wątków. Nie musimy stosować do niego żadnych środków bezpieczeństwa wątków, takich jak tworzenie zsynchronizowanych metod.

Tak więc ze względu na swoją niezmienną naturę obiekt string może być współużytkowany przez wiele wątków i nawet jeśli jest manipulowany przez wiele wątków, nie zmieni swojej wartości.

3. Bezpieczeństwo

W każdej aplikacji musimy podać kilka sekretów, np. Nazwę użytkownika \ hasła, adresy URL połączeń i ogólnie wszystkie te informacje są przekazywane jako obiekt ciągu.

Załóżmy teraz, że jeśli String nie byłby niezmienny z natury, spowodowałby poważne zagrożenie bezpieczeństwa dla aplikacji, ponieważ te wartości mogą się zmieniać, a jeśli jest to dozwolone, mogą się one zmienić z powodu błędnie napisanego kodu lub innej osoby, która mają dostęp do naszych referencji zmiennych.

4. Ładowanie klasy

Jak omówiono w sekcji Tworzenie obiektów przez odbicie w Javie z przykładem , możemy użyć Class.forName("class_name")metody do załadowania klasy do pamięci, która ponownie wywoła inne metody, aby to zrobić. Nawet JVM używa tych metod do ładowania klas.

Ale jeśli widzisz wyraźnie, że wszystkie te metody akceptują nazwę klasy jako obiekt ciągu, ciągi są używane do ładowania klas java, a niezmienność zapewnia bezpieczeństwo, przez które ładowana jest właściwa klasa ClassLoader.

Załóżmy, że jeśli String nie byłby niezmienny i próbujemy załadować, java.lang.Objectktóre zmieniają się org.theft.OurObjectw międzyczasie, a teraz wszystkie nasze obiekty mają zachowanie, które ktoś może wykorzystać do niepożądanych rzeczy.

5. Buforowanie HashCode

Jeśli zamierzamy wykonać jakiekolwiek operacje związane z haszowaniem na jakimkolwiek obiekcie, musimy nadpisać hashCode()metodę i spróbować wygenerować dokładny kod mieszający przy użyciu stanu obiektu. Jeśli stan obiektu się zmienia, co oznacza, że ​​jego kod skrótu również powinien się zmienić.

Ponieważ String jest niezmienny, więc wartość przechowywana przez jeden obiekt ciągu nigdy nie ulegnie zmianie, co oznacza, że ​​jego kod skrótu również się nie zmieni, co daje klasie String możliwość buforowania jego kodu skrótu podczas tworzenia obiektu.

Tak, obiekt String buforuje swój kod skrótu w momencie tworzenia obiektu, co czyni go doskonałym kandydatem do operacji związanych z haszowaniem, ponieważ kod skrótu nie musi być ponownie obliczany, co pozwala nam zaoszczędzić trochę czasu. Z tego powodu String jest najczęściej używany jako HashMapklucze.

Przeczytaj więcej o tym, dlaczego ciąg jest niezmienny i ostateczny w języku Java .


1
Odnośnie bezpieczeństwa - w jaki sposób zmienna wartość ciągu może zostać zmieniona w pamięci? W jaki sposób inna osoba może uzyskać dostęp do naszych zmiennych referencji?
MasterJoe 2

Nie chodzi o to, jak można uzyskać dostęp do referencji, ale co, jeśli ktoś ma do nich dostęp? jak wspomniano "jeśli String nie byłby niezmienny z natury, spowodowałoby to poważne zagrożenie bezpieczeństwa aplikacji, ponieważ te wartości mogą ulec zmianie, a jeśli jest to dozwolone, mogą się one zmienić z powodu błędnie napisanego kodu lub jakiejkolwiek innej osoby którzy mają dostęp do naszych zmiennych referencji ”.
Naresh Joshi

Jak się tutaj liczy. Dostęp do referencji można uzyskać lub nie. Jeśli to możliwe, czy możesz wymienić 1-2 techniki *** (tj. Jak), które można w tym celu wykorzystać? Jeśli nie jest to możliwe, punkt dotyczący bezpieczeństwa nie ma zastosowania. *** Przykład - Nazwij jedną technikę ataku na bazę danych aplikacji internetowej -> Wstrzyknięcie SQL. Czy znasz takie techniki atakowania odniesień?
MasterJoe 2

Jak wspomniano, „Może się to zdarzyć z powodu źle napisanego kodu lub jakichkolwiek zmian wprowadzonych przez inną osobę, która ma dostęp do naszych referencji zmiennych”. Np. Załóżmy, że ciąg jest zmienny i piszesz jakąś metodę, która używa ciągu jako sekret tajny i ponownie ten ciąg jest przekazywany do kilku innych metod w międzyczasie i jedna z tych metod nie jest zapisywana przez Ciebie i ta metoda wprowadziła w tym pewne zmiany string teraz po wywołaniu wszystkich tych metod control zwrócił twoją metodę i używasz tego ciągu ponownie, ale został on zmieniony.
Naresh Joshi

2
Proszę ujawnić wszelkie powiązania i nie wykorzystywać tej witryny do promowania swojej witryny poprzez publikowanie. Zobacz: Jak napisać dobrą odpowiedź? .
Yvette

21

Najważniejszy powód według tego artykułu na DZone:

Pula stałych łańcuchów ... Jeśli łańcuch jest zmienny, zmiana ciągu z jednym odniesieniem doprowadzi do niewłaściwej wartości dla innych odniesień.

Bezpieczeństwo

Ciąg jest szeroko stosowany jako parametr w wielu klasach Java, np. Połączenie sieciowe, otwieranie plików itp. Gdyby ciąg znaków nie był niezmienny, połączenie lub plik zostałby zmieniony i prowadziłby do poważnego zagrożenia bezpieczeństwa. ...

Mam nadzieję, że to ci pomoże.


@JasonC Chcę tylko wiedzieć, czy moja odpowiedź jest błędna, czy nie. Byłem już na rozmowie kwalifikacyjnej i czekałem na wynik.Jeśli odpowiedź mówi im, że jest poprawna, zostanę wybrany
kołysząc

1
O ile wiem, twoja odpowiedź jest prawidłowa, ale niezmienna oznacza, że ​​odniesienie nigdy nie zmieni miejsca wskazania. Wszystkiego najlepszego na rozmowie kwalifikacyjnej.
JDGuide

1
Jeśli zaakceptujesz swój punkt 1, wszystkie obiekty powinny być niezmienne.
nicomp

Cześć JDeveloper, zredagowałem Twoją odpowiedź, aby odpowiednio przypisać źródło Twojej odpowiedzi. Pamiętaj, aby zawsze używać cudzysłowów w przypadku dosłownych kopii treści. Dzięki!
NickL

Artykuł DZone zawiera główne błędy dotyczące działania basenu Strign. To jest tylko dla stałych. Zatem podane uzasadnienie jest nieważne.
Markiz Lorne

4

Czytałem ten post Dlaczego ciąg jest niezmienny lub ostateczny w Javie i przypuszczam, że najważniejszym powodem może być:

Ciąg jest niezmienny w języku Java, ponieważ obiekty String są buforowane w puli ciągów . Ponieważ buforowane literały String są współużytkowane przez wielu klientów, zawsze istnieje ryzyko, że akcja jednego klienta wpłynie na wszystkich innych klientów.


1

Masz rację. Stringw Javie używa pojęcia String Pooldosłowności. Po utworzeniu łańcucha i jeśli ciąg już istnieje w puli, zostanie zwrócone odwołanie do istniejącego ciągu, zamiast tworzenia nowego obiektu i zwracania jego odniesienia.Jeśli ciąg nie jest niezmienny, zmiana ciągu za pomocą jednego odwołania prowadzą do niewłaściwej wartości innych odniesień.

Dodałbym jeszcze jedną rzecz, ponieważ Stringjest niezmienny, jest bezpieczny dla wielu wątków, a pojedyncza instancja String może być współużytkowana w różnych wątkach. Pozwala to uniknąć użycia synchronizacji w celu zapewnienia bezpieczeństwa wątków, ciągi są niejawnie thread safe.


0

Klasa String FINALoznacza, że ​​nie można utworzyć żadnej klasy, która by ją odziedziczyła i zmienić podstawową strukturę oraz uczynić Sting mutowalnym.

Kolejna zmienna instancji i metody klasy String są takie, że nie można zmienić Stringutworzonego obiektu.

Powód, dla którego dodałeś, nie sprawia, że ​​ciąg znaków w ogóle jest niezmienny - wszystko to mówi, w jaki sposób łańcuch jest przechowywany w stercie.


11
Jeśli klasa została zadeklarowana jako ostateczna, oznacza to, że klasa nie może być dziedziczona, ale nie oznacza to, że pola instancji klasy nie mogą być zmieniane, a więc klasa jest niezmienna.
Dmitry Bychenko

@Zeeshan: Wszystkie przykładowe klasy, które podajesz, są niezmienne.
Siyuan Ren

0

Ciąg jest podawany jako niezmienny przez mikro systemy firmy Sun, ponieważ może on być używany do przechowywania jako klucza w kolekcji map. StringBuffer jest zmienny, dlatego nie może być używany jako klucz w obiekcie mapy


0

Najważniejszym powodem, dla którego String jest niezmienny w Javie, są kwestie bezpieczeństwa . Następnie byłoby buforowanie .

Uważam, że inne podane tutaj powody, takie jak wydajność, współbieżność, projekt i pula ciągów, wynikają z faktu, że String jest niezmienny. Np. Pula ciągów mogła zostać utworzona, ponieważ ciąg był niezmienny, a nie na odwrót.

Sprawdź transkrypcję wywiadu Gosling tutaj

Ze strategicznego punktu widzenia częściej są bezproblemowe. Zwykle są rzeczy, które można zrobić z elementami niezmiennymi, których nie można zrobić z rzeczami zmiennymi, takie jak buforowanie wyniku. Jeśli przekażesz ciąg do metody otwierania pliku lub jeśli przekażesz ciąg do konstruktora dla etykiety w interfejsie użytkownika, w niektórych interfejsach API (na przykład w wielu interfejsach API systemu Windows) przekazujesz tablicę znaków. Odbiorca tego obiektu naprawdę musi go skopiować, ponieważ nie wie nic o czasie jego przechowywania. I nie wiedzą, co się dzieje z przedmiotem, czy zmienia się pod ich stopami.

W końcu prawie zmuszony jesteś do replikacji obiektu, ponieważ nie wiesz, czy możesz go posiadać, czy nie. Jedną z fajnych rzeczy związanych z niezmiennymi obiektami jest to, że odpowiedź brzmi: „Tak, oczywiście, że tak”. Ponieważ kwestia własności, kto ma prawo to zmienić, nie istnieje.

Jedną z rzeczy, która zmusiła Stringsa do niezmienności, było bezpieczeństwo. Masz metodę otwierania plików. Przekazujesz do niego String. Następnie wykonuje wszelkiego rodzaju testy uwierzytelniania, zanim zacznie wykonywać wywołanie systemu operacyjnego. Jeśli uda ci się zrobić coś, co skutecznie zmutowało String, po sprawdzeniu bezpieczeństwa i przed wywołaniem systemu operacyjnego, to bum, jesteś w środku. Ale Ciągi są niezmienne, więc ten rodzaj ataku nie działa. Ten dokładny przykład jest tym, co naprawdę wymagało, aby ciągi znaków były niezmienne


0

Oprócz świetnych odpowiedzi chciałem dodać kilka punktów. Podobnie jak Strings, Array przechowuje odniesienie do początku tablicy, więc jeśli utworzysz dwie tablice arr1i zrobisz arr2coś takiego, odniesienie arr2 = arr1to będzie takie arr2samo, ponieważ arr1zmiana wartości w jednej z nich spowoduje zmianę na przykład drugiej

public class Main {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4};
        int[] b = a;
        a[0] = 8;
        b[1] = 7;
        System.out.println("A: " + a[0] + ", B: " + b[0]);
        System.out.println("A: " + a[1] + ", B: " + b[1]);
        //outputs
        //A: 8, B: 8
        //A: 7, B: 7
    }
}

Nie dość, że spowodowałoby to błędy w kodzie, może (i będzie) również wykorzystywane przez szkodliwego użytkownika. Załóżmy, że masz system, który zmienia hasło administratora. Użytkownik musi najpierw wprowadzić, newPassworda następnie, oldPasswordjeśli oldPasswordjest taki sam jak adminPassprogram, zmienić hasło o adminPass = newPassword. powiedzmy, że nowe hasło ma to samo odniesienie co hasło administratora, więc zły programista może utworzyć tempzmienną do przechowywania hasła administratora, zanim użytkownik wprowadzi dane, jeśli oldPasswordjest równe temp, zmienia hasło w przeciwnym razieadminPass = temp. Ktoś, kto wie, że może łatwo wpisać nowe hasło i nigdy nie wpisywać starego hasła, a abracadabra ma dostęp administratora. Inną rzeczą, której nie zrozumiałem, gdy uczyłem się o łańcuchach, dlaczego JVM nie tworzy nowego ciągu dla każdego obiektu i nie ma dla niego unikalnego miejsca w pamięci i możesz to zrobić za pomocą new String("str");Powodem, którego nie chcesz zawsze używać, newjest ponieważ nie jest wydajna pod względem pamięci iw większości przypadków jest wolniejsza, czytaj więcej .


0

Jeśli HELLOjest twoim ciągiem, nie możesz zmienić HELLOna HILLO. Ta właściwość nazywa się własnością niezmienności.

Możesz mieć wiele zmiennych typu String wskaźnika, aby wskazywać HELLO String.

Ale jeśli HELLO to char Array, możesz zmienić HELLO na HILLO. Na przykład,

char[] charArr = 'HELLO';
char[1] = 'I'; //you can do this

Odpowiedź:

Języki programowania mają niezmienne zmienne danych, dzięki czemu można ich używać jako kluczy w parze klucz, wartość. Zmienne łańcuchowe są używane jako klucze / indeksy, więc są niezmienne .


-1

Z Securitypunktu widzenia możemy posłużyć się tym praktycznym przykładem:

DBCursor makeConnection(String IP,String PORT,String USER,String PASS,String TABLE) {

    // if strings were mutable IP,PORT,USER,PASS can be changed by validate function
    Boolean validated = validate(IP,PORT,USER,PASS);

    // here we are not sure if IP, PORT, USER, PASS changed or not ??
    if (validated) {
         DBConnection conn = doConnection(IP,PORT,USER,PASS);
    }

    // rest of the code goes here ....
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.