For more detail...
In the case of b == b1, a Boolean object is being compared to a boolean primitive. This is a "boolean equality," so according to
JLS 15.21.2, the Boolean object is unboxed and primitive booleans are compared. Both have a value of "true," so the comparison is true.
In the case of b == b2, two Boolean objects are being compared. Note that these are separate objects, each created using "new" (as opposed to autoboxing). This is a "reference equality," so according to
JLS 15.21.3, the comparison is false because these do not refer to the same object.