Java Perlin noise implementation
Consider warmwaffle's code at GitHub (re: https://github.com/warmwaffles/Noise).  The one difference I see between the two solutions is how the 'metaVector2f's are created.  Your code is using non-repeatable random numbers; whereas, the other uses a mathematical calculation which includes prime numbers and bit shifting operations.  The latter would produce a repeatable solution with the same seed versus yours.  This may be worth something if you're testing or troubleshooting elsewhere.