数组
数组在内存里地址连续
定义一个数组,数组中的数据类型一样(二进制串位数相同),故可以直接通过下标获取数组中的内容。
基本类型存的是值,引用类型存的是地址
数组的下标从0开始。
初始值:
- Int :0
- char : 空
- 布尔类型:false
- 浮点类型0.0
- 引用类型的数据:null
创建数组
三种创建数组的方式
//创建数组int[] arr = {5,20,55};int[] brr = new int[5];int[] crr = new int[] {20,70,66};
数组输出
System.out.println(arr);
$ 结果:
打印的是数组的地址。
$ 原因:
object里的tostring方法就是这个:
int的一个类
$ 想要输出数组值:
for(int i=0;i<arr.length;i++) {System.out.println(arr[i]);}
java自己提供了方法打印
System.out.println(Arrays.toString(arr));
可变数组
数组的长度不可变,最初定义数组的时候就说明了数组的长度
java实现了可变数组
java提供了一些集合:
List集合(接口),当中有一个实现类ArrayList。
只需要new这个实现类,就可以
ArrayList:
ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList 继承了 AbstractList ,并实现了 List 接口。
ArrayList 类位于 java.util 包中,使用前需要引入它,语法格式如下:
import java.util.ArrayList; // 引入 ArrayList 类ArrayList<E> objectName =new ArrayList<>(); // 初始化
- E: 泛型数据类型,用于设置 objectName 的数据类型,只能为引用数据类型。
- objectName: 对象名。
本文作者自写了一个ArrayList,没有引用。
数组扩容:定义一个新的更长的数组(有默认值) 大约是原数组的1.5倍
原数组数据复制过去
arr指向新的数组
插入,添加
最后一个位置添加
因为数组当中是有默认值的,不知道是有效的还是无效的。
故要设一个size记录有效位。
package com.lojarro.数组;public class ArrayList {//全局变量int size=0;//记录有效数据的个数int capacity=10;//数组容量double factor=1.5;//因数1.5int[] arr=new int[capacity];/*//构造方法public ArrayList() {size=0;capacity=10;factor=1.5;arr= new int[capacity];}*///最后一个位置插入public void add(int element) {//判断数组满没满if(size==capacity) {//数组满了,需要扩容capacity=(int)(capacity*factor);//capacity*factor可能是整数,也可能是小数int[] brr=new int[capacity];for(int i=0;i<arr.length;i++) {brr[i]=arr[i];//把原数组数据放到新数组当中}arr=brr;}//插入数据arr[size]=element;size++;}//打印public String toString() {//返回字符串return object.toString(); }}
public static void main(String[] args) {ArrayList list=new ArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(7);list.add(1);list.add(2);list.add(3);list.add(4);list.add(7);list.add(1);list.add(2);list.add(3);list.add(4);list.add(7);System.out.println(list);
toString() 返回
用户只想看到前面有效的
把有效的数据遍历好,封装一个toString()
String res="[";for(int i=0;i<size;i++) {if(i==size-1) {res+=arr[i];}elseres+=arr[i]+", ";}res+="]";return res;
指定位置插入
//指定位置插入public void insert(int value,int position) {//判断位置是否合理if(position<0||position>size) {System.out.println("插入位置不合理");return ; }//判断数组满没满if(size==capacity) {//数组满了,需要扩容capacity=(int)(capacity*factor);int[] brr=new int[capacity];for(int i=0;i<arr.length;i++) {brr[i]=arr[i];}arr=brr;}//数组有空间进行插入//插入位置及其之后的数据,从后往前的顺序统一向后移动一位for(int i=size-1;i>=position;i--) {arr[i+1]=arr[i];}//插入arr[position]=value;size++;}
public class Test2 {public static void main(String[] args) {ArrayList list=new ArrayList();list.add(1);list.add(2);list.add(3);list.add(4);list.add(7);list.add(1);list.add(2);list.add(3);list.add(4);list.add(7);list.add(1);list.insert(100, 5);System.out.println(list);}
}
有序数组的插入
//插入有序数组public void insOrder(int value) {//查找第一个比他大的//中间位置或者第一个位置for(int j=0;j<size;j++) {if(arr[j]>value) {//挪位置for(int i=size-1;i>=j;i--) {arr[i+1]=arr[i];}//插入arr[j]=value;size++;return ;}}//没找到比他大的arr[size]=value;size++;}
删除
指定数据删除
删除第一个符合条件的数据
//删除第一个符合条件的数据public boolean delFirst(int value) {//查找元素for(int j=0;j<size;j++) {if(arr[j]==value) {//删除for(int i=j+1;i<size;i++) {arr[i-1]=arr[i];}size--;return true;}}return false;}
删除所有符合条件的数据
//删除所有public void delete(int value) {//查找元素for(int j=size-1;j>=0;j--) {if(arr[j]==value) {//删除for(int i=j+1;i<size;i++) {arr[i-1]=arr[i];}size--;}}}