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]