List——顺序表与链表(二)
文章目录
- 前言
- 一、链表概念及结构
- 二、LinkedList与链表
- 1.什么是LinkedList
- 2.LinkedList的常用方法
- 3.链表的遍历
- 三.实现自己的LinkedList
- 四.ArrayList和LinkedList的区别与==优缺点==
- 总结
前言
上一篇文章中,介绍了List接口以及ArrayList的使用,并且进行了简单的模拟实现,通过源码知道,ArrayList底层使用数组元素来存储元素。但是由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,且频繁的扩容会导致不必要的内存空间浪费,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。
一、链表概念及结构
链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。
链表的结构非常多样,单向双向、带头或不带头、循环或非循环。这几种情况组合起来就有八种链表结构:
1.单向或者双向
2.带头或不带头
3.循环或非循环
无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多
无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。
二、LinkedList与链表
1.什么是LinkedList
LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。但是当需要查询时,就需要按图索骥按部就班的一个一个查,查询效率不高,这个后面总结对比时再详细说明。
说明:
- LinkedList实现了List接口
- LinkedList的底层使用了双向链表
- LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
- LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
- LinkedList比较适合任意位置插入的场景
2.LinkedList的常用方法
方法 | 解释 |
---|---|
boolean add(E e | 尾插 e |
void add(int index, E element | 将e插入到index位置 |
boolean addAll(Collection<? extends E> c) | 尾插c中的元素 |
E remove(int index) | 删除index位置的元素 |
boolean remove(Object o) | 删除遇到的第一个o |
E get(int index) | 获取下标index位置的元素 |
E set(int index, E element) | 将下标index位置的元素修改为element并返回修改之前的元素 |
void clear() | 清空 |
boolean contains(Object o) | 判断o是否在链表中 |
int indexOf(Object o) | 返回第一个遇到的o的下标 |
int lastIndexOf(Object o) | 返回最后一个o的下标 |
List subList(int fromIndex, int toIndex) | 截取部分list |
void display() | 打印链表 |
3.链表的遍历
遍历链表的几种方式:
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();
}
三.实现自己的LinkedList
首先需要定义自己的MyList接口,接口中声明一系列方法后在MyLinkedList中实现,我们还需要定义一个结点类,这里我们实现的是带有前驱和后继的双向结点,以实现双向链表。具体实现如下:
MyList接口:
public interface MyList {/*** 返回链表中元素个数* @return*/int size();/*** 尾插* @param e 将元素e尾插到线性表* @return 返回true*/boolean add(Long e);/*** 将元素e插入到指定节点处* @param index* @param e*/void add (int index,Long e);Long remove(int index);/*** 删除值为e的元素* @param e 需要删除的元素* @return 成功返回true 失败返回false*/boolean remove(Long e);/*** 获取index处元素的值* @param index 数组下标* @return 该下标处的元素值*/Long get(int index);/*** 修改元素* @param index [0,size)* @param e 修改后的元素* @return 原来index处的元素*/Long set(int index,Long e);/*** 从前往后,返回第一次遇到e的下标* @param e 目标元素* @return 返回在第几个*/int indexOf(Long e);/*** 从后向前* @param e* @return*/int lastIndexOf(Long e);/*** 线性表中是否包含e* @param e* @return*/boolean contains(Long e);/*** 打印顺序表*/void display();/*** 判空* @return*/boolean isEmpty();/*** 清空*/void clear();}
定义结点类
public class MyNode {Long val;MyNode next; //指向后继节点,尾节点的后继是nullMyNode prev; //指向前驱节点,头节点的前驱是nullpublic MyNode() {//无参构造方法}public MyNode(Long val) {//需传入值的有参构造this.val = val;this.next = null;this.prev = null;}
}
MyLinkedList实现类:
public class MyLinkedList implements MyList {//需要维护三个属性:链表的头节点、链表的尾节点、链表中元素个数private MyNode head;private MyNode last;private int size;//构造方法,构造一个空的链表public MyLinkedList() {this.head = this.last = null;this.size = 0;}@Overridepublic int size() {return size;}@Override//链表的尾插public boolean add(Long e) {MyNode node = new MyNode(e); //将元素e放入节点中node.next = null;//分情况讨论if (size > 0) {this.last.next = node; //这一步将尾节点的后继指向新节点 (链接)node.prev = this.last; //这一步让新节点的前驱指向之前的尾节点尾 (链接完成)this.last = node; //这一步让新节点成为新的尾节点 (善后)} else {node.prev = null;this.last = this.head = node;}this.size++; //涉及的增删的操作必须修改size!return true;}//链表的头插private boolean addFirst(Long e) {MyNode node = new MyNode(e); //将元素e放入节点中node.next = null;if (size > 0) {this.head.prev = node;node.next = this.head;this.head = node;} else {this.head = this.last = node;}return true;}@Overridepublic void add(int index, Long e) {if (index < 0 || index > size) {throw new ArrayIndexOutOfBoundsException("下标越界");}if (size == 0) {add(e);return;}if (size == 1) {if (index == 0) {addFirst(e);} else {add(e);}return;}if (index == 0) {addFirst(e);return;} else if (index == size) {add(e);return;}MyNode prevNode = this.head;for (int i = 0; i < index - 1; i++) {prevNode = prevNode.next;}MyNode curnode = prevNode.next;MyNode node = new MyNode(e);prevNode.next = node;curnode.prev = node;node.prev = prevNode;node.next = curnode;size++;}@Overridepublic Long remove(int index) {if (index < 0 || index >= size) {throw new ArrayIndexOutOfBoundsException("下标异常");}if (size == 1) {Long e = this.head.val;this.head = this.last = null;this.size = 0;return e;}if (index == 0) {Long e = this.head.val;this.head = this.head.next;this.head.prev = null;size--;return e;}if (index == size - 1) {Long e = this.head.val;this.last = this.last.prev;this.last.next = null;size--;return e;}//走到这儿 说明链表中至少有两个元素MyNode curNode = this.head;for (int i = 0; i < index; i++) {curNode = curNode.next;}Long e = curNode.val;
// MyNode prevNode = curNode.prev;
// MyNode nextNode = curNode.next;
//
// // 修改引用关系,删除 curNode
// prevNode.next = nextNode;
// nextNode.prev = prevNode;curNode.prev.next = curNode.next;curNode.next.prev = curNode.prev;size--;return e;}@Overridepublic boolean remove(Long e) {MyNode curNode = this.head;for (int i = 0; i < size; i++) {if (curNode.val.equals(e)) {//找到元素e后判断其所在位置if (i == 0) {this.head = this.head.next;if (this.head != null) {this.head.prev = null;} else {this.last = null;}size--;return true;}if (i == size - 1) {this.last = this.last.prev;this.last.next = null;size--;return true;}//走到这儿说明在中间位置,既不是头删,也不是尾删MyNode prevNode = curNode.prev;MyNode nextNode = curNode.next;prevNode.next = nextNode;nextNode.prev = prevNode;size--;return true;}curNode = curNode.next;}return false;}@Overridepublic Long get(int index) {if(index<0||index>size-1){throw new ArrayIndexOutOfBoundsException("下标有误");}MyNode cur=this.head;for (int i = 0; i <index ; i++) {cur=cur.next;}return cur.val;}@Overridepublic Long set(int index, Long e) {if(index<0||index>size-1){throw new ArrayIndexOutOfBoundsException("下标有误");}MyNode cur=this.head;for (int i = 0; i <index ; i++) {cur=cur.next;}Long olde=cur.val;cur.val=e;return olde;}@Overridepublic int indexOf(Long e) {int i = 0;MyNode cur = this.head;while (cur != null) {if (cur.val.equals(e)) {return i;}i++;cur = cur.next;}return -1;}@Overridepublic int lastIndexOf(Long e) {int i = size-1;MyNode cur = this.last;while (cur != null) {if (cur.val.equals(e)) {return i;}i--;cur = cur.prev;}return -1;}@Overridepublic boolean contains(Long e) {
// MyNode cur=this.head;
// for (int i = 0; i < size; i++) {
// if(cur.val.equals(e)){
// return true;
// }
// cur=cur.next;
// }
// return false;return indexOf(e)!=-1;}@Override//打印链表public void display() {MyNode cur=this.head;while (cur!=null){System.out.print(cur.val+" ");cur=cur.next;}}@Overridepublic boolean isEmpty() {return size==0;}@Overridepublic void clear() {this.head=this.last=null;this.size=0;}
四.ArrayList和LinkedList的区别与优缺点
不同点 | ArrayList | LinkedList |
---|---|---|
存储空间上 | 物理上一定连续 | 逻辑上连续,物理上不一定连续 |
随机访问(查询) | 支持O(1) | 不支持O(N) |
插入 | 需要搬移元素,效率低O(N) | 只需要修改引用指向的方向,时间复杂度O(1) |
多次插入 | 空间不够时需要扩容 | 没有容量的概念 |
应用场景 | 元素高效存储+频繁访问(改查) | 任意位置的频繁插入删除(增删) |
总结
以上两篇内容将ArrayList以及LinkedList通过自己的代码实现了简单的实现,也将其中常用的方法进行了罗列以及讲解,并对两者进行了归纳总结,总的来说就是增删频繁用链表,改查频繁用顺序表两者各有优缺点。后续将会更新与其相关的力扣题。
相关文章:
【数据结构】串(String)
文章目录 基本概念顺序存储结构比较当前串与串s的大小取子串插入删除其他构造函数拷贝构造函数扩大数组空间。重载重载重载重载[]重载>>重载<< 链式存储结构链式存储结构链块存储结构 模式匹配朴素的模式匹配算法(BF算法)KMP算法字符串的前缀、后缀和部分匹配值nex…...
WPF 已知问题 开启 IsManipulationEnabled 之后触摸长按 RepeatButton 不会触发连续的 Click 事件
本文记录 WPF 的一个已知问题,在 RepeatButton 上开启 IsManipulationEnabled 漫游支持之后,将会导致触摸长按到 RepeatButton 之上时,不会收到源源不断的 Click 事件这是有个伙伴在 WPF 官方仓库报告的问题,详细请看 https://github.com/dotnet/wpf/issues/8223 原始的问题…...
L2-052 吉利矩阵
所有元素为非负整数,且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”,因为这样的矩阵一共有 666 种。 本题就请你统计一下,把 7 换成任何一个 [2,9] 区间内的正整数 L,把矩阵阶数换成任何一个 [2,4] 区间内的正整数 N&…...
2024年GPLT团体程序设计天梯赛(个人感受 + 题解)
前言 去年第一次参加天梯赛,拿了 \(158\) 分,没有个人奖,团队也差点打铁(最后应该是递补省三)。 今年天梯赛拿了 \(224\) 分,幸运地拿了个人国二。这次担任的队长,团队也拿到了国二,感谢队友们的努力付出。 今年好像很多人断网,不过没有发生在我身上哈哈哈(也许是因为…...
职业规划PPT模板
资源下载:https://pan.quark.cn/s/89db63a7b801#/list/share职业规划-07.PPT职业规划-08.pptx职业规划-09.pptx职业规划-10.pptx职业规划-11.pptx职业规划-12.pptx职业规划-13.pptx职业规划-14.pptx职业规划-15.pptx职业规划-16.pptx职业规划-17.pptx职业规划-18.pptx职业规划…...
检索增强生成(RAG)技术
随着大语言模型(LLMs)在自然语言处理(NLP)领域的显著进步,它们在多个评估基准测试中显示出超越人类水平的语言和知识掌握能力。然而,这些模型在实际应用中也面临着一系列挑战,如制造事实、知识更…...
List——顺序表与链表(二)
文章目录前言一、链表概念及结构二、LinkedList与链表1.什么是LinkedList2.LinkedList的常用方法3.链表的遍历三.实现自己的LinkedList四.ArrayList和LinkedList的区别与优缺点总结前言 上一篇文章中,介绍了List接口以及ArrayList的使用,并且进行了简单…...
PCB入门介绍与电阻电容电感类元件的创建
摘自凡亿教育 目录 一、PCB入门介绍 二、电阻电容电感类元件的创建 1.绘制电阻的原理图库 2.绘制电容的原理图库 3.绘制电感的原理图 一、PCB入门介绍 1.EDA工具 Cadence Allegro :IC-芯片设计 Mentor PADS:做消费类电子产品、手机、机顶盒、平板电脑 Altium Designer…...
MongoDB入门与实战-第五章-MongoDB副本集
目录参考一、副本集概念1、**主要功能**2、主从复制和副本集区别3、复制结构图二、副本集成员角色1.主节点2.副本节点3.仲裁节点三、副本集架构(一主一副本一仲裁)1、**设置读操作权限:**2、取消作为奴隶节点的读权限四、选举原则1、触发条件…...
[YOLOv7/YOLOv5系列改进NO.40]融入适配GPU的轻量级 G-GhostNet
文章目录前言一、解决问题二、基本原理三、添加方法四、总结前言 作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列…...
Windows x64隐藏可执行内存
文章目录实现效果实现原理VAD内存什么是VAD内存查看VAD内存VAD属性VAD内存可利用的点x64分页机制W7 x64下任意地址PDT PTE算法W10 x64定位随机化页表基址实现隐藏可执行内存隐藏内存对抗实现效果 驱动程序在Test进程中申请一块内存地址并打印,然后控制台程序在接收到…...
map容器/multimap容器
目录 1.map基本概念 简介 本质 优点 map和multimap区别 2.map构造和赋值 功能描述: 函数原型 3.map大小和交换 功能描述 函数原型 4 map插入和删除 功能描述 函数原型 5. map查找和统计 功能描述 函数原型 6 map容器排序 学习目标 主要技术点 1.map基本概念…...
SpringBoot+Vue项目便捷洗衣服务平台
文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue.js 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JD…...
[激光原理与应用-36]:《光电检测技术-3》- 光学测量基础 - 光电效应与光电探测器的基本原理
目录 一、概述 二、光电检测的理论基础:光电效应 三、分类 3.1 光子效应 3.2 热效应 四、光电检测器的参数 五、常见的光电探测器 5.1 光电倍增管:微弱光信号转换成电信号 5.2 光电导器件:电阻或电流随着光强的变化而变化 5.3 光伏…...
给定一个字符串str,求最长回文子序列长度。
问题描述: 给定一个字符串str,求最长回文子序列长度。 思想: 思想一: 根据回文串的性质,我们可以生成一个新的字符串,新字符串的顺序是原来字符串的倒序。本题可以转化为两个字符串求最长的公共子序列。 …...
40 个机器学习面试问题(文末福利送书)
原创 文章目录初学者问题 (10)1. 偏差和方差之间的权衡是什么?2.解释有监督和无监督机器学习的区别3. 监督学习和无监督学习最常用的算法是什么?4.解释KNN和k-means聚类的区别5. 什么是贝叶斯定理?我们为什么用它?6. 什么是朴素贝…...
Springboot流浪动物管理系统p2326计算机毕业设计-课程设计-期末作业-毕设程序代做
Springboot流浪动物管理系统p2326计算机毕业设计-课程设计-期末作业-毕设程序代做 【免费赠送源码】Springboot流浪动物管理系统p2326计算机毕业设计-课程设计-期末作业-毕设程序代做本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开…...
Request和Response基础知识入门
文章目录1,Request和Response的概述2,Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式2.3 IDEA快速创建Servlet2.4 请求参数中文乱码问题2.4.1 POST请…...
实战Docker未授权访问提权
1、fofa关键字 port“2375” && body“page not found” 2、docker -H tcp://ip:port 可查看到当前所有的实例 3、docker -H tcp://ip:port pull alpine 4、docker -H tcp://ip:port run -it --privileged alpine bin/sh 5、fdisk -l 查看其分区结构 6、创建一个…...
【微信小程序】页面跳转、组件自定义、获取页面参数值
🏆今日学习目标:第十七期——页面跳转、组件自定义、获取页面参数值 😃创作者:颜颜yan_ ✨个人主页:颜颜yan_的个人主页 ⏰预计时间:25分钟 🎉专栏系列:我的第一个微信小程序 文章目…...
数据结构:二叉树的链式结构
文章目录一.前言二.二叉树遍历2.1前序遍历/先根遍历2.2中序遍历/中根遍历2.3后序遍历/后根遍历2.4层序遍历2.5二叉树的销毁三.二叉树节点个数四.二叉树叶子节点的个数五.二叉树的高度六.二叉树第K层的节点个数七.找二叉树的节点八.题目8.1判断单值二叉树8.2相同的树8.3另一棵子…...
[附源码]计算机毕业设计小区疫情事件处理系统Springboot程序
项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…...
03、自定义镜像上传阿里云
目录 1、alpine Linux简介 2、基于alpine制作JDK8镜像 1.1 下载镜像 1.2 创建并编辑dockerfile 1.3 执行dockerfile创建镜像 1.4 创建并启动容器 1.5 进入容器 1.6 测试jdk 3、Docker容器之最小JRE基础镜像 4、将Docker镜像上传至阿里云(或从阿云下载镜像) 5、Docke…...
机器学习之过拟合和欠拟合
文章目录前言什麽是过拟合和欠拟合?过拟合和欠拟合产生的原因:欠拟合(underfitting):过拟合(overfitting):解决欠拟合(高偏差)的方法1、模型复杂化2、增加更多的特征,使输入数据具有更强的表达能力3、调整参数和超参数4、增加训练…...
【Linux网络编程】服务端编程初体验
文章目录前言服务端是啥、有什么特点核心函数socket的简介服务器编程客户端代码The End前言 在上节课(Linux网络编程初体验)中我们实现了连接bilibili的功能,并获取其html源码 如图所示. 今天我们要自己编写个服务端来服务我们的客户端 提示:以下是本篇…...
《人类简史》笔记四—— 想象构建的秩序
目录 一、盖起金字塔 1、未来的来临 2、 由想象构建的秩序 3、如何维持构建的秩序 二、 记忆过载 三、亚当和夏娃的一天 一、盖起金字塔 1、未来的来临 原始社会: 人口少; 狩猎和采集; 整体活动范围大(有几十甚至上百平方…...
TIDB在centos7.9上通过docker-compose进行安装、备份
1.环境介绍: 在centos7.9上安装tidb docker-compose版本 虚拟机配置2C/8G/40G 最小化安装 2.安装步骤 2.1 安装centos7.9 略 2.2 安装docker (1)安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2(2…...
Spring中Bean的生命周期
先直接说出过程,再来演示具体的操作 过程 简化来说就是 1、首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化…...
ACM第三周---周训---题目合集.
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:ACM周训练题目合集.CSDN 💬总结:…...
VUE+Spring Boot前后端分离开发实战(六):基于RABC权限通用后台管理系统-给角色动态分配权限和用户
文章目录 前言功能设计后端实现前端实现写在后面前言 本文记录了通用后台管理系统中RABC权限中两个功能:给角色分配权限、给角色设置用户。 给角色分配用户:前端使用到了elementUI中的tree,包括加载树以及给已选配权限给默认值等。给角色设置用户:前端用到了elementUI中的…...
Dockerfile自定义镜像实操【镜像结构、Dockerfile语法、构建Java项目】
要自定义镜像,就必须先了解镜像的结构才行。 1 镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 以MySQL为例,镜像的组成结构: 简单讲,镜像就是在系统函数库、运行环境基础上,添加应用…...
javaScript 进阶之路 --- 《加深理解回调函数》
前言: 回想当初第一次看到“回调函数”这个名词的时候,真的快把我难哭了。所有视频教程在讲到某个知识点的时候,大概都会说一句:“啊,这里怎么办呢?这里我们就需要用到一个回调函数...”。 等等࿰…...
Linux开发常用ps命令选项详解
【摘要】本文介绍了在Linux应用/内核开发调试中,经常需要用到的两个选项组合,当然,如果你需要查看更多更详尽的选项说明,可以参考man说明文档,即命令行下输入man ps进行查看。 aux选项组合 使用场景:更多…...
【ceph】分布式存储ceph
1 块存储,文件存储,对象存储 1.1 简介 文件存储:分层次存储,文件存储在文件夹中;访问文件时系统需要知道文件所在的路径。 举例:企业部门之间运用网络存储器(NAS)进行文件共享。 …...
Spring框架(九):Spring注解开发Annotation
Spring注解开发引子如何用注解替代xml基础配置Bean可以加一些注解来实现原有的xml文件的功能Component注解及其衍生注解依赖注入AutowireSpring非自定义的注解开发Spring其他注解注解的原理解析-xml方式注解的原理解析-注解方式引子 痛定思痛,主要问题出现在自己雀…...
python隶属关系图模型:基于模型的网络中密集重叠社区检测方法
隶属关系图模型 是一种生成模型,可通过社区联系产生网络。下图描述了一个社区隶属关系图和网络的示例(图1)。最近我们被客户要求撰写关于社区检测的研究报告,包括一些图形和统计输出。 图1.左:社区关系图(圆…...
Java实现猜数游戏
1 问题 编写一个Java程序,实现以下功能: 2 方法 首先导入java.util包下的Random,让程序随便分配给用户一个数。 再导入java.util包下的Scanner类,构建Scanner对象,以便输入。 利用Random().nextInt()生成一个随机的i…...
阿里云安装mysql、nginx、redis
目录 安装mysql 安装nginx 编辑安装redis 先看一下系统基本信息 安装mysql rpm -qa | grep mariadb 卸载mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64 下载mysql源 wget -i http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm yum…...
毕业设计-基于机器视觉的行人车辆跟踪出入双向检测计数
目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…...
linux 安装nginx
1.安装依赖包 //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.下载并解压安装包 /或上传解压包 //创建一个文件夹 cd /usr/local mkdir nginx cd nginx //下载tar包 wget http://nginx.org/download/nginx-1.13.7.tar.gz t…...
javaee之黑马旅游网1
这是一个用来锻炼javaweb基础知识的项目,先来导入一些我们准备好的文件 下面这些东西是我们项目必备的,我们提前准备好了 ,这个我会上传到我的资源,你们可以自己去下载 利用maven来创建一个项目 选择无骨架创建项目,域…...
【高并发基础】理解 MVCC 及提炼实现思想
文章目录1. 前言2. MVCC 概念2.1 MVCC 版本链2.2 MVCC trx_id2.3 MVCC Read View3. 提出问题4. 解决问题4.1 不读未提交的数据4.1.1 一般的并发情况4.1.2 特殊的并发情况4.1.3 剩下的并发情况4.2 如果自己修改了数据,要第一时间读到5. MySQL RC 使用 MVCC5.1 MVCC D…...
Flow-vue源码中的应用
认识 Flow Flow 是 facebook 出品的 JavaScript 静态类型检查工具。Vue.js 的源码利用了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码。 #为什么用 Flow JavaScript 是动态类型语言,它的灵活性有目共睹,但是过于灵活的副作用…...
学习python第一天(数据类型)
关于Python的数据类型 Python数据类型包括: 数字类型,字符类型,布尔类型,空类型,列表类型,元组类型,字典类型 1、数字类型 包括:整型int 浮点型float(有小数位的都是是浮点型) 注…...
echarts:nuxt项目使用echarts
一、项目环境 nuxt 2.X vue2.X vuex webpack 二、安装 yarn add echarts 三、使用 3.1、plugins目录下创建echarts.js import Vue from vue import * as echarts from echarts // 引入echarts Vue.prototype.$echarts echarts // 引入组件(将echarts注册为全…...
认证服务-----技术点及亮点
大技术 Nacos做注册中心 把新建的微服务注册到Nacos上去 两个步骤 在配置文件中配置应用名称、nacos的发现注册ip地址,端口号在启动类上用EnableDiscoveryClient注解开启注册功能 使用Redis存验证码信息 加入依赖配置地址和端口号即可 直接注入StringRedisTempla…...
【计算机毕业设计】74.家教平台系统源码
一、系统截图(需要演示视频可以私聊) 摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐…...
Hbase的SQL接口之Phoenix使用心得
PHOENIX 官方定义 A SQL layer over HBase delivered as a client-embedded JDBC drivertargeting low latency queries over HBase data 不同于Hive on HBase的方式,Phoenix将Query Plan直接使用HBaseAPI实现,目的是规避MapReduce框架,减少…...
Springboot萌宠社交分享系统的设计与实现hfdwz计算机毕业设计-课程设计-期末作业-毕设程序代做
Springboot萌宠社交分享系统的设计与实现hfdwz计算机毕业设计-课程设计-期末作业-毕设程序代做 【免费赠送源码】Springboot萌宠社交分享系统的设计与实现hfdwz计算机毕业设计-课程设计-期末作业-毕设程序代做本源码技术栈: 项目架构:B/S架构 开发语言…...
线性代数与解析几何——Part4 欧式空间 酉空间
线性代数与解析几何——Part4 欧式空间 & 酉空间 1. 欧氏空间 1. 定义 & 性质2. 内积表示与标准正交基3. 欧氏空间的同构4. 欧氏空间的线性变换5. 欧氏空间的子空间 2. 酉空间 1. 定义 & 性质2. 酉变换3. Hermite变换4. 规范变换 1. 欧氏空间 1. 定义 & 性质…...
带头双向循环链表的实现
目录前言节点声明链表的初始化尾插打印链表头插尾删头删查找节点指定位置插入指定位置删除链表销毁前言 之前讲过单链表的实现,在实现的过程中,我们会发现每次删除或者在前面插入节点的时候,都要提前保存上一个节点的地址。这样做十分麻烦&a…...
07【C语言 趣味算法】最佳存款方案(采用 从后往前 递推解决)
目录 一、前情回顾二、Problem:最佳存款方案2.1 Description of the problem2.2 Analysis of the problem2.3 Algorithm design2.4 The complete code and the results of the run(完整的代码 以及 运行结果)一、前情回顾 06【C语言 & 趣味算法】牛顿迭代法求方程根(可…...
游戏开发36课 cocoscreator scrollview优化
在cocoscreator内,ScrollView控件封装的挺完美的了,不过对于一些对性能要求比较高的场景,会存在问题,以top100排行榜排行榜举例子 1、应用卡顿甚至崩溃 按照官方用例使用ScrollView,插入100个玩家的item,理…...
屏幕开发学习 -- 迪文串口屏
一 前言 最近学习了一款基于图形化开发的屏幕,在摸索一周后,基本熟悉了这款产品的一个开发过程,今天给大家分享一下迪文串口屏的学习过程,有不足之处,还请见谅😁,包含了环境搭建和功能DEMO 二 …...
微机-------CPU与外设之间的数据传送方式
目录 一、无条件方式二、查询方式三、中断方式四、DMA方式一、无条件方式 外设要求:简单、数据变化缓慢。 外设被认为始终处于就绪状态。始终准备好数据或者始终准备好接收数据。 IN AL,数据端口 数据端口的地址通过CPU的地址总线送到地址译码器进行译码,同时该指令进行的是…...
从源码上解决rosdep update失败问题
(一)卸载官方的rosdep、rosdistro 卸载rosdistro # python2 sudo apt-get purge python-rosdistro# python3 sudo apt-get purge python3-rosdistro卸载rosdep # python2 sudo apt-get purge python-rosdep# python3 sudo apt-get purge python3-rosd…...
sublime text的json快捷键
系统 macos 配置 sublime Text->Settings->Key Bindings 效果 可以看到,按:shiftcommandp,会出现快捷键窗口,打pretty,会出现Format JSON,最右侧显示⌘J,说明只需要macos的⌘和J同时按…...
数据库mysql提权四种烧姿势--UDF反弹启动项MOF
免责声明:本问仅做技术交流与学习,请知法守法,不要乱搞等等 目录 前提条件 如何获取最高权限的密码? 一.UDF提权 利用条件: 信息收集 1-看有无plugin目录 2-开启外链 3-开启外连后,MSF启动~ 4-navicat--利用导出的.dll执行命令 利用原理: 执行命令: 二.反弹提权 …...
JavaScript防抖函数执行多个事件处理函数,监听浏览器窗口拖拽事件(Vue防抖函数执行多个事件处理函数)
简介:当用户调整浏览器窗口大小时,浏览器会触发 resize 事件。通常,我们希望在窗口大小改变时执行一些操作,但是如果用户频繁调整窗口大小,可能会导致这些操作被频繁触发,影响页面性能和用户体验。这时候&a…...
docker安装并跑通QQ机器人实践(4)-bs-cqhttp搭建
go-cqhttp,基于 Mirai 以及 MiraiGo 的 OneBot Golang 原生实现,只需简单的配置, 就可以基于 go-cqhttp 使用框架开发,具有轻量, 原生, 高并发, 低占用, 跨平台等特点。 1 go-cqhttp 官网及可执行文件下载链接 go-cqhttp 官网:ht…...
go 语言 mage 安装踩坑
具体安装代码:mage 官方地址:Mage :: Mage git clone https://github.com/magefile/mage cd mage go run bootstrap.go 在go部署完后,执行上面的脚本,发现最后一句老是执行不成功: rootBDGF-7FPQW93:/home/gw00241401…...
Linux安装和使用Android Debug Bridge(ADB)
目录 1、开发环境和工具 2、ADB是什么? 3、安装ADB 3.1、使用包管理器安装 ADB 3.2、手动安装 ADB 4、使用ADB 4.1、连接设备 4.2、执行shell命令 4.3、安装应用程序 4.4、截取屏幕截图 4.5、模拟按键和手势 4.6、上传文件到Android设备 4.7、从Android设备下载文件…...