当前位置: 首页 > news >正文

数据结构:链表进阶

在这里插入图片描述
在这里插入图片描述

链表进阶

    • 1. ArrayList的缺陷
    • 2. 链表
      • 2.1 链表的概念及结构
      • 2.2 链表的实现
    • 3.链表面试题
    • 4.LinkedList的使用
      • 5.1 什么是LinkedList
      • 4.2 LinkedList的使用
    • 5. ArrayList和LinkedList的区别

1. ArrayList的缺陷

通过源码知道,ArrayList底层使用数组来存储元素:

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
// ...
// 默认容量是10
private static final int DEFAULT_CAPACITY = 10;
//...
// 数组:用来存储元素
transient Object[] elementData; // non-private to simplify nested class access
// 有效元素个数
private int size;
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
}
// ...

由于其底层是一段连续空间,**当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),**效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。

2. 链表

2.1 链表的概念及结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。在这里插入图片描述
链表的结构就类似于火车
在这里插入图片描述
实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
1. 单向或者双向
在这里插入图片描述
2. 带头或者不带头
在这里插入图片描述
3. 循环或者非循环
在这里插入图片描述
虽然有这么多的链表的结构,但是我们重点掌握两种
无头单向非循环链表:结构简单,一般不会单独用来存数据。**实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。**另外这种结构在笔试面试中出现很多
在这里插入图片描述
无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

2.2 链表的实现

定义一个接口:

public interface IList {//头插法public void addFirst(int data);//尾插法public void addLast(int data);//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data);//查找是否包含关键字key是否在单链表当中public boolean contains(int key);//删除第一次出现关键字为key的节点public void remove(int key);//删除所有值为key的节点public void removeAllKey(int key);//得到单链表的长度public int size();//清空单链表public void clear();//遍历单链表public void display();//创建单链表public void  crate();
}

定义一个MySIngList类:
准备工作:MySingeList要继承IList接口的所有方法

public class MySingeList implements IList {
//定义单链表static class ListNode {public int val;public ListNode next;//next存的是下一个节点的地址,/*** 就相当于Person person=new person(),next是一个引用,* next存的是地址,next引用类型是ListNode类型的引用*/public ListNode(int val) {//实例化this.val = val;}}
//定义一个头结点public ListNode head;

创建一个单链表:

    @Overridepublic void crate() {ListNode listNode1 = new ListNode(11);//如何修改当前节点位置的next的值为指定节点位置ListNode listNode5 = new ListNode(22);ListNode listNode4 = new ListNode(33);ListNode listNode3 = new ListNode(44);ListNode listNode2 = new ListNode(55);listNode1.next = listNode2;listNode2.next = listNode3;listNode3.next = listNode4;listNode4.next = listNode5;this.head = listNode1;//将插入的第一个节点定义为头节点}

遍历这个单链表:

  @Overridepublic void display() {//定义一个cur,让cur去走,head不变,才能在遍历以后找到headListNode car = head.next;while (car != null) {//判断是否遍历完链表System.out.println(car.val + " ");car = car.next;//如何从当前位置走到下一个节点位置}}

头插法:

  //头插法;时间复杂度:O(1)@Overridepublic void addFirst(int data) {ListNode listNode = new ListNode(data);if (this.head == null) {this.head = listNode;} else {this.head = listNode.next;this.head = listNode;}}

不同位置添加的时间复杂度不同,常见的错误观点是认为所有添加操作都是O(1)。在尾部添加需要O(n),头部添加为O(1),在任意位置则平均为O(n)。了解这些有助于优化链表操作的效率。
尾插法:

 //尾插法时间复杂度:O(n)@Overridepublic void addLast(int data) {ListNode car = this.head;ListNode listNode = new ListNode(data);if (this.head == null) {this.head = listNode;} else {//找到最后一个节点while (car.next != null) {car = car.next;}//car现在指向最后一个节点/**如果想让car停在最后一个节点的位置 cur.next!=null* 如果想把整个;链表的每一个节点都遍历完,那么就是car!=null* */car.next = listNode;}}

在链表尾部添加(addLast())需要从头遍历,时间复杂度为O(n)

任意位置插入,第一个数据节点为0号下标:

//随便插入
private ListNode seach(int index) {ListNode car = this.head;int count = 0;while (count != index - 1) {car = car.next;count++;}return car;}@erridepublic void addIndex(int index, int data) {if (index < 0 || index > size()) {System.out.println("不合法");throw new Poslllgality("插入元素下标异常" + data);}if (index == 0) {addFirst(data);return;}if (index == size()) {addLast(data);return;}ListNode car = seach(index);ListNode node = new ListNode(data);node.next = car.next;car.next = node;}

当在任意位置插入的时候,要考虑的情况有很多:

  1. 当index < 0 || index > size()的时候,抛出一个异常
  2. 当index为0的时候,头插法
  3. 当index为size()的时候,尾插法
  4. 正常的插入法

查找是否包含关键字key是否在单链表当中:

 @Overridepublic boolean contains(int key) {ListNode car = this.head;while (car != null) {if (car.val == key) {return false;}car = car.next;}return false;}

删除第一次出现关键字为key的节点:

@Overridepublic void remove(int key) {if (this.head == null) {System.out.println("无法删除");}if (this.head.val == key) {this.head = null;//或者this.head==this.head.next}ListNode car = searchprev(key);if (car == null) {System.out.println("没有要删除的数字");return;} else {ListNode del = car.next;//通过car.next找到del的位置car.next = del.next;//然后就可以自己看懂}}//写一个方法,找到关键字看的前一个节点的地址private ListNode searchprev(int key) {ListNode car = this.head;while (car.next != null) {if (car.next.val == key) {return car;}car = car.next;}return null;}

删除所有值为key的节点:

 @Overridepublic void removeAllKey(int key) {if (this.head == null) {return;}ListNode prev = head;ListNode car = head.next;while (car != null) {if (car.val == key) {prev.next = car.next;car = car.next;} else {prev = car;car = car.next;}}if (head.val == key) {head = head.next;}}

得到单链表的长度:

 @Overridepublic int size() {ListNode car = head.next;int count = 0;while (car != null) {count++;car = car.next;}return count;}

清空链表:

 @Overridepublic void clear() {ListNode car = this.head;while (car != null) {ListNode carNext = car.next;//定义一个变量把car的next记录下/* car.val=null;如果是一个应用数据类型,那么才写这个,如果不是car.next=null就可以清除完毕*/car.next = null;car = carNext;}head = null;//上面的循环走完,但是head还没有置空,要手动把head置空}

3.链表面试题

  1. 删除链表中等于给定值 val 的所有节点。 力扣
  2. 反转一个单链表。 力扣
  3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。力扣
  4. 输入一个链表,输出该链表中倒数第k个结点。 牛客
  5. 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。力扣
  6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。力扣

4.LinkedList的使用

5.1 什么是LinkedList



LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节
点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。
在这里插入图片描述
在集合框架中,LinkedList也实现了List接口,具体如下:
在这里插入图片描述
【说明】

  1. LinkedList实现了List接口
  2. LinkedList的底层使用了双向链表
  3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
  4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
  5. LinkedList比较适合任意位置插入的场景

4.2 LinkedList的使用

  1. LinkedList的构造

在这里插入图片描述

public static void main(String[] args) {
// 构造一个空的LinkedList
List<Integer> list1 = new LinkedList<>();
List<String> list2 = new java.util.ArrayList<>();
list2.add("JavaSE");
list2.add("JavaWeb");
list2.add("JavaEE");
// 使用ArrayList构造LinkedList
List<String> list3 = new LinkedList<>(list2);
}
  1. LinkedList的其他常用方法介绍
    在这里插入图片描述
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1); // add(elem): 表示尾插
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
System.out.println(list.size());
System.out.println(list);
// 在起始位置插入0
list.add(0, 0); // add(index, elem): 在index位置插入元素elem
System.out.println(list);
list.remove(); // remove(): 删除第一个元素,内部调用的是removeFirst()
list.removeFirst(); // removeFirst(): 删除第一个元素
list.removeLast(); // removeLast(): 删除最后元素
list.remove(1); // remove(index): 删除index位置的元素
System.out.println(list);
// contains(elem): 检测elem元素是否存在,如果存在返回true,否则返回false
if(!list.contains(1)){
list.add(0, 1);
list.add(1);
System.out.println(list);
System.out.println(list.indexOf(1)); // indexOf(elem): 从前往后找到第一个elem的位置
System.out.println(list.lastIndexOf(1)); // lastIndexOf(elem): 从后往前找第一个1的位置
int elem = list.get(0); // get(index): 获取指定位置元素
list.set(0, 100); // set(index, elem): 将index位置的元素设置为elem
System.out.println(list);
// subList(from, to): 用list中[from, to)之间的元素构造一个新的LinkedList返回
List<Integer> copy = list.subList(0, 3);
System.out.println(list);
System.out.println(copy);
list.clear(); // 将list中元素清空
System.out.println(list.size());
}
}
  1. LinkedList的遍历
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1); // add(elem): 表示尾插
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
System.out.println(list.size());
// foreach遍历
for (int e:list) {
System.out.print(e + " ");
}
System.out.println();
// 使用迭代器遍历---正向遍历
ListIterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next()+ " ");
}
System.out.println();
// 使用反向迭代器---反向遍历
ListIterator<Integer> rit = list.listIterator(list.size());
while (rit.hasPrevious()){
System.out.print(rit.previous() +" ");
}
System.out.println();
}

5. ArrayList和LinkedList的区别

在这里插入图片描述

相关文章:

数据结构:链表进阶

链表进阶 1. ArrayList的缺陷2. 链表2.1 链表的概念及结构2.2 链表的实现 3.链表面试题4.LinkedList的使用5.1 什么是LinkedList4.2 LinkedList的使用 5. ArrayList和LinkedList的区别 1. ArrayList的缺陷 通过源码知道&#xff0c;ArrayList底层使用数组来存储元素&#xff1…...

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序&#xff0c;用于从网站抓取数据。Python 凭借其丰富的库和简单的语法&#xff0c;是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识&#xff0c;并实现一个简单的爬虫项目。 1. 什么是网络爬虫&#xff1f; 网络爬虫&#x…...

Java面试题、八股文——JVM篇最终篇

1.如何选择垃圾收集器&#xff1f; 选择合适的垃圾收集器&#xff08;Garbage Collector, GC&#xff09;对于优化Java应用程序的性能至关重要。不同的应用场景和系统需求可能需要不同类型的垃圾收集器来满足。以下是一些考虑因素以及常见的垃圾收集器选项&#xff0c;帮助您做…...

Spring Boot整合Redis Stack构建本地向量数据库相似性查询

Spring Boot整合Redis Stack构建本地向量数据库相似性查询 在微服务架构中&#xff0c;数据的高效存储与快速查询是至关重要的。Redis作为一个高性能的内存数据结构存储系统&#xff0c;不仅可以用作缓存、消息代理&#xff0c;还可以扩展为向量数据库&#xff0c;实现高效的相…...

shell脚本基础学习_总结篇(完结)

细致观看可以&#xff0c;访问shell脚本学习专栏&#xff0c;对应章节会有配图https://blog.csdn.net/2201_75446043/category_12833287.html?spm1001.2014.3001.5482 导语 一、shell脚本简介 1. 定义&#xff1a; 2. 主要特点&#xff1a; 3. shell脚本的基本结构 4. S…...

什么是 C++ 中的函数对象?它有什么特点?

在 C 中&#xff0c;函数对象&#xff08;Function Object&#xff09;是一种可调用对象&#xff0c;它允许像函数一样被调用&#xff0c;但实际上它可能并不是真正的函数。函数对象可以是以下几种类型之一&#xff1a; 普通函数&#xff1a; 一个普通的、定义在命名空间或类…...

css:项目

这是一个完整的网站制作的流程 美工会先制作一个原型图&#xff1a; 原型图写的不详细&#xff0c;就是体现一个网页大致的布局 然后美工再做一个psd样例图片 然后再交给程序员 项目 模块化开发&#xff1a;把代码的不同的样式封装起来&#xff0c;需要用到相同样式的标签就…...

macOS 开发环境配置与应用开发指南

macOS 开发环境配置与应用开发指南 macOS作为苹果公司推出的操作系统&#xff0c;因其稳定性、优雅的用户界面和强大的开发支持&#xff0c;已成为开发者和创意专业人士的首选平台之一。无论是开发iOS、macOS桌面应用&#xff0c;还是Web应用、跨平台程序&#xff0c;macOS都提…...

[A-19][V06]ARMv8/v9-内存虚拟化原理

ver0.2 [看前序文章有惊喜,关注W\X\G=Z+H=“浩瀚架构师”,可以解锁全部文章] 前言 前一篇文章,我们介绍了ARM内存的属性,算是一个小小的里程碑点,接下来我们会把注意力重新拉回虚拟化的赛道。我们从[V-05] 虚拟化基础-异常模型(Exception model)之后,花了很多笔墨介绍…...

registry 删除私有仓库镜像

原文链接&#xff1a;https://blog.csdn.net/yogima/article/details/122172744 如果需要彻底删除&#xff0c;只需进行register 磁盘删除镜像 彻底删除了&#xff0c;就可以到达彻底删除的目的。 如果只需要软删除&#xff0c;则只需进行通过API删除。 curl --header "Ac…...

UPLOAD LABS | UPLOAD LABS 靶场初识

关注这个靶场的其它相关笔记&#xff1a;UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;UPLOAD LABS 靶场简介 UPLOAD LABS 靶场是一个专门用于学习文件上传漏洞攻击和防御的靶场。它提供了一系列文件上传漏洞的实验环境&#xff0c;用于帮助用户了解文件上传漏洞的…...

Samba服务器常见问题处理

指定的网络文件夹目前是以其他用户名和密码进行映射的。要用其他用户名和密码进行连接&#xff0c;首先请断开所有现有的连接到网络共享的映射 解决方案 单击“开始”菜单&#xff0c;选择“运行…”。 在弹出的窗口中&#xff0c;输入cmd 进入命令行模式&#xff0c;并输入…...

Java基础 设计模式——针对实习面试

目录 Java基础 设计模式单例模式工厂模式观察者模式策略模式装饰器模式其他设计模式 Java基础 设计模式 单例模式 单例模式&#xff08;Singleton Pattern&#xff09; 定义&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问这个实例。适用场景&…...

最大公约数和最小公倍数-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目&#xff1a;输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数。 程序分析&#xff1a; 最小公倍数输入的两个数之积除于它们的最大公约数&#xff0c;关键是求出最大公约数&#xff1b; 求最大公约数用辗转…...

第三方数据库连接免费使用和安装

是强大的一体化数据库开发解决方案&#xff0c;可从单一应用程序无缝连接多个数据库&#xff0c;包括 MySQL、PostgreSQL、MongoDB、MariaDB、SQL Server、Oracle、SQLite 和 Redis。 下载&#xff1a;https://download.csdn.net/download/mo3408/90045937 升级特性 模型&…...

水库大坝安全监测之量水堰计应用

量水堰计是水库大坝安全监测系统中的一种关键设备&#xff0c;主要用于测量水库水位、流量等水力参数。以下是量水堰计在水库大坝安全监测中的应用及注意事项&#xff1a; 一、量水堰计的工作原理 量水堰计是一种专门用于测量水流流量的仪器&#xff0c;其工作原理主要基于水流…...

算法笔记:滑动窗口

前言 滑动窗口作为一个考点较高的算法&#xff0c;广泛应用于子串问题中&#xff0c;本文将进行详细讲解。 一、滑动窗口是什么 滑动窗口是双指针算法的一种&#xff0c;基本思路为维护一个窗口&#xff0c;然后从前往后遍历元素进行运算。 二、滑动窗口算法和其他双指针算…...

Ubuntu下的Graphviz的基础使用方法

一、Graphviz介绍 graphviz是贝尔实验室开发的一个开源的工具包&#xff0c;它使用一个特定的DSL(领域特定语言):dot作为脚本语言&#xff0c;然后使用布局引擎来解析此脚本&#xff0c;并完成自动布局 1、什么是Graphviz 官网地址&#xff0c;https://www.graphviz.org/ Gr…...

微积分复习笔记 Calculus Volume 1 - 6.8 Exponential Growth and Decay

6.8 Exponential Growth and Decay - Calculus Volume 1 | OpenStax...

React的ts文件中通过createElement拼接一段内容出来

比如接口返回一个值 const values [23.00, 40.00/kg];想做到如下效果&#xff0c; 如果单纯的用render渲染会很简单&#xff0c; 但是在ts文件中处理&#xff0c;所以采用了createElement拼接 代码如下&#xff1a; format: (values: string[]) > {if (!values || !val…...

Pinia之1:介绍Pinia、项目中引入Pinia

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

Python双向链表、循环链表、栈

一、双向链表 1.作用 双向链表也叫双面链表。 对于单向链表而言。只能通过头节点或者第一个节点出发&#xff0c;单向的访问后继节点&#xff0c;每个节点只能记录其后继节点的信息&#xff08;位置&#xff09;&#xff0c;不能向前遍历。 所以引入双向链表&#xff0c;双…...

5G基础学习笔记

功能软件化 刚性网络&#xff1a;固定连接、固定功能、固化信令交互 柔性网络&#xff1a;网元拆解成服务模块&#xff0c;基于API接口调用 服务化架构&#xff08;SBA&#xff09; Service based Architecture &#xff08;SBA&#xff09;: 借鉴了业界成熟的SOA、微服务架…...

Python plotly库介绍

一、引言 在数据可视化领域&#xff0c;Python提供了众多强大的库。其中&#xff0c;plotly是一个功能强大、交互式的可视化库&#xff0c;可以创建各种类型的图表&#xff0c;包括线图、散点图、柱状图、饼图、3D图表等。它不仅提供了美观的可视化效果&#xff0c;还支持交互式…...

go编程中yaml的inline应用

下列代码&#xff0c;设计 Config 和 MyConfig 是为可扩展 Config&#xff0c;同时 Config 作为公共部分可保持变化。采用了匿名的内嵌结构体&#xff0c;但又不希望 yaml 结果多出一层。如果 MyConfig 中的 Config 没有使用“yaml:",inline"”修饰&#xff0c;则读取…...

手机实时提取SIM卡打电话的信令声音-智能拨号器的双SIM卡切换方案

手机实时提取SIM卡打电话的信令声音 --智能拨号器app的双SIM卡切换方案 一、前言 在蓝牙电话的方案中&#xff0c;由于采用市场上的存量手机来做为通讯呼叫的载体&#xff0c;而现在市面上大部分的手机都是“双卡双待单通”手机&#xff0c;简称双卡双待手机。即在手机开机后…...

探索Python WebSocket新境界:picows库揭秘

文章目录 探索Python WebSocket新境界&#xff1a;picows库揭秘第一部分&#xff1a;背景介绍第二部分&#xff1a;picows库概述第三部分&#xff1a;安装picows库第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第六部分&#xff1a;常见Bug及解决方案第…...

2024年11月24日Github流行趋势

项目名称&#xff1a;FreeCAD 项目维护者&#xff1a;wwmayer, yorikvanhavre, berndhahnebach, chennes, WandererFan等项目介绍&#xff1a;FreeCAD是一个免费且开源的多平台3D参数化建模工具。项目star数&#xff1a;20,875项目fork数&#xff1a;4,117 项目名称&#xff1…...

NewStar CTF week5 Crypto wp

easy_ecc ecc的模板题&#xff0c;稍加推理就会发现c1mc2*k因此做一个减法就行&#xff0c;需要注意的点是c1,c2必须放到ecc里面过一道才能出正确结果 k 86388708736702446338970388622357740462258632504448854088010402300997950626097 p 644088904089909773124499208053…...

vue3+antd注册全局v-loading指令

文章目录 1. 创建指令文件2. 全局注册3. 使用 1. 创建指令文件 src/directives 在directives中创建如下文件 src│─directives│ index.ts└─loadingindex.tsindex.vuedirectives/ index.ts export * from ./loadingdirectives/loading/index.ts import { createApp } f…...

wordpress怎么安装上服务器/百度一下百度一下你知道

笔者使用代码及相关文件下载链接: 【源代码文件】pytorch-grad-cam源代码阅读和调试 源代码链接: jacobgil/pytorch-grad-cam pytorch-grad-cam源代码阅读和调试(上) pytorch-grad-cam源代码阅读和调试(中) pytorch-grad-cam源代码阅读和调试(下) 代码改进自定义一个类Guide…...

用什么做网站/陕西新站seo

MSQ是一种统计学方法&#xff0c;用于评估调查问卷的信度和效度。信度指的是调查问卷在不同时间或者不同环境下的一致性&#xff0c;效度指的是调查问卷对于衡量目标变量的准确性和有效性。 通常&#xff0c;在使用MSQ之前&#xff0c;需要设计问卷&#xff0c;并收集一定数量的…...

网络规划设计师历年真题百度网盘/北京网站优化外包

“世界不能没有开源”&#xff0c;“开源正在杀死软件开发”&#xff0c;“开源不过是一些理想主义者的美梦”&#xff0c;“你开源我赞美&#xff0c;要我开源我不干”。关于开源&#xff0c;我们能聊的太多。而“中国化”的开源&#xff0c;却总是受到不少的质疑与诋毁。但在…...

大连网站制作公司/网站页面优化包括

姆勒高管维尔弗里德波斯(Wilfried Porth)日前接受德国《汽车周刊》(Automobilwoche)采访时表示&#xff0c;戴姆勒计划到2016年每年削减1.5亿欧元(约合1.98亿美元)的IT服务开支。  与各个竞争对手相比&#xff0c;戴姆勒在小型车的销量及盈利效率方面已经难以齐头并进&#xf…...

wordpress添加flash游戏/经典软文案例200字

为什么80%的码农都做不了架构师&#xff1f;>>> Logback是由log4j创始人设计的又一个开源日志组件。 logback当前分成三个模块&#xff1a;logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改…...

天河网站建设报价/如何在百度搜索到自己的网站

目录 一、面向对象的初步认识 1.1什么是面向对象 1.2面向对象与面向过程 二、类的定义和使用...