Sobes.tech
Junior

Kas yra nuorodų duomenų tipai?

sobes.tech AI

Atsakymas iš AI

Nuorodų tipų duomenys saugo ne pačią reikšmę, o nuorodą (adresą atmintyje) į vietą, kur ši reikšmė yra.

Ypatybės:

  • Nuorodų tipo kintamieji gali saugoti null reikšmę.
  • Kai vieno nuorodų tipo kintamojo reikšmė priskiriama kitam, kopijuojama ne pati reikšmė, o nuoroda. Abu kintamieji pradeda rodyti į tą patį atminties vietą.
  • Pakeitimai, atlikti per vieną nuorodą, bus matomi per kitą, jei jie rodo į tą patį objektą.
  • Atmintis nuorodų tipų objektams valdomas šiukšlių surinkėjo.

Nuorodų tipų pavyzdžiai:

  • Eilutės (String)
  • Masyvai
  • Naudotojo klasių objektai
  • Delegatai (kai kuriose kalbose)

Skirtumas nuo reikšmių tipų:

Savybė Reikšmių tipai Nuorodų tipai
Saugojimas Savo reikšmė Nuoroda į reikšmę
Kopijavimas Kopijuojama pati reikšmė Kopijuojama nuoroda
Pakeitimai Pakeitimai kopijoje neveikia originalo Pakeitimai per vieną nuorodą matomi per kitą (jei rodo į tą patį objektą)
Atmintis Valdoma iššaukiant steką (stack) Valdoma krūvos, išvaloma šiukšlių surinkėju
Pavyzdžiai int, float, bool, struct (kai kuriose kalbose) String, Array, Object
// Pavyzdys C#
string s1 = "Hello"; // s1 rodo į eilutę "Hello"
string s2 = s1;      // s2 rodo į tą patį nuorodą kaip ir s1

// Pakeitimai nebus matomi per kitą nuorodą,
// nes eilutės C# yra nekeičiamos. 
// Pakeitus, sukuriama nauja eilutė ir nuoroda peradresuojama.
s1 = "World"; 

Console.WriteLine(s2); // Išveda "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 rodo į masyvą {1, 2, 3}
int[] arr2 = arr1;     // arr2 rodo į tą patį nuorodą

arr2[0] = 10;          // Pakeitimas per arr2

Console.WriteLine(arr1[0]); // Išveda 10, pakeitimas matomas ir per arr1
// Pavyzdys Java
String s1 = "Hello"; // s1 rodo į eilutę "Hello"
String s2 = s1;      // s2 rodo į tą patį nuorodą kaip ir s1

// Eilutės Java yra nekeičiamos.
// Pakeitus, sukuriama nauja eilutė ir nuoroda peradresuojama.
s1 = "World"; 

System.out.println(s2); // Išveda "Hello"

int[] arr1 = { 1, 2, 3 }; // arr1 rodo į masyvą {1, 2, 3}
int[] arr2 = arr1;     // arr2 rodo į tą patį nuorodą

arr2[0] = 10;          // Pakeitimas per arr2

System.out.println(arr1[0]); // Išveda 10, pakeitimas matomas ir per arr1