ArrayList和HashMap如何自己实现实例详解
发布时间 - 2026-01-10 22:09:50 点击率:次ArrayList和HashMap

ArrayList的存储就是一个数组,
HashMap的存储是一个数组加一个链表,
以下实现的MyArrayList及MyHashMap,在实际的工作中都是用不上的,最有可能用得到的地方就是面试找工作以及忽悠别人了。工作中虽然用不上,但是并不代表没有用,它可以帮助我们去理解他们的实现原理,等实现完后再去仔细查看JDK中的源码,就会发现别人实现当中那些可供学习的地方。
MyArrayList
public class MyArrayList<E> {
private int capacity = 10;
private int size = 0;
private E[] values = null;
@SuppressWarnings("unchecked")
public MyArrayList() {
values = (E[]) new Object[capacity];
}
@SuppressWarnings("unchecked")
public MyArrayList(int capacity) {
this.capacity = capacity;
values = (E[]) new Object[this.capacity];
}
public void put(E e) {
if (e == null) {
throw new RuntimeException("The value should not be null.");
}
if (size >= capacity) {
enlargeCapacity();
}
values[size] = e;
size++;
}
public E get(int index) {
if (index >= size) {
throw new RuntimeException("The index:" + index + " is out of band.");
}
return values[index];
}
public void remove(int index) {
if (index >= size) {
throw new RuntimeException("The index:" + index + " is out of band.");
}
for (int i = index; i < size - 1; i++) {
values[i] = values[i + 1];
}
values[size - 1] = null;
size--;
}
@SuppressWarnings("unchecked")
private void enlargeCapacity() {
capacity = capacity * 2;
E[] tmpValues = (E[]) new Object[capacity];
System.arraycopy(values, 0, tmpValues, 0, size);
values = tmpValues;
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(values[i]).append(",");
}
if (size > 0) {
sb.deleteCharAt(sb.length() - 1);
}
sb.append("]");
return sb.toString();
}
/**
* @param args
*/
public static void main(String[] args) {
MyArrayList<String> myList = new MyArrayList<String>();
myList.put("1");
myList.put("2");
myList.put("3");
myList.put("4");
myList.put("5");
myList.put("6");
myList.put("7");
myList.put("8");
myList.put("9");
myList.remove(7);
System.out.println(myList.toString());
}
}
MyHashMap
public class MyHashMap<K, V> {
//initialization capacity
private int capacity = 10;
//total entities
private int size = 0;
private Entity<K, V>[] entities = null;
@SuppressWarnings("unchecked")
public MyHashMap() {
entities = new Entity[capacity];
}
public void put(K key, V value) {
if (key == null) {
throw new RuntimeException("The key is null");
}
reHash();
Entity<K, V> newEntity = new Entity<K, V>(key, value);
put(newEntity, this.entities, this.capacity);
}
private void put(Entity<K, V> newEntity, Entity<K, V>[] entities, int capacity) {
int index = newEntity.getKey().hashCode() % capacity;
Entity<K, V> entity = entities[index];
Entity<K, V> firstEntity = entities[index];
if (entity == null) {
entities[index] = newEntity;
size++;
} else {
if (newEntity.getKey().equals(entity.getKey())) {//Find the same key for the first entity, if find then replace the old value to new value
newEntity.setNext(entity.getNext());
newEntity.setPre(entity.getPre());
if (entity.getNext() != null) {
entity.getNext().setPre(newEntity);
}
entities[index] = newEntity;
} else if (entity.getNext() != null) {
while (entity.getNext() != null) {//Find the same key for all the next entity, if find then replace the old value to new value
entity = entity.getNext();
if (newEntity.getKey().equals(entity.getKey())) {
newEntity.setPre(entity.getPre());
newEntity.setNext(entity.getNext());
if (entity.getNext() != null) {
entity.getNext().setPre(newEntity);
}
entities[index] = newEntity;
return;
}
}
//Cannot find the same key, then insert the new entity at the header
newEntity.setNext(firstEntity);
newEntity.setPre(firstEntity.getPre());
firstEntity.setPre(newEntity);
entities[index] = newEntity;
size++;
} else {
//Cannot find the same key, then put the new entity in head
newEntity.setNext(firstEntity);
firstEntity.setPre(newEntity);
entities[index] = newEntity;
size++;
}
}
}
public V get(K key) {
if (key == null) {
throw new RuntimeException("The key is null");
}
int index = key.hashCode() % capacity;
Entity<K, V> entity = entities[index];
if (entity != null) {
if (entity.getKey().equals(key)) {
return entity.getValue();
} else {
entity = entity.getNext();
while (entity != null) {
if (entity.getKey().equals(key)) {
return entity.getValue();
}
entity = entity.getNext();
}
}
}
return null;
}
public void remove(K key) {
if (key == null) {
throw new RuntimeException("The key is null");
}
int index = key.hashCode() % capacity;
Entity<K, V> entity = entities[index];
if (entity != null) {
if (entity.getKey().equals(key)) {
if (entity.getNext() != null) {//remove the first entity
entity.getNext().setPre(entity.getPre());
entities[index] = entity.getNext();
entity = null;
} else {//empty this index
entities[index] = null;
}
size--;
} else {
entity = entity.getNext();
while (entity != null) {
if (entity.getKey().equals(key)) {
if (entity.getNext() != null) {
entity.getPre().setNext(entity.getNext());
entity.getNext().setPre(entity.getPre());
entity = null;
} else {
//release the found entity
entity.getPre().setNext(null);
entity = null;
}
size--;
return;
}
entity = entity.getNext();
}
}
}
}
public String toString() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < capacity; i++) {
sb.append("index=").append(i).append("[");
boolean hasEntity = false;
Entity<K, V> entity = entities[i];
if (entity != null) {
hasEntity = true;
}
while (entity != null) {
sb.append("[").append(entity.getKey()).append("=").append(entity.getValue()).append("]").append(",");
entity = entity.getNext();
}
if (hasEntity) {
sb.deleteCharAt(sb.length() - 1);
}
sb.append("]\n");
}
return sb.toString();
}
/**
* Simple re-hash strategy, if the size is bigger than capacity, then do re-hash action
*/
private void reHash() {
if (size >= capacity) {
int newCapacity = capacity * 2;
@SuppressWarnings("unchecked")
Entity<K, V>[] newEntities = new Entity[newCapacity];
for (int i = 0; i < capacity; i++) {
Entity<K, V> entity = entities[i];
while (entity != null) {
put(entity, newEntities, newCapacity);
entity = entity.getNext();
}
}
this.capacity = newCapacity;
this.entities = newEntities;
}
}
public static void main(String[] args) {
MyHashMap<String, String> map = new MyHashMap<String, String>();
map.put("one", "1");
map.put("two", "2");
map.put("three", "3");
map.put("four", "4");
map.put("five", "5");
map.put("six", "6");
map.put("seven", "7");
map.put("eight", "8");
map.put("nine", "9");
map.put("ten", "10");
System.out.println(map.get("one"));
System.out.println(map.get("two"));
System.out.println(map.get("three"));
System.out.println(map.get("four"));
System.out.println(map.get("five"));
System.out.println(map.get("six"));
System.out.println(map.get("seven"));
System.out.println(map.get("eight"));
System.out.println(map.get("nine"));
System.out.println(map.get("ten"));
System.out.println(map.toString());
map.remove("nine");
map.remove("three");
System.out.println(map.get("one"));
System.out.println(map.get("two"));
System.out.println(map.get("three"));
System.out.println(map.get("four"));
System.out.println(map.get("five"));
System.out.println(map.get("six"));
System.out.println(map.get("seven"));
System.out.println(map.get("eight"));
System.out.println(map.get("nine"));
System.out.println(map.get("ten"));
System.out.println(map.toString());
}
}
class Entity<K, V> {
private K key;
private V value;
private Entity<K, V> pre;
private Entity<K, V> next;
public Entity(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public void setKey(K key) {
this.key = key;
}
public V getValue() {
return value;
}
public void setValue(V value) {
this.value = value;
}
public Entity<K, V> getPre() {
return pre;
}
public void setPre(Entity<K, V> pre) {
this.pre = pre;
}
public Entity<K, V> getNext() {
return next;
}
public void setNext(Entity<K, V> next) {
this.next = next;
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# ArrayList和HashMap
# 如何自己实现
# ArrayList
# HashMap
# 浅析java中ArrayList与Vector的区别以及HashMap与Hashtable的区别
# 深入探讨JavaScript的最基本部分之执行上下文
# 谈谈JavaScript中super(props)的重要性
# JavaScript常用工具方法封装
# Java多线程实战之交叉打印的两种方法
# Java多线程实战之单例模式与多线程的实例详解
# JavaTCP上传文本文件代码
# Java五子棋AI实现代码
# Javascript迭代、递推、穷举、递归常用算法实例讲解
# ArrayList及HashMap的扩容规则讲解
# 不上
# 都是
# 是一个
# 他们的
# 就会
# 希望能
# 人了
# 它可以
# 可供
# 再去
# 并不代表
# 谢谢大家
# 完后
# 链表
# 在实际
# 有可能用
# Object
# void
# throw
# put
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南
android nfc常用标签读取总结
移动端脚本框架Hammer.js
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
如何在Windows环境下新建FTP站点并设置权限?
在centOS 7安装mysql 5.7的详细教程
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何用IIS7快速搭建并优化网站站点?
Java类加载基本过程详细介绍
Laravel如何升级到最新版本?(升级指南和步骤)
西安专业网站制作公司有哪些,陕西省建行官方网站?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Android 常见的图片加载框架详细介绍
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何与Inertia.js和Vue/React构建现代单页应用
Python自动化办公教程_ExcelWordPDF批量处理案例
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何在阿里云高效完成企业建站全流程?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
Laravel distinct去重查询_Laravel Eloquent去重方法
如何确认建站备案号应放置的具体位置?
南京网站制作费用,南京远驱官方网站?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
如何快速搭建支持数据库操作的智能建站平台?
海南网站制作公司有哪些,海口网是哪家的?
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
在线制作视频的网站有哪些,电脑如何制作视频短片?
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何用PHP快速搭建CMS系统?
Laravel如何处理和验证JSON类型的数据库字段
Android Socket接口实现即时通讯实例代码
Linux系统运维自动化项目教程_Ansible批量管理实战
文字头像制作网站推荐软件,醒图能自动配文字吗?
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
手机网站制作与建设方案,手机网站如何建设?
Linux系统命令中screen命令详解
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
网易LOFTER官网链接 老福特网页版登录地址
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
如何在万网自助建站平台快速创建网站?

