Arrays的几个常用方法

1. 复制数组有关

1.1 使用 copyOf() 方法对数组进行复制
Arrays.copyOf(dataType[] srcArray,int length);

默认从原数组的第一个元素(索引值为 0)开始复制,目标数组的长度将为 length。如果 length 大于 srcArray.length,则目标数组中采用默认值填充;如果 length 小于 srcArray.length,则复制到第 length 个元素(索引值为 length-1)即止。

1.2 使用 CopyOfRange() 方法对数组进行复制

将指定数组的指定范围复制到新数组中。 范围( from )的初始指数必须在零和original.length之间,包括在内。 original[from]的值被放置在副本的初始元素中(除非from == original.length或from == to )。 原始数组中后续元素的值将被放置在副本中的后续元素中。 范围( to )的最终指数( to )必须大于或等于from ,可能大于original.length ,在这种情况下, false被放置在索引大于或等于original.length - from的副本的所有元素中。 返回的数组的长度将为to - from

Arrays.copyOfRange(dataType[] srcArray,int startIndex,int endIndex)
  • startIndex 表示开始复制的起始索引,目标数组中将包含起始索引对应的元素,另外,startIndex 必须在 0 到 srcArray.length 之间。

  • endIndex 表示终止索引,目标数组中将不包含终止索引对应的元素,endIndex 必须大于等于 startIndex,可以大于 srcArray.length,如果大于 srcArray.length,则目标数组中使用默认值填充

2. 和初始化有关

二维数组的初始化

2.1 静态初始化
int intArray[ ][ ]={{1,2},{2,3},{3,4,5}};

Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同

2.2 动态初始化
  • 直接为每一维分配空间,格式如下:
int a[ ][ ] = new int[2][3]
  • 从最高维开始,分别为每一维分配空间:
 int a[ ][ ] = new int[2][ ];
 a[0] = new int[3];
 a[1] = new int[5]

对二维复合数据类型的数组,必须首先为最高维分配引用空间,然后再顺次为低维分配空间。而且,必须为每个数组元素单独分配空间

3. 和转换有关的

//以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组
public Object[] toArray()

//以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。 如果列表适合指定的数组,则返回其中。 否则,将为指定数组的运行时类型和此列表的大小分配一个新数组
public <T> T[] toArray(T[] a)

3.1 list转数组

一维数组

ArrayList<String> list=new ArrayList<String>();

list.toArray(new String[list.size()]);

二维数组

List<int[]> answer = new ArrayList<>(); 
(int[][])answer.toArray(new int[answer.size()][]);

3.2 数组转list

String[] s = {"a","b","c"};
List list = java.util.Arrays.asList(s);

这里需要注意,它不支持引用数据类型,使用基本类型数组作为参数会把整个数组当成一个值

int[] nums = new int[2];
List<int[]> ints = Arrays.asList(nums);//看这里的返回值是数组类型的List

这点可以看一下源码

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
	return new ArrayList<>(a);
}

首先接收的参数课变长参数,参数类型T,根据官方文档的描述,T 是数组元素的 class,因此,这个错误产生的原因可解释为:asList 方法的参数必须是对象或者对象数组,而原生数据类型不是对象。当传入一个原生数据类型数组时,asList 的真正得到的参数就不是数组中的元素,而是数组对象本身!此时List 的唯一元素就是这个数组。

再看return new ArrayList<>(a);这个方法,起初我以为就是new了一个ArrayList,结果再往下看,这个ArrayList是Arrays的一个内部类

private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable
{
    private static final long serialVersionUID = -2764017481108945198L;
    private final E[] a;
    ArrayList(E[] array) {
        a = Objects.requireNonNull(array);
    }
    @Override
    public int size() {
        return a.length;
    }
    //...
}

这个内部类中有一个被声明为 final 的数组 a ,所有传入的元素都会被保存在这个数组 a 中,所以扩容操作是不允许的,这也解释了为什么向 myList 添加新元素是不被允许的,从 myList 中删除元素,也会抛出异常java.lang.UnsupportedOperationException

那我们怎么创建一个符合我们要求的能扩容的List呢

public class Test {
   public static void main(String[] args) {
      String[] myArray = { "Apple", "Banana", "Orange" };
      List<String> myList = new ArrayList<String>(Arrays.asList(myArray));
      myList.add("Guava");
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值