多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Java学习进程7

Java学习进程7 动态数组及泛型动态数组固定数组存在长度一旦初始化就无法修改的缺陷新增、插入元素会受容量限制因此需要手动封装动态数组基于原生定长数组实现自动扩容、增删改查功能。动态数组的方法末尾添加数据数组长度 1原数组全部元素复制末尾存放新数据指定位置插入插入位置前元素不变插入位置存放新元素后面元素统一后移一位删除指定位置数据删除位置之后的元素统一向前覆盖一位数组长度 - 1删除指定数据使用布尔类型遍历找到第一个匹配下标调用按下标删除方法删除所有相同数据循环执行单次数据删除直到不存在目标元素example自定义动态数组 ArrList 完整实现代码packagecom.yw.oop0627;/** * author YAN * date 2026/6/27 17:36 * description 动态数组 */publicclassArrList{//初始数组privateint[]arrnewint[0];//末尾添加数据publicvoidadd(intdata){//扩容原数组int[]nArrnewint[arr.length1];nArr[arr.length]data;//拷贝原数组数据到新数组for(inti0;iarr.length;i){nArr[i]arr[i];}//更新对象头arrnArr;}//插入数据publicvoidinsert(intindex,intdata){int[]newArrnewint[arr.length1];//复制插入位置之前的数据for(inti0;iindex;i){newArr[i]arr[i];}//插入目标数据newArr[index]data;//复制插入位置之后的数据for(intiindex;iarr.length;i){newArr[i1]arr[i];}arrnewArr;}//删除指定位置数据返回被删除的数据publicintremove(intindex){//保存要删除的元素intdelNumarr[index];int[]newArrnewint[arr.length-1];//复制删除位置前数据for(inti0;iindex;i){newArr[i]arr[i];}//删除位置后数据向前移动for(intiindex;inewArr.length;i){newArr[i]arr[i1];}arrnewArr;returndelNum;}//删除指定数据使用布尔类型publicbooleanremoves(intdata){for(inti0;iarr.length;i){if(arr[i]data){remove(i);returntrue;}}returnfalse;}//删除所有相同数据publicbooleanremoveAll(intdata){booleanflagfalse;//循环删除直到没有目标数据while(removes(data)){flagtrue;}returnfalse;}//获取数据publicintget(intindex){//判断index是否合法returnarr[index];}//长度publicintsize(){returnarr.length;}publicstaticvoidmain(String[]args){//测试ArrListlistnewArrList();list.add(1);list.add(2);list.add(3);for(inti0;ilist.size();i){System.out.print(list.get(i) );}System.out.println(\n插入元素5到下标1位置);list.insert(1,5);for(inti0;ilist.size();i){System.out.print(list.get(i) );}System.out.println(\n删除下标2位置元素list.remove(2));for(inti0;ilist.size();i){System.out.print(list.get(i) );}}}动态数组的局限性由于底层依然使用固定长度的 int 数组存储数据因此只能添加整形数据怎么怎么优化动态数组,让其能添加任何类型可使用object的数组局限性不同类型数据都混在一起解决使用泛型规避耗时问题减少拷贝次数对原数组进行2倍扩容examplepackagecom.yw.oop0702;/** * author YAN * date 2026/7/2 18:50 * description */publicclassArrListE{//初始数组privateObject[]arr;privatestaticintlen10;//动态数组的默认初始长度privateintsize0;//记录有效数据个数//构造方法初始化数组长度publicArrList(intlen){arrnewObject[len];}//设置长度publicArrList(){//构造方法相互调用this(参数,,);this(len);}//末尾添加数据publicvoidadd(Ee){//判断是否需要扩容if(sizearr.length){//对原数组2倍扩容Object[]nArrnewObject[arr.length*2];//拷贝愿数组数据到新数组for(inti0;iarr.length;i){nArr[i]arr[i];}//更新对象头arrnArr;}arr[size]e;size;}//插入数据publicvoidinsert(intindex,Ee){//优先扩容if(sizearr.length){Object[]nArrnewObject[arr.length*2];//拷贝愿数组数据到新数组for(inti0;iarr.length;i){nArr[i]arr[i];}//更新对象头arrnArr;}//后移元素for(intisize;iindex;i--){arr[i]arr[i-1];}arr[index]e;size;}//删除指定位置数据,返回被删除的数据publicEremove(intindex){//把要删除位置的元素提前存起来EdeleteElement(E)arr[index];//使用当前的泛型符号//元素前移覆盖for(intiindex;isize-1;i){arr[i]arr[i1];}//最后的位置为空arr[size-1]null;//有效元素个数-1size--;//返回最开始保存的、被删除的元素returndeleteElement;}//删除指定数据publicbooleanremoves(Ee){for(inti0;isize;i){if(arr[i].equals(e)){remove(i);returntrue;}}returnfalse;}//删除所有相同publicbooleanremoveAll(Ee){for(intisize-1;i0;i--){if(arr[i].equals(e)){remove(i);returntrue;}}returnfalse;}//获取数据publicEget(intindex){//判断index是否合法return(E)arr[index];}//长度publicintsize(){returnsize;}publicstaticvoidmain(String[]args){//测试ArrListIntegerlistnewArrList();longstartSystem.currentTimeMillis();for(inti0;i100000;i){list.add(i);}longendSystem.currentTimeMillis();System.out.println(耗时(end-start));//测试插入list.insert(0,999);//测试删除list.remove(0);//测试删除指定元素list.removes(50000);System.out.println(当前有效元素个数list.size());}}关于基本类型的对应包装类基本数据类型 - 包装类java.lang 包下byte - Byteshort - Shortint - Integerlong - Longfloat - Floatdouble - Doublechar - Characterboolean - Boolean关于Java内置动态数组ArrayList扩容机制底层原理ArrayList 底层基于 Object [] 数组实现属于动态数组。// 默认初始容量10privatestaticfinalintDEFAULT_CAPACITY10;// 空数组常量懒加载无参构造初始化时不创建长度为10的数组先赋值空数组第一次add才初始化容量10privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA{};// 底层存储数组transientObject[]elementData;// 集合中实际存储的有效元素个数privateintsize;三种构造方法无参构造publicArrayList(){// 初始化空数组懒加载首次添加元素才扩容到10elementDataDEFAULTCAPACITY_EMPTY_ELEMENTDATA;}指定初始容量构造publicArrayList(intinitialCapacity){if(initialCapacity0){elementDatanewObject[initialCapacity];}elseif(initialCapacity0){elementDataEMPTY_ELEMENTDATA;}else{thrownewIllegalArgumentException(Illegal Capacity: initialCapacity);}}集合参数构造把其他集合转为 ArrayList泛型作用把添加的数据形参化限制相同类型的数据才能被添加到同一个集合对象注确定泛型的数据类型时必须是引用类型常用泛型符号E T K V…任意大写字母即可E更为常用
返回列表