SolrJ is Solr's Java client API that insulates you from the dirty details of parsing and sending messages back and forth between your application and Solr. More than just a client API, it is also the way to run Solr embedded in your code instead of communicating to one remotely over HTTP—more on that later.
Although you don't have to use SolrJ to communicate with Solr, it's got some great performance features that may even tempt non-Java applications to use a little Java (or run on a JVM) in order to use it. The following are the features:
It communicates with Solr via an efficient and compact binary message format (still over HTTP) called javabin. It can still do standard XML if desired (useful if your client and your server are different versions).
It streams documents to Solr asynchronously in multiple threads for maximizing indexing throughput. This is not the default but it's easy to configure it this way.
It routes documents and search requests to a SolrCloud...