Short-circuit equality comparison for unequal PackageIdentifiers by precomputing the hash.
See commit 102a9a101a52f4ca92c9e97387ae159e54e87b05 for Nathan's original investigation into Label interning contention.

--
MOS_MIGRATED_REVID=123314470
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
index 2fa4494..74cd6fa 100644
--- a/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/cmdline/PackageIdentifier.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 import java.io.Serializable;
+import java.util.Objects;
 
 import javax.annotation.concurrent.Immutable;
 
@@ -77,10 +78,14 @@
   /** The name of the package. Canonical (i.e. x.equals(y) <=> x==y). */
   private final PathFragment pkgName;
 
+  /** Precomputed hash code **/
+  private final int hashCode;
+
   private PackageIdentifier(RepositoryName repository, PathFragment pkgName) {
     this.repository = Preconditions.checkNotNull(repository);
     this.pkgName = Canonicalizer.fragments().intern(
             Preconditions.checkNotNull(pkgName).normalize());
+    this.hashCode = Objects.hash(repository, pkgName);
   }
 
   public static PackageIdentifier parse(String input) throws LabelSyntaxException {
@@ -166,12 +171,13 @@
       return false;
     }
     PackageIdentifier that = (PackageIdentifier) object;
-    return pkgName.equals(that.pkgName) && repository.equals(that.repository);
+    return this.hashCode == that.hashCode && pkgName.equals(that.pkgName)
+        && repository.equals(that.repository);
   }
 
   @Override
   public int hashCode() {
-    return 31 * repository.hashCode() + pkgName.hashCode();
+    return this.hashCode;
   }
 
   @Override