The only difference is that initializing fields upon declaration, as in
private Map<Integer, String> abc1 = new HashMap<>();
makes things a bit easier (this is a personal opinion which could be highly argued since it mostly depends on the context). Whatever constructor you will call, you are sure that these fields will be properly initialized.
Whereas, when you initialize those fields inside a constructor, then you must make sure that the fields are properly initialized while using other constructors, too.
private Map<Integer, String> abc1;
public Program()
{
abc1 = new Map<Integer, String>();
}
public Program(Map<Integer, String> map)
{
abc1 = map ?? new Map<Integer, String>();
}
public Program(double someOtherField) : this()
{
}