Collection的子类有List,Set
List的子类ArrayList(底层实现是数组),LinkedList(底层是链表),Vector(底层是数组)
1.ArrayList的底层方法实现:
package collection;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
public class MyArrayList {
public MyArrayList() {
private Object[] elementData;
int size;
public MyArrayList(int initialCapacity) {
elementData = new Object[] {};
}
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
if (initialCapacity >= 0) {elementData = new Object[initialCapacity];
return size;
} else {}}public int size() {}
public void add(int index,Object obj) {
public void add(Object obj) {
ensureCapacityInternal(size+1);
elementData[size++] = obj;}
public Object get(int index) {
ensureCapacityInternal(size+1);//注意这个移动数据的方法
System.arraycopy(elementData, index, elementData, index+1, size-index);
elementData[index] = obj;size++;}
Object[] newobj = new Object[size*2+1];
return elementData[index];
}//扩容原理
public void ensureCapacityInternal(int capacity) {
if(capacity>elementData.length) {
if(index >= size) {
System.arraycopy(elementData, 0, newobj, 0, size);
elementData =newobj;}}
//此处设置合情合理,因为数的小标》=0;
public void rangecheck(int index) {throw new RuntimeException();
public void set(int index,Object obj) {
}
}
public void rangeCheckForAdd(int index) {
if(index < 0 || index >= size) {
//ArrayList的实现中不能往后设定元素吗?
throw new RuntimeException();}}rangecheck(index);
return false;
elementData[index] = obj;
}
return size == 0;
public boolean isEmpty() {}
public boolean contains(Object obj) {
int index = indexOf(obj);if(index == -1) {}return true;
if(elementData[i] == null) {
}//有点意思
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}public int indexOf(Object obj) {
for(int i = 0;i < size;i++) {
if(null == obj) {return i;}}}else{
System.arraycopy(elementData, index+1, elementData, index, size-index-1);
for(int i = 0;i < size;i++) {
if(elementData[i] .equals(obj)) {
return i;}}}
public void remove(int index) {
return -1;} rangecheck(index);
}
elementData[size-1] = null; size--;
System.out.println(list.size);
public void remove(Object obj) {
int index = indexOf(obj);
remove(index);
if(index != -1) {}}
MyArrayList list = new MyArrayList();
public static void main(String[] args) {list.add("1");
}
list.add(2);list.add(3);
System.out.println(list.get(1));
//System.out.println(list.get(-1));
list.remove(0);
list.remove(0);
System.out.println(list.size);
System.out.println(list.get(0));
}
package collection;
//LinkedList的底层实现是链表,增删改快,查询慢,
public class MyLinkedList {
private int size;
private Node first;
private Node last;
public int size() {
return size;
}
public void add(Object obj) {
if (first == null) {
first = new Node();
first.previous = null;
first.content = obj;
last =first ;
first.next = last;
} else {
Node node = new Node();
last.next = node;
node.content = obj;
node.previous = last;
last = node;
}
size++;
}
public void addFirst(Object obj) {
Node node = new Node();
if(first==null) {
first = node;
first.previous = null;
first.content = obj;
last= first;
first.next = last;
}else{
first.previous = node;
node.content = obj;
node.next = first;
node.previous = null;
first = node;
}
size++;
}
public void addLast(Object obj){
if(last ==null) {
addFirst(obj);
}else {
Node node = new Node();
last.next = node;
node.previous = last;
node.content = obj;
last = node;
size++;
}
}
public Node getNode(int index) {
Node temp = new Node();
temp = first;
for(int i = 0;i < index;i++) {
temp = temp.next;
}
return temp;
}
public Object get(int index) {
return getNode(index).content;
}
public void set(int index,Object obj) {
Node node = getNode(index);
node.content = obj;
}
public int indexOf(Object obj) {
Node temp = first;
if(obj == null) {
for(int i = 0;i < size;i++) {
if( temp.content == obj) {
return i;
}else {
temp = temp.next;
}
}
return -1;
}else {
for(int i = 0;i < size;i++) {
if( temp.content.equals(obj) ) {
return i;
}else {
temp = temp.next;
}
}
return -1;
}
}
public boolean contains(Object obj) {
// return indexOf(obj) ==-1? true:false;
return indexOf(obj)!=-1;
}
public void remove(Object obj) {
Node temp = first;
if(obj==null) {
for(int i = 0;i < size;i++) {
if( temp.content == obj) {
temp.previous.next = temp.next;
temp.next.previous = temp.previous;
size--;
break;
}else {
temp = temp.next;
}
}
}else {
for(int i = 0;i < size;i++) {
if( temp.content.equals(obj) ) {
if(temp==first) {
first = first.next;
first.previous = null;
size--;
break;
}else {
temp.previous.next = temp.next;
temp.next.previous = temp.previous;
size--;
break;
}
}else {
temp = temp.next;
}
}
}
}
public void clear() {
if(size !=0)
{
Node temp = first;
for(int i = 0;i < size;i++) {
Node node =temp.next;
temp.content = null;
temp = null;
node.previous = null;
temp = node;
}
}
size = 0;
}
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add(1);
System.out.println(list.get(0));
list.add(2);
System.out.println(list.get(1));
list.add(3);
System.out.println(list.get(2));
list.addFirst(4);
System.out.println(list.get(0));
list.addLast(5);
System.out.println(list.get(4));
System.out.println(list.indexOf(1));
list.remove(4);
System.out.println(list.size);
list.clear();
System.out.println(list.size);
System.out.println(list.get(0));
}
}
package collection;
public class Node {
Node previous;
Object content;
Node next;
}
package collection;
//hashmap的底层实现是数组+链表
public class MyHashMap {
private int size;
MyLinkedList arr[] = new MyLinkedList[999];//在这里不考虑扩容的事了
public void put(Object key,Object value) {
int num = key.hashCode()%arr.length;//恰到好处的运用hashcode;
if(arr[num]==null) {
MyLinkedList linkedlist = new MyLinkedList();
arr[num] = linkedlist;
Entry entry = new Entry(key, value);
linkedlist.add(entry);
size++;
}else {
for(int i = 0;i < arr[num].size();i++) {
Entry entry = (Entry)arr[num].get(i);
if(entry.key.equals(key)) {
entry.value = value;
return;
}
}
Entry entry = new Entry(key, value);
arr[num].add(entry);
size++;
}
}
public Object get(Object key) {
int num = key.hashCode()%arr.length;
if(arr[num]!=null) {
for(int i = 0;i < arr[num].size();i++) {
Entry en = (Entry) arr[num].get(i);
if(en.key.equals(key)) {
return en.value;
}
}
}
return null;
}
public int size() {
return size;
}
public static void main(String[] args) {
MyHashMap map = new MyHashMap();
/* map.put("a", "a1");
map.put("b", "b1");
map.put("a", "a2");
System.out.println(map.get("a"));
System.out.println(map.get("b"));
System.out.println(map.size());*/
Student stu1 = new Student("张三", 18);
Student stu2 = new Student("李四", 19);
Student stu3 = new Student("张三", 20);
map.put(stu1, "男");
map.put(stu2, "女");
map.put(stu1, "女");
System.out.println(map.size);
System.out.println(map.get(stu1));
}
private class Entry{
Object key;
Object value;
public Entry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
}
}
class Student{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
package collection;
import java.util.HashMap;
//由此可见HashSet集合的不可重复完全依赖于HashMap键的不可重复实现的
public class MyHashSet {
private HashMap hashmap;
private static final Object PRESENT = new Object();
public MyHashSet() {
hashmap = new HashMap<>();
}
public int size() {
return hashmap.size();
}
public boolean isEmpty() {
return hashmap.isEmpty();
}
public boolean contains(Object obj) {
return hashmap.containsKey(obj);
}
public void clear() {
hashmap.clear();
}
public void add(Object obj) {
hashmap.put(obj, PRESENT);
}
}
package knowledgepoint;
import java.util.TreeSet;
//TreeSet注意:在添加数据时排序,数据更改不会影响原来的顺序,因此里面的数据可能有重复的。
//因此使用TreeSet时要保证数据不能修改(有必要时加final)
public class TreeSetDemol {
public static void main(String[] args) {
TreeSet<Worker> treeset = new TreeSet<>();
treeset.add(new Worker("工人", 10000));
Worker w = new Worker("教师",5000);
treeset.add(w);
treeset.add(new Worker("程序员", 20000));
treeset.add(new Worker("修理工", 8000));
System.out.println(treeset);
w.setType("修理工");
w.setSalary(8000);
System.out.println(treeset);//由此验证了可重复性,因此本例中最好将属性设为final
}
}
class Worker implements Comparable<Worker>{
private String type;
private double salary;
public Worker(String type,double salary) {
this.type = type;
this.salary = salary;
}
@Override
public int compareTo(Worker o) {
return this.type.compareTo(o.type);
}
@Override
public String toString() {
return "Worker [type=" + type + ", salary=" + salary + "]";
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
TreeMap要求键能够排序就行了 ,其余和TreeSet基本一致。