Most of these suggestions apply only after a bottleneck has been identified:
Make the loop do as little as possible.
Remove from the loop any execution code that does not need to be executed on each pass.
Move any code that is repeatedly executed with the same result, and assign that code to a temporary variable before the loop ("code motion").
Avoid method calls in loops when possible, even if this requires rewriting or inlining.
Multiple access or update to the same array element should be done on a temporary variable and assigned back to the array element when the loop is finished.
Avoid using a method call in the loop termination test.
Use int data types preferentially, especially for the loop variable.
Use System.arraycopy( ) for copying arrays.
Try to use the fastest tests in loops.
Convert equality comparisons to identity comparisons when possible.
Phrase multiple boolean tests in one expression so that they "short circuit" as soon as possible.
Eliminate unneeded temporary variables from loops.
Try unrolling the loop to various degrees to see if this improves speed.
Rewrite any switch statements to use a contiguous range of case values.
Identify whether a recursive method can be made faster.
Convert recursive methods to use iteration instead.
Convert recursive methods to use tail recursion.
Try caching recursively calculated values to reduce the depth of recursion.
Use temporary variables in place of passed parameters to convert a recursive method using a single search path into an iterative method.
Use temporary stacks in place of passed parameters to convert a recursive method using multiple search paths into an iterative method.