It can be proven that if h(s) never overestimates a state's distance to the final state, then A* search is optimal.
As mentioned, the number of tiles out of place heuristic for the 8-Puzzle problem does not overestimate.
A* search is easily implemented by changing the priority queue comparator object to:
new Comparator<Vertex>() { public int compare(Vertex v1, Vertex v2) { int h1 = ((State) v1).getHeuristic(finalState); int d1 = v1.getDistance(); int h2 = ((State) v2).getHeuristic(finalState); int d2 = v2.getDistance(); return (h1 + d1) - (h2 + d2); } }