什么是链表:
内存地址不连续,基本单元是节点对象Node,单链表尾结点默认是null
什么是链表中的节点:
节点是单链表中的基本单元,每一个节点都有两个属性
属性一:存储的数据
属性二:下一个节点的内存地址
什么是指针:
一个内存地址就是一个指针,当一个对象没有被指针指向的时候,对象会被垃圾回收机制回收
链表的优缺点有哪些:
优点:随机增删元素效率高(因为存储上内存地址不连续,增删元素不涉及到大量元素位移)
缺点:查询效率低(不能通过数学表达式计算被查找元素的内存地址,每一次查找每个元素的时候都需要从头结点开始往下遍历)
JVM示意图:
代码演示(Link的底层用代码进行演示):并不全面,只是了解即可
第一步:创建一个Node节点类
package com.lbj.javase.link;
/**
* 节点
*/
public class Node {
Object data;
Node next;
public Node() {
}
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
第二步:创建一个Link链表类,类中提供调用方法
package com.lbj.javase.link;
/**
* @author LBJ
* @version V1.0
* @Package com.lbj.javase.link
* @date 2021/4/3 17:45
* @Copyright 公司
*/
public class Link {
//链表的头结点,默认值就是null
Node next;
//这段用来统计Link内元素的长度
int size=0;
public int size(){
return size;
}
//向链表中添加元素的方法
public void add(Object o){
//创建一个节点对象
//让之前单链表的末尾节点next指向新节点对象
//有可能这个元素是第一个,也可能是第二个,第三个
if(next==null){
//说明还没有节点
//new一个新的节点对象,作为头结点
//这个时候的节点,既是一个头结点,又是一个末尾节点
next=new Node(o,null);
}else {
//说明头结点已经存在了
//找到当前末尾节点,让当前末尾节点的next是新节点
Node currentLastNode=findLast(next);
currentLastNode.next=new Node(o,null);
}
size++;
}
private Node findLast(Node node) {
if(node.next==null){
return node;
}
return findLast(node.next);//递归算法
}
//向链表中删除元素的方法
public void remove(Object o){
}
//向链表中修改元素的方法
public void modify(Object newObj){
}
//向链表中...
}
第三步:测试调用链表的方法进行链表元素添加
package com.lbj.javase.link;
public class Test {
public static void main(String[] args) {
//创建一个新的链表
Link link=new Link();
//往链表内添加元素
link.add(100);
link.add(200);
link.add(300);
System.out.println(link.size());
}
}
//3