Bug 394220 - JREContainer.RuleEntry#equals returns to early
diff --git a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
index 30213af..14139ad 100644
--- a/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
+++ b/org.eclipse.jdt.launching/launching/org/eclipse/jdt/internal/launching/JREContainer.java
@@ -147,34 +147,43 @@
 			if(obj instanceof IAccessRule[][]) {
 				rules = (IAccessRule[][]) obj;
 			}
+			if (fRules == rules) {
+				return true;
+			}
 			if(rules != null) {
-				if (fRules == rules) {
-					return true;
-				}
 				if (fRules.length == rules.length) {
-					boolean equal = true;
-					IAccessRule[] originalrule, comparerule = null; 
 					for (int i = 0; i < fRules.length; i++) {
-						originalrule = fRules[i];
-						comparerule = rules[i];
-						equal &= (originalrule == comparerule);
-						if(!equal) {
-							if (originalrule.length == comparerule.length) {
-								for (int j = 0; j < originalrule.length; j++) {
-									if (!originalrule[j].equals(comparerule[j])) {
-										return false;
-									}
-								}
-								return true;
-							} 
+						if (!rulesEqual(fRules[i], rules[i])){
 							return false;
 						}
 					}
-					return equal;
+					return true;
 				}
 			}
 			return false;
 		}
+		
+		/**
+		 * Checks if the two arrays of rules are equal (same rules in each position in the array)
+		 * 
+		 * @param a First list of rules to compare, must not be <code>null</code> 
+		 * @param b Second list of rules to compare, must not be <code>null</code>
+		 * @return <code>true</code> if the arrays are equal, <code>false</code> otherwise
+		 */
+		private static boolean rulesEqual(IAccessRule[] a, IAccessRule[] b){
+			if (a == b){
+				return true;
+			}
+			if (a.length != b.length){
+				return false;
+			}
+			for (int j = 0; j < a.length; j++) {
+				if (!a[j].equals(b[j])) {
+					return false;
+				}
+			}
+			return true;
+		}
 	}
 	
 	/**