自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(344)
  • 收藏
  • 关注

原创 Netty学习:第三天

编码和解码编写网络应用程序时,因为数据在网络中传输的都是二进制字节码数据,在发送数据时就需要编码,接收数据时就需要解码codec(编解码器) 的组成部分有两个:decoder(解码器)和 encoder(编码器)。encoder 负责把业务数据转换成字节码数据,decoder 负责把字节码数据转换成业务数据Netty 自身提供了一些 codec(编解码器)Netty 提供的编码器StringEncoder,对字符串数据进行编码ObjectEncoder,对 Java 对象进行编码

2020-11-05 20:43:11 14

原创 Netty学习:第二天

Netty概述原生NIO存在的问题NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer 等。需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。JDK

2020-11-01 16:33:11 326

原创 Netty学习:第一天

Netty是什么Netty是JBoss提供的一个Java开源框架,现为Github的独立项目Netty是一个异步的、基于事件驱动的网络应用框架,用来快速开发高性能、可靠性的网络IO程序Netty主要针对在TCP协议下,面向Clients端的高并发应用,或者peer-to-peer场景下的大量数据持续传输应用Netty本质是一个NIO框架,适用于服务器通讯等多种应用场景要透彻理解Netty,先要了解NIONetty的应用场景互联网行业在分布式系统中,各个节点间需要远程服务调用,需要高性能

2020-10-15 10:59:48 26

原创 Zookeeper入门:第三天

Zookeeper开源客户端ZKClient和Curator简介Zookeeper客户端提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供的基本操纵还是有一些不足之处。Zookeeper API不足之处Zookeeper的Watcher是一次性的,每次触发之后都需要重新进行注册;Session超时之后没有实现重连机制;异常处理繁琐,Zookeeper提供了很多异常,对于开发人员来说可能根本不知道该如何处理这

2020-10-12 20:42:26 28

原创 Zookeeper入门:第二天

事件监听机制zookeeper提供了数据的发布/订阅功能,多个订阅者可同时监听某一特定主题对象,当该主题对象的自身状态发生变化时例如节点内容改变、节点下的子节点列表改变等,会实时、主动通知所有订阅者zookeeper采用了 Watcher机制实现数据的发布订阅功能。该机制在被订阅对象发生变化时会异步通知客户端,因此客户端不必在 Watcher注册后轮询阻塞,从而减轻了客户端压力watcher机制事件上与观察者模式类似,也可看作是一种观察者模式在分布式场景下的实现方式1.watcher架构wat

2020-10-12 14:37:27 37

原创 Zookeeper入门:第一天

简介ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用程序使用。每次它们被实现时,都会有大量的工作来修复不可避免的错误和竞争条件。由于实现这些服务的困难,应用程序最初通常会略过这些服务,这使得它们在出现更改时变得脆弱,并且难以管理。即使正确地执行了这些服务,在部署应用程序时,这些服务的不同实现也会导致管理复杂性。应用场景zookeepepr是一个经典的分布式数据一致性解决方案,致力于为分布式应用提供一个高性能、高可用,且具

2020-10-11 17:11:43 76

原创 关于秒杀的一些问题

画一下项目的架构图https://zhuanlan.zhihu.com/p/59944775项目可改进的地方没有设置降级的方案限流做的不够完善,目前只对用户对于某个商品的访问做了限流,没有对整体的流量做限流,比如不法分子有非常多的账号,同时对一个商品发起请求可能造成我们的服务不可用。没有考虑redis穿透的情况处理方案在这个项目中是对库存和静态数据进行了预热,但是实际中有可能某个商品可能一时间快速爆火,如果没有对这些是商品数据进行预热可能会使服务宕掉,需要快速发现热点数据的发现与隔离,.

2020-08-08 21:39:22 434

原创 笔记链接

黑马ssm:csdnjvm:github

2020-07-18 22:51:53 102

原创 啥也不懂选手对于秒杀系统的思考(百度)

满纸复制文,一把辛酸泪面试造火箭,工作拧螺丝一、秒杀系统要解决的问题并发读:并发读的优化理念就是减少用户来服务器读数据并发写:并发写的优化理念就是减少用户来服务器写数据,数据库层面要增加新库存放数据,以便做特殊处理(比如:单独保存要秒杀商品信息,单独弄一个表存秒杀订单)在解决以上两个问题之上,还要增加兜底方案二、秒杀系统设计的目标与原则目标就是建立可承受超高流量并发读写,高性能,高可用系统原则就是保证用户请求数据量尽量少、请求数尽量少、路径尽量短、依赖尽量少、分布式部署保证高可用高可

2020-07-13 21:58:59 183 1

原创 RabbitMQ学习笔记-第七章、学大厂,拓展基础组件封装思路

本章导航一线大厂的MQ组件实现思路和架构设计方案基础组件封装设计-迅速消息发送基础组件封装设计-确认消息发送基础组件封装设计-批量发送消息基础组件封装设计-延迟消息发送基础组件封装设计-顺序消息发送基础组件封装设计-事务消息发送消息的幂等性保障-消息路由规则架构设计7.1一线大厂的MQ组件实现思路和架构设计思路一、MQ组件实现功能点支持消息高性能的序列化转换、异步化发送消息支持消息生产实例与消费实例的链接池化缓存化、提升性能支持可靠性投递消息、保障消息的100%不丢失支持

2020-07-09 23:30:30 91

原创 RabbitMQ学习笔记-第六章、追前沿,领略SET化架构衍化与设计

2020-07-09 21:42:57 67

原创 RabbitMQ学习笔记-第五章下、RabbitMQ集群的搭建

5.1基础知识的补充1.集群总体概述Rabbitmq Broker集群是多个erlang节点的逻辑组,每个节点运行Rabbitmq应用,他们之间共享用户、虚拟主机、队列、exchange、绑定和运行时参数。2.集群复制信息除了message queue(存在一个节点,从其他节点都可见、访问该队列,要实现queue的复制就需要做queue的HA)之外,任何一个Rabbitmq broker上的所有操作的data和state都会在所有的节点之间进行复制。3.集群运行前提集群所有节点必须运行

2020-07-09 21:38:04 86

原创 RabbitMQ学习笔记-第五章上、RabbitMQ集群架构介绍

本章导航了解RabbitMQ集群架构模式构架高可靠RabbitMQ集群集群配置文件与集群运维故障、失败转移讲解

2020-07-09 17:25:59 51

原创 RabbitMQ学习笔记-第四章、RabbitMQ高级整合应用

本章导航RabbitMQ整合Spring AMQP实战RabbitMQ整合Spring Boot实战RabbitMQ整合Spring Cloud实战4.1RabbitMQ整合Spring AMQP实战RabbitAdminSpringAMQP声明RabbitTemplateSimpleMessageListenerContainerMessageListenerAdapterMessageConverter一、RabbitAdminRabbitAdmin类可以很好的操作Rab

2020-07-09 15:50:06 88

原创 RabbitMQ学习笔记-第三章、高级特性

本章导航消息如何保障100%投递成功幂等性概念详解在海量订单产生的业务高峰期,如何避免消息的重复消费等问题Confirm确认消息、Return返回消息自定义消费者消息的ACK和重回队列消息的限流TTL消息死信队列3.1消息如何保障100%投递成功什么是生产端的可靠性投递保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点(Broker)确认应答完善的消息进行补偿机制大厂的解决方案一消息落库,对消息状态进行打标各步骤的解释:第一步:把业务(比如写订单)入

2020-07-06 17:54:35 54

原创 RabbitMQ学习笔记-第二章、核心概念

2.1初识RabbitMQRabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMQ使用Erlang语言编写的,并且RabbitMQ是基于AMQP协议的为什么选用RabbitMQ开源、性能优秀、稳定性保障提供可靠性消息投递模式(confirm)、返回模式(return)SpringAMQP完美的整合、API丰富集群模式丰富、表达式配置、HA模式(高可用)、镜像队列模式保证数据不丢失的前提下保证高可靠性和可用性RabbitMQ高性能的原

2020-07-05 16:53:11 44

原创 RabbitMQ学习笔记-第一章、介绍

主流消息中间件介绍一、ActiveMQ简介ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线,并且他一个完全支持JMS规范的消息中间件其丰富的API、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业应用广泛MQ衡量指标:服务性能、数据存储、集群架构现在已经不常使用因为性能不是很好,比如阻塞消息堆积过多架构说明:1.Master-Slave模式:使用Zookeeper进行多个节点间的协调,只有一个主节点对外提供服务,其他从节点不对外提供服务,若是主节点宕机使

2020-07-04 22:30:37 50

原创 消息队列---RabbitMQ常见问题总结

1.为什么使用消息队列解耦、削峰、异步处理2.消息队列的优缺点优点就是异步、解耦、削峰。系统可用性降低:引入的外部组件越多,系统可用性越低。系统的复杂度提高:需要考虑消息重复(幂等性),丢失的解决方案。可能存在数据一致性问题,生产者以为消息被处理了,实际上没有被处理。3.为什么选用RabbitMQRabbitMQ的吞吐量比RocketMQ和kafka的吞吐量低,但其是基于erlang开发的基于AMQP协议的消息队列。并发性能很强,性能很好,延时很低,基于主从架构实现高可用性4.

2020-06-16 17:55:52 218

原创 程序员代码面试指南刷题--第九章.设计LRU缓存结构

题目描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。输入描述:第一行两个个整数N, K,表示操作数量以及缓存结构大小接下来N行,第一行一个整数o

2020-06-08 08:51:21 608

原创 程序员代码面试指南刷题--第九章.最大的leftMax与rightMax之差的绝对值

题目描述给定一个长度为N(N>1)的整形数组arr, 可以划分成左右两个部分,左部分为arr[0…K],右部分为arr[K+1…N-1], K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值中,最大是多少[要求]时间复杂度为O(n), 空间复杂度为O(n)输入描述:第一行一个整数N,表示数组长度。接下来一行N个整数,表示数组内的数。输出描述:输出一个整数表示最优答案示例1输入52 7 3 1 1输出6解法一:借助两个数组

2020-06-07 09:06:50 80

原创 程序员代码面试指南刷题--第九章.设计有setAll功能的哈希表

题目描述哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。[友情提示]: C++选手若有需要可以使用unordered_map替换map来将复杂度从O(log n)降为O(1)输入描述:第一行一个整数N表示操作数。接下来N行,每行第一个数字opt代

2020-06-07 08:43:42 110

原创 程序员代码面试指南刷题--第九章.蓄水池算法

容量为k的袋子,一共有n个球,使得n>k时袋子里有k个球同时保证没吐出一个球所有球进袋子的概率就是k/i(i为当前一共吐出的数量i>k&&i<=n)解法一:蓄水池算法public int[] getKRands(int k,int max){ if(max<1||k<1) return null; int[] res = new int[Math.min(k,max)]; for(int i=0;i<res.length;i++){ res[

2020-06-07 08:18:44 82

原创 慢慢来--反射相关

介绍Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任何一个对象都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java反射。两种方式获取Class对象具体类.classClass.forName(xxx)静态编译:在编译时确认类型,绑定对象动态编译:运行时确定类型,绑定对象反射优缺点优:运行期类型的判断,动态加载类,提高代码灵活性缺:反射相当于一系列解释操作,比直接运行java代码慢很多。另外反射动态操作类的属

2020-06-06 12:08:23 59

原创 慢慢来--final、static、this、super关键字

final关键字final关键字可以用来修饰类、方法和变量final修改的类不能被继承,final类中所有成员方法都会隐式的指定为final方法final修饰的方法不能被重写final修饰的变量是常量,如果是基本数据类型的变量,则其数值初始化后便不能修改;如果是引用类型的变量,初始化后不能指向另一个对象说明:使用final方法的原因有两个,一是把防止方法被重写;第二个原因是效率,早起java中final方法会转为内嵌调用,但是方法如果过于庞大,内嵌调用并不会带来性能的提升。类中所有的priva

2020-06-06 11:26:22 45

原创 程序员代码面试指南刷题--第九章.能否完美地拼成矩形

题目描述每条边不是平行于X轴就是平行于Y轴的矩形,可以用左下角和右上角的点来表示。比如{1, 2, 3, 4},表示的图形如下给定一个N行4列的二维数组matrix,表示N个每条边不是平行于X轴就是平行于Y轴的矩形。想知道所有的矩形能否组成一个大的完美矩形。完美矩形是指拼出的整体图案是矩形,既不缺任何块儿,也没有重合部分[要求]时间复杂度为O(n),额外空间复杂度为O(n)输入描述:第一行一个整数N,表示matrix的行数接下来N行,每行4个整数分别表示矩形的左下角和右上角的点输出描述:若

2020-06-06 09:25:32 67

原创 程序员代码面试指南刷题--第九章.折纸问题

题目描述请把一张纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开,此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次,请从上到下打印所有折痕的方向。[要求]时间复杂度为O(2^n)),额外空间复杂度为O(1)输入描述:第一行一个整数N。表示对折次数输出描述:输出若干行,若该折痕向下,输出"down",否则输出"up"

2020-06-06 08:48:19 95

原创 程序员代码面试指南刷题--第八章.加油站良好出发点问题

题目描述N个加油站组成一个环形,给定两个长度都是N的非负数组oil和dis(N>1),oil[i]代表第i个加油站存的油可以跑多少千米,dis[i]代表第i个加油站到环中下一个加油站相隔多少千米。假设你有一辆油箱足够大的车,初始时车里没有油。如果车从第i个加油站出发,最终可以回到这个加油站,那么第i个加油站就算良好出发点,否则就不算。请返回长度为N的boolean型数组res,res[i]代表第i个加油站是不是良好出发点规定只能按照顺时针走,也就是i只能走到i+1,N只能走到1[要求]时间复杂

2020-06-04 09:36:39 109

原创 程序员代码面试指南刷题--第八章.分金条的最小花费

题目描述给定一个正数数组arr,arr的累加和代表金条的总长度,arr的每个数代表金条要分成的长度。规定长度为k的金条分成两块,费用为k个铜板。返回把金条分出arr中的每个数字需要的最小代价。[要求]时间复杂度为O(nlog⁡n),空间复杂度为O(n)输入描述:第一行一个整数N。表示数组长度。接下来一行N个整数,表示arr数组。输出描述:一个整数表示最小代价示例1输入310 30 20输出90解法一:类似哈夫曼树,借助堆实现import java.io.*;impo

2020-06-03 09:21:52 87

原创 程序员代码面试指南刷题--第八章.做项目的最大收益问题

题目描述给定两个整数W和K,W代表你拥有的初始资金,K代表你最多可以做K个项目。再给定两个长度为N的正数数组costs[]和profits[],代表一共有N个项目,costs[i]和profits[i]分别表示第i号项目的启动资金与做完后的利润(注意是利润,如果一个项目的启动资金为10,利润为4,代表该项目最终的收入为14)。你不能并行只能串行地做项目,并且手里拥有的资金大于或等于某个项目的启动资金时,你才能做这个项目。该如何选择做项目,能让你最终的收益最大?返回最后能获得的最大资金[要求]时间复杂度

2020-06-03 08:53:16 268

原创 程序员代码面试指南刷题--第八章.数组排序之后相邻数的最大差值

题目描述给定一个整形数组arr,返回排序后相邻两数的最大差值arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大差值,故返回6。arr = [5, 5, 5, 5]。返回0。[要求]时间复杂度为O(n),空间复杂度为O(n)输入描述:第一行一个整数N。表示数组长度。接下来N个整数表示数组内的元素输出描述:输出一个整数表示答案示例1输入49 3 1 10输出6解法一:桶排序import java.io.*;impor

2020-06-02 11:40:54 95

原创 程序员代码面试指南刷题--第八章.数组中未出现的最小正整数

题目描述给定一个无序数组arr,找到数组中未出现的最小正整数例如arr = [-1, 2, 3, 4]。返回1arr = [1, 2, 3, 4]。返回5[要求]时间复杂度为O(n),空间复杂度为O(1)输入描述:第一行为一个整数N。表示数组长度。接下来一行N个整数表示数组内的数输出描述:输出一个整数表示答案示例1输入4-1 2 3 4输出1解法一:双指针import java.io.*;import java.util.*;public class Main

2020-06-02 09:35:18 120

原创 程序员代码面试指南刷题--第八章.求最短通路值

题目描述用一个整形矩阵matrix表示一个网格,1代表有路,0代表无路,每一个位置只要不越界,都有上下左右四个方向,求从最左上角到右下角的最短通路值例如,matrix为:1 0 1 1 11 0 1 0 11 1 1 0 10 0 0 0 1通路只有一条,由12个1构成,所以返回12[要求]时间复杂度为O(nm),空间复杂度为O(nm)输入描述:第一行两个整数N,M表示矩形的长宽接下来N行,每行一个长度为M的字符串表示矩形输出描述:输出一个整数表示最小步数若从(1, 1)无法到

2020-06-02 09:03:05 58

原创 设计模式学习笔记-职责链模式

学校的采购审批项目如果金额小于等于5000,由教学主任审批如果金额小于等于10000,由院长审批如果金额小于等于30000,由副校长审批如果金额大于30000,由校长审批传统方案解决传统方案的问题传统方式解决问题是接收一个采购项目后,根据采购金额来调用对应的Approver完成审批客户端会使用到分支判断来处理不同的采购请求,这样的话如果相关审批员可审核价格改变客户端需要重写。另外客户端需要知道每个审批员的可审核金额,存在强耦合不利于扩展职责链模式基本介绍职责链模式又叫责任链

2020-06-01 12:02:56 85

原创 设计模式学习笔记-策略模式

鸭子项目有各种鸭子(野鸭、北京鸭、水鸭等),鸭子有各种行为,飞、叫等显示鸭子信息传统方案解决传统方式实现鸭子问题1.Duckpublic abstract class Duck { public Duck() { } public abstract void display();//显示鸭子信息 public void quack() { System.out.println("鸭子嘎嘎叫~~"); } public void swim() { Syst

2020-06-01 11:25:16 64

原创 程序员代码面试指南刷题--第八章.边界都是1的最大正方形大小

题目描述给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度、例如0 1 1 1 10 1 0 0 10 1 0 0 10 1 1 1 10 1 0 1 1其中,边框全是1的最大正方形的大小为4×4,所以返回4[要求]时间复杂度为O(n3),空间复杂度为O(n2)输入描述:第一行一个整数N。表示矩阵的长宽。接下来N行,每行N个整数表示矩阵内的元素输出描述:输出一个整数表示答案示例1输入50 1 1 1 10 1 0

2020-06-01 09:09:41 120

原创 设计模式学习笔记-状态模式

APP抽奖活动加入每参加一次活动要扣除用户50积分,中奖概率是10%奖品数量固定,抽完就不能抽奖活动有四个状态:可以抽奖、不能抽奖、发放奖品和奖品领完状态转换图如下状态模式基本介绍状态模式主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题,状态和行为是一 一对应的,状态之间可以相互转换当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类原理类图Context类为环境角色,用于维护State实例,这个实例定义为当前状态state是抽象状态角色

2020-05-31 12:26:09 51

原创 程序员代码面试指南刷题--第八章.打印N个数组整体最大的Top K

题目描述有N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。例如,输入含有N行元素的二维数组可以代表N个一维数组。219, 405, 538, 845, 971148, 55852, 99, 348, 691再输入整数k=5,则打印:Top 5: 971, 845, 691, 558, 538[要求]时间复杂度为O(klogk),空间复杂度为O(klogk)输入描述:第一行两个整数T, K。分别表示数组个数,需要打印前K大的元素接下来T行,每行输入

2020-05-31 11:02:49 128

原创 程序员代码面试指南刷题--第八章.数组中子数组的最大累乘积

题目描述给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr=[-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12[要求]时间复杂度为O(n)O(n)O(n),空间复杂度为O(1)O(1)O(1)输入描述:第一行一个整数N。表示数组长度。接下来一行N个浮点数表示数组内的数输出描述:输出一个浮点数表示答案,保留到小数点后两位示例1输入7-2.5 4 0 3 0.

2020-05-31 10:04:52 59

原创 程序员代码面试指南刷题--第八章.在数组中找到一个局部最小的位置

题目描述定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1],又有arr[i]<arr[i+1],那么arr[i]是局部最小。给定无序数组arr,已知arr中任意两个相邻的数不相等。写一个函数,只需返回arr中任意一个局部最小出现的位置即可

2020-05-31 08:55:58 130

原创 设计模式学习笔记-解释器模式

四则运算问题先输入表达式的形式,比如a+b+c+d-e,要求表达式字母不能重复在分别输入a、b、c、d、e的值最后求出结果传统方案解决四则运算问题编写一个方法,接收表达式的形式,然后根据用户输入的数值进行解析,得到结果问题分析:如果加入新的运算符,不利于扩展解决方案:考虑解释器模式,即表达式–>解释器(可以设置多个)–>结果解释器模式基本介绍在编译原理中,一个算术表达式通过词法分析器形成词法单元,而后这些词法单元再通过语法分析器构建语法分析树,最终形成一颗抽象的语法

2020-05-30 16:58:13 87

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除