自己封装一个ArrayList

本次练习旨在自己封装一个简单的ArrayList并不是重新复刻java中的ArrayList类,有不足之处还请各位多指点,用的都是比较基础的知识比较适合初学者。

/**
 * 
 * @author Hercules
 * 
 * @version 创建时间:2020年1月7日 下午5:11:30
 * 
 *          类说明
 * 
 */
public class MyArrayLists<T> {

	private Object[] datas; // 用来存放数据

	private int size = 0; // 描述集合长度

	public MyArrayLists(int size) {
		if (size > 0) {
			datas = new Object[size];
		} else {
			System.out.println("集合长度不能为负数");//我还没有学到异常部分,所以这里暂且如此处理
		}
	}
	
	public MyArrayLists() {
		this(10);
	}

	/*
	 * 添加注释到集合中去
	 */
	public void add(T t) {
        //首先判断数组中是否已经装满
		//如果已经装满则需要扩容数组
		if(isFull()) {
			grow();
		}
		datas[size++] = t;  /*这里首先不要忘记扩容,其次这里只能用“size++”而不能用“++size”,
		因为这里后++是先用变量的原始值进行赋值以及运算等,而后再+1,而前++则是先将变量+1,而后
		在用+1后的值进行赋值和计算等*/
	}
	
	public void remove(int i) {
		if(i>=0 && i<size) {
			for(;i<size;i++) {
				datas[i] = datas[i+1];
			}
			size--;                  //这里千万不要忘记最后数组的实际元素个数要减1;
		}
	}
	
	//扩容
	public void grow() {
		Object [] newDatas = new Object[(int)(size*1.5)];
		//将原来数组的数据装入新的数组
		for(int i = 0;i<datas.length;i++) {
			newDatas[i] = datas[i];
		}
		datas = newDatas;//将新的数组赋值给datas
	}
	
	//判断数组是否已经满了返回bool
	public boolean isFull() {
		return size >= datas.length;
	}
	
	//修改数据操作
	public void set (int index,T t) {
		if(index >= 0 && index < size ) {
			datas[index] = t;
		}
	}
	
	//获取数据操作
	public T get (int index) {
		if(index >= 0 && index <size) {
	       return (T) datas[index];
		}
		return null;
	}
	
	//获取集合长度
	
	public int getLength() {
		return size;
	}
}

这就是一个自己封装的ArrayList类,可能有很多大神会觉得很low,不过既然是从基础开始,那就一点一点慢慢来。
我们来写一个测试类来看一下

/** 

* @author Hercules

* @version 创建时间:2020年1月7日 下午6:33:23 

* 测试类

*/
public class Test {
  public static void main(String [] args) {
	  MyArrayLists<String> list = new MyArrayLists<String>();
	  list.add("a");
	  list.add("a1");
	  list.add("a2");
	  list.add("a3");
	  list.add("a4");
	  
	  for(int i = 0; i < list.getLength();i++) {
		  System.out.println(list.get(i));
	  }
  }
}

输出结果如下:
在这里插入图片描述

我们再在上述代码的for循环上面添加修改操作

//修改
list.set(2, "b");

在这里插入图片描述
可以看到第三个元素变为了b,没错java的数组下标是从0开始的。

而后们再编写代码将这个元素删除
在这里插入图片描述
可以看到这时候元素就只剩下了,这几个,剩下的功能就不一一演示了

封装一个事件管理系统通常涉及到设计一个框架,其中包含以下几个核心组件: 1. **事件接口(Event Interface)**:这是一个基础接口,定义了通用的事件结构,如事件名称、携带的数据等。例如,在Java中可以是一个名为`Event`的抽象类或接口。 ```java public interface Event { String getName(); Object getData(); } ``` 2. **事件处理器(EventHandler)**:每个特定类型的事件对应一个处理器,它负责处理该事件。这些处理器注册到一个管理器中,通常是通过事件发布者来注册。 ```java public class EventHandler<T extends Event> { private final Class<T> eventClass; public EventHandler(Class<T> eventClass) { this.eventClass = eventClass; } public void handle(T event) { // 处理逻辑 } } ``` 3. **事件管理器(EventManager)**:这是系统的核心,它维护所有事件处理器的列表,并提供发布事件的功能。当接收到新的事件时,会遍历处理器列表并调用相应的handle方法。 ```java public class EventManager { private Map<Class<? extends Event>, List<EventHandler<? extends Event>>> handlers; public void registerHandler(EventHandler handler) { handlers.put(handler.getSupportedEventClass(), handlers.getOrDefault(handler.getSupportedEventClass(), new ArrayList<>())); handlers.get(handler.getSupportedEventClass()).add(handler); } public void publish(Event event) { handlers.values().forEach(handlersList -> handlersList.stream() .filter(handler -> event.getClass().isAssignableFrom(handler.getSupportedEventClass())) .forEach(handler -> handler.handle(event)); } } ``` 4. **事件发布者(EventPublisher)**:外部组件可以使用这个接口来触发事件,只需实例化一个具体的事件,然后传递给事件管理器。 ```java public class EventPublisher { private EventManager manager; public EventPublisher(EventManager manager) { this.manager = manager; } public void fireEvent(MyCustomEvent event) { manager.publish(event); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值