Além disso, uma coisa bem mais útil é que podemos agora pôr separadores de dígitos dentro de constantes numéricas.
É bem mais fácil conferir pi = 3.141_592_653_589_793_238_462_643_383_279_5 em vez de 3.1415926535897932384626433832795.
Entretanto, esse suporte a separadores de milhar vale só para o compilador; as rotinas (como Integer.parseInt ou DecimalFormat.parse) não entendem o "_". Isso, provavelmente, é para garantir compatibilidade com programas já existentes.
Uma coisa que sempre me incomodou é que números octais são iniciados por um simples zero, tal como em C/C++. Isso é muito confuso; seria preferível que houvesse um indicador de base (como, digamos, a letra Q. Por exemplo, em vez de 0377, teríamos a constante 0Q377.). Como isso já é uma "pegadinha" antiga da linguagem, eu sugiro que se use sempre um separador, para você tomar cuidado com esse zero inicial. Em vez de usar o número 0377, deveríamos usar 0_377. Mas não sei se uma convenção dessas ajudaria muito ou não.
import java.text.*; // Requer Java 7 para ser compilada class NovosLiterais { public static void main (String[] args) { int cafeBabe = -889275714; assert (cafeBabe == 0xCAFEBABE); // hexadecimal assert (cafeBabe == 031277535276); // octal // 0b introduz um número em notação binária assert (cafeBabe == 0b11001010111111101011101010111110); // binário // "_" separa os dígitos. assert (cafeBabe == 0b1100_1010_1111_1110_1011_1010_1011_1110); // binário // Pode-se usar separadores de dígitos em qualquer base assert (cafeBabe == 0xCAFE_BABE); assert (cafeBabe == -889_275_714); assert (cafeBabe == 0_31_277_535_276); // Não é preciso pôr os separadores de 3 em 3 ou de 4 em 4. long cnpj = 65_497_745_0001_53L; // É possível usar separadores de dígitos mesmo com números de ponto-flutuante double pi = 3.141_592_653_589_793_238_462_643_383_279_5; double avogadro_constant = 6.022_141_79E+23; // Você não pode usar o "_" no início de uma constante, porque aí teríamos // um identificador. Ele só pode ser usado dentro de uma constante. double _42; // isto é um identificador, não uma constante // .parseInt, .parseLong não suportam "_" try { long x = Long.parseLong ("CAFEBABE", 16); x = Long.parseLong ("CAFE_BABE", 16); } catch (NumberFormatException ex) { ex.printStackTrace(); } try { int x = Integer.parseInt ("11001010", 2); x = Integer.parseInt ("1100_1010", 2); } catch (NumberFormatException ex) { ex.printStackTrace(); } // DecimalFormat.parse também não suporta "_" NumberFormat df = DecimalFormat.getInstance(); try { Number n = df.parse ("123_456"); System.out.println (n); // imprime "123", o que indica que ele não consegue ver além do "_" } catch (ParseException ex) { ex.printStackTrace(); } } }