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
相关文章:
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何通过VPS搭建网站快速盈利?
如何登录建站主机?访问步骤全解析
建站主机空间推荐 高性价比配置与快速部署方案解析
长沙企业网站制作哪家好,长沙水业集团官方网站?
音乐网站服务器如何优化API响应速度?
建站上市公司网站建设方案与SEO优化服务定制指南
西安大型网站制作公司,西安招聘网站最好的是哪个?
建站VPS配置与SEO优化指南:关键词排名提升策略
香港网站服务器数量如何影响SEO优化效果?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
油猴 教程,油猴搜脚本为什么会网页无法显示?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
广东企业建站网站优化与SEO营销核心策略指南
如何用免费手机建站系统零基础打造专业网站?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
,网页ppt怎么弄成自己的ppt?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
制作网站的公司有哪些,做一个公司网站要多少钱?
网站制作模板下载什么软件,ppt模板免费下载网站?
建站之星后台管理系统如何操作?
如何构建满足综合性能需求的优质建站方案?
Python路径拼接规范_跨平台处理说明【指导】
如何在香港服务器上快速搭建免备案网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星24小时客服电话如何获取?
已有域名如何快速搭建专属网站?
定制建站策划方案_专业建站与网站建设方案一站式指南
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?
如何快速生成专业多端适配建站电话?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
海南网站制作公司有哪些,海口网是哪家的?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何零基础在云服务器搭建WordPress站点?
如何基于PHP生成高效IDC网络公司建站源码?
如何快速辨别茅台真假?关键步骤解析
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
建站10G流量真的够用吗?如何应对访问高峰?
C#如何序列化对象为XML XmlSerializer用法
如何用狗爹虚拟主机快速搭建网站?
如何快速搭建高效简练网站?
如何高效配置香港服务器实现快速建站?
定制建站如何定义?其核心优势是什么?
*请认真填写需求信息,我们会在24小时内与您取得联系。