Copilot commented on code in PR #15633:
URL: https://github.com/apache/dubbo/pull/15633#discussion_r2280048803


##########
dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java:
##########
@@ -25,14 +25,17 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;

Review Comment:
   The HashSet import is only used in the equals method for tracking checked 
keys. Consider using a more efficient approach like early termination or 
restructuring the comparison logic to avoid the overhead of creating and 
maintaining a HashSet for each equals call.
   ```suggestion
   
   ```



##########
dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/client/DefaultServiceInstance.java:
##########
@@ -305,28 +315,47 @@ public boolean equals(Object o) {
             return false;
         }
         DefaultServiceInstance that = (DefaultServiceInstance) o;
-        boolean equals = Objects.equals(getServiceName(), 
that.getServiceName())
-                && Objects.equals(getHost(), that.getHost())
-                && Objects.equals(getPort(), that.getPort());
+        if (!Objects.equals(getServiceName(), that.getServiceName())
+                || !Objects.equals(getHost(), that.getHost())
+                || !Objects.equals(getPort(), that.getPort())) {
+            return false;
+        }
+
+        Set<String> checkedKeys = new HashSet<>(this.getMetadata().size());
         for (Map.Entry<String, String> entry : this.getMetadata().entrySet()) {
-            if 
(entry.getKey().equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME)) {
+            String key = entry.getKey();
+            checkedKeys.add(key);
+            if (key.equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME) || 
key.equals(TIMESTAMP_KEY)) {
                 continue;
             }
-            if (entry.getValue() == null) {
-                equals = equals && (entry.getValue() == 
that.getMetadata().get(entry.getKey()));
-            } else {
-                equals = equals && 
entry.getValue().equals(that.getMetadata().get(entry.getKey()));
+            if (!Objects.equals(entry.getValue(), 
that.getMetadata().get(key))) {
+                return false;
             }
         }
 
-        return equals;
+        for (Map.Entry<String, String> thatEntry : 
that.getMetadata().entrySet()) {
+            String thatKey = thatEntry.getKey();
+            if (checkedKeys.contains(thatKey)
+                    || thatKey.equals(EXPORTED_SERVICES_REVISION_PROPERTY_NAME)
+                    || thatKey.equals(TIMESTAMP_KEY)) {
+                continue;
+            }
+            // Return false if 'that' contains a key not present in 'this' 
regardless of the entry value.
+            // This ensures consistency with hashCode, as any extra key in 
'that' would result in a different hashCode.
+            return false;
+        }
+

Review Comment:
   Creating a HashSet for every equals() call can be inefficient, especially 
for frequently compared objects. Consider restructuring the comparison logic to 
avoid this allocation, perhaps by iterating through both metadata maps in a 
single pass or using a different comparison strategy.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org
For additional commands, e-mail: notifications-h...@dubbo.apache.org

Reply via email to