This is an automated email from the ASF dual-hosted git repository.

chaokunyang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-fury.git


The following commit(s) were added to refs/heads/main by this push:
     new 6a06d9fa [Java] refine Collection util data structure (#1287) (#1288)
6a06d9fa is described below

commit 6a06d9fa758f9be4b27e3c474c0caa5b8264822b
Author: mof-dev-3 <[email protected]>
AuthorDate: Mon Jan 1 15:36:01 2024 +0800

    [Java] refine Collection util data structure (#1287) (#1288)
    
    1. use local reference when possible
    2. make tuple value field final
    
    ---------
    
    Co-authored-by: [email protected] <[email protected]>
---
 .../apache/fury/builder/ObjectCodecOptimizer.java  | 20 +++++++++--------
 .../org/apache/fury/collection/FuryObjectMap.java  |  1 +
 .../java/org/apache/fury/collection/LazyMap.java   | 18 ++++++++++------
 .../collection/{Tuple2.java => MutableTuple2.java} | 24 ++++++---------------
 .../collection/{Tuple3.java => MutableTuple3.java} | 25 +++++++---------------
 .../java/org/apache/fury/collection/Tuple2.java    | 11 ++++++----
 .../java/org/apache/fury/collection/Tuple3.java    | 15 +++++++------
 7 files changed, 54 insertions(+), 60 deletions(-)

diff --git 
a/java/fury-core/src/main/java/org/apache/fury/builder/ObjectCodecOptimizer.java
 
b/java/fury-core/src/main/java/org/apache/fury/builder/ObjectCodecOptimizer.java
index c2c5571e..9678cfd9 100644
--- 
a/java/fury-core/src/main/java/org/apache/fury/builder/ObjectCodecOptimizer.java
+++ 
b/java/fury-core/src/main/java/org/apache/fury/builder/ObjectCodecOptimizer.java
@@ -27,7 +27,7 @@ import org.apache.fury.annotation.Internal;
 import org.apache.fury.codegen.CodegenContext;
 import org.apache.fury.codegen.Expression;
 import org.apache.fury.codegen.ExpressionOptimizer;
-import org.apache.fury.collection.Tuple3;
+import org.apache.fury.collection.MutableTuple3;
 import org.apache.fury.type.Descriptor;
 import org.apache.fury.type.DescriptorGrouper;
 import org.apache.fury.util.function.SerializableSupplier;
@@ -106,23 +106,25 @@ public class ObjectCodecOptimizer extends 
ExpressionOptimizer {
     if (boxedRefTracking) {
       boxedReadWeight = 4;
     }
-    List<Tuple3<List<Descriptor>, Integer, List<List<Descriptor>>>> groups =
+    List<MutableTuple3<List<Descriptor>, Integer, List<List<Descriptor>>>> 
groups =
         Arrays.asList(
-            Tuple3.of(
+            MutableTuple3.of(
                 new ArrayList<>(descriptorGrouper.getBoxedDescriptors()),
                 boxedWriteWeight,
                 boxedWriteGroups),
-            Tuple3.of(
+            MutableTuple3.of(
                 new ArrayList<>(descriptorGrouper.getBoxedDescriptors()),
                 boxedReadWeight,
                 boxedReadGroups),
-            Tuple3.of(
+            MutableTuple3.of(
                 new ArrayList<>(descriptorGrouper.getFinalDescriptors()), 9, 
finalWriteGroups),
-            Tuple3.of(new 
ArrayList<>(descriptorGrouper.getFinalDescriptors()), 5, finalReadGroups),
-            Tuple3.of(new 
ArrayList<>(descriptorGrouper.getOtherDescriptors()), 5, otherReadGroups),
-            Tuple3.of(
+            MutableTuple3.of(
+                new ArrayList<>(descriptorGrouper.getFinalDescriptors()), 5, 
finalReadGroups),
+            MutableTuple3.of(
+                new ArrayList<>(descriptorGrouper.getOtherDescriptors()), 5, 
otherReadGroups),
+            MutableTuple3.of(
                 new ArrayList<>(descriptorGrouper.getOtherDescriptors()), 9, 
otherWriteGroups));
-    for (Tuple3<List<Descriptor>, Integer, List<List<Descriptor>>> decs : 
groups) {
+    for (MutableTuple3<List<Descriptor>, Integer, List<List<Descriptor>>> decs 
: groups) {
       while (decs.f0.size() > 0) {
         int endIndex = Math.min(decs.f1, decs.f0.size());
         decs.f2.add(decs.f0.subList(0, endIndex));
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/FuryObjectMap.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/FuryObjectMap.java
index bf0e65d9..528fc643 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/FuryObjectMap.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/FuryObjectMap.java
@@ -312,6 +312,7 @@ public class FuryObjectMap<K, V> {
 
     @Override
     public boolean hasNext() {
+      K[] keyTable = FuryObjectMap.this.keyTable;
       for (int i = nextIndex; i < keyTable.length; i++) {
         if (keyTable[i] != null) {
           nextIndex = i;
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/LazyMap.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/LazyMap.java
index db64b91c..972f4eb5 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/LazyMap.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/LazyMap.java
@@ -47,23 +47,27 @@ public class LazyMap<K, V> extends ForwardingMap<K, V> {
 
   @Override
   public Map<K, V> delegate() {
-    if (map == null) {
-      map = new HashMap<>(entries.size());
-      for (Entry<K, V> entry : entries) {
-        map.put(entry.getKey(), entry.getValue());
+    Map<K, V> m = this.map;
+    if (m == null) {
+      List<Entry<K, V>> e = this.entries;
+      m = new HashMap<>(e.size());
+      for (Entry<K, V> entry : e) {
+        m.put(entry.getKey(), entry.getValue());
       }
+      this.map = m;
     }
-    return map;
+    return m;
   }
 
   @Override
   public V put(K key, V value) {
-    if (map == null) {
+    Map<K, V> m = map;
+    if (m == null) {
       // avoid map put cost when deserialization this map.
       entries.add(new MapEntry<>(key, value));
       return null;
     } else {
-      return map.put(key, value);
+      return m.put(key, value);
     }
   }
 
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple2.java
similarity index 76%
copy from java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java
copy to 
java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple2.java
index 8e011d25..71619dda 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple2.java
@@ -22,26 +22,21 @@ package org.apache.fury.collection;
 import java.io.Serializable;
 import java.util.Objects;
 
-public class Tuple2<T0, T1> implements Serializable {
-
-  private static final long serialVersionUID = 1L;
-
+public class MutableTuple2<T0, T1> implements Serializable {
   /** Field 0 of the tuple. */
   public T0 f0;
 
   /** Field 1 of the tuple. */
   public T1 f1;
 
-  /** Creates a new tuple where all fields are null. */
-  public Tuple2() {}
-
   /**
-   * Creates a new tuple and assigns the given values to the tuple's fields.
+   * Creates a new tuple and assigns the given values to the tuple's fields, 
with field value
+   * nonFinal. Recommend use {@link Tuple2} if value do not need to change.
    *
    * @param value0 The value for field 0
    * @param value1 The value for field 1
    */
-  public Tuple2(T0 value0, T1 value1) {
+  public MutableTuple2(T0 value0, T1 value1) {
     this.f0 = value0;
     this.f1 = value1;
   }
@@ -54,7 +49,7 @@ public class Tuple2<T0, T1> implements Serializable {
     if (o == null || getClass() != o.getClass()) {
       return false;
     }
-    Tuple2<?, ?> tuple2 = (Tuple2<?, ?>) o;
+    MutableTuple2<?, ?> tuple2 = (MutableTuple2<?, ?>) o;
     return Objects.equals(f0, tuple2.f0) && Objects.equals(f1, tuple2.f1);
   }
 
@@ -63,12 +58,7 @@ public class Tuple2<T0, T1> implements Serializable {
     return Objects.hash(f0, f1);
   }
 
-  public static <T0, T1> Tuple2<T0, T1> of(T0 value0, T1 value1) {
-    return new Tuple2<>(value0, value1);
-  }
-
-  @Override
-  public String toString() {
-    return "Tuple2(" + f0 + ", " + f1 + ')';
+  public static <T0, T1> MutableTuple2<T0, T1> of(T0 value0, T1 value1) {
+    return new MutableTuple2<>(value0, value1);
   }
 }
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple3.java
similarity index 74%
copy from java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java
copy to 
java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple3.java
index f5511605..3df169c4 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/MutableTuple3.java
@@ -22,29 +22,25 @@ package org.apache.fury.collection;
 import java.io.Serializable;
 import java.util.Objects;
 
-public class Tuple3<T0, T1, T2> implements Serializable {
-  private static final long serialVersionUID = 1L;
-
+public class MutableTuple3<T0, T1, T2> implements Serializable {
   /** Field 0 of the tuple. */
   public T0 f0;
 
   /** Field 1 of the tuple. */
   public T1 f1;
 
-  /** Field 1 of the tuple. */
+  /** Field 2 of the tuple. */
   public T2 f2;
 
-  /** Creates a new tuple where all fields are null. */
-  public Tuple3() {}
-
   /**
-   * Creates a new tuple and assigns the given values to the tuple's fields.
+   * Creates a new tuple and assigns the given values to the tuple's fields, 
with field value
+   * nonFinal. Recommend use {@link Tuple3} if value do not need to change
    *
    * @param value0 The value for field 0
    * @param value1 The value for field 1
    * @param value2 The value for field 2
    */
-  public Tuple3(T0 value0, T1 value1, T2 value2) {
+  public MutableTuple3(T0 value0, T1 value1, T2 value2) {
     this.f0 = value0;
     this.f1 = value1;
     this.f2 = value2;
@@ -58,7 +54,7 @@ public class Tuple3<T0, T1, T2> implements Serializable {
     if (o == null || getClass() != o.getClass()) {
       return false;
     }
-    Tuple3<?, ?, ?> tuple3 = (Tuple3<?, ?, ?>) o;
+    MutableTuple3<?, ?, ?> tuple3 = (MutableTuple3<?, ?, ?>) o;
     return Objects.equals(f0, tuple3.f0)
         && Objects.equals(f1, tuple3.f1)
         && Objects.equals(f2, tuple3.f2);
@@ -69,12 +65,7 @@ public class Tuple3<T0, T1, T2> implements Serializable {
     return Objects.hash(f0, f1, f2);
   }
 
-  public static <T0, T1, T2> Tuple3<T0, T1, T2> of(T0 value0, T1 value1, T2 
value2) {
-    return new Tuple3<>(value0, value1, value2);
-  }
-
-  @Override
-  public String toString() {
-    return "Tuple3(" + f0 + ", " + f1 + ", " + f2 + ')';
+  public static <T0, T1, T2> MutableTuple3<T0, T1, T2> of(T0 value0, T1 
value1, T2 value2) {
+    return new MutableTuple3<>(value0, value1, value2);
   }
 }
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java
index 8e011d25..d0358428 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/Tuple2.java
@@ -27,16 +27,19 @@ public class Tuple2<T0, T1> implements Serializable {
   private static final long serialVersionUID = 1L;
 
   /** Field 0 of the tuple. */
-  public T0 f0;
+  public final T0 f0;
 
   /** Field 1 of the tuple. */
-  public T1 f1;
+  public final T1 f1;
 
   /** Creates a new tuple where all fields are null. */
-  public Tuple2() {}
+  public Tuple2() {
+    this(null, null);
+  }
 
   /**
-   * Creates a new tuple and assigns the given values to the tuple's fields.
+   * Creates a new tuple and assigns the given values to the tuple's fields, 
with field value final.
+   * In case field value is nonFinal, use {@link MutableTuple2}
    *
    * @param value0 The value for field 0
    * @param value1 The value for field 1
diff --git 
a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java 
b/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java
index f5511605..c03d7372 100644
--- a/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java
+++ b/java/fury-core/src/main/java/org/apache/fury/collection/Tuple3.java
@@ -26,19 +26,22 @@ public class Tuple3<T0, T1, T2> implements Serializable {
   private static final long serialVersionUID = 1L;
 
   /** Field 0 of the tuple. */
-  public T0 f0;
+  public final T0 f0;
 
   /** Field 1 of the tuple. */
-  public T1 f1;
+  public final T1 f1;
 
-  /** Field 1 of the tuple. */
-  public T2 f2;
+  /** Field 2 of the tuple. */
+  public final T2 f2;
 
   /** Creates a new tuple where all fields are null. */
-  public Tuple3() {}
+  public Tuple3() {
+    this(null, null, null);
+  }
 
   /**
-   * Creates a new tuple and assigns the given values to the tuple's fields.
+   * Creates a new tuple and assigns the given values to the tuple's fields, 
with field value final.
+   * In case field value is nonFinal, use {@link MutableTuple3}
    *
    * @param value0 The value for field 0
    * @param value1 The value for field 1


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to