1. 数组(Array)
- 数组是一种线性表数据结构
- 三个特点:顺序存储;内存地址连续;相同数据类型
- 数组所有元素初始化为默认值
- 使用索引访问数组元素,索引也称为下标
- 数组是引用类型,并且大小不可变
- 缺点:无法动态修改容量;插入要移动数据
1.1 数组的名与实
- 数组的实,是一块地址连续的内存
- 数组的名,就是这个块连续内存的第一个内存的地址
- 数组的变量和基本变量一样,本身是个地址
int[] nums = new int[] {2,14,35}
// or int[] nums = {2,14,35}
// 重新赋值
nums = {1, 2}
分析:
nums 是局部变量,放栈空间;{2,14,35}
是通过 new 获取,放堆空间
数组是引用类型,大小不可变,nums 实际上是从一个数组对象,指向另一个数组对象,数组本身没有变,只是创建了一个新的数组对象
2. java.util.Arrays
2.1 输出数组
String str = ",a,,b,";
String[] split1 = str.split(",");
System.out.println(Arrays.toString(split1));
2.2 add() 会抛异常
List<String> list = Arrays.asList("A", "B", "C", "D");
list.add(0, "sss");
// java.lang.UnsupportedOperationException
原因分析:
Arrays 有一个内部类 ArrayList(非 java.util.ArrayList 类)
继承抽象类 AbstractList,未重写 add(),remove() 等方法
public abstract class AbstractList {
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
}
2.3 添加元素 set()
List<String> list = Arrays.asList("A", "B", "C", "D");
list.set(0, "sss");
3. 数组转List
// 方式一:
List<String> list = Arrays.asList(strArray);
// 方式二:
String[] strArray = new String[] {"A", "B", "C", "D"};
ArrayList<String> copyArrays = new ArrayList<>(Arrays.asList(strArray));
// 方式三:
List<String> arrayList = new ArrayList<>();
Collections.addAll(arrayList, strArray);
4. Arrays.asList() vs new ArrayList(Arrays.asList())
4.1 Arrays.asList()
List<String> list = Arrays.asList("A", "B", "C", "D");
源码分析
public class Arrays {
public static <T> List<T> asList(T... a) {
return new Arrays.ArrayList<>(a);
}
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);
}
}
}
4.2 new ArrayList(Arrays.asList())
String[] array = new String[]{"A", "B", "C", "D"};
List<String> stringList = new ArrayList<>(Arrays.asList(array));
5. 其他方法
int[] arr = new int[]{1, 3, 4, 2};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
网友评论