范文无忧网范文学习范文大全

如何自己实现一个简单的ArrayList

03月03日 编辑 fanwen51.com

[大学生如何找到并且实现自己的梦想]大学生如何找到并且实现自己的梦想 很多大一大二学生跟我说,他们很迷茫,整天过得很颓废,不知道自己想要什么,不知道自己的梦想是什么,鉴于此,学长专门写下此文来告诉你们如何找到...+阅读

如何自己实现一个简单的ArrayList

ArrayList是Java集合框架中一个经典的实现类。他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小。实现一个简单的ArrayList,实现的过程:实现的ArrayList主要的功能如下:默认构造器和一个参数的有参构造器add方法get方法indexOf方法contains方法size方法isEmpty方法remove方法 这个简单的ArrayList类 取名为SimpleArrayList,全部的代码查看SimpleArrayList代码 构造器 源码ArrayList一共有三个构造器,一个无参构造器,一个参数为int型有参构造器,一个参数为Collection型的有参构造器。参数为Collection型的构造器用来实现将其他继承Collection类的容器类转换成ArrayList。SimpleArrayList类因为还没有手动实现其他的容器类,所以实现的构造方法只有2个。代码如下: public SimpleArrayList(){ this(DEFAULT_CAPACITY); } public SimpleArrayList(int size){ if (size

有参构造器中,int参数是用来生成一个指定大小的Object数组。将创建好的数组传给elementData。elementData是真正的用来存储元素的数组。add方法 add 方法用来往容器中添加元素,add方法有两个重载方法,一个是add(E e),另一个是add(int index, E e)。add本身很简单,但是要处理动态数组,即数组大小不满足的时候,扩大数组的内存。具体的代码如下: public void add(E e){ isCapacityEnough(size + 1); elementData[size++] = e; } 方法isCapacityEnough就是来判断是否需要扩容,传入的参数就是最小的扩容空间。因为add一个元素,所以最小的扩容空间,即新的长度是所有元素+ 1。这里的size就是真正的元素个数。 private void isCapacityEnough(int size){ if (size >DEFAULT_CAPACITY){ explicitCapacity(size); } if (size

如果需要的空间比默认的空间大,就调用explicitCapacity进行扩容。这里有个size小于0的判断,出现size小于0主要是因为当size超过Integer.MAX_VALUE就会变成负数。 private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; private void explicitCapacity(int capacity){ int newLength = elementData.length * 2; if (newLength - capacity(MAX_ARRAY_LENGTH)){ newLength = (capacity >MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); } elementData = Arrays.copyOf(elementData, newLength); } 上面的代码是扩容的代码,首先,定义一个数组最大的容量的常量为最大值,这个值按照官方的源码中的解释是要有些VM保留了数组的头部信息在数组中,因此实际存放数据的大小就是整数的最大值 - 8 然后设定一个要扩容的数组的大小,虽然上面说了有一个扩容空间的值 size + 1 ,这个是实际我们最小需要扩容的大小。

但为了继续增加元素,而不频繁的扩容,因此一次性的申请多一些的扩容空间。这里newLength 打算申请为 数组长度的2倍,然后去判断这个长度是否满足需要的扩容空间的值。 即有了后续的两段代码 if (newLength - capacity(MAX_ARRAY_LENGTH)){ newLength = (capacity >MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH); } 如果2倍的长度仍然不满足,则申请到需要的扩容长度。在我们只增加一个元素的情况下,这个判断是永远不会生效的,但是如果有addAll方法,则增加的元素很多,就要导致一次申请2倍的长度是不够的。第二个判断是判断newLength的长度如果超过上面定义的数组最大长度则判断要需要的扩容空间是否大于数组最大长度,如果大于则newLength为 MAX_VALUE ,否则为 MAX_ARRAY_LENGTH。

最后,真正实现数组扩容到设定长度的方法就没意思了,调用Arrays.copyOf(elementData, newLength)得到一个扩容后的数组。add的另一个重载方法也很简单。 public void add(int index, E e) { //判断是不是越界 checkRangeForAdd(index); //判断需不需要扩容 isCapacityEnough(size + 1); //将index的元素及以后的元素向后移一位 System.arraycopy(elementData,index,elementData,index + 1,size - index); //将index下标的值设为e elementData[index] = e; size++; } private void checkRangeForAdd(int index){ //这里index = size是被允许的,即支持头,中间,尾部插入 if (indexsize){ throw new IndexOutOfBoundsException("指定的index超过界限"); } } 至此,一个简单的add方法就实现完了。get方法 get方法用来得到容器中指定下标的元素。方法实现比较简单,直接返回数组中指定下标的元素即可。

private void checkRange(int index) { if (index >= size || index

java中Arraylist是干什么的?怎么用

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。) size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。

其他所有操作都以线性时间运行(大体上讲)。与用于 LinkedList 实现的常数因子相比,此实现的常数因子较低。 每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单 在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。

这可以减少递增式再分配的数量。注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。

如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问: List list = Collections.synchronizedList(new ArrayList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。

因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。 注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。

编辑本段常用的方法 boolean add(E e) 将指定的元素添加到此列表的尾部。 void add(int index, E element) 将指定的元素插入此列表中的指定位置。 boolean addAll(Collection

利用数组实现Java ArrayList类的基本功能要求实现方法包括: Add

提供给你思路,这里我只做往数组里加int数字,其实可以做泛型的,如果你想深研究自己去看JDK源码。 我这里只是简单的做数组之间的复制。代码略长:不懂追问!public class MyList { private int size; Object[] object = null; Object[] temp; int sequence = 0; public MyList() { this(1); } public MyList(int size) { if (size <= 0) { throw new IllegalArgumentException("长度应大于0"); } else { this.size = size; this.object = new Object[this.size]; } }// Add, Insert, Delete, Find public void add(Object obj) { if (obj == null) { throw new IllegalArgumentException("添加的对象不应为null"); } else { if (sequence >= size) { this.size++;// 这里扩展空间方式随意,可以每次扩展两倍 temp = new Object[this.size]; System.arraycopy(object, 0, temp, 0, object.length); object = temp; temp = null; } object[sequence] = obj; sequence++; } } public void insert(int index, Object obj) { if (index < 0 || obj == null) { throw new IllegalArgumentException("插入的索引值应不小于0,并且插入的对象不应为null"); } else { if (index == object.length) { add(obj); } else if (index > object.length) { throw new IllegalArgumentException("数据越界,插入的索引不应不在数组范围内"); } if (sequence >= size) { this.size++; } temp = new Object[this.size]; System.arraycopy(object, 0, temp, 0, index);//[1,2,3] temp[index] = obj; System.arraycopy(object, index, temp, index+1, object.length-index); object = temp; temp = null; sequence++; } } public void delete(int index) { if (index < 0 || index>this.size) { throw new IllegalArgumentException("索引应在数组范围内"); } else { temp = new Object[--this.size]; System.arraycopy(object, 0, temp, 0, index); System.arraycopy(object, index+1, temp, index, object.length-1-index); object = temp; temp = null; sequence--; } } public Object find(int index) { if (index < 0 || index > this.size) { throw new IllegalArgumentException("索引应大于0或不大于集合元素数"); } else { return object[index]; } } public int size() { return this.size; } }

ArrayList的使用

先给一个实体类 person public class Person { /**姓名*/ private String name; /**编号*/ private String number; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } } 再给一个操作类 personOp 里面有两个方法..一个增加一个查找.注释很清楚的的看不懂再问我 public class PersonOp { ListpersonList = new ArrayList(); /** 添加对象 不重复 */ public ListaddPerson(Person person) { for (Person p : personList) { if (!p.equals(person)) { personList.add(person); } } return personList; } /** 按姓名或编号查找对象 这里考虑的只是按名字或编号的其中某一个查找 删除或返回此对象*/ public Person searchPerson(String name, String number) { Person person = new Person(); if (name != null) { for (Person p : personList) { if (p.getName().equals(name)) { // personList.remove(p); person = p; } } } else if (number != null) { for (Person p : personList) { if (p.getNumber().equals(number)) { // personList.remove(p); person = p; } } } return person; } }

延伸阅读:

如何实现自己的梦想我跟你一样,有自己的理想,我很爱音乐,天生就有一副自认为很好的嗓子,所以我爱唱,我想唱。在小学时,我并不知道自己的理想是什么,可有一次,我被同学拉去在班会上表演节目,我刚开始很害...

如何实现自己的理想作文每个人都有自己的理想,每个人的理想都是不相同的,它们就好像海边上的贝壳一样色彩斑斓。 我的理想是做一名法官。从小我就对这个神秘而伟大的职业充满了好奇。每当我看到电视...

关于如何实现自己的目标一个人设定目标时,最重要的并非"如何"实现这个目标,而是"为何"要设定这些目标,"为何"比"如何"来得重要。 步骤一:列下实现目标的理由。 成功者在设定目标的同时,也会找出设定这些目标的理...

我如何实现自己的梦想有目标就去慢慢做。。不要想那么多,你最重要的做自己最想做的事,三百多行,行行有状元,。。,你可以成为自己所从事职业的一个排头兵,成为状元。。只要努力,就会有成功的那一天 你有...

如何实现自己的目标” 美国现代成功学代表人物安东尼·罗宾写道:“知道目标,找出好的方法,起身去做,观察每个步骤的结果,不断修正调整,以达到目标为止。俄国著名芭蕾舞家帕芙洛娃说过,不休止地朝着一...

如何去实现自己的价值在说如何实现之前,首先需要解决“自己的价值”是什么的问题。价值是个交易中的概念,比如一块翡翠玉石,对不感兴趣、不想要的人来说一点价值都没有;但对喜欢的人来说,那就有价值了...

在生活中如何实现自己的梦想分两部分同时进行:信与行 信是梦想的首要条件,必须相信你自己能够实现梦想,你的梦想才能在宇宙中处于实现的可能性呈现过程中。我们可以通过冥想,将自己想要实现的梦想一次次地...

编写一个学生类将学生的姓名年龄性别分别保存到ArrayListpackage src; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Scanner; public class Test2 { SuppressWarnings("unche...

做自己的产品经理如何实现自我提升1、理清结构,明确自己需要优先获取哪块知识。 参加培训之前,一定要梳理一下自身的知识结构。一方面是看哪块的短板比较大,而工作当中应用又比较多,或者未来的职业发展上会有需要...

推荐阅读
图文推荐
栏目列表