开始学java的时候,对于 int[] 和ArrayList总是懵懵懂懂的,不知道啥时候用哪个。现在终于了解了,总结一下跟大家分享一下
int[]数组
- 创建
// 方式一:创建一个固定的数组 int arr1 = {1,2,3,4,5}; // 方式二:创建一个长度为10的数组 double[] arr1 = new double[10]; // 方式三:创建一个固定数组 char[] arr = new char[] {1,2,3};
- 特点
1、长度在创建初期确定,且不可变动
2、添加的内容只能为基本类型
ArrayList集合
- 特点
1、ArrayList是集合的一个实现类
2、ArrayList内部封装了一个Object类型的对象,初始长度为10,且长度可变
3、ArrayList集合的查询快,但是增删慢
4、线程不安全 - 创建
// ArrayList可传各种类型数据 ArrayList<T> arr = new ArrayList<>();
int[] 和ArrayList的对比(也可以是char[] 、double[]~~)
功能 | int[ ] arr=new int[5]; | ArrayList array=new ArrayList(); |
---|---|---|
长度 | 不可变 | 可变,动态扩容 |
获取长度 | arr.length | array.size() |
末尾添加 | - | arr.add(element) |
指定位置添加 | - | array.add(index,element) |
存入数据 | 基本类型 | 任意类型,一般结合泛型使用 |
返回某个位置的值 | arr[index] | array.get(index) |
更改某个位置的值 | arr[index]=element; | array.set(index,element); |
判空 | - | array.isEmpty();返回的是boolean类型 |
是否包含某个元素 | - | array.contains(element);返回的是boolean类型 |
移除指定位置元素 | - | array.remove(index),返回的是被删除的值 |
迭代 | - | Iterator ite = list.iterator(); //将List集合中元素转到iterator变量中。 |
ite.hasNext() | ||
int[ ] 转ArrayList | - | Arrays.asList(int[]); |
ArrayList转 int[ ] | array.toArray(); | - |
数组扩容(直接上图)
学会了扩容,那么我们用int[]来实现一个ArrayList
public class ArrayList {int size; //有效数组长度,即将要插入的位置的下标int capacity; // 数组容量double factor; // 因数,即扩容的因数int[] arr; //数组// 构造函数public ArrayList() {size = 0;capacity = 10;factor = 1.5;arr = new int[capacity];}// 添加public void add(int element) {// 先判断数组是不是满了(有效长度是不是超过了数组的长度)if(size>=arr.length) {capacity *=factor;int[] temp = new int[capacity];for(int i=0;i<arr.length;i++) {temp[i]=arr[i];}arr = temp;}// 添加数组后,size需要指向下一个位置,所以别忘了++arr[size]= element;size++;}// 插入public void insert(int element,int index) {// 先判断index的值是否合法if(index<0 || index>size) {System.out.println("位置"+index+"不可插入");}else {// 先判断数组是不是满了if(size>=arr.length) {capacity *=factor;int[] temp = new int[capacity];for(int i=0;i<arr.length;i++) {temp[i] = arr[i];}arr = temp;}// 没满的话,执行插入// 插入时未避免数据丢失,从后往前插入for(int i=size-1;i>=index;i--) {arr[i+1] = arr[i];}// 数据移完之后,对插入位置进行赋值arr[index] = element;size++;}}// 删除public void delete(int element) {int count = 0; // 从后往前遍历,这样可以确认不会漏删for(int i=size-1;i>=0;i--) {// 找到了要删除的值了if(arr[i]==element) {// 从这个位置开始遍历,把后一位的值移动到前一位for(int j=i+1;j<size;j++) { // 从i+1位置开始,将当前值赋值给前一个数arr[j-1] = arr[j];}// 删除后,有效长度要减少size--;// 记录查找此处count++;}}// flag=false说明没有找到if(count==0) {System.out.println("未找到"+element);}}// 修改public void update(int index,int element) {if(index<0 || index>size) {System.out.println("位置"+index+"不合法");}else {arr[index] = element;}}// 清空public void clear() {// arr指向新创建的长度为10的数组,同时将capacity = 10;arr = new int[capacity];size = 0;}// 重写toString方法@Overridepublic String toString() {String s = "[";// 针对清空列表的操作,列表清空后,size=0if(size==0) {return s+"]";}else {for(int i=0;i<size-1;i++) {s+=arr[i]+", ";}s+=arr[size-1];s+="]";return s;}}
}