Académique Documents
Professionnel Documents
Culture Documents
En général une bibliothèque (library) est un regroupement de code suffisamment structuré et documenté pour
que d’autres programmeurs puissent s’en servir. La bibliothèque associée à un langage de programmation est
diffusée avec le compilateur, système d’exécution etc. La majeure partie de des programmes disponibles
dans la bibliothèque d’un langage est normalement écrite dans ce langage lui-même.
La première source de documentation des classes de la bibliothèque de Java est bien entendu la
documentation en ligne de cette dernière, ou comme on dit la Application Programmer Interface
Specification. Nous donnons donc des extraits de cette documentation assortis de quelques commentaires
personnels. Cette section entend surtout vous aider à prendre la bonne habitude de consulter la
documentation du langage que vous utilisez. En particulier, la version web du polycopié comporte des liens
vers la documentation en ligne.
On objectera que la bibliothèque est énorme. Mais en pratique on s’y retrouve assez vite :
La documentation en ligne est organisée de façon systématique, La page d’accueil est une liste de liens
vers les pages des packages, la page d’un package est une liste de liens vers les pages des classes, qui
contiennent (au début) une liste de liens vers les champs, méthodes etc.
Les classes que nous utilisons appartiennent à trois packages seulement.
Les descriptions sont parfois un peu cryptiques (car elles sont complètes), mais on arrive vite à en
extraire l’essentiel.
Il est vain d’objecter que la documentation est en anglais. C’est comme ça.
Ce package regroupe les fonctionnalités les plus basiques de la la bibliothèque. Il est importé par défaut (pas
besoin de import java.lang.*).
À chaque type scalaire (int, char etc.), correspond une classe (Integer, Character etc.) qui permet surtout de
transformer les scalaires en objets. Une transformation que le compilateur sait automatiser (voir 2.2.3).
Prenons l’exemple de la classe Integer le pendant objet du type scalaire int. Deux méthodes permettent le
passage d’un scalaire à un objet et réciproquement.
Les fonctions mathématiques usuelles sont définies dans la classe Math. Il n’y a pas d’objets Math. Cette
classe ne sert qu’à la structuration. Elle offre des méthodes (statiques).
B.6.1.3 Les chaînes
Les chaînes sont des objets de la classe String. Une chaîne est tout simplement une séquence finie de
caractères. En Java les chaînes sont non-mutables : on ne peut pas changer les caractères d’une chaîne. Les
chaînes sont des objets normaux, à un peu de syntaxe spécialisée près. Les constantes chaînes s’écrivent
entre doubles quotes, par exemple "coucou". Si on veut mettre un double quote « " » dans une chaîne, il fait
le citer en le précédant d’une barre oblique inverse (backslash).
System.err.print("Je suis un double quote : \"") affiche Je suis un double quote : " sur la console.
En outre, la concaténation de deux chaînes s1 et s2, s’écrit avec l’opérateur + comme s1+s2.
Les autres opérations classiques sur les chaînes sont des méthodes normales.
La taille ou longueur d’une chaîne s, c’est-à-dire le nombre de caractères qu’elle contient s’obtient par
s.length()
public int length()
Le caractère d’indice index s’extrait par la méthode charAt.
public char charAt(int index)
Comme pour les tableaux, les indices commencent à zéro.
On extrait une sous-chaîne par la méthode substring.
public String substring(int beginIndex, int endIndex)
beginIndex est l’indice du premier caractère de la sous-chaîne,et endIndex est l’indice du caractère qui
suit immédiatement la sous-chaîne. La longueur de la sous-chaîne extraite est donc endIndex-
beginIndex. Si le couple d’indices ne désigne pas une sous-chaîne l’exception
IndexOutOfBoundsException est lancée. Les règles de définition du couple d’indices désignant une
sous-chaîne valide (voir la documentation) conduisent à la particularité bien sympathique que
s.substring(s.length(), s.length()) renvoie la chaîne vide "".
La méthode equals est l’égalité structurelle des chaînes, celle qui regarde le contenu des chaînes.
public boolean equals(Object anObject)
Il faut remarquer que l’argument de la méthode est un Object. Il faut juste le savoir, c’est tout. La
classe String étant une sous-classe de Object (voir B.2.3), la méthode s’applique en particulier au seul
cas utile d’un argument de classe String.
La méthode compareTo permet de comparer les chaînes.
public int compareTo(String anotherString)
Compare la chaîne avec une autre selon l’ordre lexicographique (l’ordre du dictionnaire). L’appel
« s1.compareTo(s2) » renvoie un entier r avec :
r < 0, si s1 est strictement inférieure à s2.
r = 0, si les deux chaînes sont les mêmes.
r > 0, si s1 est strictement plus grande t s2.
L’ordre sur les chaînes est induit par l’ordre des codes des caractères, ce qui fait que l’on obtient
l’ordre du dictionnaire stricto-sensu seulement pour les mots sans accents.
Il y a beaucoup d’autres méthodes, par exemple toLowerCase et toUpperCase pour minusculer et
majusculer.
public String toLowerCase()
public String toUpperCase()
Cette fois-ci les caractères accentués sont respectés.
On ne peut pas changer une chaîne, par exemple changer un caractère individuellement. Or, on veut souvent
construire une chaîne petit à petit, on peut le faire en utilisant la concaténation mais il y a alors un prix à
payer, car une nouvelle chaîne est créée à chaque concaténation. En fait, lorsque l’on construit une chaîne de
gauche vers la droite (pour affichage d’un tableau par ex.) on a besoin d’un autre type de structure de
données : le StringBuilder (ou StringBuffer essentiellement équivalent). Un objet StringBuilder contient
un tampon de caractère interne, qui peut changer de taille et dont les éléments peuvent être modifiés. Les
membres les plus utiles de cette classe sont :
On trouvera un exemple d’utilisation classique d’un objet StringBuilder en 1.2.1 : une création, des tas de
append(…), et un toString() final.
B.6.1.5 La classe System
Cette classe System est un peu fourre-tout. Elle posssède trois champs et quelques méthodes assez utiles.
La sortie out est la sortie normale du programme, tandis que la sortie err est la sortie d’erreur. En
fonctionnement normal ces deux flux semblent confondus car aboutissant tous deux dans la même
fenêtre. Mais on peut rediriger la sortie out, par exemple vers un fichier (>fichier). Les messages
d’erreurs s’affichent alors au lieu de se mélanger avec la sortie normale du programme dans fichier.
Les objets de la classe Reader sont des flux de caractères ouverts en lecture. Un tel flux est simplement une
séquence de caractères que l’on lit les un après les autres, et qui finit par se terminer.
La méthode la plus significative est donc celle qui permet de lire le caractère suivant du flux.
public int read() throws IOException
Cette méthode renvoie un int qui est le caractère en attente dans le flux d’entrée, ou −1, si le flux est
terminé. On notera que read renvoie un int et non pas un char précisément pour pouvoir identifier la
fin du flux facilement. En outre et comme annoncé par sa déclaration elle peut lever l’exception
IOException en cas d’erreur (possible dès que l’on s’intéresse au fichiers).
Quand la fin d’un flux est atteinte, il faut fermer le flux.
public void close() throws IOException
Cette opération libère les ressources mobilisées lors de la création d’un flux d’entrée (numéros divers
liées au système de fichiers, tampons internes). Si on ne ferme pas les fluxs dont on ne sert plus, on
risque de ne pas pouvoir en ouvrir d’autres, en raison de l’épuisement de ces ressources.
La classe Reader sert seulement à décrire une fonctionnalité et il n’existe pas à proprement parler d’objets de
cette classe.
En revanche, il existe diverses sous-classes (voir B.2.3) de Reader qui permettent de construire concrètement
des objets, qui peuvent se faire passer pour des Reader. Il s’agit par entre autres des classes StringReader
(lecteur sur une chaîne), InputStreamReader (lecteur sur un flux d’octets) et FileReader (lecteur sur un
fichier). On peut donc par exemple obtenir un Reader ouvert sur un fichier /usr/share/dict/french par
Reader in = new FileReader ("/usr/share/dict/french") ;
Reader in = new InputStreamReader (System.in) ;
Un objet BufferedReader est d’abord un Reader qui groupe les appels au flux sous-jacent et stocke les
caractères lus dans un tampon, afin d’améliorer les performances (voir B.5.4). Mais un BufferedReader offre
quelques fonctionnalités en plus de celles des Reader.
Une source pseudo-aléatoire est une suite de nombres qui ont l’air d’être tirés au hasard. Ce qui veut dire que
les nombres de la suite obéissent à des critères statistiques censés exprimer le hasard (et en particulier
l’uniformité, mais aussi un aspect chaotique pas évident à spécifier précisément). Une fois la source
construite (un objet de la classe Random), diverses méthodes permettent d’obtenir divers scalaires (int,
double, etc.) que l’on peut considérer comme tirés au hasard. On a besoin de tels nombres « tirés au hasard »
par exemple pour réaliser des simulations (voir 2.1.1) ou produire des exemples destiner à tester des
programmes.
Les constructeurs.
public Random()
public Random(long seed)
La version avec argument permet de donner une semence de la source pseudo-aléatoire, deux sources
qui ont la même semence se comportant à l’identique. La version sans argument laisse la bibliothèque
choisir une semence comme elle l’entend. La semence choisie change à chaque appel du constructeur
et on suppose qu’elle est choisie de façon la plus arbitraire et non-reproductible possible (par exemple
à partir de l’heure qu’il est).
Les nombres pseudo-aléatoires sont produits par diverses méthodes « next ». Distinguons
particulièrement,
Un entier entre zéro (inclus) et n (exclu).
public int nextInt(int n)
Cette méthode est pratique pour tirer un entier au pseudo-hasard sur un intervalle [a…b[, par
a + rand.nextInt(b-a).
Un flottant entre 0.0 (inclus) et 1.0 (exclu).
public float nextFloat()
public double nextDouble()
Ces méthodes sont pratiques pour décider selon une probabilité quelconque. Du style
rand.nextDouble() < 0.75 vaut true avec une probabilité de 75 %.