The javadoc is pretty clear about the difference:
void setCharacterEncoding(String charset)
Sets the character encoding (MIME charset) of the response being sent to the client, for example, to UTF-8. If the character encoding has already been set bysetContentType(java.lang.String)orsetLocale(java.util.Locale), this method overrides it. CallingsetContentType(java.lang.String)with the String oftext/htmland calling this method with the String of UTF-8 is equivalent with callingsetContentTypewith the String oftext/html; charset=UTF-8.
void setContentType(String type)
Sets the content type of the response being sent to the client, if the response has not been committed yet. The given content type may include a character encoding specification, for example,text/html;charset=UTF-8.