arraylist
main方法(){
MyNode 第一个节点 //linkedlist 的保存数据
MyNode 最后一个节点 //linkedlist 的保存数据
int size;
//模拟linkedlist运行
MyNode m=new MyNode();
MyNode m1=new MyNode();
第一个节点=
}
class Mynode{
Object o;//储存数据
MyNode 上节点 //因为是引用数据类型,所以上节点 属性中保存的是一个MyNode对象的堆内存的地址
MyNode 下节点
}
arraylist 和linklist的区别
import java.util.ArrayList;
import java.util.LinkedList;
public class Lists {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<String> list1=new LinkedList<String>();
// arraylist linklist 链表中多了 最首尾节点的操作 增删查 分为两种,对空集合报错的,和对空机和处理返回null。
// 其余和array list 的语法是一样的。
// 但是!!!!!!!! 同名方法执行的方式,即底层原理是完全不同的,效率可能是截然相反的,
ArrayList<String> list2=new ArrayList<String>();
// list1.add(e)
// list1.add(e);
// 在数组没有扩容的情况下,数组添加尾数据是在游标处直接填写。链表是创建新节点,修改上节点信息,和尾节点信息
// list1.add(index,element);
// list1.add(index,element);
// 输入数据有个隐藏前提,寻址
// 数组寻址 有地址+下标*间隔
// 链表寻址 用首节点.下一个节点.下一个节点.下一个节点.下一个节点.......直到找到想要的位置。
// (比如第10个节点,就是找9次下节点)
// 链表寻址就是在遍历,代价高
// 输入操作
// 数组插入 遍历最后一个元素位置到插入点的数据,逐个后移,把要插入的数据放到插入点
// 链表插入 将插入点的两个节点互相解开,与新节点链接。
// 三个位置论证插入操作 数组和链表
// 数组的前端 数组的寻址代价在任何位置一样 数组插入代价高,全部移动 链表首位寻址代价低 插入代价低(首尾更低)
// 数组的中端 数组的寻址代价在任何位置一样 数组插入代价中,移动一半 链表中间寻址代价中(最高) 插入代价低
// 数组的后端 数组的寻址代价在任何位置一样 数组插入代价极底或极高,全部移动或不移动 链表首尾寻址代价低 插入代价低(首尾更低)
// 总结
// 数组的前端 链表速度快,数组极慢
// 数组的中端 链表略低,数组略高
// 数组的末端 数组略快,链表略慢,数组扩容时更慢
// 删改查
list1.remove(); //修改第二个的上节点为null 让linked list的first标记为第二个节点
list2.remove(0); //数组从第二个位置到最后一个元素位置 ,逐个前移
list1.remove(10); //隐藏操作 寻址 链表型要next10次找到第十一个然后将目标的前后相连
list2.remove(10);//数组寻址代价低,计算获得,删除数据时从目标的后到最后 一个元素遍历,逐个前移
// 总结
// 前 链表优势,明显
// 中 基本相同
// 后 链表优势,不明显 最后一个节点数组优势
list1.remove("we"); //隐藏操作 寻找数据 链表从前向后遍历 next 直到找到想要的object,然后对目标点移除操作
list2.remove("we"); //隐藏操作 寻找数据 数组从前向后遍历 直到找到想要的object,然后对目标点移除操作
// 总结
// 前 链表优势, 明显
// 中 链表优势, 比较明显
// 后 链表优势, 不明显 最后一个节点数组优势
list1.clear(); //从前向后遍历,逐个节点清空,数据,上节点,下节点,最后size归零
list2.clear(); //从前向后遍历, 把每个下标设null 最后size归零
}
}