ArrayList模拟底层实现
public class MyArrayList <E>{
private int size;
private Object[] elementData;
private final int DEFAULT_CAPACITY = 10;
public MyArrayList() {
size = 0;
elementData = new Object[DEFAULT_CAPACITY];
}
public MyArrayList (int capacity) {
if(capacity<0) {
throw new RuntimeException("MyArrayList容量错误:"+capacity);
}else if (capacity==0) {
size = 0;
elementData = new Object[DEFAULT_CAPACITY];
}else {
size = 0;
elementData = new Object[capacity];
}
}
public void add(E obj) {
if(size == elementData.length) {
Object[] elementData2 = new Object[size+DEFAULT_CAPACITY>>1];
System.arraycopy(elementData, 0, elementData2, 0, size);
elementData = elementData2;
elementData[size++] = obj;
size = size+DEFAULT_CAPACITY>>1;
}else {
elementData[size++] = obj;
}
}
public void set(int index,E obj) {
checkRange(index);
elementData[index] = obj;
}
private void checkRange(int index) {
if(index<0||index>size-1) {
throw new RuntimeException("索引越界:"+index);
}
}
public void remove(int index) {
checkRange(index);
int length = size-index-1;
if(length>0) {
System.arraycopy(elementData, index+1, elementData, index, length);
elementData[--size]=null;
}
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append("[");
for(int i=0;i<size;i++) {
s.append(elementData[i]).append(",");
}
s.setCharAt(s.length()-1, ']');
return s.toString();
}
public static void main(String[] args) {
MyArrayList<String> arr = new MyArrayList<>();
arr.add("aa");
arr.add("bb");
arr.add("cc");
System.out.println(arr);
arr.remove(1);
System.out.println(arr);
}
}
LinkedList模拟底层实现
class Node{
Node previous;
Node next;
Object element;
public Node(Object element) {
super();
this.element = element;
}
public Node(Node previous, Node next, Object element) {
super();
this.previous = previous;
this.next = next;
this.element = element;
}
}
public class MyLinkedList <E>{
private Node first;
private Node last;
private int size;
public MyLinkedList() {
size = 0;
}
public void add(E obj) {
Node temp = new Node(obj);
if(size==0) {
first = temp;
last = temp;
}else {
last.next = temp;
temp.previous = last;
last = temp;
}
size++;
}
public void add(int index,E obj) {
checkRange(index);
Node temp = new Node(obj);
Node node = getNode(index);
Node up = node.previous;
if(up!=null) {
up.next = temp;
temp.previous = up;
}
if(node!=null) {
node.previous = temp;
temp.next = node;
}
if(index == 0) {
first = temp;
}
if(index == size-1) {
last = temp;
}
size++;
}
private Node getNode(int index) {
checkRange(index);
Node temp = null;
if(index <= (size-1)<<1) {
temp = first;
for(int i=0;i<index;i++) {
temp = temp.next;
}
}
if(index > (size-1)<<1) {
temp = last;
for(int i=size-1;i>index;i--) {
temp = temp.previous;
}
}
return temp;
}
public Object get(int index) {
checkRange(index);
return getNode(index).element;
}
private void checkRange(int index) {
if(index<0||index>size-1) {
throw new RuntimeException();
}
}
public void Remove(int index) {
checkRange(index);
Node node = getNode(index);
Node up = node.previous;
Node down = node.next;
node = null;
if(up==null) {
first = down;
}else if(down==null) {
last = up;
}else {
up.next = down;
down.previous = up;
}
size--;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
Node temp = first;
s.append("[");
for(int i=0;i<size;i++) {
s.append(temp.element+",");
temp = temp.next;
}
s.setCharAt(s.length()-1, ']');
return s.toString();
}
public static void main(String[] args) {
MyLinkedList<String> myLinkedlist = new MyLinkedList<String>();
myLinkedlist.add("aa");
myLinkedlist.add("bb");
myLinkedlist.add("cc");
myLinkedlist.add("dd");
System.out.println(myLinkedlist);
myLinkedlist.add(2,"ee");
System.out.println(myLinkedlist);
myLinkedlist.Remove(0);
System.out.println(myLinkedlist);
myLinkedlist.Remove(3);
System.out.println(myLinkedlist);
System.out.println(myLinkedlist.get(2));
}
}
HashMap底层实现
class Node2<K,V>{
int hash;
K key;
V value;
Node2 next;
}
public class MyHashMap<K,V> {
private Node2[] table;
private int size;
public MyHashMap() {
table = new Node2[16];
size = 0;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
s.append("[");
Node2 temp = null;
for(int i=0;i<table.length;i++) {
temp = table[i];
while (temp!=null) {
s.append(temp.key+":"+temp.value+",");
temp = temp.next;
}
}
s.setCharAt(s.length()-1, ']');
return s.toString();
}
public int myHash(int h,int length) {
return h&(length-1);
}
public void put(K key,V value) {
Node2 node = new Node2();
node.hash = myHash(key.hashCode(), table.length);
node.key = key;
node.value = value;
node.next = null;
Node2 temp = table[node.hash];
Node2 iteraLast = null;
boolean isRepeated = false;
if(temp==null) {
table[node.hash]=node;
}else {
while(temp!=null) {
if(temp.key.equals(key)) {
temp.value = value;
isRepeated = true;
break;
}
iteraLast = temp;
temp = temp.next;
}
if (!isRepeated) {
temp = node;
iteraLast.next = node;
}
}
size++;
}
public void remove(K key) {
for(int i=0;i<table.length;i++) {
Node2 temp = table[i];
Node2 iteraLast = table[i];
while(temp!=null) {
if (temp.key.equals(key)) {
if(temp.next==null) {
iteraLast.next = null;
temp.hash = -1;
temp.key = null;
temp.value = null;
}else {
iteraLast.next = temp.next;
}
}
iteraLast =temp;
temp = temp.next;
}
}
size--;
}
public Object get(K key) {
Object value = null;
for(int i=0;i<table.length;i++) {
Node2 temp = table[i];
while(temp!=null) {
if(temp.key!=null && temp.key.equals(key)) {
value = temp.value;
}
temp = temp.next;
}
}
if (value==null) {
throw new RuntimeException("找不到键对应的值");
}
return value;
}
public static void main(String[] args) {
MyHashMap<Integer, String> myHashMap = new MyHashMap<>();
myHashMap.put(3, "aa");
myHashMap.put(6, "bb");
myHashMap.put(9, "cc");
System.out.println(myHashMap);
myHashMap.remove(3);
System.out.println(myHashMap);
System.out.println(myHashMap.get(6));
}
}