code: public DefaultConsistentHash union(DefaultConsistentHash dch2) {
        checkSameHashAndSegments(dch2);
        if (numOwners != dch2.getNumOwners()) {
           throw new IllegalArgumentException("The consistent hash objects must have the same number of owners");
        }
  
        List<Address> unionMembers = new ArrayList<>(this.members);
        mergeLists(unionMembers, dch2.getMembers());
  
        List<Address>[] unionSegmentOwners = new List[segmentOwners.length];
        for (int i = 0; i < segmentOwners.length; i++) {
           unionSegmentOwners[i] = new ArrayList<>(locateOwnersForSegment(i));
           mergeLists(unionSegmentOwners[i], dch2.locateOwnersForSegment(i));
        }
  
        Map<Address, Float> unionCapacityFactors = unionCapacityFactors(dch2);
        return new DefaultConsistentHash(hashFunction, numOwners, unionSegmentOwners.length, unionMembers, unionCapacityFactors, unionSegmentOwners);
     }
docs: Merges two consistent hash objects that have the same number of segments, numOwners and hash function.
  For each segment, the primary owner of the first CH has priority, the other primary owners become backups.