I am unable to understand the logic behind it.
Case 1:
HashSet shortSet = new HashSet();
for (short i = 0; i < 3; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println(shortSet.size() + " shortSet : " + shortSet);
Op :Size : 3 shortSet : [0, 1, 2]
Case 2 :
HashSet shortSet = new HashSet();
for (int i = 0; i < 3; i++) {
shortSet.add(i);
shortSet.remove(i - 1);
}
System.out.println("Size : "+shortSet.size() + " shortSet : " + shortSet);
Op : Size : 1 shortSet : [2]
I just want to understand the main reason behind this, why these two output are different Just By changing from short to int . what happens behind the scene.

The problem is that in the first case, the expression i is of type short, whereas the expression i - 1 is of type int. Those values are being boxed to Short and Integer respectively - the Integer isn't in the set, so can't be removed.
You can fix this with a cast:
for (short i = 0; i < 3; i++) {
shortSet.add(i);
shortSet.remove((short) (i - 1));
}
In your second case, both i and i - 1 are of type int (then boxed to Integer), so the entries you're adding can also be removed...
See more on this question at Stackoverflow