Junior
Ce sunt tipurile de date de referință?
sobes.tech AI
Răspuns de la AI
Tipurile de date de referință stochează nu valoarea în sine, ci o referință (adresă în memorie) către locul unde se află această valoare.
Caracteristici:
- Variabilele de tip referință pot stoca o referință către
null. - Când se atribuie valoarea unei variabile de tip referință alteia, nu se copiază valoarea în sine, ci referința. Ambele variabile indică același loc în memorie.
- Modificările făcute printr-o referință vor fi vizibile și prin cealaltă, dacă indică același obiect.
- Memoria pentru obiectele de tip referință este gestionată de garbage collector.
Exemple de tipuri de date de referință:
- Șiruri de caractere (
String) - Array-uri
- Obiecte de clase personalizate
- Delegați (în unele limbaje)
Diferențe față de tipurile de date de valoare:
| Caracteristică | Tipuri de date de valoare | Tipuri de date de referință |
|---|---|---|
| Stocare | Valoarea în sine | O referință către valoare |
| Copiere | Se copiază valoarea în sine | Se copiază referința |
| Modificare | Modificările în copie nu afectează originalul | Modificările printr-o referință sunt vizibile și în cealaltă (dacă indică același obiect) |
| Memorie | Gestionată de stivă (de obicei) | Gestionată de heap, eliberată de garbage collector |
| Exemple | int, float, bool, struct (în unele limbaje) |
String, Array, Object |
// Exemplu în C#
string s1 = "Hello"; // s1 stochează o referință la șirul "Hello"
string s2 = s1; // s2 acum stochează aceeași referință ca și s1
// La modificare, nu va fi vizibilă prin cealaltă referință,
// deoarece șirurile în C# sunt imutabile.
// La modificare, se creează un nou șir și referința este reasignată.
s1 = "World";
Console.WriteLine(s2); // Afișează "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 stochează o referință la array-ul {1, 2, 3}
int[] arr2 = arr1; // arr2 acum stochează aceeași referință
arr2[0] = 10; // Modificare prin arr2
Console.WriteLine(arr1[0]); // Afișează 10, modificarea fiind vizibilă și prin arr1
// Exemplu în Java
String s1 = "Hello"; // s1 stochează o referință la șirul "Hello"
String s2 = s1; // s2 acum stochează aceeași referință ca și s1
// Șirurile în Java sunt imutabile.
// La modificare, se creează un nou șir și referința este reasignată.
s1 = "World";
System.out.println(s2); // Afișează "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 stochează o referință la array-ul {1, 2, 3}
int[] arr2 = arr1; // arr2 acum stochează aceeași referință
arr2[0] = 10; // Modificare prin arr2
System.out.println(arr1[0]); // Afișează 10, modificarea fiind vizibilă și prin arr1