问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA如何实现动态数组

发布网友 发布时间:2022-04-29 19:09

我来回答

5个回答

热心网友 时间:2022-06-20 09:13

动态数组用ArrayList 它的底层就是动态数组

ArrayList

ArrayList 集合的存取方式和数组操作很类似,可以按照index顺序来存取集合中的元素,但是还是建议采用更通用的迭代器来进行ArrayList的遍历。
ArrayList与数组最大的区别就是它是可变数组,在初始化ArrayList集合的时候,可以指定一个初始化容量(Capacity 集合中可容纳元素的数量),不指定的时候,系统会指定一个默认的容量值。当我们向ArrayList集合添加元素的时候,实际上是存放元素数量(size)在不断的增加,当容量不变,当数量增长到初始容量大小的时候,因为没有空间导致元素添加阻塞,这时候该集合的容量会按照一定增长策略自动增长,容量增长后,可以继续向集合中添加元素。可变数组是ArrayList的优点,但从另外一个角度考虑,容量的增长是需要付出额外的代价的,所以在性能上有所损失。性能问题的一种解决思路是我们可以在向集合添加大量元素之前,根据欲添加元素的数量,预先扩充容量,采用的是ensureCapacity方法。
ArrayList是一种线性表,在内存中是连续存储的,适合于元素的随机存取。添加和删除操作是需要依据添加的位置来定,如果在ArrayList最后元素后面添加和删除元素,在性能方面还算好,但是如果是在ArrayList中间添加和删除元素的话,代价就会很大。因为,ArrayList需要维护整个集合元素的顺序存储,所以需要处理欲添加和删除元素位置之后的所有元素。
ArrayList的实现不是线程安全的。也就是说,如果有多个线程同时操作ArrayList集合对象,而且其中至少有一个线程的操作涉及到集合对象中元素的修改(添加和删除),则该线程内对集合对象操作的方法需要实现同步。这也是ArrayList与Vector的主要区别。在新的集合框架的实现上,基于性能的考虑,大部分的集合设计都是线程不安全的。如果有同步需求,在用户自己的实现中可以实现同步,实现的方法有2种:
1、在操作集合对象的方法上使用synchronized关键字。
2、如果方法不可修改,则可在定义集合的时候,定义同步化的集合对象(采用Collections工具类的方法),类似:
List list = Collection.synchronizedList(new ArrayList(.....));
(此处深入说明下,在采用Iterator遍历集合的时候,如果有其他线程修改了集合(添加或删除操作),那么Iterator的处理会中止并抛出ConcurrentModificationException异常,这是集合处理中的Fail-safe特性)
ArrayList提供的方法中,除了Collection和List的公用方法外,又加入了一些新的方法。

ArrayList(int initialCapacity) 构造器方法增加了集合初始化的最小容量
Void ensureCapacity(int minCapacity) 预扩充ArrayList的容量
Void trimToSize() 把集合的Capacity缩小到Size的大小

下面做一个ArrayList小例子:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
* @功能:ArrayList的应用小例子
* @author JackRui
* @时间:2009.03.31
*/
public class ArrayListDemo {

public static void main(String[] args) {
//利用ArrayList本身的特性
System.out.println("利用ArrayList本身的特性");
ArrayList list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.remove("bbb");
list.add("ddd");
for (int i=0,lsize=list.size();i<lsize;i++){
System.out.println(list.get(i));
}
//利用Iterator遍历
System.out.println("利用Iterator遍历");
Collection clist = new ArrayList();
clist.addAll(list);//添加元素不能采用Iterator接口
Iterator iter = clist.iterator();
while(iter.hasNext()){
String s = (String)iter.next();
if(s.equals("ddd")){
iter.remove();//可以通过Iterator接口对元素进行删除
}else{
System.out.println(s);
}
}
//利用ListIterator遍历
System.out.println("利用ListIterator遍历");
List list2 = new ArrayList();
ListIterator lit = list2.listIterator();
if(!lit.hasNext()){
lit.add("haha");//可以通过ListIterator接口进行集合元素的添加
lit.previous();
System.out.println(lit.next());
}

}

}
运行结果如下:
利用ArrayList本身的特性
aaa
ccc
ddd
利用Iterator遍历
aaa
ccc
利用ListIterator遍历
haha

解析:3种方法中,第一种方法不通用,不建议使用。第2种方法最通用,但仅支持单向遍历,而且对象的添加需要分开实现。第3种方法可以双向遍历,而且可以直接使用ListIterator接口来添加对象。

参考资料:http://fusanjiao.javaeye.com/blog/639963
希望能帮到您,O(∩_∩)O谢谢!

热心网友 时间:2022-06-20 09:14

int[] = {1,2,3,4,5,...},里面可以是N个,不知道你是不是想实现这样的功能,希望能帮助到你
就是这样写啊String[] = {"a","b"},但这个只能在初始化的时候写。如果是参数的话有一种是用...来代替表示可以无限个

还有,你可以通过先定义,到知道具体的长度后再初始化的做法

热心网友 时间:2022-06-20 09:14

java中有多种定义好的动态数组,这里就说ArrayList。
ArrayList list = new ArrayList.
//动态数组添加元素
list.add("a")
//动态数组获取第一个元素
list.get(0)

//动态数组删除第一个元素

list.remove(0)

热心网友 时间:2022-06-20 09:15

ArrayList

真受不了. 数组必须确定一个length,如果不确定,就不是数组,是arrayList

热心网友 时间:2022-06-20 09:15

java虚拟机里面有一个叫做堆内存的内存空间,当数组要重新分配空间时,原来的数组就将原来占用的空间释放掉,重新为其分配空间。

不知能不能帮到你。。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果手机微信怎么换漂亮字体(苹果手机微信怎么换行输入) 有什么好用的app转换字体 手写转文字的软件 erp可以看评论地址吗 淘宝评论url是什么意思? 揭秘:码牌支付风控升级,背后真相揭秘 电脑电视直播软件哪个好用什么软件好电脑看电视直播 潼南子同街学区是哪些 三极管BU406价格和参数? 火锅料放在冰柜忘了插电一个星期给会坏了吗 火锅的设备有哪些 万和燃气jslq20热水器滤网怎样拆 3d设计师培训最专业的学校在哪? 3d技术属于什么专业? 1660ti和1060性价比还有性能差距 3d工程设计专业怎么样 狗狗吃了士力架怎么办 3d设计师培训哪个好 吃士力架真的可以增肥吗 德克士会员卡 德克士的VIP卡多少钱一张呀? 关于德克士会员卡的问题 将来想在3d设计方面工作 大学学要学什么专业 要美术功底么 请问德克士有办会员卡吗 大学本科里那个专业比较适合3d设计 狗狗偷吃了一个士力架怎么办?会死吗?因为之前知道了狗狗吃巧克力... 3D建模师属于什么专业,那所大学主打? 德克士办会员卡,需要什么东西,最低充多少 ap面板需要专业上门安装吗 德克士会员卡 消费时会给手机发短信吗 学3D设计要报什么专业啊?专业名称叫什么 天燃气热水器洗澡用的堵了怎么办,滤网在哪,找不到滤网 java声明一个可变大小int型数组 Java作业集合编写数组--&gt;大小可变的数组 电热水器有一个滤网垫圈安在什么位置 丢失未开具增值税专用发票怎么处理? java中的可变数组能不在形参中使用吗?比如String str[];可以,但是String... str;却不可以 专票丢失怎么处理? java中可以用动态数组吗 发票未开出即丢失,怎么处理 java list 转 可变数组吗 增值税专用发票没开就丢了怎么办 JAVA中动态数组的应用,具体一点,谢谢了 四责协同是指什么内容 java 有类似于动态数组的吗 未开具增值税专用发票丢失了怎么办 四责协同内容是什么 java中动态数组是怎么回事 java如何定义动态数组 未开过的发票丢失怎么办? 一岗双责”的“四责协同”的表述正确吗?