Tout d'abord, je tiens à souligner que je suis tout à fait d'accord avec la réponse (actuellement la mieux notée) de @codaddict.
Mais je voulais faire une expérience, alors la voici :
Il ne s'agit pas d'une preuve formelle, mais ce code a fonctionné pour moi sans jamais atteindre l'intérieur de l'enveloppe de l'ordinateur. if
(en utilisant le JDK 1.6.0 Update 16 sur Ubuntu) :
Edit : Voici un code mis à jour qui gère également les Locales :
import java.util.Locale;
public class ToLowerTester {
public final Locale locale;
public ToLowerTester(final Locale locale) {
this.locale = locale;
}
public String findFirstStrangeTwoLetterCombination() {
char[] b = new char[2];
for (char c1 = 0; c1 < Character.MAX_VALUE; c1++) {
b[0] = c1;
for (char c2 = 0; c2 < Character.MAX_VALUE; c2++) {
b[1] = c2;
final String string = new String(b);
String lower = string.toLowerCase(locale);
if (string.length() != lower.length()) {
return string;
}
}
}
return null;
}
public static void main(final String[] args) {
Locale[] locales;
if (args.length != 0) {
locales = new Locale[args.length];
for (int i=0; i<args.length; i++) {
locales[i] = new Locale(args[i]);
}
} else {
locales = Locale.getAvailableLocales();
}
for (Locale locale : locales) {
System.out.println("Testing " + locale + "...");
String result = new ToLowerTester(locale).findFirstStrangeTwoLetterCombination();
if (result != null) {
String lower = result.toLowerCase(locale);
System.out.println("Found strange two letter combination for locale "
+ locale + ": <" + result + "> (" + result.length() + ") -> <"
+ lower + "> (" + lower.length() + ")");
}
}
}
}
L'exécution de ce code avec les noms de locale mentionnés dans la réponse acceptée permettra d'imprimer quelques exemples. L'exécuter sans argument essayera toutes les locales disponibles (et prendra un certain temps !).
Ce n'est pas exhaustif, car en théorie, il pourrait y avoir des chaînes de caractères multiples qui se comportent différemment, mais c'est une bonne première approximation.
Notez également que de nombreuses combinaisons de deux caractères produites de cette manière sont probablement invalides en UTF-16. Le fait que rien n'explose dans ce code ne peut être attribué qu'à une API String très robuste en Java.
Enfin, même si l'hypothèse est vraie pour la mise en œuvre actuelle de Java, cela peut facilement changer lorsque les futures versions de Java mettront en œuvre les futures versions de la norme Unicode, dans lesquelles les règles pour les nouveaux caractères peuvent introduire des situations où cela n'est plus vrai.
Donc dépendre de ça est toujours une assez mauvaise idée.