Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Du rififi dans l'arrondi

Vendredi, c'est arrondi !
Je vous propose une petite expérience amusante pour montrer que les calculs en virgule flottante ne font pas toujours ce qu'on pense...

Lire la suite...

Introduction au binaire, avec des vrais bouts de Java

Vous savez ce qu'on dit : "Il existe 10 types de personnes - ceux qui comprennent le binaire, et..."

Dans cet article, je rappellerai quelques principes basiques sur la représentation des nombres en binaire, les opérations associées, ainsi que les techniques de manipulation bas niveau des bits. Rien de méchant, mais il existe certaines API en Java dont l'usage nécessite une certaine connaissance de ces mécanismes, alors autant être préparé.

Lire la suite...

Nouvelle formation : Java Concurrency In Practice

Mes chers lecteurs,

JCIPJ'ai le plaisir de vous annoncer que je devrais, en 2012, ajouter une nouvelle corde à mon arc, en l'occurrence une nouvelle formation : Java Concurrency In Practice.

Si le nom vous dit quelque chose, c'est normal : c'est le titre du livre de Brian Goetz, Doug Lea, Tim Peierls, Joshua Bloch... qui fait référence (et mal au crâne) sur le domaine de la programmation parallèle/concurrente en Java.
La formation est basée sur le livre, sous la supervision des auteurs, et est développée par Heinz Kabutz, auteur de la fameuse newsletter et de la formation Java Specialist que j'anime déjà.

Bref, attendez-vous à du lourd.

D'ailleurs, je ne vous cache pas que c'est un peu intimidant pour moi aussi - je me sens un peu petit à côté de telles légendes... Mais je vais faire de mon mieux :)

La formation ne devrait pas être disponible avant mi-2012 (et toujours chez Zenika), j'aurai donc le temps de vous en reparler.

Au coeur du JDK : performance des conversions

Dans l'article précédent, qui portait sur la conversion des nombres, je vous ai affirmé que la conversion d'un nombre en chaîne était plus performante en utilisant Integer.toString() que la concaténation du nombre avec une chaîne vide (""+foo).

Comme je n'ai vu aucun commentaire de type "O RLY ?" à la suite de l'article, j'imagine que vous m'avez cru sur parole. C'est bien :) Mais ça va toujours mieux en le démontrant.
J'ai donc monté un petit benchmark pour comparer les deux techniques, en usant des précautions habituelles (nettoyage de la mémoire, optimisations de la JVM déjouées, code warming...).

Le code source complet est disponible en annexe, et tous les résultats présentés ci-dessous ont été obtenus sur un Intel E6300, 3Go ram sous Windows XP 32b et Java 6.0.24.

Lire la suite...

Au coeur du JDK : conversion des nombres

Aujourd'hui, je vous propose une petite révision sur la conversion entre les différentes représentations des nombres.

En Java, il est possible de représenter un nombre sous 3 formes :

  • en utilisant le type primitif adéquat (byte, short, int, long, float, double)
  • en utilisant la classe wrapper correspondante (Byte, Short, Integer, Long, Float, Double)
  • sous forme de chaîne de caractères, provenant le plus souvent d'une saisie utilisateur

Il existe des méthodes optimisées pour opérer des conversion entre ces trois formats. Il est important de les connaître, pour des raisons de lisibilité et de performance.

Lire la suite...

Niveaux de criticité dans Jenkins, Sonar, PMD et Checkstyle

Sonar permet de configurer, via une interface graphique, les niveaux de criticité des alertes remontées par PMD et Checkstyle. Ces niveaux peuvent ensuite (après quelques réglages) servir à influencer la santé des builds dans Jenkins - par exemple, l'utilisation de System.out.println provoquera un simple warning, alors que le lancement manuel d'un Throwable fera échouer le build.

Le problème, c'est que chaque outil dispose de ses propres niveaux de criticité, et il n'est pas toujours simple de déterminer leur correspondance d'un outil à l'autre : un réglage "minor" dans Sonar correspond-il à "info" ou "warning" dans PMD ? Et Jenkins le comprendra-t-il comme une alerte de type "low" ou "normal" ?

Lire la suite...

Guava par l'exemple (3/3) : I/O

Dans ce troisième et dernier article, je vous propose de découvrir les fonctionnalités de Guava relatives à la gestio des entrées/sorties (I/O).
Que ce soit pour réaliser des opérations systèmes (copie de fichier, déplacement...), ou pour travailler avec des fichiers textuels ou binaires, le package com.google.common.io regorge de fonctionnalités pratiques.

Cet article fait partie d'une série :

Lire la suite...

De l'utilité d'un bon hashCode

La bonne implémentation de la méthode hashCode() a une conséquence directe sur les performances des collections de type Hash* (HashSet, HashMap...).

Pour le démontrer, je vous propose une petite expérience : nous allons mesurer le temps nécessaire à l'insertion d'un grand nombre d'objets dans un HashSet, en fonction de la qualité de leur algorithme de hachage.

Lire la suite...

Guava par l'exemple (2/3) : les collections

Dans ce second article, je vous propose de découvrir les fonctionnalités de Guava relatives aux collections.
Nous nous intéresserons dans un premier temps aux Prédicats et aux Fonctions, puis nous découvrirons les nouvelles Collections proposées par Google.

Cet article fait partie d'une série :

Lire la suite...

Inner classes and the myth of the default constructor

How many times have you read the following sentence : "When you don't provide any constructor in a class, the compiler automatically inserts a default, no-args constructor for you" ?

So now you assume that every class with no apparent constructor has a hidden, default, no-arg constructor. Big mistake.

Lire la suite...

- page 6 de 35 -