自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM 内存模型

JVM体系结构1.classfile 字节码文件的部分2.Classloader3.内存结构4.执行引擎的部分 解释器和JIT即时编译器 还差GC类的对象存储在方法区中,堆中存储对象和成员变量,而堆中的对象在方法的执行过程中,需要用到虚拟机栈,程序计数器,以及本地方法栈,方法在执行的时候,它的每行代码都是由执行引擎中的解释器逐行解释的,对于热点代码则通过JIT即时编译器进行编译,在执行引擎中还有一个比较重要的模块,垃圾回收GC,它会对堆中的不再引用对象进行垃圾回收,还会有一些java不太方便实

2022-01-14 16:48:42 458

原创 JVM常用调优参数

1)-Xms20M表示设置JVM启动内存的最小值为20M,必须以M为单位(2)-Xmx20M表示设置JVM启动内存的最大值为20M,必须以M为单位。将-Xmx和-Xms设置为一样可以避免JVM内存自动扩展。大的项目-Xmx和-Xms一般都要设置到10G、20G甚至还要高(3)-verbose:gc表示输出虚拟机中GC的详细情况(4)-Xss128k表示可以设置虚拟机栈的大小为128k(5)-Xoss128k表示设置本地方法栈的大小为128k。不过HotSpot并不区分虚拟机栈和本地方法栈,

2022-01-14 14:16:44 1531

原创 并发的原子性 可见性 有序性和classloader

原子性原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行。只有简单的读取、赋值(而且必须是将数字赋值给某个变量,变量之间的相互赋值不是原子操作)才是原子操作。java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围操作的原子性,可以通过synchronized和Lock来实现。由于synchronized和Lock能够保证任一

2022-01-11 15:04:21 428

原创 内存屏障*

内存屏障是硬件之上、操作系统或JVM之下,对并发作出的最后一层支持。再向下是是硬件提供的支持;向上是操作系统或JVM对内存屏障作出的各种封装。内存屏障是一种标准,各厂商可能采用不同的实现。JVM提供的并发机制。首先,从volatile的语义引出可见性与重排序问题;接下来,阐述问题的产生原理,了解为什么需要内存屏障;然后,浅谈内存屏障的标准、厂商对内存屏障的支持,并以volatile为例讨论内存屏障如何解决这些问题;最后,补充介绍JVM在内存屏障之上作出的几个封装。为了帮助理解,会简要讨论硬件架构层面的一

2022-01-11 14:24:13 441

原创 Hystrix原理

背景分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,如果各个服务正常运行,那大家齐乐融融,高高兴兴的,但是如果其中一个服务崩坏掉会出现什么样的情况呢?如下图,简单...

2022-01-11 11:47:37 105

原创 classfile解析的内容

Class文件是一组以8位字节为基础单位的二进制流,各个数据项严格按顺序排列,没有任何分隔符。Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:无符号数和表。我们可以使用一些软件来查看classfileSublime_Text 软件IDEA 插件 Bined我们可以使用一些软件来查看classfile无符号数:是基本数据类型,以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节、8个字节的无符号数,可以用来描述数字、索引引用、数量值或

2022-01-08 14:56:39 376

原创 Spring MVC 异常处理机制和执行流程

Spring MVC 异常处理机制作用如客户端调用web程序时,如果程序出现异常,特别是运行时异常;如果没有try-catch进行捕获,异常将最终不会被ExceptionResolver进行处理,导致程序出现500错误。亦或者当客户端访问一个不存在的商品详情时,此时需要呈现给用户一个显示页,用户告知“您查找的商品不存在”等信息。今天就就说说spring提供的简单异常处理器SimpleMappingExceptionResolver和注解的方式异常处理首先:spring提供的简单异常处理器Simple

2021-09-28 09:30:36 373

原创 国际化和登录过滤和类型转换器

国际化:它们分别是“语言类型”和“国家/地区的类型”。简单的写有一个例子:xml配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframewor

2021-09-26 20:52:00 102

原创 Spring-maven-mvc文件上传下载

首先:导入文件上传下载的依赖//io流工具类依赖 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>//文件上传数据处理依赖

2021-09-24 22:09:03 139

原创 Spring-MVC 返回json 实现增删改查

首先建立一个maven-web工程:然后导入依赖:<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 htt

2021-09-23 16:41:58 239

原创 Spring-mvc-Restful风格实现增删改查

Restful风格:一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。URL定义资源:互联网所有的事物都可以被抽象为资源资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。分别对应 添加、 删除、修改、查询。Restful的特性资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲

2021-09-21 20:50:34 635 2

原创 Spring MVC的执行过程

用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdap.

2021-09-20 20:36:06 108

原创 乐观锁的一种实现方式-CAS(Compare and Swap 比较并交换):

首先介绍一些乐观锁与悲观锁:悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

2021-09-17 08:45:20 238 2

原创 Spring-事务和mybatis整合对初学者友好

Spring-事务事务的特性原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。一致性(Consistency):一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。持久性(Durability):一旦事务完成,无论发生什么系统错误,它的

2021-09-16 22:49:34 122

转载 Java基础知识面试题

原文一、Java基础知识面试题1、Java概述①. 何为编程编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编程。②. 什么是JavaJava是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因

2021-09-16 09:16:50 180

转载 java笔试题

# java笔试题大全带答案(经典11题)**1.不通过构造函数也能创建对象吗()**A. 是B. 否**分析:答案:A**Java创建对象的几种方式(重要):(1) 用new语句创建对象,这是最常见的创建对象的方法。(2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。(3) 调用对象的clone()方法(4) 运用反序列化手段,调用java.io.ObjectI

2021-09-16 09:05:10 162

原创 Spring之AOP面向切面编程和JDBC 对初学者友好嘻嘻嘻

动态代理Proxy:利用Java的反射技术(Java Reflection),在运行时创建一个实现某些给定接口的新类(也称“动态代理类”)及其实例(对象),代理的是接口(Interfaces),不是类(Class),也不是抽象类。在运行时才知道具体的实现,spring aop就是此原理。首先:写一个接口package com.openlab.mapper;public interface usermapper {public void show();}接着写一个类实现接口:package

2021-09-15 20:17:00 170 2

原创 JAVA面试题相关基础知识

1、面向对象的特征有哪些方面 ①抽象:抽象是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。②继承:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继

2021-09-15 08:01:18 148

原创 Spring框架IOC之二

1.引入外部的properties文件首先创建配置文件xxx.propertiesdriverClassName=com.mysql.cj.jdbc.Driverurl=jdbc:mysql://localhost:3306/transfer1name=rootpassword=123456在xxx.xml引入xxx.properties<context:property-placeholder location="classpath:beans.properties"><

2021-09-14 20:32:51 96

原创 Spring框架IOC之一

1.什么是sprigSpring是一个开源框架。,它是由Rod Johson创建。它是为了解决定企业开发的复杂性的创建的Spring使用基本的JavaBeam来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅局限于服务器端的开发,从简单性,可测试性,和松耦合的角度而言,任何java应用都可从中受益。目的:解决企业应用开发的复杂性。功能:使用基本的javaBean代替EJB,并提供更多的企业应用功能范围:任何的Java应用它是一个容器框架,用来装JAVABean(ja

2021-09-13 19:33:41 225

原创 java 高并发部分面试题

1、线程与进程进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它

2021-09-11 18:23:01 699

原创 jQuery 的选择器

$("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素$("div") 选择所有的div标签元素,返回div元素数组$(".myClass") 选择使用myClass类的css的所有元素$("*") 选择文档中的所有的元素,可以运用多种的选择方式进行联合选择:例如$("#myELement,div,.myclass")层叠选择器:...

2021-09-11 17:08:01 157

转载 concurrentHashMap

ConcurrentHashMap是J.U.C(java.util.concurrent包)的重要成员,它是HashMap的一个线程安全的、支持高效并发的版本。在默认理想状态下,ConcurrentHashMap可以支持16个线程执行并发写操作及任意数量线程的读操作。本文将结合Java内存模型,分析JDK源代码,探索ConcurrentHashMap高并发的具体实现机制,包括其在JDK中的定义和结构、并发存取、重哈希和跨段操作,并着重剖析了ConcurrentHashMap读操作不需要加锁和分段锁机制的内在

2021-08-29 19:19:31 461

原创 内存>|<溢出

内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 引起内存溢出的原因有很多种,常见的有以下几种:  1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;  2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;  3.代码中存在死循环或循环产生过多重复的对象实体;  4.使用的第三方软件中的BUG;  5.启动参数内存值设定的过小;内存溢出的解决方案: 第一步,修改JVM启动参数,直接增加内存...

2021-08-16 20:54:50 276 2

原创 强引用、软引用、弱引用、虚引用

强引用:我们使用的大部分引用实际上都是强引用,new 出的对象之类的引用,只要强引用还在,永远不会回收。强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。如下是一个强引用:Object strongReference = new Object();软引用:引用但非必须的对象,内存溢出异常之前,回收。软引用是用来描述一些有用但并不是必需的对象,在Java中用java.

2021-08-16 20:33:11 124

原创 深拷贝和浅拷贝

一、数据类型数据分为基本数据类型(String, Number, Boolean, Null, Undefined,Symbol)和对象数据类型。1、基本数据类型的特点:直接存储在栈(stack)中的数据2、引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。*二、浅拷贝与深拷贝深拷贝和浅拷贝是只针对Object和Array这样的引用

2021-08-10 20:23:50 120

原创 线性池原理

引进线程池的原因:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。参数说明corePoolSize核心线程数量,线程池维护线程的最少数量keepAliveTime线程池除核心线程外的其他线程的最长空闲时间,超过该时间的空闲线程会被销

2021-08-09 21:58:22 421

原创 强软弱虚四大引用

1.强引用:使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题.2.软引用(SoftReference):如果一个对象只具有软引用,则内存空间充足时,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可以和一个引用队列(ReferenceQueue)联合使用。如果软引

2021-08-09 18:25:21 59

原创 值传递和引用传递

JAVA中的数据类型1.基本数据类型,其变量保存的是原始值,也就是变量就是数据本身。常见的基本数据类型:byte,short,int,long,char,float,double....2.引用数据类型,其变量保存的是引用值,也就是保存的是对象的内存空间的首地址。常见的引用数据类型:类,数组,String....值传递和引用传递1.值传递在调用方法时实参把实际的值传递给形参。就是将实际的值复制一份给形参,在方法内对形参进行修改仅仅改变形参的值,不会改变实参的值。缺点:不适合大量数

2021-08-08 16:27:16 374

原创 三路快排^_^

快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R.Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。三路快排就是在快速排序的基础上进一步优化的,它是将数据分成三个部分,等于一部分,大于一部分,小于一部分。小于部分和等于部分从前往后,大于部分从后往前。等部分在小于部分之后。如下图:

2021-07-30 19:45:54 322

原创 中缀表达式计算(用栈实现)

输入字符串“(10+20/2*3)/2+8”计算结果1.首先我们要将“(10+20/23)/2+8”变成“(,10,+,20,/,2,,3,),/,2,+,8”2.建两个栈,一个用于操作符(+,-,…)的入栈出栈(栈op)一个用于数值的入栈出栈(栈nu)3.操作符出栈入栈规则:如果栈op为null直接进栈如果栈op的栈顶为“(”直接进栈如果栈op的栈顶为操作符如“+”等,我们就判断要进栈的操作符的优先级****是否大于栈顶的操作符优先级,如果大于就进栈;否者就弹出栈顶操作符,直到栈顶操作

2021-07-17 14:02:01 556

原创 二叉树遍历

二叉树(binary tree)是结点的有限集合,这个集合或者空,或者由一个根及两个互不相交的称为这个根的左子树或右子树构成.从定义可以看出,二叉树包括:1.空树 2.只有一个根节点 3.只有左子树 4.只有右子树 5.左右子树都存在 有且仅有这5中表现形式二叉树的特点:性质1:在二叉树的第i层上至多有2^(i-1)个节点(i >= 1)性质2:深度为k的二叉树至多有2^k-1个节点(k >=1)性质3:对于任意一棵二叉树T而言,其叶子节点数目为N0,度为2的节点数目为N2

2021-07-10 19:56:24 50

原创 HashMap底层原理

HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。HashMap的数据结构数组:其实所谓的数组指的就是一组相关类型的变量集合,并且这些变量彼此之间没有任何的关联。存储区间连续,占用内存严重,数组有下标,查询数据快,但是增删比较慢;二叉树:对一棵相对平衡的有序二叉树,对其进行插入,查找,删除等操作,

2021-07-09 20:05:19 167

原创 哈希冲突^_^

哈希冲突产生的原因哈希是通过对数据进行再压缩,提高效率的一种解决方法。但由于通过哈希函数产生的哈希值是有限的,而数据可能比较多,导致经过哈希函数处理后仍然有不同的数据对应相同的值。这时候就产生了哈希冲突。简单说就是:如果两个不同对象的hashCode相同,这种现象称为hash冲突。**解决哈希冲突的四种方法**开发定址法再哈希法链地址建立一个公共溢出区开放地址方法(1)线性探测按顺序决定值时,如果某数据的值已经存在,则在原来值的基础上往后加一个单位,直至不发生哈希冲突。

2021-07-08 20:07:41 193

原创 工厂模式O(∩_∩)O

工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。简单工厂模式简单工厂模式最大的优点在于实现对象的创建和对象的使用分

2021-07-08 19:56:35 151

原创 单例模式|

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。基本的实现思路单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。单例的实现

2021-07-08 13:37:19 69

原创 JAVA中代码的执行顺序

究竟在JAVA中代码的值行顺序是怎么样的呢?接下来俺就通过实例来讲讲吧!以下是父类代码:public class Parent { static{//静态代码块 System.out.println("父类的静态代码块"); } { System.out.println("父类的代码块");//代码块 } Parent() {//父类的构造方法 System.out.println("父类的构造方法"); }}以下是子类代码:public class Childre

2021-05-26 21:04:29 601 2

原创 递归算法O(∩_∩)O哈哈~

***什么是递归? ***从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说:从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说…(以此循环)应该很多人都听过这个吧!其实这也算是递归的思想吧。不断调用“从前有座山,山上有座庙,庙里有个老和尚和一个小和尚,有一天,老和尚对小和尚说”只不过没有结束条件,但递归有结束条件吧了。通过上面这个故事,相信也对递归有了一点点的了解吧。接下来

2021-05-18 00:31:23 280

原创 瓢程页面编写思路(需要代码联系我)

页面编写思路网页页面编写需要清晰的思路,这样才能事半功倍。如果没有计划没有思路的去编写,走一步看一步的话,往往会浪费更多的时间。以下仅是个人的几点思路,希望能给你带来帮助,如有误请留言提醒,我会及时更改,谢谢!1,建文件夹在编写网页页面时,先建立文件夹用于存储不同的资源,文件名简单明了。这样就能将不同的资源储存到相应的位置,在编写过程中寻找资源会提升速度,也方便找到,会减少很多的麻烦。如果没有建立相应的文件夹,而是将所有的东西都放在一起的话。在编写的过程中,到了后期,寻找一个资源就会变得很麻烦,从而浪

2021-05-05 00:22:39 394 2

原创 简单弹性布局

弹性布局Flexbox弹性布局(flexible box)模块目的是提供一个更加有效的方式来布置对齐和分布在容器之间的各项内容,即便它们的大小是未知或者动态变化的。 弹性布局的主要思想是让容器有能力来改变项目的宽度和高度,以填满可用空间的能力。可以更轻松地设计灵活的响应式布局结构,而无需使用浮动或定位。1.弹性布局Flexbox 简单实例...

2021-05-04 22:44:25 194

空空如也

空空如也

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

TA关注的人

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