The offsets typically are present as an optimization. For example, in the character array related items, you can use the same character array multiple times to construct multiple Strings from the array. This is because you would use the same array with different offsets and lengths.
This is a very effective optimization because it prevents the need to construct new character arrays solely for the purpose of having the character you wish to start with at the zero index. For example, after reading in a block of bytes (perhaps from a socket), you could chunk it up into String sized messages without having to do unnecessary byte copying.