String Pool trong Java

Mình mới học Java, có một thắc mắc nhỏ nhờ mấy bạn giải đáp dùm, đây là Source Code:

String a = "dmcs";
String b = new String();
b = "dmcs";
System.out.print(a == b)

Kết quả: True

String a = "dmcs";
String b = new String("dmcs");
System.out.print(a == b);

Kết quả: false

Vậy sự khác nhau của việc khai báo một String rỗng sau đó gán cho nó bằng một biến kiểu String khác và việc gán cho nó ngay từ đầu là gì, như ở câu b mình kiểm tra hashCode của cả a và b là bằng nhau, vậy tại sao hai biến đó lại tham chiếu đến hai biến khác nhau (theo mình hiểu thì Java sử dụng String Pool, 2 biến tham chiếu đến 2 String hoàn toàn giống nhau thì cùng địa chỉ với nhau)