自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (4)
  • 收藏
  • 关注

原创 Java中的反射

反射的引入模块之间有关系—耦合度(高内聚、低耦合)一、反射的概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.以上的总结就是什么是反射反射就是把java类中的各种成分映射成一个个的Java

2020-09-03 15:53:39 169

原创 jdk1.5与jdk1.8的新特性

jdk1.5新特性1.静态导入可以导入静态方法,可以直接使用静态导入信息会优先加载package cn.tedu.jdk.jdk5;//静态导入import static java.lang.Math.*;public class StaticImportDemo { public static void main(String[] args) { // System.out.println(random()); System.out.

2020-09-03 15:02:52 441

原创 Java网络编程的UDP协议与TCP协议

网络编程是基于网络进行数据传输I(IO流)。参考模型一、UDP协议:底层基于流,传输不建立连接,不安全(不可靠)但是速度快适用场景:直播、视频、音频等等底层根据数据包(64KB)来进行数据传输1.1发送端1.创建UDP发送端对象2.创建数据包(指定IP地址、端口号以及要发送数据)3.发送数据包4.关流public static void main(String[] args) throws IOException { //创建UDP发送端的对象 DatagramSo

2020-09-03 14:54:52 204

原创 java中file类和IO流的定义以及使用

File类概述:1.File:翻译是文件,用于表达java中的路径名。2.路径:用于表示文件或者文件夹在当前系统中的位置3.路径的分类:绝对路径,没有任何的歧义,也没有任何的前提条件,Windows,从盘符开始的路径,例如"D:/a/b/c/d/a.txt"相对路径,相对于某个文件的路径。构造方法:1.File(String path)将一个字符串描述的路径,封装成一个 File对象。2.File(String parent,String Child)将两个字符串(父级路径, 子级路径

2020-08-25 18:22:07 836

原创 java中ArrayList的概念和用法

一.简介Java.util.ArrayList类是一个动态数组类型,可以随时从链表中添加或删除一个元素。ArrayList实现了List接口并且可以动态改变大小的。当我们不知道数据元素的个数时,就可使用ArrayList;如果知道数据元素个数,就可以直接用数组。二.实现List lists = new ArrayList();(其中的String可以改为integer,double等类型)注:ArrayList对象只能存放对象,不能存放基础数据类型的数据。三.构造函数ArrayList中定义了三

2020-08-24 18:05:04 542

原创 内部类(成员内部类、静态内部类、方法内部类)

一:成员内部类:最常见的内部类就是成员内部类,也称作普通内部类;1、Inner类定义在Outer类的内部,相当于Outer类的成员变量的位置,Inner类可以使用任意访问修饰符,如:public、private、protected等。2、Inner类中定义的test()方法可以访问Outer类中的数据,不受访问控制符的影响。3、 定义了成员内部类后,必须使用外部类对象来创建内部类对象,而不能直接去 new 一个内部类对象,即:内部类 对象名 = 外部类对象.new 内部类( );如创建Inner的内

2020-08-21 23:26:01 210

原创 String 、StringBuffer和StringBuilder的区别

为什么出现StringBuffer和StringBuilder?String 字符串是不可变的字符序列,一旦存在,不能修改,如果出现了字符串拼接,那么不能在常量池中已经存在的字符串的内存上追加内容,必须在常量池另外开辟一块新内存来存放拼接的新的字符串内容,在实际开发中,如果有大量的拼接字符串操作,则意味着要在常量池里开辟更多的新内存来存放拼接的对象,那么方法区的内存就可能会逐渐被占满。造成内存空间的浪费,给java的方法区字符串常量池带来很大的压力。所以出现了可变的字符序列=========》String

2020-08-20 14:18:24 429

原创 Java中常见的异常

作为一只敬业bai的程序员,就是不能接受我的编程du出现bug!可见我们对zhibug是如此的深恶痛觉!它已成为我们dao职业生涯中的拦路虎,所以今天精心为大家总结一下Java中常见的几种异常,望大家多多注意。1、java.lang.NullPointerException(空指针异常)调用了未经初始化的对象或者是不存在的对象。经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等。对数组操作中出现空指针, 即把数组的初始化和数组元素的初始化混淆起来了。数组的初始化是对

2020-08-19 20:07:57 211

原创 Java中的包装类和基础类型数据比较大小的关系

1.概念为了方便、快捷的去操作基本类型数据,java提供基本类型对应的包装类。只能创建出包装类的对象就能提供操作基本类型的数据的便捷性。2.运用规则1.int和int之间,用比较,肯定为true。基本数据类型没有equals方法2.int和Integer比较,Integer会自动拆箱, 和 equals都肯定为true3.int和new Integer比较,Integer会自动拆箱,调用intValue方法, 所以 == 和 equals都肯定为true4.Integer和Integer比较的

2020-08-18 18:52:09 1011

原创 java中String的概念以及重要方法的使用

1.概念String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。String类底层是根据不可改变字符数组来实现数据存储,String类对象的内容无法改变(常量)java中所有的常量存储在方法区的运行时常量池当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用(共享)//下面创建了几个对象?5个对象String str=“a”;//1str+=“b”;//str=new StringBuilder(“a”).append(“b”).toStr

2020-08-17 18:05:25 162

原创 API的概念以及重要方法的使用

API—Application Programming Interfaces(提供一系列的接口以及接口下的类)API里提供的所有方法要么是被protected修饰要么就是不写(public)1.概念Object类是java的顶级父类,每个类默认继承Object类。2.重要方法**1.clone()????*把原对象的属性值赋值到新对象中并且把新对象进行返回类实现Cloneable接口产生对象才能支持克隆操package cn.tedu.object;//当类实现Cloneable接口产生的

2020-08-17 16:05:29 452

原创 Java中接口的定义以及与抽象类的区别

interface(接口)1.概念当抽象类中所有的方法都是抽象方法时可以把抽象类变成接口来表示(用interface)。接口本质不是一个类,类和接口之间通过implements产生关联关系—实现。java支持接口与接口之间是多继承,类与接口之间是多实现就是为了实现类能具有更多丰富的功能。实现类需要重写接口所有的抽象方法但是如果不想都重写需要把实现类变成抽象类。注意:1.接口里的方法都是抽象方法?接口里的方法都是抽象方法(和版本有关系)2.接口里可以定义构造方法?不能定义3.接口可以创建对象?不能

2020-08-14 18:43:48 137

原创 java中抽象类的定义

一、抽象类的基本概念抽象方法,只声明而未实现的方法我们称为抽象方法,所有的抽象方法都需要用abstract关键字声明,包含抽象方法的类也需要使用abstract关键字声明,抽象类和普通类相比,区别在于抽象类带有抽象方法,抽象方法可以只声明,而不需要方法体。代码演示:package cn.tedu.abstractx; public abstract class People{ private String name; //声明抽象方法,没有方法体,直接分号结束 public abstract

2020-08-13 15:53:42 2448

原创 java中重写和重载的区别以及定义

经过这几天的学习,我经常将重写和重载搞混,今天终于弄清楚了,来篇博客记录一下喽!重载(Overload)和重写(Override)的区别:方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(

2020-08-12 16:46:09 3631

原创 java中继承的定义与实现

1.继承1.1概念如果多个类的内容出现重复,把重复的内容放到一个新的类中,通过extends关键字让原来的类和新的类产生关联关系—继承。原来的类是子类,新的类是父类。子类可以继承父类部分信息(父类的私有化信息、构造方法以及构造代码块不能被继承)。class Person { private String name; private int age; public String getName() { return name; } publ

2020-08-12 11:58:35 800

原创 java基本语法---面向对象--static和final关键字

1.static(静态)关键字,修饰符 变量、方法、代码块、内部类2.静态变量静态变量随着类的加载(方法区的静态常量池)而加载到方法区的静态区,与类同级也叫类变量,通过类名.形式来调用静态变量也可以通过对象来调用静态变量。存储在方法区静态区时会默认给静态变量赋予系统默认初始值。类产生的对象共享同一个静态变量。看静态变量是否需要被所有的对象来共享,如果需要共享就设置成静态变量。方法里可以定义静态变量?静态变量与类同级,只有方法被调用时里面的内容才能出现,前后矛盾,不能定义package

2020-08-11 18:24:54 91

原创 Java面向对象的特征

1.继承1.1概念如果多个类的内容出现重复,把重复的内容放到一个新的类中,通过extends关键字让原来的类和新的类产生关联关系—继承。原来的类是子类,新的类是父类。子类可以继承父类部分信息(父类的私有化信息、构造方法以及构造代码块不能被继承)。packagecn.tedu.extendsx;publicclassExtendsDemo1{publicstaticvoidmain(String[]args){//创建子类对象---医生类对象Doctord=newDoctor();d.trea

2020-08-10 18:22:31 132

原创 Java基本语法----数据类型

1. 基本数据类型(4类8种)整型: 空间大小(字节) 范围byte(字节) 1 -27~27-1(-128~127)short(短整型) 2 -215~215-1(-32768~32

2020-08-07 19:31:31 93

原创 Java基本语法---数组

1.概念可以存储多个相同数据类型元素的容器2.定义格式1.数据类型[] 数组名=new 数据类型[元素个数/数组长度];int[] arr=new int[3];//指定长度数据类型 名称=初始化;//定义变量变量定义分为声明和初始化两个过程可以分为声明和初始化两个过程通过唯一的内存地址值(数组名)来确定数组,java自动给数组元素进行编号(下标),从0开始。由内存地址值和下标就能唯一确定数组里元素—数组名[下标]。2.数据类型[] 数组名=new 数据类型[]{元素值1,元素值2,…}

2020-08-06 14:21:19 246

原创 java键盘录入

步骤1.导包—获取信息的位置import java.util.Scanner;2.找到ScannerScanner sc=new Scanner(System.in);3.获取数据int num=sc.nextInt();//获取整数String s=sc.nextLine();//获取一行//1.导包import java.util.Scanner;class JavaDemo{public static void main(String[] args) {//2.找到Sc

2020-08-05 18:48:19 148

原创 java流程控制语句

1.顺序结构绝大部分代码从上往下由左往右依次编译和执行class JavaDemo{public static void main(String[] args) {System.out.println("欢迎来到英雄联盟!!!");System.out.println("敌军还有30s到达战场");System.out.println("全军出击");System.out.println("FisrtBlood!!!");System.out.println("Defeat!!!");}

2020-08-04 19:13:04 600

原创 java的几种运算符以及优先级

运算符1.算数运算符+、-、 *、 / 、 % 、++、 --、使用方式:单独使用 参与计算当++、–出现在操作数的后面时,先传值再自加/自减当++、–出现在操作数的前面时,先自加/自减再赋值byte、short、char做++/–时。底层会默认添加强转类型转换2.赋值运算符把右边的值赋值给左边扩展赋值运算符(底层强制类型转换)+=、 -=、 *=、 /=、 %=、 &=(按位与等)、 |=、 ^=、>>=(右移等)、 <<=(左移等) 、&

2020-08-04 12:59:30 1111

原创 大数据的入门第一步---Java(一)

java简介1.java引入从1993左右推出一款高级编程语言(Oak 橡木),面向互联网编程,安全可靠、面向对象、跨平台等特点2.java基本语法—跨平台(操作系统)JVM(java虚拟机) 先在对应操作系统上安装上对应版本的JVM,把应用程序放到JVM里进行执行,传入相同的应用程序保证在不同操作系统上得到的结果是一样的,屏蔽底层操作系统差异性3.java三大技术架构J2se(基础版/标准版)—给小型应用程序以及桌面服务提供开发的解决方案J2ee(企业版)—给企业中的集中式开发提供解决

2020-08-03 21:46:07 149

原创 搭建mycat 分片服务器

1 案例1:搭建mycat 分片服务器1.1 问题• 数据库主机 192.168.4.55 使用db1库存储数据• 数据库主机 192.168.4.56 使用db2库存储数据• 主机 192.168.4.54 运行mycat服务,逻辑库名称为test,连接用户名为admin,密码123456• 在主机 192.168.4.254 访问测试配置1.2 方案准备四台主机,搭建mycat分片服务器,通过某种特定条件,将存放在一个数据库(主机)中的数据,分散存放到多个数据库(主机)中,已达到分散单台设

2020-08-02 21:57:48 247

原创 MySQL数据库-----视图的的相关操作

1 案例1:视图的基本使用1.1 问题• 把/etc/passwd文件的内容存储到db9库下的user表里• 添加新字段id 存储记录的行号(在所有字段的前边)• 创建视图v1 结构及数据user表的字段、记录一样。• 创建视图v2 只有user表shell是/bin/bash用户信息 。• 分别对视图表和基表执行insert update delete 操作。• 删除视图v1 和 v21.2 步骤实现此案例需要按照如下步骤进行。步骤一:视图的基本使用什么是视图:是一种虚拟存在的表内

2020-08-01 22:52:11 204

原创 MySQL数据库的MNA集群环境配置

1 案例1:准备MHA集群环境1.1 问题• 准备6台虚拟机,并按照本节规划配置好IP参数• 在这些虚拟机之间实现SSH免密登录• 在相应节点上安装好MHA相关的软件包1.2 方案使用6台RHEL 7虚拟机,如图-1所示。准备集群环境,安装依赖包,授权用户,配置ssh密钥对认证登陆,所有节点之间互相以root秘钥对认证登录,管理主机以root密钥对认证登录所有数据节点主机,配置mha集群。图-1IP规划,如图-2所示:图-21.31.4 步骤实现此案例需要按照如下步骤进行。步骤

2020-07-31 21:42:23 249

原创 MySQL数据库的主从配置(二)

1 案例1:实现MySQL读写分离1.1 问题• 搭建一主一从结构• 配置maxscale代理服务器• 测试分离配置1.2 方案使用4台RHEL 7虚拟机,如图-1所示。其中192.168.4.10和192.168.4.20,分别提供读、写服务,均衡流量,通过主从复制保持数据一致性,由MySQL代理192.168.4.100面向客户端,收到SQL写请求时,交给服务器A处理,收到SQL读请求时,交给服务器B处理。linux客户机用于测试配置,可以使用真机代替图-11.3 步骤实现此案例需要

2020-07-30 22:32:48 170

原创 mysql数据库的主从配置(一)

1 案例1:MySQL一主一从1.1 问题• 构建 主–>从 复制结构• 其中主机192.168.4.10作为主库• 主机192.168.4.20作为从库1.2 方案使用2台RHEL 7虚拟机,如图-1所示。其中192.168.4.10是MySQL主服务器,负责提供同步源;另一台192.168.4.20作为MySQL从服务器,通过调取主服务器上的binlog日志,在本地重做对应的库、表,实现与主服务器的AB复制(同步)。图-1提前为两台MySQL服务器安装好MySQL-server、

2020-07-30 14:11:20 258

原创 MySQL的基本操作(五)

1 数据备份与恢复1.1 问题本案例要求熟悉MySQL的备份与恢复,完成以下任务操作:• 逻辑备份工具 mysqldump• 使用mysql 恢复数据库1.2 步骤实现此案例需要按照如下步骤进行。步骤一:使用mysqldump进行逻辑备份1)备份MySQL服务器上的所有库将所有的库备份为mysql-all.sql文件: [root@zlz~]# mysqldump -u root -p --all-databases > /root/alldb.sql Enter passw

2020-07-26 14:26:35 271

原创 MySQL的基本操作(四)

1 MySQL管理工具1.1 问题• 部署LAMP+phpMyAdmin平台1.2 方案安装httpd、mysql、php-mysql及相关包启动httpd服务程序解压phpMyAdmin包,部署到网站目录配置config.inc.php,指定MySQL主机地址创建授权用户浏览器访问、登录使用今天课程需要使用1台RHEL7虚拟机,其中一台作为数据服务器(192.168.4.6)、另外一台作为测试用的Linux客户机(192.168.4.254)。照如下步骤进行。步骤一:准备软件的运行

2020-07-25 20:52:13 206

原创 MySQL数据库的基本操作(三)

1 MySQL存储引擎的配置1.1 问题本案例要求MySQL数据存储引擎的使用,完成以下任务操作:• 查看服务支持的存储引擎• 查看默认存储类型• 更改表的存储引擎• 设置数据库服务默认使用的存储引擎1.2 步骤实现此案例需要按照如下步骤进行。步骤一:查看存储引擎信息登入MySQL服务器,查看当前支持哪些存储引擎。使用mysql命令连接,以root用户登入: [root@zlz ~]# mysql -u root –p Enter password: Welcome to

2020-07-24 22:49:24 319

原创 数据库密码忘记了,可以这样操作

1.修改主配置文件,添加skip-grant-tables #vim /etc/my.cnf [mysqld] skip-grant-tables //跳过授权表 2.重启mysql #systemctl restart mysqld 3.无需输入密码进入mysql,执行修改密码的命令,刷新并退出 #mysql -u root -p 直接回车进入数据库,无需输入密码 mysql>show databases; mysql>use mysql; mys.

2020-07-24 09:32:50 299

原创 MySQL的基本操作(二)

1 修改表结构1.1 问题本案例要求熟悉MySQL库中表的字段修改,主要练习以下操作:• 添加字段• 修改字段名• 修改字段类型• 删除字段1.2 步骤实现此案例需要按照如下步骤进行。步骤一:添加字段在studb中创建tea6表 mysql> CREATE TABLE studb.tea6(id int(4) PRIMARY KEY, -> name varchar(4) NOT NULL, -> age int(2) NOT NULL -> );

2020-07-23 22:52:40 169

原创 MySQL的基本操作(一)

1 构建MySQL服务器1.1 问题本案例要求熟悉MySQL官方安装包的使用,快速构建一台数据库服务器:• 安装MySQL-server、MySQl-client软件包• 修改数据库用户root的密码• 确认MySQL服务程序运行、root可控1.2 方案本课程将使用64位的RHEL 7操作系统,MySQL数据库的版本是5.7.17。访问http://dev.mysql.com/downloads/mysql/,找到MySQL Community Server下载页面,平台选择“Red Ha

2020-07-22 21:48:12 282

原创 NSD SHELL DAY(七)

1 案例1:编写一键部署软件脚本1.1 问题本案例要求编写脚本实现一键部署Nginx软件(Web服务器):• 一键源码安装Nginx软件• 脚本自动安装相关软件的依赖包• 脚本自动判断yum是否可用1.2 步骤实现此案例需要按照如下步骤进行。步骤一:准备工作1)判断yum源是否可用通过yum repolist查看软件包数量是否大于0: [root@zlz ~]# yum repolist [root@zlz ~]# yum repolist | awk '/repolist/{

2020-07-22 20:51:52 95

原创 NSD SHELL DAY(六)

1 案例1:使用awk提取文本1.1 问题本案例要求使用awk工具完成下列过滤任务:• 练习awk工具的基本用法• 提取本机的网卡流量、根分区剩余容量、获取SSH远程失败的IP地址• 格式化输出/etc/passwd文件中的用户名、UID、宿主目录信息1.2 步骤实现此案例需要按照如下步骤进行。步骤一:awk文本过滤的基本用法1)基本操作方法格式:awk [选项] ‘[条件]{指令}’ 文件其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。Awk过滤数据时支持仅打

2020-07-21 21:16:41 187

原创 NSD SHELL DAY(五)

1 案例1:sed基本用法1.1 问题本案例要求熟悉sed命令的p、d、s等常见操作,并结合正则表达式,完成以下任务:• 删除文件中每行的第二个、最后一个字符• 将文件中每行的第一个、第二个字符互换• 删除文件中所有的数字• 为文件中每个大写字母添加括号1.2 方案sed文本处理工具的用法:用法1:前置命令 | sed [选项] ‘条件指令’用法2:sed [选项] ‘条件指令’ 文件… …相关说明如下:• 条件可以是行号或者/正则/• 没有条件时,默认为所有条件•

2020-07-20 21:36:09 136

原创 NSD SHELL DAY(四)

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。1 案例1:字符串截取及切割1.1 问题使用Shell完成各种Linux运维任务时,一旦涉及到判断、条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串。1.2 方案子串截取的三种用法:${变量名:起始位置:长度

2020-07-19 21:30:00 131

原创 NSD SHELL DAY(三)

1 案例1:使用for循环结构1.1 问题本案例要求编写一个Shell脚本chkhosts.sh,利用for循环来检测多个主机的存活状态,相关要求及说明如下:• 对192.168.4.0/24网段执行ping检测• 脚本能遍历ping各主机,并反馈存活状态1.2 方案在Shell脚本应用中,常见的for循环采用遍历式、列表式的执行流程,通过指定变量从值列表中循环赋值,每次复制后执行固定的一组操作。for循环的语法结构如下所示:1. for 变量名 in 值列表2. do3.

2020-07-18 21:55:24 112

原创 NSD SHELL DAY(二)

1 案例1:Shell中的数值运算1.1 问题本案例要求熟悉Linux Shell环境的特点,主要练习以下操作:• 使用expr、KaTeX parse error: Undefined control sequence: \* at position 168: …expr命令乘法操作应采用 \̲*̲ 转义,避免被作为Shell通…符号。首先定义变量X=1234,然后分别计算与78的加减乘除和求模运算结果:[root@svr5 ~]# X=1234

2020-07-17 21:42:11 117

JavaWEB.xmind

随着网络的发展,很多线下业务开始向网上发展,基于Internet的web应用也变得越来越复杂用户所访问的资源已不仅仅局限于服务器硬盘上存放的静态网页,更多的应用需要根据用户的请求动态生成网页信息,复杂的还需要从数据库中提取信息,经过一定的运算,生成一个页面返回给客户。WEB知识点较多,零散琐碎,下面是我小小的总结。

2020-09-08

数据库基础小总结.doc

数据库也是计算机类笔试面试中不可避免会遇到的考点,尤其是银行和部分传统软件类公司。这里根据整理的资料,对数据库基础的相关知识也做个总结吧。希望学过数据库但长时间不用的同学根据这些知识能够回忆和重拾,没学过的同学能掌握一些数据库的基础知识。

2020-09-03

JAVASE.xmind

这是我之前复习Java基础原理过程中写的Java基础知识点总结。Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其底层实现原理。 纸上得来终觉浅,绝知此事要躬行。笔者之前对每部分的内容对做了比较深入的学习以及代码实现,基本上比较全面地讲述了每一个Java基础知识点,当然可能有些遗漏和错误,欢迎读者指正。

2020-09-03

Mysql.xmind

数据库是用于存储和管理数据的仓库,在这个数据每秒更新的时代,瞅瞅它有啥牛逼的地方。MySQL数据库软件的相关操作都在此

2020-07-30

空空如也

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

TA关注的人

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