non sono un fan della conoscenza basso livello dei linguaggi di programmazione, non penso sia importante conoscere la differenza a livello di memoria tra un array e una lista, basta sapere le differenze in termini pratici e quando usare uno e quando usare l'altro. I discorsi sulle performance delle strutture dati hanno un sapore antico e java è comodo per imparare "alla mia maniera" proprio per le sue "restrizioni", penso sia meglio concentrarsi sul paradigma e sulle funzionalità piuttosto che sulla gestione della memoria. Infatti io non ho fatto ingegneria

non i dettagli implementativi, i TEST distinguono una applicazione solida da una debola -_-
btw visual studio mica è gratis, per il resto java o c# è uguale, c# sicuramente da più soddisfazione in quando è facile partire usando interfacce grafiche (mentre in java le gui non sono così immediate da usare, anche se le swt non sono male), java in compenso è gratuito e lo è il suo IDE (qua è lunga, a me piace eclipse netbeans mi fa merda, ma non è verità assoluta

)
