Sure, there is Apache Commons Math, but it is still changing a lot, and it is not very performance optimized yet, while it has been active for several years already. There is also Java3D, it does Matrix through GMatrix, but not much linear algebra and if you look at their implementation, it is very basic, not performance oriented.
The other candidates seem to be 1-man projects that can disappear any other day (some of them look quite good like ojalgo, most of them are not interesting). Then you also have the serious but not maintained anymore Cern Colt library.
Compared to C/C++, the Java world is worrying if you want to do maths.
In those libraries, a dense matrix of double can be implemented two ways:
- by maintaining internally a double. Usually those libraries allow for not copying the array, so it can be neat if your interfaces have this kind of arrays.
- by maintaining internally a double. The reason is for performance, but then each time you build a matrix from a double, an expensive copy will happen. So you need to use the Matrix object in your interfaces instead of double.
This is a pain because you can be very quickly stuck in one or the other Matrix library. A "solution" is to have your own interface, but that is a pain to write. There is UJMP, but it can hide some important methods (like transpose & multiply in one go from Colt or the ability to reuse an existing matrix in various operations to avoid allocating new memory), it is a students project (like parallel colt), but if it was a standard, it could be much more interesting.
In summary it does really look like scientific people, universities don't use Java for computation otherwise Colt surely would have been maintained.