最简单最容易理解的手写LIst集合类

Posted yonim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最简单最容易理解的手写LIst集合类相关的知识,希望对你有一定的参考价值。

说道集合,不得不说一下容器,数组也是集合的一种,那集合和容器的区别是什么呢?

个人认为,数组就是固定死的,而集合则是可以自增。

话不多说,直接上代码

 

首先是我们的接口层

package com.util.collection;

public interface ListCollection {

    // 添加元素
    void add(Object obj);
    
    // 获取集合容量
    int size();
    
    // 根据下标取元素
    Object get(int i);
    
    
    // 根据下标删除元素
    void rem(int i);
    
    // 根据元素删除
    void rem(Object obj);
    
    
    // 实际用到的值 
    int actual();
}

实现层

package com.util.collection;

public class ListDemo implements
ListCollection{

    // 初始值
    private Object[] obj = new Object[10];

    // 旧值 更新值 
    private Object[] objects;
    
    


    // 初始化一下、赋值、替换
    private void setObj(Object[] obj) {
        objects = new Object[(int) Math.ceil(obj.length*1.5)];
        for (int i = 0; i < obj.length; i++) {
            objects[i] = obj[i];
        }
        this.obj = objects;
    }

    @Override
    public void add(Object obj) {
        if (actual() == size()) {
            setObj(this.obj);
            this.obj[actual()] = obj;
            
        }else {
            this.obj[actual()] = obj;
        }
    }

    @Override
    public int size() {
        return obj.length;
    }
    


    @Override
    public Object get(int i) {
        return this.obj[i];
    }

    // 删除时需要进行遍历
    @Override
    public void rem(int i) {
        this.obj[i] = null;
        if(i!=size()-1 && i>size()-1) {
            for (int j = i; j < obj.length-1; j++) {
                obj[j] = obj[j+1];
            }    
        }
    }

    @Override
    public void rem(Object obj) {
        if(obj!=null) {
            for (int i = 0; i < this.obj.length; i++) {
                if(this.obj[i] == obj) {
                    rem(i);
                }
            }
        }
    }
    
    
    // 获取实际数组值
    public int actual() {
        int size = 0;
        for (int i=0;i<obj.length;i++) {
            if(obj[i] != null)
                size++;
        }
        return size;
    }
    
    
    
}

测试类

package com.util.collection;

public class TestList {

    public static void main(String[] args) {
        ListCollection list = new ListDemo();
        list.add("123");
        list.add("456");
        list.add("789");
        list.add("147");
        list.add("258");
        list.add("369");
        list.add("159");
        list.add("357");
        System.err.println("集合容量:"+list.size());
        System.err.println("集合使用容量:"+list.actual());

         for (int i = 0; i < 20; i++) { list.add(i); }
        System.err.println("集合容量:"+list.size());
        System.err.println("集合使用容量:"+list.actual());
        System.err.println("=======================");
        System.err.println("下标第一个:"+list.get(0));
        list.set(0,"替换后的值");
        System.err.println("修改之后的值是:" + list.get(0));
        
        list.rem(0);
        System.err.println("删除后读取的第一个值:"+list.get(0));
        System.err.println();
        
        
        
        
        
    }
    
}

测试输出:

集合容量:10
集合使用容量:8
集合容量:35
集合使用容量:28
=======================
下标第一个:123
修改之后的值是:替换后的值
删除后读取的第一个值:456

 

以上是关于最简单最容易理解的手写LIst集合类的主要内容,如果未能解决你的问题,请参考以下文章

自己手写调度器,理解Python中的asyncio异步事件循环与协程

自己手写调度器,理解Python中的asyncio异步事件循环与协程

自己手写调度器,理解Python中的asyncio异步事件循环与协程

在 Java 中将 List 转换为 Set 的最简单方法

手把手教你手写一个最简单的 Spring Boot Starter

如何正确地写出单例模式