代码之家  ›  专栏  ›  技术社区  ›  Illarion Kovalchuk

如何在Java中获得数组的子数组,而不复制数据?

  •  46
  • Illarion Kovalchuk  · 技术社区  · 15 年前

    7 回复  |  直到 10 年前
        1
  •  23
  •   Markus Kull    15 年前

    Java中的许多类接受数组的子集作为参数。例如Writer.write(char cbuf[],int off,int len)。也许这已经足够你的用例了。

        2
  •  65
  •   rootmeanclaire    11 年前
    Arrays.asList(array).subList(x, y).
    

    这个方法不会给你一个数组,而是一个 List

        3
  •  12
  •   Roman Nikitchenko    7 年前

    没有真正的方法 Java中的y。不能在现有内存上创建新数组。基本上有两种选择:

    • 使用包装器,它提供某种接近数组的抽象,并且适合于许多应用程序。将在下面描述。

    你可以用 java.nio.Buffer 类层次结构,尤其是 java.nio.ByteBuffer 它在整个数组或子范围上提供缓冲区抽象。通常这是人们所需要的。这还提供了许多有趣的功能,如“零拷贝”翻转和灵活的字节区域表示。

    下面是使用 java.nio.ByteBuffer .

    byte [] a1 = {0, 0, 1, 0};
    ByteBuffer buf = ByteBuffer.wrap(a1,1,2);
    

    buf 任何 ByteBuffer 操作。

    只是个警告, buf.array() 返回原件 a1

        4
  •  4
  •   Joachim    10 年前

    如果使用byte[]这样的内置数组,就无法在Java中声明子数组。原因是:数组的长度与数据一起存储,而不是与引用的声明一起存储。因此,不复制数据的子数组没有存储长度的地方! 因此,对于基本类型,可以使用上面提到的高效字节数组副本,对于更高的类型(列表),可以使用一些方法。

        5
  •  2
  •   rsp    15 年前

    你可以采取和 String 上课时间;为由数组、开始偏移量和结束偏移量构造的不可变对象创建一个类,该偏移量提供对子数组的访问。这样一个对象的用户不必知道整个数组或子数组之间的区别。构造函数不必复制数组,只需存储数组引用及其边界。

        6
  •  1
  •   Kotten    13 年前

    您可以使用(ArrayList).subList(value1,value2)我相信,这对您的情况有帮助吗?如果您想使用ArrayList,这是当然的。

        7
  •  1
  •   Orestis P.    5 年前

    public class ArraySegment<T> implements Iterable<T> 
    {
          private int from, to;
          private T[] original;
          
          public ArraySegment<T>(T[] original, int from, int to)
          {
              //constructor stuff
          }
    
          public T get(int index)
          {
               return original[index + from];
          }
    
          public int size()
          {
              return to - from + 1;
          }
          
          @Override
          public Iterator<T> iterator()
          {
              //Iterator that iterates over the slice
          }
    
          //Can support setters on from/to variables
    }
    
        8
  •  0
  •   djenning90    5 年前

    Google的Guava库以一个 ByteSource

    Google Guava 是一个现成的开放源码功能包,从一开始就遵循Google的最佳实践,这依赖于重要的阵列切片功能。

        9
  •  -1
  •   Manuel Selva    15 年前

    看一看 Arrays.copyOfRange(***) 方法。

    推荐文章