最新要闻
- 【全球新要闻】推特创作者将获得广告分成:需要开通蓝V会员才有资格
- 一加Ace 2正面“全身照”首次亮相:超窄边框双曲屏
- 当前速看:高中生分班前磕头跪谢班主任:网友看后意见大!老师回应:给每人发了红包
- 《流浪地球2》里的“硬核科技” 中国电信已经用上了
- 当前视讯!ChatGPT将英伟达AI GPU变成黄金 后者股价飙升超40%
- 《狂飙》带火鱼干店 老板:微信加烦了!剧中原来是这一集
- 当前焦点!Edge新版增加内容推荐按钮:打开甚至不用点
- 今日报丨比亚迪1月销量:汉卖出1.22万辆 宋Plus继续火爆
- 天天动态:车主展示特斯拉自动泊车入位 结果翻车:变成“自动撞车”
- 【天天速看料】价格暴降后特斯拉供不应求 马斯克:准备要涨了
- 宝能造车梦破碎:烧了80多亿元的观致 如今沦为法拍车
- 女孩4万多元的摩托 被男摩友加白糖报废!官方介入
- 全球即时:柔软顺滑 古今男士平角裤3条到手29.9元
- 世界视讯!休闲百搭 361° 运动束脚裤立减140元:49元起清仓价
- 环球速看:冰火两重天!四川一地昼夜温差38.6℃ 专家揭秘真相
- 今年开播有戏 “陈萍萍”演员吴刚回应《庆余年》第二季:很快了
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【环球时快讯】Java实现动态数组(数据结构与算法)
前言:为什么需要动态数组?
1,我们之前用的数组最大的问题就在于数组长度定长,一旦一个数组在定义时确定长度之后,使用过程中无法修改这个长度。
2,Java中提供的数组都是静态数组int[] char[] long[](定义之后没法改变长度) 所以需要我们自己定义一个类,拓展基础数组的功能。
(资料图片仅供参考)
一、什么是动态数组
Java中提供的数组都是静态数组,即在一个数组定义时确定长度后,使用过程中无法修改此长度。 动态数组就是在普通数组上,增加了一个可以根据元素的个数动态调整数组大小的功能。
二、动态数组的实现
创建一个MyArrayList类 为可变类型Object参数 size为元素的数量 elements为所有的元素 DEFAULT_CAPACITY为默认组的数量 并且初始化构造方法
package com.szx;@SuppressWarnings("unchecked")public class MyArrayList{ /** * 元素的数量 */ private int size; /** * 所有的元素 */ private E[] elements; /** * 默认数组数量 */ private static final int DEFAULT_CAPACITY=2; /** * 返回-1索引不存在 */ private static final int ELEMENT_NOT_FOUND=-1; public MyArrayList(int capaticy){ //如果新的数组数量小于默认的数组 那么就用新的 ,默认为2 capaticy = (capaticy 接口的设计
◼ int size(); // 元素的数量 ◼ boolean isEmpty(); // 是否为空 ◼ boolean contains(E element); // 是否包含某个元素 ◼ void add(E element); // 添加元素到最后面 ◼ E get(int index); // 返回index位置对应的元素 ◼ E set(int index, E element); // 设置index位置的元素 ◼ void add(int index, E element); // 往index位置添加元素 ◼ E remove(int index); // 删除index位置对应的元素 ◼ int indexOf(E element); // 查看元素的位置 ◼ void clear(); // 清除所有元素
1添加元素-add(E element)
0 1 2 3 4 5 6
当size等于0时
element 0 1 2 3 4 5 6
10 20 30 40 50 element 当size=5时
核心代码:elements[size] = elemenet;
size++;
package com.szx;@SuppressWarnings("unchecked")public class MyArrayList{ /** * 元素的数量 */ private int size; /** * 所有的元素 */ private E[] elements; /** * 默认数组数量 */ private static final int DEFAULT_CAPACITY=2; /** * 返回-1索引不存在 */ private static final int ELEMENT_NOT_FOUND=-1; public MyArrayList(int capaticy){ //如果新的数组数量小于默认的数组 那么就用新的 ,默认为2 capaticy = (capaticy size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } //ensureCapacity(size+1); for (int i = size-1; i >=index; i--) { elements[i+1] = elements[i]; } //原来的位置存放新添加的元素 elements[index] = element; size++; } @Override public String toString() { StringBuffer string = new StringBuffer(); string.append("size=").append(size).append("["); for (int i = 0; i < size; i++) { if(i!=0)string.append(","); string.append(elements[i]); } string.append("]"); return string.toString(); } 测试结果:
2:数组动态扩容 经过上面测试.我们会发现数组可以正常添加但默认数量是2 超过两个就会出事:
实现动态扩容:ensureCapacity方法,在添加元素前进行调用
/** * 往index位置添加元素 * @param index * @param element */ public void add(int index,E element){ if(index <0||index>size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } ensureCapacity(size+1); for (int i = size-1; i >=index; i--) { elements[i+1] = elements[i]; } //原来的位置存放新添加的元素 elements[index] = element; size++; }/** * 保证要有capacity的容量 * @param capacity */ private void ensureCapacity(int capacity){ int oldCpacity = elements.length; if(oldCpacity >=capacity){ return; } //int newCapacity = oldCpacity +oldCpacity*1.5; //新的容量为旧容量的1.5倍,当然也可以自己调整, //使用位运算提高效率 int newCapacity = oldCpacity +(oldCpacity>>1); E[] newElements = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } //替换之前的数组 elements = newElements; System.out.println(oldCpacity + "扩容为:"+newCapacity); }测试结果:
3:删除元素-remove(int index)
/** * 删除index位置对应的元素 * @param index * @return */ public E remove(int index){ if(index <0||index>=size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } E old = elements[index]; for (int i = index+1; i <=size-1; i++) { elements[i-1] = elements[i]; } size--; elements[size] = null; return old; }4:根据idex查询对应的元素
/** * 返回index位置对应的元素 * @param index * @return */ public E get(int index){ if(index <0||index>=size){ System.out.println("下标越界,该数组中不存在"); throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } return elements[index]; }5:设置index的元素(元素的修改)
/** * 设置index位置的元素 * @param index * @param element * @return */ public E set(int index,E element){ if(index <0||index>=size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } E old = elements[index]; elements[index] = element; return old; }进行测试:
完整代码:
package com.szx;@SuppressWarnings("unchecked")public class MyArrayList{ /** * 元素的数量 */ private int size; /** * 所有的元素 */ private E[] elements; /** * 默认数组数量 */ private static final int DEFAULT_CAPACITY=2; /** * 返回-1索引不存在 */ private static final int ELEMENT_NOT_FOUND=-1; public MyArrayList(int capaticy){ //如果新的数组数量小于默认的数组 那么就用新的 ,默认为2 capaticy = (capaticy size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } ensureCapacity(size+1); for (int i = size-1; i >=index; i--) { elements[i+1] = elements[i]; } //原来的位置存放新添加的元素 elements[index] = element; size++; } /** * 清除所有元素 */ public void clear(){// if(size<=100){// size = 0;// }else{// // elements =null;// } for (int i = 0; i < size; i++) { elements[i] = null; } size = 0; } /** * 是否为空 * @return */ public boolean isEmpty(){// if(size==0){// return true;// }else{// return false;// }// return size==0; } /** * 是否包含某个元素 * @param element * @return */ public boolean contains(E element){ return indexOf(element)!=ELEMENT_NOT_FOUND; } /** * 返回index位置对应的元素 * @param index * @return */ public E get(int index){ if(index <0||index>=size){ System.out.println("下标越界,该数组中不存在"); throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } return elements[index]; } /** * 设置index位置的元素 * @param index * @param element * @return */ public E set(int index,E element){ if(index <0||index>=size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } E old = elements[index]; elements[index] = element; return old; } /** * 删除index位置对应的元素 * @param index * @return */ public E remove(int index){ if(index <0||index>=size){ throw new IndexOutOfBoundsException("Index:"+index+",Size:"+size); } E old = elements[index]; for (int i = index+1; i <=size-1; i++) { elements[i-1] = elements[i]; } size--; elements[size] = null; return old; } /** * 查看元素的位置 * @param element * @return */ public int indexOf(E element){ if(element ==null){ for (int i = 0; i < size; i++) { if(elements[i]== null){ return i; } } }else{ for (int i = 0; i < size; i++) { if(element.equals(elements[i])){ return i; } } } return -1; } @Override public String toString() { StringBuffer string = new StringBuffer(); string.append("size=").append(size).append("["); for (int i = 0; i < size; i++) { if(i!=0)string.append(","); string.append(elements[i]); } string.append("]"); return string.toString(); } /** * 保证要有capacity的容量 * @param capacity */ private void ensureCapacity(int capacity){ int oldCpacity = elements.length; if(oldCpacity >=capacity){ return; } //int newCapacity = oldCpacity +oldCpacity*1.5; //新的容量为旧容量的1.5倍,当然也可以自己调整, //使用位运算提高效率 int newCapacity = oldCpacity +(oldCpacity>>1); E[] newElements = (E[]) new Object[newCapacity]; for (int i = 0; i < size; i++) { newElements[i] = elements[i]; } //替换之前的数组 elements = newElements; System.out.println(oldCpacity + "扩容为:"+newCapacity); }} 测试代码:
package com.szx;public class Main { public static void main(String[] args) { MyArrayListlist1 = new MyArrayList(); list1.add(11); list1.add(22); list1.add(33); list1.add(44); System.out.println(list1.toString()); list1.remove(2); System.out.println("删除后"); System.out.println(list1.toString()); System.out.println("修改:"); list1.set(0,66); System.out.println(list1.toString()); }}
【环球时快讯】Java实现动态数组(数据结构与算法)
【全球新要闻】推特创作者将获得广告分成:需要开通蓝V会员才有资格
一加Ace 2正面“全身照”首次亮相:超窄边框双曲屏
当前速看:高中生分班前磕头跪谢班主任:网友看后意见大!老师回应:给每人发了红包
【全球速看料】MAUI新生6.9-控件辅助功能①:动画Animation
集合框架
10 正则表达式应用
《流浪地球2》里的“硬核科技” 中国电信已经用上了
全球报道:超详细--redis在Linux环境搭建主从复制
当前视讯!ChatGPT将英伟达AI GPU变成黄金 后者股价飙升超40%
《狂飙》带火鱼干店 老板:微信加烦了!剧中原来是这一集
焦点报道:为什么 L1 正则化能做特征选择而 L2 正则化不能
Linux环境下:程序的链接, 装载和库[可执行文件的装载]
当前焦点!Edge新版增加内容推荐按钮:打开甚至不用点
今日报丨比亚迪1月销量:汉卖出1.22万辆 宋Plus继续火爆
当前头条:[数据结构] 哈希表 (开放寻址法+拉链法)
天天动态:车主展示特斯拉自动泊车入位 结果翻车:变成“自动撞车”
【天天速看料】价格暴降后特斯拉供不应求 马斯克:准备要涨了
热点评!迁移学习(HDAN)《Heuristic Domain Adaptation》
美团索命一问:一个SQL ,怎么分析加了哪些锁? 含4大场景、8个规则
宝能造车梦破碎:烧了80多亿元的观致 如今沦为法拍车
女孩4万多元的摩托 被男摩友加白糖报废!官方介入
读Java实战(第二版)笔记01_Java的变化
全球即时:柔软顺滑 古今男士平角裤3条到手29.9元
世界视讯!休闲百搭 361° 运动束脚裤立减140元:49元起清仓价
环球速看:冰火两重天!四川一地昼夜温差38.6℃ 专家揭秘真相
今年开播有戏 “陈萍萍”演员吴刚回应《庆余年》第二季:很快了
python的基础知识1
奔驰被曝大砍产品线!19款车型或将淘汰 原因现实
环球视点!马斯克收费比微博狠多了:推特被曝企业“金V”认证付费:每月6770元
焦点热议:3年前旗舰也有份!中国广电剧透:小米10/青春版计划4月推送MIUI 14
《流浪地球2》票房破32亿元 导演谈第3部:原班人马再来一遍
全球最资讯丨浙江台州最大汽车经销商老板跑路 旗下19家4S店全部关停
12.4万保时捷首单买家发声:保时捷答应优惠卖车
[数据结构] 树、森林的遍历
每日时讯!MAUI新生2.5-数据绑定和MVVM:MVVM的属性验证
当前速递!父亲借女儿3万压岁钱不还被起诉 法院:应还本金及利息
焦点观察:1万元!佳能入门级全画幅相机EOS R8规格曝光
世界微速讯:为S23让路!三星Galaxy S22京东秒杀:骁龙8小屏旗舰 3569元
环球微头条丨豆瓣8.1分!《三体》主创:能拍中国科幻大作 此生无憾
低代码平台前端的设计与实现(三)设计态画布DesignCanvas的设计与实现
热资讯!重庆一景区煮麻辣汤圆:下次元宵佳节还得等384天
男子打包螺蛳粉开车24小时运回北京 只因朋友圈一句话:这是真爱
【天天新视野】用户滑雪频繁触发iPhone车祸检测功能 苹果:已进行了优化 同时派代表考察
天天快播:甜品级游戏本价格已曝光:搭载RTX 4050/4060
环球消息!5 组合数据类型
今日讯!短记我的二十五岁,如落叶般随风飘荡。
世界观焦点:java基础:流程控制
女子春节连打4通宵麻将:患上突发性耳聋
国产显卡搞定“显卡杀手”:摩尔线程MTT S80居然能跑《孤岛危机》
【世界独家】极限挤牙膏!三星Galaxy S23系列用残血版LPDDR5X内存
世界微动态丨wireshark 抓包整理———— 从一个小案例开始 [一]
【全球热闻】游客洪崖洞花30元找当地大爷抄近道 只花2分钟:网友道出真相
速讯:博纳影业总裁妻子金巧巧否认暗指《满江红》排片多、不好看:个人喜好
颜值最高的白色手机来了!vivo X90告白下周预售:天玑9200加持
天天消息!Python教程:IO
零下10度静止一夜不掉电!“车主”盛赞恒驰5 OTA效果好
当前视点!java基础:java基础语法
大众也不香了!比亚迪ATTO 3获德媒超高认可:钟爱刀片电池
快资讯:CPU性能提升10%!13代酷睿笔记本测试数据出炉
【全球报资讯】盖茨向马斯克“泼冷水”:殖民火星完全浪费钱
世界新资讯:医生发现19岁阿尔兹海默症患者:已知最年轻
SQL SERVER——高可用技术概述
环球微头条丨用ChatGPT写作业?新算法给AI生成文本加水印:置信度高达99.999999999994%
快播:【Redis场景拓展】秒杀问题-全局唯一ID生成策略
美团一面:InndoDB 单表最多 2000W,为什么?小伙伴竟然面挂
每日精选:2个月没人管!AMD老显卡终于要有新驱动了
奢侈品不愁卖!LV将涨价20% 世界首富放言:中国人有钱
全球看热讯:Andlua+实现WakeUpOnline远程开机
Docker搭建本地私有仓库
世界即时:vue/ts 新建项目时好用的配置 【vite.config.ts、tsconfig.json、】
天天热点!大爷看《狂飙》入戏屏幕前举杯痛饮 被演技折服:口碑大剧结尾你满意吗?
厉害!中国半导体领域科研论文数量持续全球第一 光触媒等已超美国
【缓存策略及实践】前端如何配置 HTTP 缓存机制
全球简讯:为什么感觉工资过万很普遍了?打打字就能月入过万你心动吗?央视揭秘新骗局
《生化危机4:重制版》第五章演示:里昂和碍事梨合作通关
云南小女孩骑鸵鸟上学从容淡定 挡眼睛控制方向:网友调侃是大象年检了
观焦点:造车新势力轿车月榜Top2 长安深蓝SL03迎开门红:1月交付6137台
环球快消息!越野车开进古河床随意碾压:改装牧马人无视警示牌“撒野” 专家:保护有难度
天天微资讯!2899元价格屠夫!XiaoMI Book 12.4 二合一评测:办公追剧不在话下
微头条丨C盘扩容:不要轻易转换动态磁盘 Dynamic Disk
乳腺癌已成为全球第一大癌症:我国每年新增42万 比国外发病早
今日观点!投资不过山海关对东北伤害狠!老工业基地全力发展新能源车 专家称沈阳可成深圳
世界今热点:全球首位!以色列总统使用ChatGPT写演讲稿:开头、结尾感受下
全球看热讯:《角斗士2》明年上映
全球热点评!阿里云盘致歉:昨晚系统故障 全平台无法加载内容
TGA年度最佳!《双人成行》销量破1000万:双人游戏天花板
环球今日报丨特斯拉降价到20万出头 网友忍不住要下单 宝马奔驰大众:我们不跟
速递!腾讯视频官宣:《三体》番外剧《三体:大史》即将上线
2023年1月随笔
世界今日报丨大跃进了!今年小米新机都将抛弃USB 2.0
今日立春:二十四节气之首 万物开始复苏
8个你可能不知道答案的常见JavaScript面试问题
世界热资讯!荣耀北斗卫星通信专利获批通过 荣耀Magic5系列将首发?
B站《三体》动画“晚节不保”:即将跌破4分
全球实时:再也不怕手一抖跳广告了!规范App乱跳转新标准出台
热门:坚挺四年的苹果:栽了
关注:你以为你真的会玩《俄罗斯方块》?看完这些大神 我大悟了
UI通过元素定位实现特定区域截图
全球热推荐:2022浙江高考数学导数压轴解析