I'm a long-time python programmer, thinking of learning clojure because I want to play with my droid, and java drives me nuts. I've been reading
Learning Clojure[1], where it talks about data immutability as a fundamental assumption of Clojure's model. It says "Watch out for cases of mutable Java objects stored in immutable Clojure collection objects. If the mutable object changes, this won't be reflected in the collection's hash." This sounds potentially horrendously difficult to debug.
I don't want to start a language war, here. I'd be interested to hear people's personal experience with this issue, and also of any tools or language features which mitigate this issue, either by making it a very unlikely mistake, or making such cryptic mutability easy to detect.
[1] http://en.wikibooks.org/wiki/Learning_Clojure
The upshot of this is that if you're using a Java library, you'll generally want to either:
(a) build a clojure wrapper API so as to enforce some sane semantics on it (see clojure.contrib.http.agent for a good example of this, where HTTP interactions are wrapped in clojure agents and a good set of convenience functions that make working with the JDK's HttpURLConnection and friends way more pleasant than usual).
(b) confine the usage of key Java libraries in such a way that there's a clear line of demarcation between clojure's mutability and concurrency semantics and the free-for-all in the rest of Java. This is where the big win is in programming Swing interfaces, for example, where your core data model would ideally be implemented using persistent data structures and clojure's reference objects to ensure sane concurrency semantics, and you take all the usual precautions when touching the Swing APIs.