Hasta que he empezado a trabajar en mi nueva empresa, nunca me había dado de las novedades en el lenguaje en Java 1.5.

  1. Tipos de datos parametrizados, es decir, ahora se puede especificar el tipo de datos que contienen estructuras tales como Vector o Map.

    // Vector de cadenas
     Vector<String> v = new Vector<String>();
     v.addElement("Hola");
     String s = v.getElementAt(0);
     v.addElement(new Integer(20));// Daría error!!
     
     // HashMap con claves enteras y valores de vectores
     HashMap<Integer, Vector> hm = new HashMap<Integer, Vector>();
     hm.put(1, v);
     Vector v2 = hm.get(1);

    Esto permite evitar el uso de castings y de autoboxing:

    Vector<Integer> v = new Vector<Integer>();
     v.addElement(30);
     Integer n = v.getElementAt(0);
     n = n+1;
  2. Mejoras en blucles. Ahora existe un nuevo for para recorrer colecciones y arrays sin usar Iterator:
    // Recorre e imprime todos los elementos de un array
     int[] arrayInt = {1, 20, 30, 2, 3, 5};
     for(int elemento: arrayInt)
     System.out.println (elemento);
     
     // Recorre e imprime todos los elementos de un Vector
     Vector<String> v = new Vector<String>();
     for(String cadena: v)
     System.out.println (cadena);
  3. Tipo Enum.
    // Define una lista de 3 valores y luego comprueba en un switch 
     // cuál es el valor que tiene un objeto de ese tipo
     enum EstadoCivil {soltero, casado, divorciado};
     EstadoCivil ec = EstadoCivil.casado;
     ec = EstadoCivil.soltero;
     switch(ec)
     {
     case soltero:System.out.println("Es soltero");
     break;
     case casado:System.out.println("Es casado");
     break;
     case divorciado:System.out.println("Es divorciado");
     break;
     }
  4. Imports estáticos. Permiten usar métodos y propiedades estáticas sin tener que referenciar la clase específicamente.
    import static java.awt.Color;
     import static java.lang.Math;
     
     public class... 
     {
     ...
     JLabel lbl = new JLabel();
     lbl.setBackground(white);  // Antes sería Color.white
     ...
     double raiz = sqrt(1252.2);// Antes sería Math.sqrt(...)
     }
  5. Argumentos variables. Ahora se puede pasar una lista de argumentos variable a una función como en C:
    // Funcion que tiene un parámetro String obligatorio
     // y n parámetros int opcionales
     
     public void miFunc(String param, int... args) 
     {
     ...
     // Una forma de procesar n parametros variables
     for (int argumento: args)
     {
     ...
     }
     ...
     }
     
     ...
     miFunc("Hola", 1, 20, 30, 2);
     miFunc("Adios");
     
  6. Metainformación. Ahora se pueden añadir directivas que transmitan información a las herramientas de desarrollo tipo Eclipse, del mismo modo que @deprecated permite que el compilador muestre la palabra tachada. Por ejemplo:
    // Definición de una interfaz mediante metainformacion
     
     public @interface MiInterfaz
     {
     int metodo1();
     String metodo2();
     }

Hay muchas más novedades relacionadas con la máquina virtual y con las librerías. Te recomiendo leer este documento de donde he extraído yo la información más relevante.