Q:

Qué significa el comando ArrayList(); al crear un ArrayList?

Tengo el siguiente comando 
public static void main(String[] args) {

      ArrayList<Integer> weeklyTemperatures = new // crea un ArrayList
      ArrayList<Integer>();**  // ¿Que está haciendo de nuevo esta línea?

A:

Considerando el siguiente trozo de código:
ArrayList<Integer> weeklyTemperatures = new ArrayList<Integer>();

Este se compone de varias partes, pero se escribe normalmente como una sola linea.
Primero se declara el tipo con 
ArrayList<T>

Esto quiere decir que se tiene la intención de declarar una variable del tipo ArrayList. En Java es obligatorio que se declare el tipo de variable, esto debido a que java es un lenguaje tipado. Por otro lado, ArrayList es una clase que representa un tipo de estructura de datos que es común en programación, llamadas Listas. 
Ahora, los signos <> que están a la derecha del tipo, se llaman coloquialmente diamantes. Estos quieren decir que la clase ArrayList hace uso de parámetros genéricos. Los tipos genéricos permiten a la clase que hace uso de estas estructuras (ArrayList), abstraerse del funcionamiento interno de t. Entonces t solo implementa los métodos que la clase que hace uso del tipo genérico, necesita para manipularlos. En este caso no se necesita que t implemente métodos especiales, por lo tanto se puede declarar de cualquier tipo que sea un ejemplar de Object ( t extends Object )(Ver Herencia). Ej:
ArrayList<String>
ArrayList<Integer>
ArrayList<Perro>

Puedes ver mas información desde la documentación oficial en inglés: Generic Types.
Segundo, se da nombre a la variable con:
ArrayList<Integer> weeklyTemperatures 

Cada variable debe tener un nombre conforme a las reglas de nombres en Java. También existen distintos tipos de variables. Esta podría solo ser una declaración si se cierra la instrucción con ; .
Tercero. Se usa el operador = para asignar un valor a la variable que se acaba de declarar. Esto se puede hacer tanto en la misma linea como en una nueva. Ej:
int numero;
numero = 1;

o también
int numero = 1;

Cuarto. Se crea un ejemplar de la clase con new. El operador new reserva memoria para el nuevo objeto de la derecha, su sintaxis es:

new [nombre del constructor]([parámetros del constructor])

Esto produce una llamada al constructor de esa clase y devuelve una referencia a el nuevo ejemplar de la misma, cabe destacar que siempre el constructor de una clase lleva el nombre de la misma. Las clases que poseen constructores privados no se pueden ejemplarizar (Modificadores de acceso)
Finalmente una clase se puede ejemplarizar con un tipo diferente si son parte de la misma jerarquía de clases (Herencia).

