Προς το περιεχόμενο

Απορίες στην Java


FarCry1

Προτεινόμενες αναρτήσεις

Καλησπερα. Αυτες τις μερες προσπαθω να εξοικειωθώ με την Java αφου οι περισσοτεροι εργοδοτες δυστυχως ζητουν να ξερεις java. Στην σχολη ομως δεν ημουν τοσο καλος και την περασα με το ζορι. Αντιθετα στην C ημουν καλυτερος καθως ο καθηγητης που ειχαμε εκανε πολλα σχηματα στον πινακα για το τι γινεται στην μνημη RAM και ακομα και με τους δεικτες δεν ειχα δυσκολευτει αφου απο τα σχηματα τους καταλαβα. Γενικως τα σχηματα που φαινεται τι γινεται στην μνημη Ram με βοηθουν και με βαση αυτα προσπαθω να καταλαβω και την java.

 

Στην java εχω προχωρησει αρκετα και ειμαι στον πολυμορφισμο. Ομως παρολο που καποια πραγματα τα ξερω σχετικα καλά, νιωθω οτι δεν καταλαβει ακομα τι γινεται στην μνημη κυριως με τις συμβολοσειρες. Νομιζω κατι δεν κανω σωστα.

Θα ηθελα να μου πειτε αν εχει καποια διαφορα η συμβολοσειρα στην C με την Java. Δηλαδη αν βαλουμε στην Java String x; πως θα αποθηκευτει στην μνημη RAM; Μπορει καποιος

να μου το σχεδιασει οπως το σχεδιασα κι εγω στο χαρτι με την γλωσσα C; Σας στελνω φωτογραφια

 1.jpg.ee898a422e3a2888bca7367314f19126.jpg

 

 

 

Επισης σε μια δομη στην C μπορουσαμε να δηλωσουμε και πινακες. Στην Java αν αντι για pin και mat βαζαμε ArrayList με ακέραιους μπορει να μου πει καποιος πως θα ηταν στην μνημη; Εχω στειλει κι εδω φωτογραφια.

2.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Δημοσ. (επεξεργασμένο)

Στην Java δεν πρέπει να σε προβληματίζει η διαχείριση της μνήμης. Μάθε OOP, Collections και τους βασικούς αλγόριθμους και θα είσαι μια χαρά για Junior θέση.

"In Java, memory management is the process of allocation and de-allocation of objects, called Memory management. Java does memory management automatically. Java uses an automatic memory management system called a garbage collector."

Η διαχείριση της μνήμης δεν είναι εύκολη υπόθεση ενώ γενικότερα οι προγραμματιστές προσπαθούν να χρησιμοποιούν high level εργαλεία που τους καθιστούν πιο παραγωγικούς.

Αν σε εξιτάρει τόσο και θες να βρεις δουλειά αποκλειστικά σε γλώσσα σε αυτό το κομμάτι κοίτα C++ ή Rust.

 

Επεξ/σία από wotw
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

15 λεπτά πριν, wotw είπε

Στην Java δεν πρέπει να σε προβληματίζει η διαχείριση της μνήμης. Μάθε OOP, Collections και τους βασικούς αλγόριθμους και θα είσαι μια χαρά για Junior θέση.

"In Java, memory management is the process of allocation and de-allocation of objects, called Memory management. Java does memory management automatically. Java uses an automatic memory management system called a garbage collector."

Η διαχείριση της μνήμης δεν είναι εύκολη υπόθεση ενώ γενικότερα οι προγραμματιστές προσπαθούν να χρησιμοποιούν high level εργαλεία που τους καθιστούν πιο παραγωγικούς.

Αν σε εξιτάρει τόσο και θες να βρεις δουλειά αποκλειστικά σε γλώσσα σε αυτό το κομμάτι κοίτα C++ ή Rust.

 

C/C++ δεν βλεπω να εχει τοση ζητηση. Δεν ψαχνουν αρχαριους αλλα μονο με προυπηρεσια.

Οσον αφορα την μνημη δεν ρωταω γιατι μου μονο αρεσει, αλλα ετσι θα καταλαβω τι γινεται. Πχ οταν φτιαχνουμε ενα αντικειμενο στην Java, καταλαβα οτι δημιουργειται ενας δεικτης που δειχνει στο αντικειμενο. Και αυτον τον δεικτη μπορεις να τον αλλαξεις θεση και να δειχνει αλλου.

Επισης οταν δηλωνω εναν πινακα String στην java για καποιο λογο πχ σε μια For που διατρεχω τον πινακα, φαινονται ολοκληρα τα αλφαριθμητικα ανα μια θεση. Δηλαδη δεν αποθηκευεται 1 γραμμα σε καθε θεση του πινακα οπως γινεται και στην C;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

O πίνακας από string στην Java δεν μετραφράζεται στην c ως char[] αλλά ως char[][]. Είναι δηλαδή πίνακας από πίνακες σε χαρακτήρες == Πίνακας από strings.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οκ. Να ρωτησω και κατι αλλο.

Οταν δηλωνουμε ενα αντικειμενο απο μια κλαση, το αντικειμενο αυτο θα περιεχει μεσα και τις μεθοδους (αν εχει η κλαση) ή μονο τα πεδια(μεταβλητες δηλαδη); Απ οτι καταλαβαινω πολλες φορες στην main γραφω S1.getName(); Το S1 ειναι ενα αντικειμενο και καλω την μεθοδο getName. Αρα απ οτι καταλαβαινω καθε αντικειμενο, εκτος απο μεταβλητες εχει και μεθοδους μεσα. Σωστα τα λεω;

 

Eπισης θυμαμαι στην C που οταν καλουμε μια συναρτηση, σταματαει προσωρινα η main και εκτελειται η συναρτηση. Δημιουργει αντιγραφα τιμων που παιρνει απο τα ορισματα στην main, και μολις τελειωσει η συναρτηση "διαγραφει" οτι δημιουργησε και γυρναει στην main.

Αυτο το οτι "διαγραφει ολες τις τιμες οταν τελειωσει η συναρτηση και γυρισει στην main" ισχυει και στην java;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχεις μπερδέψει λίγο τα πράγματα στο μυαλό σου. Να φανταστώ δεν πήρες κάποιο μάθημα με compilers στην σχολή σου σωστά;

Σε κάθε περίπτωση πρέπει να διαβάσεις για vtables   και να δεις πως τα υλοποιεί η java

Για το 2ο που λες δεν έχει να κάνει με γλώσσα αλλά με την assembly που καταλήγει το πρόγραμμα σου (με τον α ή β τρόπο αναλόγως την γλώσσα). Αυτό που περιγράφεις είναι πως δουλεύει το  function call.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
21 ώρες πριν, FarCry1 είπε

Οκ. Να ρωτησω και κατι αλλο.

Οταν δηλωνουμε ενα αντικειμενο απο μια κλαση, το αντικειμενο αυτο θα περιεχει μεσα και τις μεθοδους (αν εχει η κλαση) ή μονο τα πεδια(μεταβλητες δηλαδη); Απ οτι καταλαβαινω πολλες φορες στην main γραφω S1.getName(); Το S1 ειναι ενα αντικειμενο και καλω την μεθοδο getName. Αρα απ οτι καταλαβαινω καθε αντικειμενο, εκτος απο μεταβλητες εχει και μεθοδους μεσα. Σωστα τα λεω;

 

Eπισης θυμαμαι στην C που οταν καλουμε μια συναρτηση, σταματαει προσωρινα η main και εκτελειται η συναρτηση. Δημιουργει αντιγραφα τιμων που παιρνει απο τα ορισματα στην main, και μολις τελειωσει η συναρτηση "διαγραφει" οτι δημιουργησε και γυρναει στην main.

Αυτο το οτι "διαγραφει ολες τις τιμες οταν τελειωσει η συναρτηση και γυρισει στην main" ισχυει και στην java;

Το αντικείμενο καταλαμβάνει χωρο μονο για τα πεδία. Οι μέθοδοι 'ανήκουν' στην κλαση.

Οταν καλεις μια μεθοδο απο την main τότε οι primitive (int, boolean, float..) τοπικές μεταβλητές και παράμετροι αποθηκεύονται στην stack memory (LIFO) η οποια καθαρίζει μόλις τελειωσει η μέθοδος (οπως στην C).

Αν μεσα στη μεθοδο δημιουργείς αντικείμενα τοτε αυτα τα καθαρίζει ο GC όταν δεν υπάρχουν references προς αυτά (Στην C πρέπει να κάνεις deallocate).

 

Επεξ/σία από albNik
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Ευχαριστω για τις απαντησεις. Προσπαθουσα να καταλαβω μια ασκηση στην Java και τωρα καταλαβα καποια πραγματα που δεν ηξερα. Σας στελνω και τον κωδικα:

public class Main
{
    public static void main(String[] args) {
    
    DataSet ds = new DataSet();
    
    BankAccount BA1 = new BankAccount(1500);
    BankAccount BA2 = new BankAccount(2000);
    BankAccount BA3 = new BankAccount(1000);
   
    ds.add(BA1);
    ds.add(BA2);
    ds.add(BA3);
    
    System.out.println("Average: " + ds.calcAverage());
    System.out.println("Max Balance " + ds.getMax());
    System.out.println("Min Balance " + ds.getMin());
    }      
}

public class DataSet
{
    private int counter;
    private double sum;
    private BankAccount max;
    private BankAccount min;
    
    public DataSet (){
    counter=0;
    sum=0;
    max=null;
    min=null;

}
    public void add(BankAccount item){
        if(counter == 0){
            
            max=item;
            min=item;
            
        }
        if(item.getBalance() > max.getBalance()){
            max=item;}
            
        if(item.getBalance() < min.getBalance()){
            min=item;}
            
            counter++;
            sum= sum + item.getBalance();
    }
        public double calcAverage(){
            
            if (counter ==0)
            return 0;
            return sum/counter;
        }
        
        public double getMax(){
            return max.getBalance();
        
        }
        public double getMin(){
            return min.getBalance();
        }
}

public class BankAccount
{
    private double balance;
    
    public BankAccount(double amount){
        
        balance = amount;
    }        
    public double getBalance(){
        return balance;
       }
}

Μετα απο ενα σχημα που εκανα στο χαρτι τοτε καταλαβα πως δουλευει η Java Και θα ηθελα να μου πειτε αν καταλαβα σωστα η κανω καπου λαθος

Αρχικα καταλαβα οτι η Java εχει δεικτες οπως και στην C. Εγω νομιζα οτι δεν χρησιμοποιουμε δεικτες.

1)Δηλαδη το BA1 ΒΑ2 BA3 ειναι δεικτες που δειχνουν σε αντικειμενο τυπου BankAccount. Το ιδιο ισχυει με τον δεικτη ds που δειχνει σε αντικειμενο τυπου DataSet. O Min και Max ειναι δεικτες που δημιουργηθηκαν οταν φτιαξαμε το αντικειμενο που ειναι τυπου DataSet και αρχικα θα δειξουν σε null. Ομως ειναι φτιαγμενοι και να δειχνουν σε αντικειμενα τυπου BankAccount. Επισης ο δεικτης item δειχνει εκει που καλουμε την μεθοδο καθε φορα (add). πχ ο δεικτης item θα γινει ισος με τον δεικτη που καλουμε την μεθοδο. Οτι γινοταν και στην C δηλαδη. 

2)Τα πεδια/μεταβλητες δηλαδη που ειναι σε καθε κλαση ουσιαστικα επιδρουν σε ολες τις μεθοδους της ιδιας κλασης. Επισης οταν αναφερομαστε σε μια μεθοδο σε πεδια της κλασης , μπορουμε να αλλαξουμε τιμες στο αντικειμενο παρολο που στην μεθοδο δεν εχουμε δεν εχουμε ορισει κατι. Αυτο δεν γινοταν στην C με τις συναρτησεις. Θυμαμαι στην σχολη που οταν φτιαχναμε μια συναρτηση δεν μπορουσαμε να αλλαξουμε τις μεταβλητες εξω απο την συναρτηση παρα μονο με την βοηθεια των δεικτων. Παντως καταλαβα οτι αν ορισουμε μια μεταβλητη μεσα στην μεθοδο εχει εμβελεια μονο στην μεθοδο και οχι σε ολη την κλάση. Δηλαδη ο counter που εχει οριστει εξω απο την μεθοδο μπορει να αλλαζει απο την μεθοδο. Στην C δεν γινοταν αυτο

3)Οι δεικτες που δειχνουν σε αντικειμενα τις καταλαβαινω οπως στην C που μπορουμε να φτιαξουμε μια δομη που δεν ξερουμε το ονομα της αλλα ξερουμε τον δεικτη που δειχνει σε αυτη την δομη.

Καλα τα εχω καταλαβει; Ή εχω κανει καποιο λαθος; 

 

IMG_20210721_132954.jpg

Επεξ/σία από FarCry1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Tα references δειχνουν σε θεσεις μνημης οπως και οι pointers, απλα ειναι πιο βελτιωμένα. Εχουν εκτός apo την διεύθυνση του object καποια επιπλέον metadata οπως τον τυπο της κλασσης π.χ. αν ειναι πινακας τοτε εχει και το Length του.  Δεν μπορει το reference ενός Dataset object να δειχνει αργοτερα στο BankAccount. Ειναι πιο ασφαλή επίσης επειδή δεν επιτρέπονται low level arithmetic tricks με τις διευθύνσεις τους.

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Οκ. Θέλω να ρωτήσω κάτι αλλο

Έκανα κάποια τεστ στην java με τους δείκτες. Δημιούργησα δύο δείκτες S1 και S2. Δημιούργησα και 2 αντικείμενα ίδιου τυπου/κλάσης.

"τύπος κλάσης" S1=new "τύπος κλάσης"(); 

"τύπος κλάσης" S2=new "τύπος κλάσης"(); 

Επομένως ο κάθε δείκτης δείχνει σε ένα αντικείμενο.

Ήθελα να δω τι γίνεται με τις διευθύνσεις στην μνήμη. Δοκιμασα να κάνω

System.out.println(S1);

System.out.println(S2);

Και εκτέλεσα το πρόγραμμα. Όντως οι δείκτες έδειχναν σε διαφορετικές θέσεις μνήμης. Αντέγραψα σε χαρτί τις διεύθυνσης και των δύο δεικτων για να θυμάμαι που είναι ο καθένας. 

Δοκιμασα να κάνω τον S1 να δείχνει στον S2;  με την εντολή S1=S2; 

Είδα ότι πλέον στην εκτέλεση του πρόγραμματος οι διευθύνσεις των δεικτων ήταν ίδιες μεταξύ τους.

Δοκίμασα όμως μετά να τους αντιστρέψω S2=S1 και ΣΒΗΝΟΝΤΑΣ την προηγούμενη εντολή S1=S2

Εκτελεσα ξανά το πρόγραμμα και αντί να έχουν την δεύτερη διεύθυνση που είχα γράψει στο χαρτί, είχαν την διεύθυνση του S1=S2 που είχε εμφανιστεί πριν. Δηλαδή φαινόταν σαν να μην τους αντεστρεψα.

Ότι και να εβαζα(ειτε S1=S2 είτε S2=S1) την ίδια διευθυνση έβαζε.

Εγω ήξερα ότι όλες οι "κινήσεις" στις γλωσσες προγραμματισμου γίνονται από δεξιά προς τα άριστερα. Το ίδιο και στην C. Αν έβαζα δύο δείκτες S1=S2; καταλάβαινα ότι ο S1 θα μετακινηθεί και θα πάει εκεί που δείχνει ο S2.

Δεν ισχύει το ίδιο στην java; 

Επεξ/σία από FarCry1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Αυτό που βλέπεις υποτίθεται ότι είναι το hashcode του object, όχι διευθυνση μνήμης.

Επίσης o JVM ειναι έξυπνος ώστε να μην αποθηκεύει καν το ενα object που δεν χρησιμοποίησες ποτέ.

Εκτυπωσε τα S1, S2 πριν και μετα το S2=S1

public class HelloWorld{

     public static void main(String []args){
         T a=new T();
         T b=new T();
         
      // System.out.println(a);
      // System.out.println(b);
         
        a=b;
        System.out.println(a);
        System.out.println(b);
     }
}

class T{}

Δες τη διαφορα αν κανεις uncomment τις δυο γραμμές.

 

Επεξ/σία από albNik
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οι managed γλωσσες Java, C#... εχουν εξελιχθεί αρκετα στο code optimisation και ειδικά στην διαχείριση μνήμης. To εκτελέσιμο τους ξεπερνάει ανετα σε ταχύτητα τα αντίστοιχα των c/c++. Ο GC είναι ουσιαστικά ενας perfomance booster.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οκ. Να κανω μια αλλη ερωτηση οσον αφορα τις επαναληψεις

Ξερω οτι υπαρχουν δυο τροποι για να διατρεξουμε εναν πινακα που τονο ονομασαμε pin

Ο ενας τροπος ειναι αυτος:

for(i=0; i<pin.lenght; i++{

System.out.println(pin[i]));

}

Και ο αλλος ειναι αυτος:

for(int i : pin){

System.out.println(i);

}

Εστω τωρα οτι εχουμε δηλωσει καπου  στο προγραμμα και την εντολη:

Scanner in = new Scanner(System.in); για να πληκτρολογησει ο χρηστης και να μπουν οι ακεραιοι στον πινακα

τοτε ο ενας τροπος ειναι αυτος:

for(i=0; i<pin.lenght; i++{

pin[i]=in.nextInt();

}

Και ο αλλος τροπος ποιος ειναι; Κανω δοκιμες και εμφανιζει λαθη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...