JAVA 用数组实现 ArrayList

1、能自动扩容

  2、能存放不同类型的数据

这两点我们是这样解决的:

  1、当一个数据存放满了,我们就将这个数据复制到一个新的数组中,而这个新的数组容量要比原数组大。通过这样不断的扩大数组长度,也就是集合的容量。那么这里我们用到了这个方法  System.arraycopy

完整的写法为:public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

参数

@ src -- 这是源数组 @ srcPos -- 这是源数组中的起始位置 @dest -- 这是目标数组 @ destPos -- 这是目标数据中的起始位置  @ length -- 这是一个要复制的数组元素的数目


1

2

3

4


int arr1[] = {0,1,2,3,4,5};

int arr2[] = {0,10,20,30,40,50};

System.arraycopy(arr1,0,arr2,1,2);

//结果为:arr2 = [0,0,1,30,40,50];

  2、第二个问题,我们只需要声明为 Object 类型的数组就可以了。

完整代码如下:


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

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239


package com.ys.collection;

public class MyArrayList {

//用于存储数据

private transient Object[] data = null;

//集合的元素个数

private int size = 0;

//定义一个常量为 10.(后面用于定义默认的集合大小)

private static final int DEFAULT_CAPACITY = 10;

/***

* 有参构造函数

* 指定数组的大小

* @param length

*/

public MyArrayList(int initialCapacity){

if(initialCapacity < 0){

throw new IllegalArgumentException("非法的集合初始容量值 Illegal Capacity: "+

initialCapacity);

}else{

//实例化数组

this.data = new Object[initialCapacity];

}

}

/***

* 无参构造函数

* 指定数组的初始大小为 10

*/

public MyArrayList(){

this(DEFAULT_CAPACITY);

}

/***

* 1、复制原数组,并扩容一倍

* 2、复制原数组,并扩容一倍,并在指定位置插入对象

* @param index

* @param obj

*/

public void checkIncrease(int index,Object obj){

if(size >= data.length){

//实例化一个新数组

Object[] newData = new Object[size*2];

if(index == -1 && obj == null){

System.arraycopy(data, 0, newData, 0, size);

}else{

//将要插入索引位置前面的对象 拷贝

System.arraycopy(data, index, newData, index+1, size-index);

}

//将 newData 数组赋值给 data数组

data = newData;

newData = null;

}

}

/***

* 获取数组的大小

* @return

*/

public int getSize(){

return this.size;

}

/***

* 根据元素获得在集合中的索引

* @param o

* @return

*/

public int indexOf(Object o) {

if (o == null) {

for (int i = 0; i < data.length; i++)

if (data[i]==null)

return i;

} else {

for (int i = 0; i < data.length; i++)

if (o.equals(data[i]))

return i;

}

return -1;

}

/***

* 在尾部添加元素

* @param obj

* @return

*/

public boolean add(Object obj){

//检查是否需要扩容

checkIncrease(-1, null);

data[size++] = obj;

return true;

}

/**

* 判断给定索引是否越界

* @param index

* @return

*/

public boolean checkIndexOut(int index){

if(index > size || index < 0){

throw new IndexOutOfBoundsException("指定的索引越界,集合大小为:"+size+",您指定的索引大小为:"+index);

}

return true;

}

public boolean add(int index,Object obj){

//如果给定索引长度刚好等于原数组长度,那么直接在尾部添加进去

if(index == size){

add(obj);

}

//checkIndexOut()如果不抛异常,默认 index <=size,且 index > 0

else if(checkIndexOut(index)){

if(size < data.length){

System.arraycopy(data, index, data, index+1, size-index);

data[index] = obj;

}else{

//需要扩容

checkIncrease(index, obj);

}

size++;

}

return true;

}

/***

* 根据索引获得元素

* @param index

* @return

*/

public Object get(int index){

checkIndexOut(index);

return data[index];

}

/***

* 删除所有元素

*/

public void removeAll(){

for(int i = 0 ; i < data.length ; i++){

data[i] = null;

}

}

/***

* 根据索引删除元素

* @param index

* @return

*/

public Object remove(int index){

if(index == size+1){

throw new IndexOutOfBoundsException("指定的索引越界,集合大小为:"+size+",您指定的索引大小为:"+index);

}else if(checkIndexOut(index)){

//保存对象

Object obj = data[index];

if(index == size){

data[index] = null;

}else{

//将后边的数组向前移动一位

System.arraycopy(data, index+1, data, index, size-index);

}

size--;

return obj;

}

return null;

}

/***

* 删除指定的元素,删除成功返回 true,失败返回 false

* @param obj

* @return

*/

public boolean remove(Object obj){

for(int i = 0 ; i < size ; i++){

if(obj.equals(data[i])){

remove(i);

return true;

}

}

return false;

}

/***

* 在指定位置修改元素,通过索引,修改完成后返回原数据

* @param index

* @param obj

* @return

*/

public Object change(int index,Object obj){

checkIndexOut(index);

Object oldObj = data[index];

data[index] = obj;

return oldObj;

}

/***

* 查看集合中是否包含某个元素,如果有,返回 true,没有返回 false

* @param obj

* @return

*/

public boolean contain(Object obj){

for(int i = 0 ; i < data.length ; i++){

if(obj.equals(data[i])){

return true;

}

}

return false;

}

public static void main(String [] args){

MyArrayList my = new MyArrayList();

//System.out.println(my.data.length);

my.add(0,3);

//System.out.println(my.getSize());

my.add(0,4);

//System.out.println(my.getSize());

my.add(0,5);

//my.removeAll();

//my.remove(2);

//System.out.println(my.get(2));

System.out.println(my.indexOf(null));

System.out.println(my.contain(2));

for(int i = 0 ; i < my.data.length ; i++){

System.out.println(my.data[i]);

}

}

}

  

时间: 2024-10-08 16:04:18

JAVA 用数组实现 ArrayList的相关文章

将java中数组转换为ArrayList的方法实例(包括ArrayList转数组)

方法一:使用Arrays.asList()方法 1 2 String[] asset = {"equity", "stocks", "gold", "foreign exchange","fixed income", "futures", "options"}; List<String> assetList = Arrays.asList(asset);

java中数组和ArrayList的互转

java中基本类型数组[]和ArrayList之间的互相转换在算法实现过程中经常使用. 1 int[] data = {4, 5, 3, 6, 2, 5, 1}; 2 3 // int[] 转 List<Integer> 4 List<Integer> list1 = Arrays.stream(data).boxed().collect(Collectors.toList()); 5 // Arrays.stream(arr) 可以替换成IntStream.of(arr). 6

[转]Java中怎样把数组转换为ArrayList

方法汇总: Element[] array = {new Element(1),new Element(2),new Element(3)}; ArrayList<Element> arrayList = new ArrayList<Element>(Arrays.asList(array)); //方法1 List<Element> list = Arrays.asList(array); //方法2 List<element> list = new Ar

在Java中怎样把数组转换为ArrayList?

翻译自:How to Convert Array to ArrayList in Java? 本文分析了Stack Overflow上最热门的的一个问题的答案,提问者获得了很多声望点,使得他得到了在Stack Overflow上做很多事情的权限.这跟我没什么关系,我们还是先看看这个问题吧. 这个问题是"在Java中怎样把数组转换为ArrayList?" Element[] array = {new Element(1),new Element(2),new Element(3)}; 1

Java 带分隔字符串、字符串数组和 ArrayList&lt;String&gt; 之间的转换

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 一.先来认识一下标题说的这三件东西,也许描述的不清楚,但有了下面的例子,就不会有歧义了 1.带分隔字符串是这样的: String seperate

Java 中 Vector、ArrayList、List 使用深入剖析

线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个C

在java 中,数组与 List&lt;T&gt; 类型的相互转换

在java中,数组与List<T> 之前进行互相转换,转换方法可总结为以下几种: 一. 将 数组转换成List<T> 1. 使用 Collections 的addAll 方法 String[] myStr = {"1","2","4","9","7"}; List<String> listStr = new ArrayList<String>(); Colle

Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要 上一章,我们学习了Collection的架构.这一章开始,我们对Collection的具体实现类进行讲解:首先,讲解List,而List中ArrayList又最为常用.因此,本章我们讲解ArrayList.先对ArrayLis

Java动态数组

其中java动态数组: Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList.下面介绍一下ArrayList作为Java动态数组的用法. 1.语法:add()是添加一个新的元素,remove()删除一个元素,size()获得ArrayList的长度.ArrayList的下标是从0开始. 2.示例代码 [java] view plaincopy package wang48.j