public class ListInsert {
public static long[] insert(long[] arr,int i,long l){
//新建数组,对原数组扩容
long[] arr1 = new long[arrlength+1];
//将原数组数据赋值给新数组
for(int j = 0;j<arrlength;j++){
arr1[j] = arr[j];
}
//将大于i的数据向后移动一位
for(int j = arr1length-2;j>i;j--){
arr1[j+1] = arr1[j];
}
//赋值到i位置
arr1[i+1] = l;
return arr1;
}
//测试
public static void main(String[] args){
long[] arr = {12,25,11,36,14};
long[] arr1 = insert(arr, 2, 100);
for (long l : arr1) {
Systemoutprint(l+" ");
}
}
数组的扩容方式:arr = ArrayscopyOf(arr, arrlength+1);
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
动态数组用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 = CollectionsynchronizedList(new ArrayList());
(此处深入说明下,在采用Iterator遍历集合的时候,如果有其他线程修改了集合(添加或删除 *** 作),那么Iterator的处理会中止并抛出ConcurrentModificationException异常,这是集合处理中的Fail-safe特性)
ArrayList提供的方法中,除了Collection和List的公用方法外,又加入了一些新的方法。
ArrayList(int initialCapacity) 构造器方法增加了集合初始化的最小容量
Void ensureCapacity(int minCapacity) 预扩充ArrayList的容量
Void trimToSize() 把集合的Capacity缩小到Size的大小
下面做一个ArrayList小例子:
import javautilArrayList;
import javautilCollection;
import javautilIterator;
import javautilList;
import javautilListIterator;
/
@功能:ArrayList的应用小例子
@author JackRui
@时间:20090331
/
public class ArrayListDemo {
public static void main(String[] args) {
//利用ArrayList本身的特性
Systemoutprintln("利用ArrayList本身的特性");
ArrayList list = new ArrayList();
listadd("aaa");
listadd("bbb");
listadd("ccc");
listremove("bbb");
listadd("ddd");
for (int i=0,lsize=listsize();i<lsize;i++){
Systemoutprintln(listget(i));
}
//利用Iterator遍历
Systemoutprintln("利用Iterator遍历");
Collection clist = new ArrayList();
clistaddAll(list);//添加元素不能采用Iterator接口
Iterator iter = clistiterator();
while(iterhasNext()){
String s = (String)iternext();
if(sequals("ddd")){
iterremove();//可以通过Iterator接口对元素进行删除
}else{
Systemoutprintln(s);
}
}
//利用ListIterator遍历
Systemoutprintln("利用ListIterator遍历");
List list2 = new ArrayList();
ListIterator lit = list2listIterator();
if(!lithasNext()){
litadd("haha");//可以通过ListIterator接口进行集合元素的添加
litprevious();
Systemoutprintln(litnext());
}
}
}
运行结果如下:
利用ArrayList本身的特性
aaa
ccc
ddd
利用Iterator遍历
aaa
ccc
利用ListIterator遍历
haha
解析:3种方法中,第一种方法不通用,不建议使用。第2种方法最通用,但仅支持单向遍历,而且对象的添加需要分开实现。第3种方法可以双向遍历,而且可以直接使用ListIterator接口来添加对象。
参考资料:
a
=
new
int[3]
这里new指定三个 *** 作:在堆区为数组分配空间;为数组每个元素附默认值;返回数组对象的引用。
数组对象一旦创建好了就不能改变其长度,new *** 作必须指定数组长度。数组长度可以为0表示无元素,直接初始化不能指定长度,例如:int
a
=
{1,2,3}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)