Doubles.constrainToRange(double,double,double) and Floats.constrainToRange(float,float,float) both cause unnecessary boxing of their arguments. Both call Preconditions.checkArgument(boolean, String, **Object**, **Object**) which causes the boxing.

Can be easily fixed by introducing an overloaded version of checkArgument for floats and doubles. For ints and longs these versions already exist:
Preconditions.checkArgument(boolean, String, **int**, **int**)
Preconditions.checkArgument(boolean, String, **long**, **long**)
which is also why constrainToRange does not have the same problem in the Ints, Shorts & Longs packages.
private static class DoubleArrayAsList extends AbstractList<Double>
      implements RandomAccess, Serializable {
    final double[] array;
    final int start;
    final int end;
    DoubleArrayAsList(double[] array) {
      this(array, 0, array.length);
    }
    DoubleArrayAsList(double[] array, int start, int end) {
      this.array = array;
      this.start = start;
      this.end = end;
    }
    @Override
    public int size() {
      return end - start;
    }
    @Override
    public boolean isEmpty() {
      return false;
    }
    @Override
    public Double get(int index) {
      checkElementIndex(index, size());
      return array[start + index];
    }
    @Override
    public boolean contains(Object target) {
      
      return (target instanceof Double)