diff --git a/api/src/main/java/org/apache/iceberg/types/Types.java b/api/src/main/java/org/apache/iceberg/types/Types.java
index 927b3a5065ad..4a3c4551646b 100644
--- a/api/src/main/java/org/apache/iceberg/types/Types.java
+++ b/api/src/main/java/org/apache/iceberg/types/Types.java
@@ -723,6 +723,9 @@ public int hashCode() {
 
   public static class StructType extends NestedType {
     private static final Joiner FIELD_SEP = Joiner.on(", ");
+    private static final int NO_HASHCODE = Integer.MIN_VALUE;
+
+    private transient int hashCode = NO_HASHCODE;
 
     public static StructType of(NestedField... fields) {
       return of(Arrays.asList(fields));
@@ -824,7 +827,10 @@ public boolean equals(Object o) {
 
     @Override
     public int hashCode() {
-      return Objects.hash(NestedField.class, Arrays.hashCode(fields));
+      if (hashCode == NO_HASHCODE) {
+        hashCode = Objects.hash(NestedField.class, Arrays.hashCode(fields));
+      }
+      return hashCode;
     }
 
     private List<NestedField> lazyFieldList() {