一、java集合框架体系图
Java 容器分为 Collection 和 Map 两大类,其下有很多子类如图:

二、Collection 和 Collections 有什么区别?
1. Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,实现该接口的类主要有List和Set。
2. Collections是一个集合框架的工具类,包含了很多静态方法,比如一些对集合的排序,搜索以及序列化等操作。(例:排序方法->Collections. sort(list))
三、HashMap和Hashtable有什么区别?
HashMap和Hashtable都是Java中用来实现映射关系的数据结构,它们之间的主要区别:
线程安全性:Hashtable是线程安全的,而HashMap是非线程安全的。
同步性: Hashtable是同步的,而HashMap是非同步的。这意味着在多线程环境下使用HashMap时要更加小心,因为它不能保证在并发环境下的安全性。
null值: Hashtable不允许键值或值为null,而HashMap允许一个null键和任意数量的null值
性能: 由于Hashtable的同步特性,在单线程环境下使用HashMap比使用Hashtable要快。
另外jdk1.8之后,HashMap和Hashtable在实现方式上也有了区别。
在使用上也有区别,比如在jdk1.4以前使用Hashtable,jdk1.4以后使用HashMap会更好。
总结来说,HashMap适合单线程环境使用,而Hashtable适合多线程环境使用。
四、List接口中ArrayList的底层实现
1. 首先 我们先点进去看一下ArrayList的底层代码,如图:

2. 那我们就使用Object[]类型的数组和size属性实现ArrayList的增删改查方法
package com.bdqn.MyList.MyArrayList;
public class MyArrayList {
private Object[] array; //获取当前数组的引用
private int size; //获取当前数组的长度
/*
新增指定元素
*/
public void add(Object ob){
if (array==null){
array = new Object[1];
array[0] = ob;
}else {
Object newarray[] = new Object[array.length+1];
//先循环复制以前的内容到新数组
for (int i = 0; i < array.length; i++) {
newarray[i] = array[i];
}
//再把新元素放到最后一个位置即可
newarray[array.length] = ob;
//替换全局变量引用 保证array指向最新的
array = newarray;
}
}
/*
根据下标删除指定元素
*/
public void del(int index){
if (index<0 || index>=array.length){
System.err.println("下标超出范围");
}else {
Object newarray[] = new Object[array.length-1];
for (int i = 0; i < array.length; i++) {
if (i<index){
newarray[i]=array[i];
}else if (i>index){
newarray[i-1]=array[i];
}
}
array = newarray;
}
}
/*
根据传入的下标跟元素 修改
*/
public void update(int index,Object ob){
if (index<0 || index>=array.length){
System.out.println("下标越界");
return;
}
array[index] = ob;
}
/*
历遍展示整个集合
*/
public void show(){
for (Object ob:array) {
System.out.println("["+ob+"]");
}
}
/*
size生成的get、set方法
*/
public int getSize() {
size = array.length;
return size;
}
public void setSize(int size) {
this.size = size;
}
}
package com.bdqn.MyList.test;
/**
* 测试类
*/
import com.bdqn.MyList.MyArrayList.MyArrayList;
public class Test {
public static void main(String[] args) {
MyArrayList list=new MyArrayList();
list.add(3); //添加
list.add(2);
list.add(1);
list.del(1); //删除
list.update(0,4); //修改
list.show(); //查看
}
}
//结果输出为 [4] 换行 [1]
五、List接口中LinkedList的底层实现
1. Node.java
package com.bdqn.MyList.MyLinkedList;
/**
* 节点类
*/
public class Node {
public Object element; //本节点自身的内容
public Node next; //保存下一个节点的引用地址
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
}
2. MyLinkedList.java
package com.bdqn.MyList.MyLinkedList;
/**
* 链表类
*/
public class MyLinkedList {
private Node root; //头节点 一定要有 不能丢
/*
新增
*/
public void add(Object ob){
Node node = new Node();
node.element = ob;
if (root==null){
root = node; //如果是第一次新增
}else {
//传统的for循环搞不定 while
Node temp = root;
while(temp.next!=null){
temp = temp.next;
} //循环结束以后 那么此时temp自然就定位到了最后一个节点
temp.next = node; //尾巴后面加入新节点
}
}
/*
获取链表的实时长度
*/
public int getLength(){
Node temp = root;
int sum = 1;
while (temp!=null){
temp = temp.next;
sum++;
}
return sum;
}
/*
链表删除
*/
public void delete(int index){
if (index<0 || index>getLength()){
System.out.println("下标越界");
}else {
//假设index=3 要找到2元素(上一个)
if (index==0){
root = root.next; //删头
}else {
Node temp = root;
int a = 0;
while (temp!=null){
//此时 并未完成被删除节点的清空操作
if (a==index-1){
temp.next = temp.next.next;
break;
}
temp = temp.next;
a++;
}
}
}
}
/*
修改
*/
public void update(int Index, Object obj) {
// 判断位置下标是否合法
System.out.println("下标->"+Index);
if (Index < 0 || Index > getLength()) {
System.out.println("下标越界");
} else {
Node temp=root;
System.out.println(temp.next.element);
for (int i = 0; i < Index; i++) {
temp=temp.next;
}
temp.setElement(obj);
}
}
/*
遍历整个链表
*/
public void show(){
Node temp = root;
while (temp!=null){
System.out.println("["+temp.element+"]");
temp = temp.next;
}
}
}
3. Test.java
package com.bdqn.MyList.test;
/**
* 测试类
*/
import com.bdqn.MyList.MyLinkedList.MyLinkedList;
public class Test {
public static void main(String[] args) {
MyLinkedList list=new MyLinkedList();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.delete(3);
list.update(1,5);
list.show();
}
}
//运行结果如图:
