در اصل پایه هر دوی متدهای بالا یکی است یعنی contains برای فهمیدن اینکه رشته مورد نظر شما در رشته منبع است از متد indexOf مانند زیر استفاده می کند و تنها تفاوتی که دارد این است که باعث خوانایی برنامه می شود.
public boolean contains(CharSequence findedStr){
return indexOf(findedStr.toString()) > -1;
}
شما با توجه به نیاز خودتون اگر می خواهید موقعیت رشته رو پیدا کنید از indexOf و برای اینکه متوجه شوید که رشته ای که دارید جستجو می کنید در رشته مورد نظر هست یا نه از contains که مقدار برگشتیش منطقی هست استفاده میکند.