如何理解Java泛型模拟scala实现自定义ArrayList方式
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,本篇内容主要讲解"如何理解Java泛型模拟scala实现自定义ArrayList方式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解Java泛型模拟
千家信息网最后更新 2025年11月07日如何理解Java泛型模拟scala实现自定义ArrayList方式
本篇内容主要讲解"如何理解Java泛型模拟scala实现自定义ArrayList方式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解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 MyListextends 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.add("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, ']'); return 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) { 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()); }}
到此,相信大家对"如何理解Java泛型模拟scala实现自定义ArrayList方式"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
方法
类型
接口
参数
方式
代码
元素
内容
大小
数组
索引
学习
合法
实用
更深
东西
两个
之间
兴趣
双十
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
达梦数据库license查看
传说之下手机版修改数据库
软件开发文字缩进
中国网络安全监督管理
车载网络技术应用综述
网络安全三年级
双路服务器只插一路内存
大连软件开发软件公司
确实维护网络安全
服务器 设备税
fifa22与服务器断开连接
客户端关闭数据库连接
生命科技与互联网时代
地图软件开发工具
税控开票系统安全连接服务器失败
腾讯软件开发工资一般多少
软件开发证书报名条件
uml怎么连接数据库
java软件开发常用模型
万方年鉴数据库
用u盘装的服务器系统老是出问题
携程软件开发面试
服务器如何判断是否损坏
社区怎么管理怎么服务器
网络安全小学生课件
成都计算机软件开发费用是多少
云龙区网络营销软件开发质量服务
关于汽车网络安全的灵魂二十问
网络安全周手抄报 四年级
桂林山水课件软件开发