Salut,

Envoyé par
papilou86
Si j'ai tout bien compris, il n'y a aucun moyen de faire une liste des objets déjà créés en mémoire vive du PC.
Oui et non. En Java, il faut avoir accès une référence vers un objet pour pouvoir en faire quelque chose, comme le stocker dans une liste Mais on peut s'arranger pour avoir ces références pour en créer la liste quand on en a besoin. On peut créer aussi la liste et la remplir au moment de créer les objets.

Envoyé par
papilou86
Si je ne connais pas le nom de l'objet, impossible de l'atteindre.
Il faut donc, au fur et à mesure que je crées des objets que je mette leur nom, et leur propriétés dans un tableau par exemple.
Oui et non également. La programmation objet implique que l'objet connaisse ses propriétés. Inutile donc de les stocker dans un tableau. Mais il faut pouvoir accéder à l'instance d'objet que l'on veut traiter, par un moyen ou un autre.
Mettons que j'ai la classe suivante qui définit mon objet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| public class Person {
private final String firstname;
private final String lastname;
private final LocalDate birthDate;
public Person(String firstname, String lastname, LocalDate birthDate) {
this.firstname=firstname;
this.lastname=lastname;
this.birthDate=birthDate;
}
public String getFirstName() {
return firstname;
}
public String getLastName() {
return lastname;
}
public LocalDate getBirthDate() {
return birthDate;
}
public int getAge() {
return Period.between(birthDate,LocalDate.now()).getYears();
}
@Override
public String toString() {
int age=getAge();
return firstname + " " + lastname + " (" + age+ " an"+ (age>1?"s":"")+")";
}
} |
On peut les mettre dans une liste :
1 2 3 4 5 6 7 8 9 10 11 12 13
| List<Person> persons = new ArrayList<>();
Person p1 = new Person("André","A", LocalDate.of(1948, Month.MAY, 12));
persons.add(p1);
Person p2 = new Person("Carole","B", LocalDate.of(1953, Month.DECEMBER, 17));
persons.add(p2);
Person p3 = new Person("Joseph","C", LocalDate.of(1963, Month.FEBRUARY, 21));
persons.add(p3);
Person p4 = new Person("Nathalie","D", LocalDate.of(1942, Month.NOVEMBER, 3));
persons.add(p4); |
L'intérêt c'est qu'on peut traiter la liste dans une boucle :
1 2 3 4
| for(Person person : persons ) {
int age = person.getAge();
System.out.println(person.getFirstName() +" a " + age + " an"+ (age>1?"s":""));
} |
Ou par Stream :
List<Person> personsOlderThan60 = persons.stream().filter(person-> person.getAge()>60).collect(Collectors.toList());
Pour afficher l'age de Carole, on peut faire :
persons.stream().filter(person-> "Carole".equals(person.getFirstName()).mapToInt(Person::getAge).forEach(age-> Ssytem.out.println("L'age de Carole est " +age));
ou
persons.stream().filter(person-> "Carole".equals(person.getFirstName()).forEach(person -> Ssytem.out.println("L'age de " + person.getFirstName() + " est " + person.getAge()));
Si on doit très souvent chercher une person sur une information donnée, on pourra utiliser une Map :
Map<String, Person> mapByFirstName = persons.stream().collect(Collectors.toMap(Person::getFirstName, Function.identity()));
Pour savoir s'il y a une Carole dans la liste précédente :
boolean caroleExists = persons.stream().anyMatch(person-> "Carole".equals(person.getFirstName()));

Envoyé par
papilou86
Dans ce cas, je vais cherche prune dans un tableau, puis si je trouve prune je vais modifier le prix.
On peut aussi utiliser un tableau :
1 2 3 4 5 6
| Person[] personArray = { person1, person2, person3, person4 };
for(Person person : personArray) {
if ("Carole".equalsIgnoreCase(person.getFirstName())) {
// code à faire si firstname est Carole
}
} |

Envoyé par
papilou86
Seconde question: si j'ai bien compris, on ne peut pas supprimer un objet. On met cette instance à null, c'est tout, et on laisse faire java.
Donc, je supprime l'objet de mon tableau, (je sauvegarde le tableau) et il ne sera pas rechargé au démarrage de mon programme le lendemain.
La suppression et l'ajout seront plus facile à gérer avec une List. Avec un tableau, il faudra penser toujours à ignorer les valeurs null. Un tableau ne peut pas changer de taille, donc il faut savoir dès le début le nombre d'éléments et se trimbaler plein de cases vides qui prennent de la mémoire pour rien et augmente les temps de traitement pour rien. Ou alors il faut gérer ça en créant des nouveaux tableaux et bouger les éléments, pour minimiser l'impact sur les performances.

Envoyé par
papilou86
On met cette instance à null, c'est tout, et on laisse faire java.
Oui c'est le garbage collector qui s'occupe de libérer l'espace mémoire, quand il a le temps, ou que c'est indispensable, ou pour d'autres raisons algorithmiques. Cela se fait également quand on perd toute référence vers l'objet. Par exemple :
1 2 3 4
| public int calculAge(LocalDate date) {
Person p = new Person("","",date);
return p.getAge();
} |
L'objet créé sera perdu (sa référence ne sera plus connue du programme) dès que la méthode aura fini de s'exécuter.
Partager