自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

九路

大道至简,知易行难

  • 博客(95)
  • 资源 (10)
  • 收藏
  • 关注

原创 一篇文章彻底解释清楚Java的大Class到底是什么

作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 java的 Class不是太清楚,所以想写一篇关于Java Class 的文章,没有那么多专业名词,希望用通俗的语言能把Java的 Class 这个概念讲明白,理解了Class后,Java的反射也就好理解多了。Class很容易,保证看了就明白,我们先来熟悉一个最基础的概念,什么是类?什么是类?这个想必所

2020-11-28 14:39:45 274

原创 手写Java HashMap核心源码

手写Java HashMap核心源码上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码。我们来先了解一下HashMap的原理。HashMap 字面意思 hash + map,map是映射的意思,HashMap就是用hash进行映射的意思。不明白?没关系。我们来具体讲解一下HashMap的原理。HashMap 使用分析//1 存HashMap<String,String> map = new HashMap<>();map.put("n

2020-11-11 11:13:09 272 1

原创 彻底弄懂Javascript模块导入导出

笔者开始学习Javascript的时候,对模块不太懂,不知道怎么导入模块,导出模块,就胡乱一通试比如 import xx from 'test.js' 不起作用,就加个括号 import {xx} from 'test.js'反正总是靠蒙,总有一种写法是对的,其实还是没有理解,还是不懂尤其是在当初写 www.helloworld.net 网站的时候,一遇到这种问题,就懵逼了,尤其是引入第...

2022-12-24 16:48:00 94

原创 通俗大白话,彻底弄懂 https 原理本质

*单向加密:**不可逆,只要输入的内容一样,输出的密文一定是一样的,有任何修改, 产生的密文都是不同的**对称加密:**加密和解密使用同一把密钥,加密解密速度特别快使用公钥和私钥进行加密和解密,公钥加密私钥解,私钥加密公钥解。加密解密的过程非常慢所谓公钥,就是可以公开给别人的所谓私钥,就是不可以公开给别人,是自己私有保留的。注:以上内容,纯粹是加密的知识,和https没有任何关系。下面我们开始讲解https的过程。我们先看一个需求解决了这个需求,就明白了https的过程了。

2022-11-03 09:10:51 199

原创 欢迎使用Markdown编辑器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2022-02-13 10:26:17 129

原创 彻底弄懂类设计原则之 - 单一职责原则

类设计原则之 - 单一职责类的设计原则之单一职责原则,是最常用的类的设计的原则之一英文: SRP , Simple Responsibility Principle中文:单一职责原则这是面向对象类设计中的第一个原则 ,也是看起来最简单的一个原则,但是实际上远远没有这么简单,很多人不一定真正理解了!类设计,通俗的讲不是怎么去写一个类更好,应该遵循什么样的原则设计类更好。我们随便找几...

2022-01-05 11:18:00 52

原创 Python爬虫 | 批量爬取今日头条街拍美图

01前言上篇文章我们爬取了今日头条街拍美图,心情相当愉悦,今天这篇文章我们使用Selenium来爬取当当网的畅销图书排行。正所谓书中自有黄金屋,书中自有颜如玉,我们通过读书学习来提高自身的才华,自然能有荣华富贵,也自然少不了漂亮小姐姐。02准备工作在爬取数据前,我们需要安装Selenium库以及Chrome浏览器,并配置好ChromeDriver。03SeleniumSeleni...

2021-07-07 11:08:00 378

原创 10年程序员的编程语言感受与Go的结缘

因为小编最近在写两套教程,分别是Java语言基础教程和Go语言的基础教程,并且这 2 门语言,小编在实际的工作中也都有用过而且 www.helloworld.net 社区的后台,就是用Go语言写的,而且正是小编负责的。况且小编在工作中是用Java的。所以对这两门语言还算比较了解,所以本文对这 2 种语言聊聊小编自己的感受与看法,也顺便聊聊小编这10年来,各种编程语言的一些感受本文观点仅仅代表自己,仅供参考不希望引起语言好与坏之争。小编的C++开发经历最初小编我刚毕业的时候,是做C/C++开发的

2021-07-04 17:34:19 129

原创 中国十大IT技术社区,你都知道哪些?

中国5大新型IT技术社区与5大传统IT技术社区,你都知道哪些?社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流。社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚焦了IT行业内的一群技术人,在技术社区可以学习最前沿的技术,寻找解决问题的方法,认识有...

2021-06-15 10:01:00 63

原创 一篇文章通俗易懂的让你彻底理解 Java 注解

很多Java程序员,对Java的注解一知半解,更有甚者,有的人可能连注解是什么都不知道本文我们用最简单的 demo , 最通俗最短的语言,带你了解注解到底是什么?先来简单回顾一下基础,我们知道,Java 的源文件编辑后,生成 .class 文件,.Java源文件,这个是源文件时期源文件经过编译生成 .class 字节码文件,这个也是编译时期.class 加载到内存中,就可以用了,这个是运行期间如下图记住以上知识点,下面和注解有关,我们正式来讲注解本文将从以下 2 个方面来讲解注解1

2021-06-14 22:16:03 1289 1

原创 一篇文章弄懂 Java 反射的使用

说到Java反射,必须先把 Java 的字节码搞明白了,也就是 Class , 大 Class在之前的文章中,我们知道了Java的大Class就是类的字节码,就是一个普通的类,里面保存的是类的信息,还不太明白Java的大Class的,可以先看一下之前的文章 一篇文章彻底搞懂Java的大Class到底是什么先想一个问题1. 给我们一个类,我们如何使用?这还不简单,通过这个类,创建一个类的对...

2021-06-08 10:26:00 24

原创 go, iris , nuxt, 服务端渲染等技术在helloworld开发者社区中的应用与实践

大家好,helloworld.net 上线已经有近半年的时间了,转眼过的好快,在这半年的时间里,迭代了近10多个版本,优化了很多的体验,交互上的不足之处,同时也上线了我们的安卓 app, 苹果的因为还在申请开发者账号,所以暂时未上线在这半年的时间内,网友很给力,也给出了很多的建议和优化,也有不少网友说愿意为 helloworld开发者社区出一份力,在这里我感谢这些支持我们的用户,hellowo...

2021-05-27 14:37:00 25

原创 go iris nuxt 在helloworld社区中的应用

大家好,helloworld.net 上线已经有近半年的时间了,转眼过的好快,在这半年的时间里,迭代了近10多个版本,优化了很多的体验,交互上的不足之处,同时也上线了我们的安卓 app, 苹果的因为还在申请开发者账号,所以暂时未上线在这半年的时间内,网友很给力,也给出了很多的建议和优化,也有不少网友说愿意为 helloworld开发者社区出一份力,在这里我感谢这些支持我们的用户,helloworld开发者社区会一如既往的坚持免费,分享,干货的精神做一个 程序员自己的技术社区今天我们来聊聊 go, iri

2021-05-27 14:36:06 166 1

原创 博客园的整改了,我们还能去哪些技术社区写博客

前几天突然技术群里有人说,博客园好多文章页面打不开了,上网一查,原来,博客园在整改,至少一周的时间博客园都处于关站状态作为技术社区里面知名的博客写作网站,里面有很多干货,突然一下子整改了,影响还是挺大的。对于广大程序猿来说,写文章既可以理清思路,又可以通过分享技术结交到朋友。一个专业的技术社区对程序员的职业生涯来说,是很重要的,可以这么说,技术社区一般会陪伴技术人的整个职业生涯那么作为一名博客狂热者,现在还有哪些地方可以写博客(搬家)?下面小编就罗列一下常用的技术社区以及最后重点介绍一下最近新出的一

2021-03-22 17:51:48 6666 2

原创 helloworld.net 的总结以及2021年的期待

没有反思的人生不值得过!由时不时向外张望,彻底转向向内审视的一年。2020年,公历闰年,共366天,52周零2天。二十一世纪二十年代的第1年。大家好,我是待兔, helloworld.net也就是 helloworld开发者社区的创始人之一,由于前几天感冒了,你知道的,这个时间感冒是有点麻烦的,所以导致这篇文章来的稍晚了点,好饭不怕晚,晚点写有晚点写的好处,那就是有更多的时间思考2020年是不平凡的一年,肆虐全世界的新冠疫情,洪水灾害,澳洲山火灾持续五个月,非洲爆发约3600亿只蝗灾,以及科比的离开,

2021-02-26 09:54:37 494 6

原创 一个免费的开源的html转markdown语法的工具

一个免费的开源的html转markdown语法的工具大家好,我是待兔,今天为大家分享一个由 www.helloworld.net 网站开发并开源的一个非常好用的工具 html2md现在好的技术文章确实多,每天各种技术群里,各种技术社区,有很多质量非常好的技术文章,于是我们就收藏了,可是问题来了,我们收藏到哪呢?怎么收藏呢?微信群里发的文章,我们可以收藏csdn中的技术文章我们也可以注册一个账号收藏helloworld.net技术社区里面的文章再注册一个账号收藏可是技术社区好多呢,每个社区都

2021-02-07 14:12:23 581

原创 技术人员为什么一定要写技术博客?

技术人员为什么一定要写技术博客?大家好,我是待兔,也是helloworld.net创始人,今天想讲讲技术人员如何提高技术以及为什么一定要写技术博客?因为接触过很多的开发者,以及在各种技术群里,也有一些人问过我好多问题主要有以下几个大佬你是如何提高技术的?你的全栈是怎么学的?哪来的那么多时间学习技术?首先呢,我不是大佬,只是一个普通的开发者其次,我的上班时间和大学一样,忙于写公司的各种业务区别就是我下班后,周六日的时间里,会花大把的时间看技术文章,视频等,还有就是我把我学习的过程

2021-02-03 13:16:53 217

原创 中国5大新型IT技术社区与5大传统IT技术社区,你都知道哪些?

中国5大新型IT技术社区与5大传统IT技术社区,你都知道哪些?社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的技术,认识有相同爱好的朋友,在一起学习和交流。社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚焦了IT行业内的一群技术人,在技术社区可以学习最前沿的技术,寻找解决问题的方法,认识有相同爱好相同技术的朋友,可以在一起交流学习。还能认识行业内的技术大牛。技术社区一般有三类人:1.第一类人写作

2021-01-27 14:14:03 1340 1

原创 使用 Payload 提高 RecyclerView 渲染效率

RecyclerView.Adapter 中有个带有 payloads 参数的函数,由于这个函数不是抽象函数,被很多人忽略了。该函数定义如下:public void onBindViewHolder(VH holder, int position, List<Object> payloads) { onBindViewHolder(holder, position);}该函数的默认实现会调用 onBindViewHolder(holder, position) 这个抽象函数。

2020-11-29 20:28:58 1200

原创 一篇文章彻底搞懂Java的大Class到底是什么

作者在之前工作中,面试过很多求职者,发现有很多面试者对Java的 Class 搞不明白,理解的不到位,一知半解,一到用的时候,就不太会用。因为自己本身以前刚学安卓的时候,甚至做安卓2,3年后,也是对 java的 Class不是太清楚,所以想写一篇关于Java Class 的文章,没有那么多专业名词,希望用通俗的语言能把Java的 Class 这个概念讲明白,理解了Class后,Java的反射也...

2020-11-28 15:56:00 14

原创 Java实现 一篇文章说尽设计模式之六大原则

我们知道,设计模式很有用,学好设计模式不但能让你写出更简洁,优雅的代码,还能使得代码的结构更清晰,也更有利于扩展当然设计模式也不是万能的,一成不变的.设计模式只是前人总结出来的一种经验,一种特定问题的解决方法,不能看作是死的东西不一定非要生搬硬套,非得按照设计模式书上来来,只要我们写的代码符合一定的一些原则,一样可以看作是自己的模式.但是前人总结出来的东西必须非常值得我们学的.本系列23种设计模式会用最简单的例子,会用最让人明白的语言讲清楚里面的思想即可,过多的细节不会涉及,本系列所有的代码有的是自

2020-11-25 13:06:59 141

原创 Gradle系列之三 Gradle概述以及生命周期

1 Gradle是一种编程框架gradle主要由以下三部分组成1 groovy核心语法2 build script block3 gradle api注:本章所有的代码都在 https://github.com/jiulu313/gradledemo.git如下图2 Gradle的优势1 更加的灵活,因为gradle是编程框架,所以功能要强大的多2 粒度性上,源码的编译,资源的编译,都是一个一个Task的,我们可以修改task来达到精细控制上3 扩展性上,gradle有插件机制

2020-11-18 15:47:44 402 1

原创 Gradle技术之二 Groovy对文件的操作

Groovy对文件的操作对文件的遍历假设文件的原始内容为:hello,world这里是北京andorid and ios are good system第一种方法:使用 eachLine()//1.1 new 一个Filedef file = new File(filepath)//1.2 groovy对文件的遍历file.eachLine { //打印每一行内容 line -> println line}//输出hello,world这里是北京an

2020-11-18 15:46:09 799

原创 Gradle技术之一 Groovy语法精讲

Gradle技术之一 Groovy语法精讲gradle脚本是基于groovy语言开发的,想要学好gradle必须先要对groovy有一个基本的认识1. Groovy特点groovy是一种DSL语言,所谓的DSL语言,就是专门针对某一特定领域的语言,专精而不专广是一种基于JVM的开发语言,也是编译成class字节码文件结合和Python,Ruby,PHP等语言的特性,写脚本非常强大Groovy可以与Java完美结合,而且可以使用Java所有的类库语法上支持动态类型,闭包等新语言的特性支持面向

2020-11-18 10:17:06 425

原创 二分搜索树的原理与Java源码实现

1 折半查找法了解二叉查找树之前,先来看看折半查找法,也叫二分查找法在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引。如下:int[] arr = new int[]{1,3,4,6,8,9};在 arr 数组中查找6这个元素,查到返回对应的索引,没有找到就返回-1思想很简单:1 先找到数组中间元素target与6比较2 如果target比6大,就在数组的左边查找3 如果target比6小,就在数组的右边查找java实现代码如下: private

2020-11-14 17:49:04 144

原创 手写Java LinkedHashMap 核心源码

概述LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少使用算法,核心思想就是当缓存满时,会优先淘汰那些近期最少使用的缓存对象LruCache的缓存算法LruCache采用的缓存算法为LRU(Least Recently Used),最近最少使用算法。核心思想是当缓存满时,会首先把那些近期最少使用的缓存对象淘汰掉LruCache的实现LruCache底层就

2020-11-14 17:47:50 117

原创 手写Java Stack 核心源码

Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。只能在一端进行插入或者删除,即压栈与出栈栈的实现比较简单,性质也简单。可以用一个数组来实现栈结构。入栈的时候,只在数组尾部插入出栈的时候,只在数组尾部删除**我们来看一下Stack的用法 :如下 public static void main(String[] args){ //新建一个栈 Stack<String> stack = new Stack&lt

2020-11-14 17:46:20 151

原创 手写Java PriorityQueue 核心源码(2)

上一节介绍了PriorityQueue的原理,先来简单的回顾一下 PriorityQueue 的原理以最大堆为例来介绍PriorityQueue是用一棵完全二叉树实现的。不但是棵完全二叉树,而且树中的每个根节点都比它的左右两个孩子节点元素大PriorityQueue底层是用数组来保存这棵完全二叉树的。如下图,是一棵最大堆。最大堆的删除操作删除指的是删除根元素,也就是图中的100元素删除元素也就是 shiftDown操作,向下翻删除一个根元素有以下步骤:将100元素删除,将最后一个

2020-11-14 17:45:25 49

原创 手写Java PriorityQueue 核心源码(1)

本章先讲解优先级队列和二叉堆的结构。下一篇代码实现从一个需求开始假设有这样一个需求:在一个子线程中,不停的从一个队列中取出一个任务,执行这个任务,直到这个任务处理完毕,再取出下一个任务,再执行。其实和 Android 的 Handler 机制中的 Looper 不停的从 MessageQueue 中取出一个消息然后处理是一样的。不过这个需求还有一点。需要我们的任务是有优先之分的,优先高的先执行,优先级低的后执行。比如现在队列中已经有了10个任务了,现在有一个紧急的任务需要处理,怎么办?解决办法有多

2020-11-14 17:44:25 100

原创 手写LinkedList核心源码

上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素。在查找需求比较重要的情况下可以用ArrayList,如果是删除操作比较多的情况下,用ArrayList就不太合适了。Java为我们提供了LinkedList,是用链接来实现的,我们今天就来手写一个QLinkedList,来提示底层是怎么做的。如上图,底层用一个双链表,另外有两个指示器,一个指向头,一个指向尾。链表中的每个节点

2020-11-13 10:43:20 75

原创 手写ArrayList核心源码

手写ArrayList核心源码ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue,PriorityQueue等等,我们将手写这些常用的数据结构的核心源码,用尽量少的代码来揭示核心原理。下面我们来手写ArrayList的核心源码首先我们定义一个QArrayList,不要问为什么叫QArrayList,因为我之前写过Qt,仅此而已。源码 public class<T> QArr

2020-11-12 13:35:23 189 2

原创 Vue实现一个MarkDown编辑器

Vue实现一个markdown编辑器前段时间做项目的时候,需要一个Markdown编辑器,在网上找了一些开源的实现,但是都不满足需求说实话,这些开源项目也很难满足需求公司项目的需求,与其实现一个大而全的项目,倒不如实现一个简单的,易于在源码上修改的项目,核心功能都有的,以供修改使用本文的源码地址如下https://github.com/jiulu313/HelloMarkDown喜欢的...

2019-05-18 21:01:00 31

原创 7 二分搜索树的原理与Java源码实现

1 折半查找法了解二叉查找树之前,先来看看折半查找法,也叫二分查找法在一个有序的整数数组中(假如是从小到大排序的),如果查找某个元素,返回元素的索引。如下:int[] arr = new int[]{1,3,4,6,8,9};在 arr 数组中查找6这个元素,查到返回对应的索引,没有找到就返回-1思想很简单:1 先找到数组中间元素target与6比较2 如果target比6大,就...

2018-12-27 09:22:00 14

原创 6 手写Java LinkedHashMap 核心源码

概述LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少使用算法,核心思想就是当缓存满时,会优先淘汰那些近期最少使用的缓存对象LruCache的缓存算法LruCache采用的缓存算法为LRU(Least Recently Used),最近最少使用算法...

2018-12-18 08:57:00 14

原创 5 手写Java Stack 核心源码

Stack是Java中常用的数据结构之一,Stack具有"后进先出(LIFO)"的性质。只能在一端进行插入或者删除,即压栈与出栈栈的实现比较简单,性质也简单。可以用一个数组来实现栈结构。入栈的时候,只在数组尾部插入出栈的时候,只在数组尾部删除**我们来看一下Stack的用法 :如下public static void main(String[] args){ /...

2018-12-10 23:37:00 9

原创 4.2 手写Java PriorityQueue 核心源码 - 实现篇

上一节介绍了PriorityQueue的原理,先来简单的回顾一下 PriorityQueue 的原理以最大堆为例来介绍PriorityQueue是用一棵完全二叉树实现的。不但是棵完全二叉树,而且树中的每个根节点都比它的左右两个孩子节点元素大PriorityQueue底层是用数组来保存这棵完全二叉树的。如下图,是一棵最大堆。最大堆的删除操作删除指的是删除根元素,也就是图中的100...

2018-12-08 11:52:00 13

原创 4.1 手写Java PriorityQueue 核心源码 - 原理篇

本章先讲解优先级队列和二叉堆的结构。下一篇代码实现从一个需求开始假设有这样一个需求:在一个子线程中,不停的从一个队列中取出一个任务,执行这个任务,直到这个任务处理完毕,再取出下一个任务,再执行。其实和 Android 的 Handler 机制中的 Looper 不停的从 MessageQueue 中取出一个消息然后处理是一样的。不过这个需求还有一点。需要我们的任务是有优先之分的,优先高的...

2018-12-07 10:31:00 13

原创 3 手写Java HashMap核心源码

手写Java HashMap核心源码上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码。我们来先了解一下HashMap的原理。HashMap 字面意思 hash + map,map是映射的意思,HashMap就是用hash进行映射的意思。不明白?没关系。我们来具体讲解一下HashMap的原理。HashMap 使用分析//1 存HashMap<...

2018-11-28 08:52:00 13

原创 2 手写Java LinkedList核心源码

上一章我们手写了ArrayList的核心源码,ArrayList底层是用了一个数组来保存数据,数组保存数据的优点就是查找效率高,但是删除效率特别低,最坏的情况下需要移动所有的元素。在查找需求比较重要的情况下可以用ArrayList,如果是删除操作比较多的情况下,用ArrayList就不太合适了。Java为我们提供了LinkedList,是用链接来实现的,我们今天就来手写一个QLinkedList...

2018-11-25 22:44:00 16

原创 1 手写Java ArrayList核心源码

手写ArrayList核心源码ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue,PriorityQueue等等,我们将手写这些常用的数据结构的核心源码,用尽量少的代码来揭示核心原理。下面我们来手写ArrayList的核心源码首先我们定义一个QArrayList,不要问为什...

2018-11-25 16:38:00 16

DUILIB编程总结及源码

DUILIB编程总结及源码

2013-11-02

精通GDI编程

精通GDI编程

2013-11-02

QT中文帮助文档

QT中文帮助文档

2013-11-02

ResXplor.zip资源相关

ResXplor.zip资源相关

2013-10-23

P2P技术原理及代码示例

P2P技术原理及代码示例

2013-10-23

金山软件公司C++代码规范

金山软件公司C++代码规范

2013-10-23

bkwin界面框架使用说明

bkwin界面框架使用说明

2013-10-23

金山界面库源码

bkwin 金山界面库 界面库 c++

2013-10-23

editpls语法高亮文件

editplus语法高亮文件

2013-10-23

空空如也

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

TA关注的人

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