一、Collection、List、Set、Map之间的关系图:
二、测试是List、Set、Map三大容器的基本特性
1、List的底层是数组;
2、Set的底层是链表;
3、Map的底层是Map的底层结构就是:数组+链表;
<1>、测试类代码:
<2>、测试List的基本特点的代码:
特点描述:List数组是有序、可重复的。
(1)、对ArrayList()的测试:
(2)、对LinkedList()的测试:
(3)、对Vertord()的测试:
<3>、测试Set的基本特点的代码:
特点描述:Set集合是无序、不可重复的。
(1)、对HashSet()的测试:
<4>、对Map的基本特点测试:
特点描述:Map映射中同时存放键和值,当键重复时值就会被覆盖。
(1)、对HashMap()的测试:
(2)、对HashTable()的测试:
三、自制的List、Set、Map的源代码
1、自制ArrayList()源代码:
public class SxtArrayList {
public Object[] elementData;
public int size;
// 得到当前容器的中所装的元素的个数
public int size() {
return size;
}
// 判断容器是否为空
public boolean isEmpty() {
return size == 0;
}
// 得到指定位置的元素
public Object get(int index) {
rangeCheck(index);
return elementData[index];
}
// 初始化容器的容量
public SxtArrayList(int initialCapacity) {
super();
if (initialCapacity < 0) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
this.elementData = new Object[initialCapacity];
}
// 初始化容器的容量
public SxtArrayList() {
this(10);
}
// 数组扩容和数据的拷贝
public void add(Object obj) {
if (size == elementData.length) {
Object[] newArray = new Object[size * 2 + 1];
System.arraycopy(elementData, 0, newArray, 0, elementData.length);
elementData = newArray;
}
elementData[size++] = obj;
}
//用于移除指定位置的元素
public Object remove(int index){
rangeCheck(index);
Object oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
return oldValue;
}
//创建一个私有的判断方法,
private void rangeCheck(int index){
if (index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
SxtArrayList list = new SxtArrayList(3);
list.add("111");
list.add("222");
list.add("333");
list.add("444");
list.add("555");
list.add("666");
System.out.println(list.get(5));
System.out.println(list.remove(2));
System.out.println(list.size());
}
}
2、自制LinkedList()代码:
public class SxtLinkedList {
public Note first;
public Note last;
public int size;
//删除指定位置的结点
public void remove(int index) {
Note temp = Note(index);
if (temp != null) {
Note up = temp.previous;
Note down = temp.next;
up.next = down;
down.previous = up;
size--;
}
}
//得到一个结点
private Note Note(int index) {
Note temp = null;
if (first != null) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
return temp;
}
//增加元素
public void add(Object obj) {
Note n = new Note();
if (first == null) {
n.setPrevious(null);
n.setObj(obj);
n.setNext(null);
first = n;
last = n;
} else {
n.setPrevious(last);
n.setObj(obj);
n.setNext(null);
last.setNext(n);
last = n;
}
size++;
}
public int size() {
return size;
}
public static void main(String[] args) {
SxtLinkedList list = new SxtLinkedList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list.size());
list.remove(1);
System.out.println(list.size());
}
}
3、自制MashSet()代码:
public class SxtLinkedList {
public Note first;
public Note last;
public int size;
//删除指定位置的结点
public void remove(int index) {
Note temp = Note(index);
if (temp != null) {
Note up = temp.previous;
Note down = temp.next;
up.next = down;
down.previous = up;
size--;
}
}
//得到一个结点
private Note Note(int index) {
Note temp = null;
if (first != null) {
temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
}
return temp;
}
//增加元素
public void add(Object obj) {
Note n = new Note();
if (first == null) {
n.setPrevious(null);
n.setObj(obj);
n.setNext(null);
first = n;
last = n;
} else {
n.setPrevious(last);
n.setObj(obj);
n.setNext(null);
last.setNext(n);
last = n;
}
size++;
}
public int size() {
return size;
}
public static void main(String[] args) {
SxtLinkedList list = new SxtLinkedList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list.size());
list.remove(1);
System.out.println(list.size());
}
}
4、自制的HashMap()代码:
public class SxtMap01 {
SxtEntry[] arr = new SxtEntry[990];
int size;
public void put(Object key, Object value) {
SxtEntry e = new SxtEntry(key, value);
for (int i = 0; i < size; i++) {
if (arr[i].key.equals(key)) {
arr[i].value = value; //键值重复的处理
}
}
arr[size++] = e;
}
public Object get(Object key) {
for (int i = 0; i < size; i++) {
if (arr[i].key.equals(key)) {
return arr[i].value;
}
}
return null;
}
public boolean containsKey(Object key) {
for (int i = 0; i < size; i++) {
if (arr[i].key.equals(key)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
SxtMap01 map = new SxtMap01();
map.put("小黄", "dog");
map.put("大黄", "cat");
map.put("小黄", "pig");
String str = (String) map.get("小黄");
System.out.println(str);
boolean b = map.containsKey("小黄");
System.out.println(b);
}
}
class SxtEntry {
Object key;
Object value;
public SxtEntry(Object key, Object value) {
super();
this.key = key;
this.value = value;
}
public SxtEntry() {
}
}