Intern
Ποια είναι η διαφορά μεταξύ των primitive και των αναφορικών τύπων δεδομένων;
sobes.tech AI
Απάντηση από AI
Οι πρωταρχικοί τύποι αποθηκεύουν άμεσα την τιμή, ενώ οι τύποι αναφοράς αποθηκεύουν μια αναφορά (διεύθυνση στη μνήμη) στο αντικείμενο που περιέχει την τιμή.
Πρωταρχικοί τύποι:
- Καταλαμβάνουν σταθερό και μικρό όγκο μνήμης.
- Μεταδίδονται με τιμή (αντιγράφεται η ίδια η τιμή).
- Ξεκινούν με μικρό γράμμα.
- Περιλαμβάνουν:
byte,short,int,long,float,double,boolean,char.
// Παράδειγμα πρωταρχικού τύπου
int a = 10;
int b = a; // Αντιγράφεται η τιμή 10
b = 20; // Μόνο το b αλλάζει, το a παραμένει 10
Τύποι αναφοράς:
- Καταλαμβάνουν διαφορετικό όγκο μνήμης, ανάλογα με το περιεχόμενο του αντικειμένου.
- Μεταδίδονται με αναφορά (αντιγραφή της διεύθυνσης του αντικειμένου). Οι αλλαγές στο αντικείμενο μέσω της αναφοράς επηρεάζουν όλες τις μεταβλητές που αναφέρονται σε αυτό.
- Συνήθως ξεκινούν με κεφαλαίο γράμμα (κλάσεις).
- Περιλαμβάνουν: κλάσεις (
String,Object, προσαρμοσμένες κλάσεις), διεπαφές, πίνακες.
// Παράδειγμα τύπου αναφοράς
String str1 = new String("Hello");
String str2 = str1; // Αντιγράφεται η αναφορά στο αντικείμενο "Hello"
str2 = "World"; // Το str2 τώρα αναφέρεται σε ένα νέο αντικείμενο "World". Το str1 εξακολουθεί να αναφέρεται στο "Hello".
// Άλλο παράδειγμα με μεταβλητό αντικείμενο
ArrayList<Integer> list1 = new ArrayList<>();
list1.add(1);
ArrayList<Integer> list2 = list1; // Αντιγράφεται η αναφορά στο ίδιο αντικείμενο ArrayList
list2.add(2); // Προσθέτουμε ένα στοιχείο στο αντικείμενο που προσπελάζεται και από τις δύο αναφορές
// Τώρα, το list1 περιέχει [1, 2] και το list2 περιέχει [1, 2]
Γρήγορος πίνακας σύγκρισης:
| Ιδιότητα | Πρωταρχικοί τύποι | Τύποι αναφοράς |
|---|---|---|
| Αποθήκευση | Τιμή | Αναφορά σε αντικείμενο |
| Μεταβίβαση | Με τιμή | Με αναφορά |
| Μέγεθος μνήμης | Σταθερό και μικρό | Μεταβλητό |
| Ξεκινά με μικρό γράμμα | Ναι | Συνήθως με κεφαλαίο |
| Nullability | Δεν μπορούν να είναι null |
Μπορούν να είναι null |
Οι πρωταρχικοί τύποι περικλείονται σε αντίστοιχες κλάσεις-περιτυλίγματα (wrapper classes) για να μπορούν να λειτουργούν ως αντικείμενα (π.χ., int σε Integer).