Java泛型模拟scala实现自定义ArrayList方式

网友投稿 279 2022-09-23


Java泛型模拟scala实现自定义ArrayList方式

目录泛型模拟scala实现自定义ArrayList自定义实现ArrayList代码

泛型模拟scala实现自定义ArrayList

泛型就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),

然后在使用/调用时传入具体的类型

操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。

以下实例通过泛型,灵活的实现了类似scala中集合的map,reduce方法,并可以链式编程

Function1:一个入参的泛型接口,例如map(),filter()

//泛型接口

public interface Function1 {

R call(T t);

}

Function2:两个入参的泛型接口,例如reduce()

//泛型接口

public interface Function2 {

E call(E elem,E sum);

}

MyList:自定义List

import java.util.ArrayList;

//泛型类

public class MyList extends ArrayList {

//泛型方法 (只有在public修饰符和返回值之间用了泛型的才是泛型方法,指定后,该方法内可以使用该泛型)

public MyList map(Function1 fun){

MyList myList = new MyList<>();

for (E e : this) {

R res = fun.call(e);

myList.add(res);

}

return myList;

}

//这个不是泛型方法,泛型在引用时指定,可以是泛型类中已经定义的,也可以是具体的类

public MyList filter(Function1 fun){

MyList myList = new MyList<>();

for(E elem : this){

Boolean flag = fun.call(elem);

if(flag){

myList.add(elem);

}

}

return myList;

}

//这个也不是泛型方法

public E reduce(Function2 fun){

E sum = null;

boolean isFirst = true;

for (E elem : this) {

if(isFirst){

sum = elem;

isFirst = false;

}else {

sum = fun.call(elem,sum);

}

}

return sum;

}

}

测试:

public class MyTest {

public static void main(String[] args) {

MyList myList = new MyList<>();

myList.add("aaaa");

myList.add("bbbb");

myList.add("cccc");

myList.addhttp://("accc");

String res = myList.filter(x -> x.contains("a")).map(x -> x.toUpperCase()).reduce((x, y) -> x + y);

System.out.println(res);

}

}

输出:

自定义实现ArrayList代码

"双十一让你明白,有些东西,打半折你也买不起;就像你喜欢的人,眼光降低一半,还是看不上你“。所以,在JDK1.8中,ArrayList底层是怎么实现的呢?(看源码能理解就行)

/**

* 自定义实现ArrayList

*/

public class TextArrayList {

private Object[] elementData;

private int size;

private static final int DEFALT_CAPACITY = 10;

/**

* 无参构造,默认数组大小为10

*/

public TextArrayList() {

elementData = new Object[DEFALT_CAPACITY];

}

/**

* 有参构造,数组大小为传入的值

*/

public TextArrayList(int capacity) {

if (capacity < 0) {

throw new RuntimeException("容器容量不能为负数");

} else if (capacity == 0) {

elementData = new Object[DEFALT_CAPACITY];

} else {

elementData = new Object[capacity];

}

}

/**

* 给数组中添加元素

*

* @param element */

public void add(E element) {

//数组扩容

if (size == elementData.length) {

Object[] newArray = new Object[elementData.length + (elementData.length >> 1)];

System.arraycopy(elementData, 0, newArray, 0, elementData.length);

elementData = newArray;

}

elementData[size++] = element;

}

/**

* 删除元素

* 挨个比较所有元素,获得第一个比较结果为True的,返回

*

* @return

*/

public void remove(E element) {

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

if (element.equals(get(i))) {

//比较操作用到equals方法

System.arraycopy(elementData, i + 1, elementData, i, elementData.length - i - 1);

elementData[size - 1] = null;

size--;

}

}

}

/**

* 删除索引

*

* @return

*/

public void remove(int index) {

int numMoved = elementData.length - index - 1;

if (numMoved > 0) {

System.arraycopy(elementData, index + 1, elementData, index, numMoved);

}

elementData[size - 1] = null;

size--;

}

/**

* 判空

*

* @return

*/

public boolean isEmpty() {

return size == 0 ? true : false;

}

@Override

public String toString() {

StringBuilder stringBuilder = new StringBuilder();

//[a,b,c]

stringBuilder.append("[");

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

stringBuilder.append(elementData[i] + ",");

}

stringBuilder.setCharAt(stringBuilder.length() - 1, ']');

etbOmFlzreturn stringBuilder.toString();

}

/**

* 增加get方法

*

* @param index

*/

public E get(int index) {

checkRange(index);

return (E) elementData[index];

}

/**

* 增加set方法

*

* @param index

*/

public void set(E element, int index) {

checkRange(index);

elementData[index] = element;

}

//判断索引合法性

public void checkRange(int index) {

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

http:// throw new RuntimeException("索引不合法:" + index);

}

}

public static void main(String[] args) {

TextArrayList t1 = new TextArrayList(20);

// t1.add("aa");

// t1.add("bb");

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

t1.add("wang" + i);

}

t1.set("sss", 10);

System.out.println(t1);

System.out.println(t1.get(39));

t1.remove(3);

t1.remove("wang5");

System.out.println(t1);

System.out.println(t1.size);

System.out.println(t1.isEmpty());

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:路由交换学习笔记(十一)路由策略与策略路由(交换机路由策略)
下一篇:路由交换学习笔记(十)访问控制列表与地址前缀列表(路由交换基础知识)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~