「java动态数组的实现」java动态数组的实现原理
本篇文章给大家谈谈java动态数组的实现,以及java动态数组的实现原理对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
java8中如何动态遍历动态多维数组
有两种实现方法:
可以用List数组来实现
可以用map来实现
方法一:用map来实现
比如要创建一个1行、3列的数组,实现方法如下:
public static void main(String[] args) throws CloneNotSupportedException { MapDouble, ListDouble myMap = create(1, 3);}public static MapDouble, ListDouble create(double row, double column) { MapDouble, ListDouble doubleMap = new HashMapDouble, ListDouble(); for (double x = 0; x row; x++) { for (double y = 0; y column; y++) { doubleMap.put(x, new ArrayListDouble()); } } return doubleMap;}
方法二:
可以用List数组来实现
public static void main(String args[]) {
//list 作为动态二维数组
ListListString list = new ArrayList();
ListString a1 = new ArrayListString();
ListString a2 = new ArrayListString();
ListString a3 = new ArrayListString();
list.add(a1);
list.add(a2);
list.add(a3);
a1.add("string1 in a1");
a1.add("string2 in a1");
a2.add("string1 in a2");
a3.add("string1 in a3");
a3.add("string2 in a3");
for (int i = 0; i list.size(); ++i) {
for (int j = 0; j list.get(i).size(); ++j)
System.out.println(list.get(i).get(j));
}
}
Java动态数组
ArrayList就是一个可以变成的数组(你可以这样理解)
ArrayListE 其中E是一个泛型,例如,ArrayListString array=new ArrayListString();则表示新建一个存放String的可变长数组。
ArrayListObject array1=new ArrayListObject()则为一个存放Object的可变长数组。
记住,这种样式的E,有的用T表示,它的意思为泛型。泛型是什么就不介绍了。
而且,E只能是一个类的类名,如果你是变为ArrayListint则是错误的,要用ArrayListInteger才可以
JAVA中如何动态改变数组长度 动态数组 arraycopy
java中的数组一旦被定义长度是不允许修改长度的,如果题主希望实现类似的功能可以采用ArrayList。ArrayList的底层结构就是数组。当ArrayList实例化时会默认设置一个长度,当长度不够用时会自动扩展现有长度的1/2.(假设初始数组长度为10,现在变成了15)
System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length )能够实现数组复制的功能。
假设有数组a(src),数组b(dest),我们希望把a数组中从下标为2(srcPos)长度为3(length)的元素复制到b的下标为4(destPos)开始的元素中。java代码示例如下:
int a = [1,3,5,7,9];
int b = [2,4,6,8,0,2,4];
System.arraycopy(a,2,b,4,3);
//最终b的内容为[2,4,6,8,5,7,9];
但是如果注意API的话会发现arraycopy有几个限制
1、a,b的元素类型必须相同(int和Integer这里也是需要区分的)
2、数组不能越界,也就是srcPos+length不能超过a的长度;desPos+length也不能超过b的长度,否则就会报数组越界的一场。这也说明了无法实现数组长度的动态扩展。
JAVA如何实现动态数组
动态数组用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();ilsize;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接口来添加对象。
参考资料:
希望能帮到您,O(∩_∩)O谢谢!
java动态数组的实现的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java动态数组的实现原理、java动态数组的实现的信息别忘了在本站进行查找喔。
发布于:2022-12-27,除非注明,否则均为
原创文章,转载请注明出处。