For doubles, Autoboxing means implicitly (without a cast nor anything that shows off we're doing it) converting a double value, the primitive type, to a Double value, the corresponding object type.
Auto unboxing is the opposite: implicitly converting a Double value to a double value.
You use it when you want to convert a primitive to an object, or an object to a primitive. Typically when wanting to store double values in a List, well, Lists cannot store primitives but they can store objects, so you can convert the doubles to Doubles, and store them in Lists. Without explicitly saying in the program, "hey, my double here, make it a Double before you store it somewhere that can take in Doubles!"
listOfDoubles.add(Double.valueOf(i)); // this why we could use double
value of?
You can because why not. It's completely unneeded to call Double.valueOf(i) as the compiler will do that implicitly if you hadn't done it explicitly.
Unneeded, but not forbidden. Notably, autoboxing and unboxing were introduced with Java 1.5. It didn't exist before. So, before, you needed a way to box and unbox your values when you needed to. Double.valueOf() is such a way.
It wouldn't make sense to suddenly forbid it and break older programs that used it, just because it's not needed anymore in modern Java.