最近准备找工作,就复习了下Java的基础,顺便多看看源码,在复习到集合这一章时,就想着自己动手实现集合,就看了看jdk的源码,由于笔者本科学的是高分子材料,和计算机、软件、互联网完全不沾边,也没学过数据结构,但为了多了解这方便的知识,就根据jdk的源码,模仿了集合的实现,今天给大家带来的是ArrayList的实现,当然在这里笔者也只是实现了集合中部分常用的方法,并且也没有使用泛型。
首先笔者也是自己定义了一个MyList(对应jdk里面的List)接口(笔者没有像jdk里面去定义Collection接口),然后定义了一个MyList的实现类--MyArrayList。
具体代码如下,代码中有相关的注释,读者根据注释去学习:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58package com.tiantang.collection; /** * 自定义的List接口 * @author LiuJinkun * */ public interface MyList { /** * 增加元素 * @param obj */ void add(Object obj); /** * 在指定索引处增加元素 * @param index * @param obj */ void add(int index,Object obj); /** * 根据对象删除元素 * @param obj */ void remove(Object obj); /** * 根据索引删除元素 * @param index */ void remove(int index); /** * 返回指定索引处的元素 * @param index * @return */ Object get(int index); /** * 修改指定索引处的元素 * @param index * @param obj */ void set(int index,Object obj); /** * 返回元素所在的索引 * @param obj * @return */ int indexOf(Object obj); /** * 判断集合是否为空 * @return */ boolean isEmpty(); /** * 清空集合 */ void clear(); int size(); }
复制代码
上面的代码,经过笔者测试,不存在BUG,当然安全性肯定没有JDK的好,代码的优化也没有JDK做得好,笔者写这些代码,纯属只是为了练习,加深印象。后续笔者还会陆续实现其他的集合。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118package com.tiantang.collection; /** * 自定义实现ArrayList * @author LiuJinkun * */ public class MyArrayList implements MyList{ //ArrayList集合的底层实现是数组,因此定义了一个数组,用来存放元素 private Object[] elementData; //数组的大小 private int size; public int size(){ return size; } /** * 无参构造器,默认初始化数组的大小为10 */ public MyArrayList(){ this(10); } /** * 有参构造器,根据传入的数字来初始化数组的大小 * @param initialCapacity */ public MyArrayList(int initialCapacity){ if(initialCapacity>0){ elementData=new Object[initialCapacity]; }else{ throw new IllegalArgumentException(); } } @Override public void add(Object obj) { //先判断数组容量是否足够 ensureCapacity(); elementData[size++]=obj; } private void ensureCapacity() { if(size==elementData.length){ //扩容 Object[] newArray=new Object[size*2+1]; //然后将原数组的数据拷贝到新数组 System.arraycopy(elementData, 0, newArray, 0, elementData.length); //最后让原数组的引用指向新数组对象 elementData=newArray; } } @Override public void add(int index, Object obj) { //先判断索引是否越界 rangCheck(index); ensureCapacity(); //再进行数组的拷贝(为索引为index的位置腾出空位) System.arraycopy(elementData, index, elementData, index+1, size-index); //最后添加元素 elementData[index]=obj; size++; } private void rangCheck(int index) { if(index<0||index>=size){ throw new IllegalArgumentException(); } } @Override public void remove(Object obj) { for(int i=0;i<size;i++){ if(elementData[i].equals(obj)){ remove(i); } } } @Override public void remove(int index) { rangCheck(index); System.arraycopy(elementData, index+1, elementData, index, size-index-1); elementData[size--]=null; } @Override public Object get(int index) { //判断索引是否合法 if(index>=size){ throw new IllegalArgumentException(); } return elementData[index]; } @Override public void set(int index, Object obj) { rangCheck(index); elementData[index]=obj; } /** * 返回元素第一次出现在集合中的索引,若集合中不包含该元素就返回-1 */ @Override public int indexOf(Object obj) { for(int i=0;i<size;i++){ if(elementData[i].equals(obj)){ return i; } } //不包含该元素就返回-1 return -1; } @Override public boolean isEmpty() { return size==0?true:false; } @Override public void clear() { for(int i=0;i<size;i++){ elementData[i]=null; } size=0; } }
最后
以上就是聪慧月饼最近收集整理的关于自定义实现Java中的ArrayList集合的全部内容,更多相关自定义实现Java中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复