友农
码龄4年
关注
提问 私信
  • 博客:70,721
    社区:12
    70,733
    总访问量
  • 50
    原创
  • 793,251
    排名
  • 28
    粉丝

个人简介:一名大学生

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:北京市
  • 加入CSDN时间: 2020-07-24
博客简介:

m0_49622667的博客

查看详细资料
个人成就
  • 获得50次点赞
  • 内容获得14次评论
  • 获得255次收藏
  • 代码片获得315次分享
创作历程
  • 9篇
    2023年
  • 18篇
    2022年
  • 20篇
    2021年
  • 3篇
    2020年
成就勋章
TA的专栏
  • Kotlin
    9篇
  • MySQL
    4篇
  • spring
    1篇
  • javaWeb
    2篇
  • 数据结构
    4篇
  • 多线程
    9篇
  • java基础
    6篇
  • C语言
    4篇
  • 数据库
    2篇
兴趣领域 设置
  • 大数据
    mysql
  • 服务器
    linux
创作活动更多

如何做好一份技术文档?

无论你是技术大神还是初涉此领域的新手,都欢迎分享你的宝贵经验、独到见解与创新方法,为技术传播之路点亮明灯!

180人参与 去创作
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Kotlin新手教程九(协程)

async实际上启动了一个单独的协程,与launch类似,但是launch返回一个Job且无附带任何结果值,async返回一个Deferred(一个轻量级的非阻塞future),可以使用.await()在一个延期时间取得最终的值。注意,如果只是在 println 中调用了 await() 而不首先调用 start() ,这将形成顺序行为,因为 await() 会启动协程并等待其完成,这不是 lazy 模式的预期结果。} 内部的代码块提取到独立的函数中。如果我们忘记保持对新启动的协程的引用,它还会继续运行。
原创
发布博客 2023.02.22 ·
1224 阅读 ·
1 点赞 ·
1 评论 ·
1 收藏

Kotlin新手教程八(泛型)

然而, 内联函数的具体化的类型参数会由调用处内联函数体中的类型实参所代入,因此可以用于类型检测与转换, 与上述泛型类型的实例具有相同限制。运行时泛型类型的实例不保留关于其类型实参的任何信息。有些时候, 你可能想表示你并不知道类型参数的任何信息, 但是仍然希望能够安全地使用它. 这里所谓"安全地使用"是指, 对泛型类型定义一个类型投射, 要求这个泛型类型的所有的实体实例, 都是这个投射的子类型。in可以使类型参数逆变,只能用作输入,也就是可以作为入参的类型但是无法作为返回值的类型。(消费者使用)修饰符。
原创
发布博客 2023.02.21 ·
747 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Kotlin新手教程七(委托)

委托模式是软件设计模式中的一项基本技巧。在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。kotlin中使用by实现委托。
原创
发布博客 2023.02.21 ·
528 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

Kotlin新手教程六(数据类、密封类、枚举类、泛型)

在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例。有些时候, 你可能想表示你并不知道类型参数的任何信息, 但是仍然希望能够安全地使用它. 这里所谓"安全地使用"是指, 对泛型类型定义一个类型投射, 要求这个泛型类型的所有的实体实例, 都是这个投射的子类型。一个枚举类可以实现接口(但不能从类继承),可以为所有条目提供统一的接口成员实现,也可以在相应匿名类中为每个条目提供各自的实现。泛型一般可以用于类、接口、方法上。
原创
发布博客 2023.02.20 ·
523 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

Kotlin新手教程五(扩展)

这样的扩展可以在对象变量上调用, 即使其值为 null,并且可以在函数体内检测 this == null,这能让你在没有检测 null 的时候调用 Kotlin 中的toString():检测发生在扩展函数的内部。这就是因为扩展函数式静态分发的:调用的扩展函数是由函数调用所在的表达式的类型来决定的, 而不是由表达式运行时求值结果决定的。对于分发接收者与扩展接收者的成员名字冲突的情况,扩展接收者优先。扩展听起来很强大,但实际不是真正的修改他们所拓展的类,仅仅是可以通过使用该类型的变量用点表达式调用新函数。
原创
发布博客 2023.02.17 ·
1307 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Kotlin新手教程四(抽象类和接口)

上例中D调用 super< A >.foo()和 super< B >.foo(),所以如果调用D的foo方法就会输出AB,我们也可以选择调用任意一个,这样其实是比Java更好的,因为在Java里面如果要实现多个接口,且里面有重复的方法名,那么其实覆盖不覆盖也无所谓,因为没有方法体。这一规则既适用于继承单个实现(bar())的方法也适用于继承多个实现(foo())的方法。通过 SAM 转换, Kotlin 可以将其签名与接口的单个抽象方法的签名匹配的任何 lambda 表达式转换为实现该接口的类的实例。
原创
发布博客 2023.02.17 ·
561 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Kotlin新手教程三(类与继承)

在构造派生类的新实例的过程中,第一步完成其基类的初始化(在之前只有对基类构造函数参数的求值),因此发生在派生类的初始化逻辑运行之前。也就是说,当你实例化一个子类时,首先会初始化父类的主构造方法,父类的初始化代码块和初始化属性,接下来才是子类的。2.主构造器不能包含除属性声明的任何代码块,初始化的代码可以放到以init关键字作为前缀的初始代码块中。注:使用override修饰的方法实际效果也相当在重写的情况下使用open修饰了,如果不想再被其子类重写,那么可以使用final修饰。
原创
发布博客 2023.02.17 ·
1441 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。和 Java 不一样,Kotlin 中的 Char 不能直接和数字操作(但是可以显示把字符转换为数字),Char 必需是单引号 ’ 包含起来的。数组在 Kotlin 中使用 Array 类来表示,它定义了 get 与 set 函数(按照运算符重载约定这会转变为 [])以及 size 属性,以及一些其他有用的成员函数。这里虽然都是将num的值赋值给a和b,但是Int?
原创
发布博客 2023.02.16 ·
730 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

Kotlin新手教程一(Kotlin简介及环境搭建)

Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,它也可以被编译成为 JavaScript 源代码(方便在没有JVM的设备上运行)。它主要是由俄罗斯圣彼得堡的 JetBrains 开发团队所发展出来的编程语言,其名称来自于圣彼得堡附近的科特林岛。
原创
发布博客 2023.02.16 ·
2319 阅读 ·
0 点赞 ·
0 评论 ·
6 收藏

Java虚拟机(JVM)

JVM是Java Virtual Machine的简称,翻译过来就是java虚拟机。虚拟机是指通过软件模拟具有完整硬件功能的、运行在一个完全隔离环境中的完整计算机系统。java能够那么火热,JVM功不可没。java的宣传口号是“一次编写,处处运行”,依靠的就是JVM,那么这个功能是怎么实现的呢?因为当你在IDE上写完代码编译后,JVM会为其生成一个.class文件,也叫字节码。当你把这个字节码放到另外一个系统上,只要都安装了JVM,那么这个java程序也能在另一个系统中运行。...
原创
发布博客 2022.08.11 ·
943 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

规避这些坑,能让你在查询数据库时更快

在数据库中,对于查询操作比较频繁的表,可以使用索引,索引又分为主键索引和非主键索引(有人也分为聚簇索引和非聚簇索引),我们先来看看主键索引是如何提高查询性能的。索引经历了几个阶段,第一个阶段使用的是二叉树,将数据直接存储在各个节点上,虽然相对一般查询来说也提高了效率,但是由于层级太高,查询和维护的时候都比较麻烦;第二阶段是B-数,此时也是将数据存储在各个节点上,虽然提高了维护效率,但是加载全部的信息还是需要不少的时间;第三阶段是B+数,该阶段将索引存储到B+树上,非叶子节点不存储数据,叶子节点也不存储数据,
原创
发布博客 2022.07.12 ·
646 阅读 ·
2 点赞 ·
0 评论 ·
3 收藏

带你快速学习Spring

Spring的官方解释很多,总的来说Spring就是包含了众多⼯具⽅法的 IoC 容器。工具方法很容易理解,这里不再赘述,容器的话只要你学过java,多多少少会接触一些容器,比如Map,List这类存放数据的容器;再比如Tomcat是Web容器,但是loC这个词貌似就很陌生了,接下来我们着重学习什么是loC。loC 是英文 Inversion of Control 的缩写,翻译过来就是控制反转 。所以Spring实质上就是一个“控制反转”的容器。接下来我们通过例子理解什么是控制反转。传统造车假设传统
原创
发布博客 2022.07.10 ·
462 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

MySQL中的删除:drop,delete,truncate的区别和联系

drop是DDL(数据定义语言),用于整张表的删除,删除的时候不仅删除了表中的数据,还删除了表结构。(也就是使用drop删除表后,数据库中便查询不到该表)语法:drop table 表名;注:drop命令后不可使用where等命令。delete是DML(数据操作语言),用于对表中数据的删除,不会删除表结构,也就是说即使你使用delete from 表名;将表中所有数据都删除了,该表依然存在。delete的删除原理:在InnoDB数据库引擎下,将要删除的数据添加一个删除标记,该表的实际大小不会产生变化
原创
发布博客 2022.06.02 ·
14468 阅读 ·
16 点赞 ·
0 评论 ·
60 收藏

你知道http协议各版本之间的区别吗?

HTTP 0.9是最初的HTTP协议,已经过时。特点:这一版本在请求和响应中加入了HTTP版本号,这一特点在之后的版本中保持不变。相对于HTTP 0.9 新增以下特性:这是目前最流行的HTTP协议,我在有时候做一些小网站的时候也会使用。相对于HTTP 1.0 新增以下特性:为了解决1.1版本利用率不高的问题,提出了HTTP/2.0版本。但目前似乎还没流行起来。主要新增特性:HTTP3.0 在2018年发布,基于谷歌的QUIC,底层使用udp代码tcp协议。主要提升:
原创
发布博客 2022.06.01 ·
2660 阅读 ·
1 点赞 ·
0 评论 ·
19 收藏

数据库和表的基本操作

1.数据库操作创建数据库:create database [数据库名]切换(进入)数据库:create database [数据库名]删除数据库:drop database [数据库名]显示所有数据库:show databases;显示当前所在数据库:select databa();2.MySQL数据类型在学习表之前,需要先学习MySQL的基本数据类型,这样更方便我们去定义表,操作表。2.1数值类型数值类型有9个(有一个为BIT(M),常用Boolean对应BIT,默认为1),大家
原创
发布博客 2022.05.31 ·
325 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

CSS选择器常见用法

一、单选择器1.id选择器id选择器使用 HTML 元素的 id 属性选择元素id选择器只能选择唯一的特定的元素,因为它在HTML页面中时唯一的选择特定的id元素,可以使用#后面加元素id# col{ color:red;}2.类选择器类选择器使用HTML元素的class属性选择元素类选择器可以选择多个class属性值相同的元素选择某一类,可以使用.加上类名.col{ color:red;}将所有类名为col的元素颜色设置为红色3.标签选择器标签选择器使用HT
原创
发布博客 2022.05.30 ·
1138 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

MySQL的安装与配置

之前学习了MySQL,但是由于时间过于久远有些知识点有些模糊,借此机会写一个系列文章,主要目的是为了更加巩固自己的知识,当然也希望能够帮助到刚接触MySQL的小伙伴,大家一起努力,一起进步。文章目录一、安装MySQL二、MySQL的配置一、安装MySQL要学习MySQL,首先我们要先把软件安装好,才能进行下一步。下载MySQL(https://downloads.mysql.com/archives/community/)通过这个网址选择不同版本的MySQL,我们这里用MySQL5.7.27作为.
原创
发布博客 2022.05.30 ·
532 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

为什么说HashMap是线程不安全的?

一、头插法导致死循环在jdk1.7以前,HashMap在进行扩容时采用的是头插法,可能当时别人觉得这样比较高效,但是也带来了线程安全问题。刚开始时HashMap是这样的:正常扩容后是这样的:但如果是在多线程下,两个线程的指向3:此时线程1比线程2先执行,那么线程1就会指向7,将线程7.next指向了3,:但是对于线程2来说,3.next=7;所以就形成了死循环,也就是3和7构成了环。二、数据覆盖在jdk1.8以后,改了1.7以前的小毛病,但是新的问题又来了,我们来看下源码:
原创
发布博客 2022.04.25 ·
5930 阅读 ·
0 点赞 ·
7 评论 ·
10 收藏

常见锁策略和CAS你真的清楚了吗?

一、常见锁策略1.1乐观锁和悲观锁乐观锁:这种锁策略表示认为数据不会发生冲突,只有在数据更新时才会对冲突进行检测,如果没有发生冲突就可以直接更新数据,如果发生冲突就将数据返回给用户,让用户自己决定处理。(下文会讲解乐观锁的实现CAS)悲观锁:这种锁策略认为数据一定会发生冲突,所以在数据被访问的时候,就给数据加上锁,直到数据处理结束释放锁。(synchronized和Lock都是使用悲观锁策略)我们在认识锁策略的时候,不能只通过名称就辨别好坏,比如乐观锁和悲观锁,听起来悲观锁更逊色一些。但其实乐
原创
发布博客 2022.04.24 ·
277 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

java中wait()和sleep()的区别

一、wait和sleep的相同点都可以使线程休眠都可以响应interrupt的相应二、wait和sleep的区别wait和sleep在参数传递上大致相同,但传递值为0时,就是天壤之别,看下面的代码:public class Demo8 { public static void main(String[] args) { Thread thread1=new Thread(()->{ System.out.println("线程一开始启动")
原创
发布博客 2022.04.20 ·
847 阅读 ·
0 点赞 ·
2 评论 ·
0 收藏
加载更多