自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java常见面试题 非常实用

Java 面试题一.容器部分二.多线程部分三.SpringMvc部分四.Mybatis部分五.MySQL部分六.Redis部分七.RabbitMQ部分八.JVM虚拟机部分九.算法知识部分十.其他面试部分2|1更新时间:2020/08/10 内容:JVM虚拟机部分 预更:算法部分2|2容器部分面试题Java 容器都有哪些Collectio...

2022-04-09 20:53:31 2415

原创 六年面试经验来分享JAVA基础面试题

1.面向对象和面向过程的区别面向过程优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源。比如单片机、嵌入式开发、Linux/Unix,等一般采用面向过程开发,性能是最重要的因素。缺点:没有面向对象易维护、易复用、易扩展面向对象优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护缺点:性能比面向过程低2.Java语言有哪些特点1.简单易学;2.面向对象(封装,继承,多态);.

2022-04-08 13:15:35 389

原创 Java基础——字符串常量池遇到的坑

原来学java的时候,这块就没怎么看,最近学多线程稍微仔细看了一下,遇到不少疑惑。问题一:String str1 = new String("abc"); 到底创建了几个对象?一般的回答2个,一个是在堆中new的String("abc")对象,一个是字符串常量池创建的"abc"。更严谨的说法严谨的问法:String str1 = new String("abc"); 运行时(包括类加载和程序执行)涉及几个String实例?回答2个。一个是字符串字面量"abc"对应的,驻留在字符串常

2022-04-08 13:10:56 316

原创 Java基础之 contains 简单用法

学习Democontains方法:用于判断list集合是否包含某个元素containsKey方法:用于判断Map键中是否包含某个键containsValue方法:用于判断map中是否包含某个value值码上行动 1 import java.util.ArrayList; 2 import java.util.HashMap; 3 import java.util.List; 4 import java.util.Map; 5 6 /** 7 * contai.

2022-04-08 13:08:08 40089

原创 全网最全最细Java基础-多态

多态多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。多态的定义和存在

2022-04-07 11:43:56 549

原创 常被问到的八个 Java 面试题

想要找到一份好的工作,面试是少不了的,可能你觉得自己技术应该不错了,但是面试却是一团糟。下面我收集了八个常常被问到的Java面试题。1. 阐述 Java 7 和 Java 8 的区别。实话说,两者有很多不同。如果你能列出最重要的,应该就足够了。你应该解释 Java 8 中的新功能。想要获得完整清单,请访问官网:Java 8 JDK。你应该知道以下几个重点:lambda 表达式,Java 8 版本引入的一个新特性。lambda 表达式允许你将功能当作方法参数或将代码当作数据。lambd

2022-04-07 11:37:24 127

原创 Java基础面试题(史上最全、持续更新、吐血推荐)

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

2022-04-06 19:30:25 1581 1

原创 Spring Boot:Spring Boot Jpa 的使用

Spring Boot Jpa 介绍首先了解 Jpa 是什么?Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。值得注意的是,Jpa是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的

2022-04-03 15:49:56 583

原创 Java并发编程:线程池的使用

在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。  那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?  在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法

2022-04-02 11:39:56 185

原创 Java并发编程:同步容器

为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。今天我们就来讨论下同步容器。  以下是本文的目录大纲:  一.为什么会出现同步容器?  二.Java中的同步容器类  三.同步容器的缺陷  若有不正之处请多多谅解,并欢迎批评指正。一.为什么会出现同步容器?  在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。  List、S

2022-04-02 11:36:47 126

原创 Java并发编程:Synchronized及其实现原理

一、Synchronized的基本使用  Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:  (1)修饰普通方法  (2)修饰静态方法  (3)修饰代码块  接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了Synchronized的

2022-04-01 15:11:19 145

原创 Java并发编程:并发容器之ConcurrentHashMap

JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vector和Hashtable、Collections.synchronizedXxx()同步容器等相比,util.conc

2022-04-01 15:00:40 487

原创 Java计算1-100的和(要求尽量考虑代码优化)

1.递归算法 1 public static void main(String[] args) { 2 System.out.println(add(1)); 3 } 4 5 private static int add(int i) { 6 if (i < 100 && i > 0) { 7 return i + add(i + 1); 8 } 9 .

2022-04-01 14:44:18 5180

原创 30个要点帮你完成java代码优化

通过java代码规范来优化程序,优化内存使用情况,防止内存泄露可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文讨论的主要是如何提高代码的效率。在Java程序中,性能问题的大部分原因并不在于Java语言,而是在于程序本身。养成好的代码编写习惯非常重要,比如正确地、巧妙地运用java.lang.String类和java.util.Vector类,它能够显著地提高程序的性能。下面

2022-03-31 14:50:00 1832

原创 Java应用程序监控JavaMelody

JavaMelody是运行在Java Web容器中,用来监控Java内存和J服务器CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求等的执行数量,平均执行时间,错误百分比等。图表可以按天,周,月,年或自定义时间段查看。使用方法Maven依赖<dependency> <groupId>net.bull.javamelody</groupId> <artifactId>javamelody-core

2022-03-31 12:00:50 788

原创 Java 9 创建自定义运行时映像

一. 什么是自定义运行时映像?在JDK 9之前,Java运行时映像可用作巨大整体的单体(artifact),从而增加了下载时间,启动时间和内存占用。单体JRE使得不可能在具有小内存的设备上使用Java。 如果将Java应用程序部署到云端,则需要支付使用的内存; 最常见的是,单体JRE使用的内存比所要求的内存还要多,因此为云服务支付更多的内存。 在Java 8中引入的Compact配置文件,以减少JRE大小,从而减少运行时内存占用 —— 通过允许将JRE的一个子集打包在称为Compact配置文件的自定义运

2022-03-31 11:55:23 423

原创 Java并发编程有多难?这几个核心技术你掌握了吗?

本文主要内容索引1、Java线程2、线程模型3、Java线程池4、Future(各种Future)5、Fork/Join框架6、volatile7、CAS(原子操作)8、AQS(并发同步框架)9、synchronized(同步锁)10、并发队列(阻塞队列)本文仅分析java并发编程中的若干核心问题,对于上面没有提到但是又和java并发编程有密切关系的技术将会不断添加进来完善文章,本文将长期更新,不断迭代。本文试图从一个更高的视觉来总结Java语言中的并发编程内容,

2022-03-31 11:11:28 221

原创 【Java并发编程】线程安全和共享对象

一、什么是线程安全  当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用代码代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。  内部锁  Java提供了强制性的内置锁机制:synchronized块。一个synchronized块有两个部分:锁对象的引用,以及这个锁保护的代码块。执行线程进入synchronized块之前会自动获得锁,无论通过正常控制路径退出还是从块中抛出异常,线程都在放弃对synchronized块

2022-03-31 11:06:12 249

原创 Java并发编程:什么是线程池

什么是线程池  学习编程的小伙伴们会经常听到“线程池”、“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移,办理业务的人数每年都增加五千。20年之后这家银行办理业务的人次已经到十万。最开始只有一个客户的时候银行只需要雇佣一个按办理业务次数计工资的临时工就行了,办完业务就解雇。随着办理业务的人不断增多,银行老板发现继续雇佣按次计费的员工太麻烦了,每天都在招人,又每天都解雇人。所以老板就想出了一个办法,雇佣几个员

2022-03-31 11:00:43 163

原创 Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。更多Java教程可以关注小编+薇:hua2021ei 【架构资料】获取,最后祝大家都能拿到自己心仪的offer  volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来.

2022-03-30 18:48:07 140

原创 JavaScript的发展史

一、JavaScript发展历程1. 诞生​ JavaScript因互联网而生,紧跟浏览器的发展而发展。​ 1990年,欧洲核能研究所(CERN)科学家在互联网(Internet)基础上,发明了万维网(World Wide Web),从此可以再网上浏览网页文件。(互联网是线路、协议以及通过TCP、IP协议实现数据电子传输的硬件和软件的集合体。Internet提供的主要服务有万维网WWW、文件传输FTP、电子邮件E-mail、远程登录Telnet等。万维网则存在于互联网之上,是由无数个网络站点和网

2022-03-30 18:32:11 4298

原创 Java权限管理(授权与认证)

CRM权限管理如果发现分享的内容有不合理或者的不对地方,请留言,我会及时定位分析,感谢!!!一、概念权限管理就是管理用户对于资源的操作。本 CRM 系统的权限(也称作资源)是基于角色操作权限来实现的,即RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间都是多对多的关系,为了实现表之间多对

2022-03-30 18:29:06 10139 2

原创 Java多线程【三种实现方法】

java多线程并发与并行并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行并行:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。对比:并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)更多Java学习进阶教程+薇:hua2021ei 免费获取哦进程与线程进程(Process)是计算机中的程序关于某数据集合上的一

2022-03-23 15:55:57 167

原创 nodejs和js的关系

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言。js(JavaScript)是一种高级的、解释型的编程语言;它是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。更多Java学

2022-03-22 13:34:44 1863 1

原创 Java动态加载类在功能模块开发中的作用

Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册、发送邮件等功能,代码如下:1 /*2 * web功能实现类3 */4 public class Web {56 public static void main(String[] args) {7 //每次有新功能都需要重新加载8 if("UserReg".equals(args...

2022-03-21 15:32:02 152

原创 JAVA并发编程J.U.C学习总结

什么是JSR:JSR,全称 Java Specification Requests, 即Java规范提案, 主要是用于向JCP(Java Community Process)提出新增标准化技术规范的正式请求。每次JAVA版本更新都会有对应的JSR更新,比如在Java 8版本中,其新特性Lambda表达式对应的是,新的日期和时间API对应的是什么是JSR 166:当然,本文的关注点仅仅是,它是一个关于Java并发编程的规范提案,在JDK中,该规范由java.util.concurrent包实现,是

2022-03-20 11:11:32 184

原创 Java并发编程:synchronized

虽然多线程编程极大地提高了效率,但是也会带来一定的隐患。比如说两个线程同时往一个数据库表中插入不重复的数据,就可能会导致数据库中插入了相同的数据。今天我们就来一起讨论下线程安全问题,以及Java中提供了什么机制来解决线程安全问题。  以下是本文的目录大纲:  一.什么时候会出现线程安全问题?  二.如何解决线程安全问题?  三.synchronized同步方法或者同步块  若有不正之处,请多多谅解并欢迎批评指正。一.什么时候会出现线程安全问题?  在单线程中不会出现线程安全问题,

2022-03-18 12:23:14 144

原创 Java并发编程:Lock

了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。  也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起,然后再讲述java.util.concurrent.locks包下常用的有哪些类和接口,最后讨论以下一些关于锁的概念方面

2022-03-18 12:11:08 68

原创 怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制

前言在日常Java开发中,我们经常碰到java.lang.NoClassDefFoundError这样的错误,需要花费很多时间去找错误的原因,具体是哪个类不见了?类明明还在,为什么找不到?而且我们很容易把java.lang.NoClassDefFoundError和java.lang.ClassNotfoundException这两个错误搞混,事实上这两个错误是完全不同的。我们往往花费时间去不断尝试一些其他的方法去解决这个问题,而没有真正去理解这个错误的原因。这篇文章就是通过解决NoClassDefFo

2022-03-18 11:21:07 3357

原创 java_web用户的自动登录模块的实现

javaBean的代码:更多Java学习教程薇老师:hua2021eipackage bean;import java.io.Serializable;public class Admin implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private Integer id; private String na...

2022-03-17 09:53:57 394

原创 Java类加载器ClassLoader总结

JAVA类装载方式,有两种:1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。 2.显式装载, 通过class.forname()等方法,显式加载需要的类类加载的动态性体现:一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是

2022-03-16 11:02:34 404

原创 以用户注册功能模块为例浅谈MVC架构下的JavaWeb开发流程

JavaWeb应用开发,撇开分布式不谈,只讨论一个功能服务应用的开发,无论是使用原生的Servlet/JSP方案,还是时下的SSM架构,都有一套经过工程实践考验的最佳实践,这综合考虑了团队协作、项目管理、可用性等方方面面的问题。一些约定考虑到项目管理的方便,一般前端不能直接访问到jsp页面,而是必须通过Servlet来管理到Jsp页面的跳转<li><a href="${pageContext.request.contextPath}/UserServlet?method=

2022-03-15 11:03:48 1050

原创 40个Java多线程问题总结

前言这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。1、多线程有什么用?(1)发挥多核CPU的优势随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核C.

2022-03-14 11:34:39 133

原创 从0开始 独立完成企业级Java电商网站开发(服务端)

数据表结构设计关系设计为什么不用外键?分库分表有外键会非常麻烦,清洗数据也很麻烦。数据库内置触发器也不适合采用。查业务问题的后悔药——时间戳更多Java学习教程+薇老师:hua2021eicreate_time 数据创建时间update_time 数据更新时间可以用于查询业务,主要要存储datetime类型。用户模块用户表create table mmall_user(id int(11) PRIMARY key not null auto_increment

2022-03-13 20:58:49 2168

原创 我的面试标准:1.能干活;2.Java基础好;3.熟悉分布式框架

我的面试标准在上周,我密集面试了若干位 Java 后端的候选人,工作经验在3到5年间。我的标准其实不复杂: 第一能干活; 第二 Java 基础要好; 第三最好熟悉些分布式框架; 我相信其它公司招初级开发时,应该也照着这个标准来面的。我也知道,不少候选人能力其实不差,但面试时没准备或不会说,这样的人可能在进团队干活后确实能达到期望,但可能就无法通过面试,但面试官总是只根据面试情况来判断。但现实情况是,大多数人可能面试前没准备,或准备方法不得当。要知道,我们平时干活更偏

2022-03-13 11:14:48 104

原创 再有人问你分布式事务,把这篇扔给他

前言不知道你是否遇到过这样的情况,去小卖铺买东西,付了钱,但是店主因为处理了一些其他事,居然忘记你付了钱,又叫你重新付。又或者在网上购物明明已经扣款,但是却告诉我没有发生交易。这一系列情况都是因为没有事务导致的。这说明了事务在生活中的一些重要性。有了事务,你去小卖铺买东西,那就是一手交钱一手交货。有了事务,你去网上购物,扣款即产生订单交易。事务的具体定义事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一

2022-03-12 12:09:22 97

转载 JAVA Future类详解

前言在高性能编程中,并发编程已经成为了极为重要的一部分。在单核CPU性能已经趋于极限时,我们只能通过多核来进一步提升系统的性能,因此就催生了并发编程。由于并发编程比串行编程更困难,也更容易出错,因此,我们就更需要借鉴一些前人优秀的,成熟的设计模式,使得我们的设计更加健壮,更加完美。而Future模式,正是其中使用最为广泛,也是极为重要的一种设计模式。今天就跟阿丙了解一手Future模式!生活中的Future模式为了更快的了解Future模式,我们先来看一个生活中的例子。场景1:午

2022-03-11 19:48:39 418

原创 Java:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题

一. JVM内存区域的划分1.1 java虚拟机运行时数据区java虚拟机运行时数据区分布图:JVM栈(Java Virtual Machine Stacks): Java中一个线程就会相应有一个线程栈与之对应,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈,因此栈存储的信息都是跟当前线程(或程序)相关信息的,包括局部变量、程序运行状态、方法返回值、方法出口等等。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 堆(Heap): 堆是所有线程共

2022-03-11 12:30:25 271

原创 Java代码优化六大原则

单一职责代码优化第一步,单一职责原则 (Single Responsibility Principle)。对于一个Java类,应该仅有一个引起它变化的原因,也就是说,一个类中,应该是一组相关性很高的函数、数据的封装。但是这个原则的界限划分的并不是那么清晰,很大程度上要依赖于开发者的个人经验来定。对于单一职责界限的划分最大的问题就是类的职责是什么,如何划分类的职责。单一职责原则在我们实际工作中随处可见,例如在我们比较关心的框架MVC,MVP中,负责页面展示的Activity,Fragment,以及各.

2022-03-10 11:23:11 634

原创 【MongoDB for Java】Java操作MongoDB

1、 下面建立一个JavaProject工程,导入下载下来的驱动包。即可在Java中使用mongoDB,目录如下:二、Java操作MongoDB示例在本示例之前你需要启动mongod.exe的服务,启动后,下面的程序才能顺利执行;1、 建立SimpleTest.java,完成简单的mongoDB数据库操作Mongo mongo = new Mongo();这样就创建了一个MongoDB的数据库连接对象,它默认连接到当前机器的localhost地址,端口是27017。D..

2022-03-09 13:01:44 674

空空如也

空空如也

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

TA关注的人

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