如何理解Java泛型模拟scala实现自定义ArrayList方式
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,本篇内容主要讲解"如何理解Java泛型模拟scala实现自定义ArrayList方式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解Java泛型模拟
千家信息网最后更新 2025年01月16日如何理解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) { MyListmyList = 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安全错误
数据库的锁怎样保障安全
湖南一搜网络技术有限公司
黄埔网络安全服务价格是怎样的
机架式服务器 塔式服务器
肇庆信息软件开发费用是多少
svn存储服务器
网络安全班会的简报
綦江网络安全工程师
sql数据库 原始数据
服务器维修单
网络安全专用产品安全认证
网络安全培训行业融资
铜梁区企业网络技术服务内容
数据库系统工程师吃香吗
qt 数据库界面设计
批量修改数据库链接字段地址
网络安全防范
金蝶kis显示服务器未正常启动
黑客攻击的是服务器还是程序
800块买个数据库值不值
加盟商选货软件开发
手机服务器地址是什么
idea创建数据库连接文件
软件开发 差额征税
淮安宽直网络技术有限公司
党委信息网络技术中心
数据库表输出为exc
潍坊app软件开发
北京亚尚软件开发有限公司
dns服务器怎么创建正向
我的世界服务器传送指令