自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GO环境配置踩坑(一)——设置GOPATH

在使用SHELL命令(go install)下载第三方包的时候,经常会发现包已经下载好了,但是仍然是不能使用,这其实就是GOPATH配置方面的问题了如何配置GOPATH(mac系统)我们下载好包后仍然不能使用,很可能就是因为我们包的存放目录并不是GOPATH,所以在编译代码的时候操作系统仍旧是无法读取到相对应的包或者资源,那么我们该如何设置环境变量呢?1.找到你下载好的包的存放目录——user/local/bin我这里用user/local/bin举例子2.vim编辑/.zshrc或者etc/pr

2022-04-07 17:50:51 2548

原创 Go语言学习——反射

参考——李文周的博客Golang的反射反射其实是指在程序运行的过程中对程序本身进行访问和修改的一种能力,程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。我们知道空接口可以存储任意类型的变量,

2022-04-02 15:32:53 293

原创 Golang操作MySQL(一)——用gorm实现curd

参考——李文周的博客什么是GORMGORM是一个go语言开发的ORM框架,ORM全称是Object-Relationship-Mapping,像Java中经常用到的MyBatis就是一个ORM框架,而GORM也是一样,大大降低了对开发人员的sql语句能力,开发人员只需要调用框架中的api即可,剩下的由GORM框架将代码转换成SQL语句后,对数据库进行操作优点:对开发人员友好,大大提高了开发效率缺点:1.牺牲了程序性能2.弱化了开发人员的sql能力的能力如何在Goland中使用GORM我们只需

2022-03-30 15:33:20 1712

原创 Go并发学习(二)——Context(上下文)

参考:Go语言设计与实现什么是Context上下文 context.Context是 Go 语言中用来设置截止日期、同步信号,传递请求相关值的结构体。上下文与 Goroutine 有比较密切的关系,是 Go 语言中独特的设计,在其他编程语言中我们很少见到类似的概念。context.Context 是 Go 语言在 1.7 版本中引入标准库的接口,该接口定义了四个需要实现的方法,其中包括:Deadline()——返回Context完成工作的截止时间Done()——返回一个channel,这个cha

2022-03-29 17:08:08 551

原创 Go并发学习(一)——goroutine和channel

线程和协程线程:操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,是进程中的实际运作单位。**协程:**又称微线程。协程是一种用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。为什么有了线程还需要协程虽然多线程在前互联网世代已经足够使用,但是线程的局限性也比较明显1.线程数量有限,一般不会很多2.线程占据的资源通常比我们需要的多得多,造成浪费每个系统级线程开辟都会占用空间,这个空间可

2022-03-29 15:55:04 196

原创 Go语言学习——方法、接口、Error

方法Go 没有类。不过你可以为结构体类型定义方法。方法就是一类带特殊的 接收者 参数的函数。方法接收者在它自己的参数列表内,位于 func 关键字和方法名之间。在此例中,Abs 方法拥有一个名为 v,类型为 Vertex 的接收者。package mainimport ( "fmt" "math")type Vertex struct { X, Y float64}// 这里的v就是方法的接收者func (v Vertex) Abs() float64 { return m

2022-03-28 11:14:50 448

原创 Go语言学习——指针、切片、映射、函数

指针——值的内存地址Go 拥有指针。指针保存了值的内存地址。*类型 T 是指向 T 类型值的指针。其零值为 nil。var p *int //p是一个可以指向int类型值的指针& 操作符会生成一个指向其操作数的指针。k := 42p = &k //p这时候就是一个指向k的指针*操作符表示指针指向的底层值。fmt.Println(*p) // 通过指针 p 读取 k*p = 21 // 通过指针 p 设置 kpackage maini

2022-03-25 11:11:58 854

原创 Go语言学习——流程控制语句+指针

for循环——Go语言中的唯一循环基本的 for 循环由三部分组成,它们用分号隔开:初始化语句:在第一次迭代前执行条件表达式:在每次迭代前求值后置语句:在每次迭代的结尾执行(和Java十分相似)package mainimport "fmt"func main() { sum := 0 for i := 0; i < 10; i++ { sum += i } //这是一个求0-9的总和循环 fmt.Println(sum)}并且初始化语句和后置语句是可以选择写

2022-03-24 16:10:28 339

原创 Go语言学习——包、函数、变量、type关键字

来源自Go学习之旅包每个 Go 程序都是由包构成的。程序从 main 包开始运行。示例代码通过导入路径 “fmt” 和 “math/rand” 来使用这两个包。package mainimport ( "fmt" "math/rand")func main() { fmt.Println("My favorite number is", rand.Intn(200))}结果:My favorite number is +一个范围在[0,200]的随机数像上面我们导入包的.

2022-03-24 15:23:42 312

原创 SpringCloud/分布式入门

1.集群/分布式/微服务/SOA是什么?1.1什么是集群源于维基百科计算机集群简称集群是一种计算机系统,它通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多集群的技术特点通过多台计算机完成同样的任务,达到更高的效率——

2022-02-25 19:59:59 391

原创 MySQL刷题

1.组合两个表思路我们可以看到题目说明Person表的主键是PersonId,而Address的主键是AddressId,而且Address表里也同样包含PersonId,因此可以得出一个结论,PersonId是Address表的外键,因此我们只需要使用PersonId字段将两个表连接即可select FirstName, LastName, City, Statefrom Person left join Addresson Person.PersonId = Address.PersonId

2021-09-28 17:54:29 462

原创 redis启动报错

第一步先进入redis所在目录,然后运行redis-server命令第二步重新打开一个cmd窗口,然后运行redis-cli命令,之后就可以正常使用

2021-09-11 13:26:20 391

原创 计算机网络复习(下)

HTTP与HTTPSHTTP协议我们在输入一个URL时,显示出各种各样的Web页面,这些页面从何而来,又是经过了什么操作呈现在我们面前的?Web 界面当然不会凭空出来,根据 Web 浏览器地址栏中指定的 URL,Web 使用一种名为 HTTP 的协议作为规范,完成从客户端到服务端的一些流程。可以说,Web 是建立在 HTTP 协议上进行通信的。什么是HTTPHTTP:超文本传输协议(HyperText Transport Protocol)是当今互联网应用最广泛的一种网络协议,所有的万维网(WWW

2021-08-29 17:26:16 733

原创 计算机网络复习总结(中)

传输层在前面的文章中我们总结了TCP/IP五层模型中的链路层和网络层,这两层主要负责的是主机和主机之间的通信,那么我们传输的数据到达主机之后呢?每台电脑上有那么多的应用程序,这些数据该分配给哪个进程?这就是这一章要提到的传输层的工作了。它主要负责的是端口与端口之间的通信。TCP和UDP在传输层中最重量级的两个协议,就是UDP和TCP1.UDP(User Data Protocol)用户数据报协议使用UDP协议的主机可以在任意时刻发送数据,远程主机接收数据后也无需返回响应虽然UDP协议提供无连接

2021-08-28 19:48:53 890 1

原创 计算机网络整合复习(上)

TCP/IP五层模型和OSI七层模型所谓**通信协议就是通信双方都必须要遵守的通信规则。**如果没有网络通信协议,计算机的数据将无法发送到网络上,更无法到达对方计算机,即使能够到达,对方也未必能读懂。有了通信协议,网络通信才能够发生。可以看到七层模型相比于五层模型,就是在应用层和传输层之间增加了表示层和会话层,那么结合我们上述提到的通信协议,我们可以提出一个问题,模型有这么多层,难道用的都是相同的通信协议吗?答案是否定的,协议的实现是很复杂的。因为协议要把人读得懂的数据,如网页、电子邮件等加工转化成

2021-08-28 12:33:30 579

原创 数据库终章——知识总结

数据库调优我们先来看一下数据库查询数据的流程图数据库调优其实一般情况都是我们的SQL语句调优,SQL的调优就可以解决大部分问题了,当然也不排除SQL执行环节的调优。我们所谓的调优也就是在执行器执行之前的分析器和优化器阶段完成的,那我们开发工作中怎么去调优的呢?遇SQL不决explain,但是这里就要说到第一个坑了。排除缓存干扰因为在MySQL8.0之前我们的数据库是存在缓存这样的情况的,,因为存在缓存,sql怎么执行都是很快,当然第一次其实不快但是我没注意到,以至于之后缓存经常失效,导致rt(

2021-08-19 18:46:22 150

原创 详解MySQL存储引擎——InnoDB

文章来自柳树的絮叨叨,作者靠发型吃饭的柳树对于 MySQL,要记住、或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图:InnoDB内存结构从上面第二张图可以看到,InnoDB 主要分为两大块:1)InnoDB In-Memory Structures2)InnoDB On-Disk StructuresBuffer pool当进行数据库操作时,MySQL 不会直接去修改磁盘的数据,因为这样做太慢了,MySQL 会先改内存,然后记录 red

2021-08-19 15:33:59 447 2

原创 MySQL事务与MVCC

数据库事务介绍事务的四大特性ACID1.原子性(atomicity): 事务的最小工作单元,要么全成功,要么全失败。2.一致性(consistency): 事务开始和结束后,数据库的完整性不会被破坏。3.隔离性(isolation): 不同事务之间互不影响,四种隔离级别为RU(读未提交)、RC(读已提交)、RR(可重复读)、SERIALIZABLE (串行化)。4.持久性(durability): 事务提交后,对数据的修改是永久性的,即使系统故障也不会丢失。事务的隔离级别读未提交(Read U

2021-08-18 20:08:09 171

原创 MySQL——页和索引

概述生产上为了高效地查询数据库中的数据,我们常常会给表中的字段添加索引,大家是否有考虑过如何添加索引才能使索引更高效,考虑如下问题添加的索引越多越好吗?为什么有时候用了索引但是查询速度并没有提高?索引有哪些类型?如何评价一个索引设计的好坏?InnoDB页存储结构数据被划分为若干个页,以页作为磁盘和内存之间交互的基本单位,一般为16KB,且页内的物理地址是连续的。最小记录、最大记录和用户记录,三者为主要数据,其中理论上存储了各个行信息,但实际上是多个行信息组合成的一条连续的数据。数据存储

2021-08-18 18:00:50 2430

原创 详解volatile和Synchronized

普通Demopublic class Test { public static void main(String[] args) { Autumn a=new Autumn(); a.start(); for(;;){ if (a.isFlag()){ System.out.println("我是Autumn"); } } }}class A

2021-08-16 18:34:04 681

原创 ReentrantLock的底层实现——AQS实现原理

以下文章参考于程序员cxuan概述谈到多线程并发编程,我们就逃不掉AQS(AbstractQueuedSynchronizer),所谓的AQS即是抽象的队列式的同步器,内部定义了很多锁相关的方法,我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。...

2021-08-16 17:27:17 1060

原创 乐观锁和悲观锁的底层实现原理

本文参考——敖丙——JavaFamily概述上一篇文章我们提到了乐观锁和悲观锁的工作方式和使用场景,那么这两种锁本身是如何实现的?这篇文章就来总结一下乐观锁和悲观锁,他们对应的实现—— CAS ,Synchronized,ReentrantLock乐观锁——CAS什么是CASCAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。CAS是如何保证线程安全的?线程在读取数据时不进行加锁,在准备写回数据时,先

2021-08-15 19:49:51 1097

原创 Java锁机制——互斥锁,自旋锁,读写锁,悲观锁和乐观锁

以下文章源于小林coding1.概述在多线程并发的场景下,不可以避免的一个问题就是共享资源的竞争问题,那么最熟悉、常见的方法就是在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选择了错误的锁,那么在一些高并发的场景下,可能会降低系统的性能,这样用户体验就会非常差了。所以,为了选择合适的锁,我们不仅需要清楚知道加锁的成本开销有多大,还需要分析业务场景中访问的共享资源的方式,再来还要考虑并发访问共享资源时的冲突概

2021-08-15 17:55:40 581

原创 ThreadLocal的使用以及底层原理

1.概述在处理多线程并发的场景中,如果要保证线程安全,相信大家马上出现的想法就是锁机制,但是无论是乐观锁还是悲观锁,都会在并发冲突的时候对性能造成影响,那么有没有一种方法,可以彻底避免发生资源竞争呢?答案就是ThreadLocal从字面意思理解,ThreadLocal可以解释成是线程的局部变量,只允许当前线程访问,别的线程都访问不了,既然是线程私有的,那么肯定就不会发生竞争了。因此ThreadLocal提供了一种与众不同的保证线程安全的方式,它不是在发生冲突的时候加锁,而是彻底杜绝了冲突的发生。T

2021-08-06 00:13:32 148

原创 数据结构3——二叉树

226.翻转二叉树翻转一棵二叉树。翻转二叉树其实很简单,我们每次只需要把当前结点的左右子树调换即可,通俗的说就是——左子树变右子树,右子树变左子树,那么我们如何实现呢?——两种方法:迭代和递归# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left

2021-08-01 15:38:10 264

原创 JVM3——类加载机制详解

1.Java类生命周期一个类的完整生命周期包括7个阶段1.加载(用户主导,读取二进制字节流)2.验证3.准备4.解析(2-4都是由JVM主导)5.初始化(用户主导)6.使用7.卸载:GC将无用对象从内存中卸载2.类加载过程如果JVM想要加载.class文件,需要将其装进类加载器中,类加载器就好像一个搬运工,将.class文件全部搬进JVM里面那么JVM是如何加载这些.class文件呢??系统加载Class类型文件主要有三步——加载-连接-初始化而JVM主导连接过程,并将其细分

2021-07-31 17:57:49 141

原创 JVM2——垃圾收集器与内存分配

垃圾收集器1.概念垃圾收集(Garbage Collection ,GC)的历史比 Java 久远,GC 需要思考的 3 件事情:1.哪些内存需要回收2.什么时候回收3.如何回收垃圾收集器关注的是 Java 堆中的内存,后续讨论的内存分配与回收也指这部分内存2.判断一个对象是否需要回收垃圾收集器进行垃圾回收之前,首先就是要判断哪些对象需要被回收(对象是否死亡)1)引用计数法——为对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收

2021-07-31 15:12:32 135

原创 JAVA虚拟机——JVM的内存区域与内存溢出异常

什么是JVMJVM 是 Java Virtual Machine 的缩写,它是一个虚构出来的计算机,一种规范。通过在实际的计算机上仿真模拟各类计算机功能实现···通俗来说 JVM 其实就类似于一台小电脑运行在 windows 或者 linux 这些操作系统环境下。它直接和操作系统进行交互,与硬件不直接交互,由操作系统帮我们完成和硬件进行交互的工作。对于C和C++来说,开发人员拥有每一个对象的所有权,但也肩负着每个对象从开始到销毁的维护责任但是对于Java来说,由于JVM的存在,所以不需要手动去为每

2021-07-31 12:29:04 294

原创 数据结构part1——数组

二分法查找35.搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5输出: 2示例 2:输入: nums = [1,3,5,6], target = 2输出: 1示例 3:输入: nums = [1,3,5,6], target = 7输出: 4class Solution:

2021-07-29 15:06:48 204

原创 详细解析Java内存模型与原子性-可见性-有序性

为什么要学习并发编程其实无论语言、中间件和框架再如何先进,我们都不应该完全依赖于它们完成并发处理的所有事情,了解并发的内幕并学习其中的思想,仍然是成为一个高级程序员的必经之路。如果只是为了面试而去背诵题目,不了解其中的原理,这对我们的长足发展是百害无益的为什么需要并发编程?这里摘录《Java 并发编程的艺术》书中的一段话来回答这个问题,我们为什么需要并发线程?多核 CPU 时代的到来打破了单核 CPU 对多线程效能的限制。多个 CPU 意味着每个线程可以使用自己的 CPU 运行,这减少了线程上下.

2021-07-26 15:13:42 343

原创 Java多线程的底层原理

想要理解Java的多线程原理,那么不可避免的我们需要学会Java运行时数据区域和Java的类加载机制了Java运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间。简单介绍一下什么时线程共享和线程私有1)线程共享:公共的区域,里面存储的数据对所有的线程都是共享的,谁都可以访问2)线程私有:每个线程自己独享的区域,每个线程的私有区域都是相互独立的,互不影响线程共享1)Java堆(heap):Jav

2021-07-26 13:31:33 763

原创 Hashtable和ConcurrentHashMap

HashMap如何保证线程安全?一般有三种方式来代替原生的线程不安全的 HashMap:1)使用 java.util.Collections 类的 synchronizedMap 方法包装一下 HashMap,得到线程安全的 HashMap,其原理就是对所有的修改操作都加上 synchronized。方法如下:public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 2)使用线程安全的 Hashtable

2021-07-26 12:08:25 1769

原创 HashMap——八股文必背

HashMap底层原理是什么?HashMap就是以key-value形式存储数据的一种数据结构,在我们平常开发中非常常用,它在 JDK 1.7 和 JDK 1.8 中底层数据结构是有些不一样的。总体来说,在JDK1.7中它的底层实现是数组加链表使用 Entry 类存储 Key 和 Value,,而在1.8之后底层实现则是数组加链表加红黑树使用 Node 类存储 Key 和 Value。当然,这里的 Entry 和 Node 并没有什么不同,我们来看看 Node 类的源码:// HashMap 1.8 内

2021-07-25 18:48:12 972

原创 ArrayList为什么可以扩容?它的扩容机制是什么?

ArrayList了解吗,它是什么?有什么作用?众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中,Collection 麾下三生子 List、Set 和 Queue。ArrayList 就实现了 List 接口,其实就是一个数组列表,不过作为 Java 的集合框架,它只能存储对象引用类型,也就是说当我们需要装载的数据是诸如 int、float 等基本数据类型的时候,必须把它们转换成对应的包装类。ArrayList的底层实现是数组(Object []数组)既然它是数组实

2021-07-25 17:41:05 2129 1

原创 Java中的集合框架——Collection接口和Map接口

集合和数组一样,都是用来存储元素的,数组和集合不同的地方在于——数组可以存储基本数据类型和引用类型,但是数据只能存储引用类型;第二个就是数组的大小是固定的,但是集合的大小是可变的(可扩容)。所以因为集合的关系Java设计了包装类型总的来说,数组和集合的不同点如下:1.由于数组一旦被定义,就无法更改其长度,所以数组无法动态的适应元素数量的变化。2.组拥有 length 属性,可以通过这个属性查到数组的存储能力也就是数组的长度,但是无法通过一个属性直接获取到数组中实际存储的元素数量。(我们只能知道数组的.

2021-07-25 15:26:01 280

原创 了解了反射,我们来捋一下Java的代理模式

Java反射机制一文中提到过Spring IOC 和AOP都运用到了动态代理机制,也相当于应用了反射,那么到底什么是代理,什么是动态代理?动态代理又是如何运用反射的?常规编码方式在了解代理之前,我们常规使用接口的方式其实是:所有interface变量都是通过向上转型指向某个子类实例的1.编写一个接口public interface SmsService { String send(String message);}2.编写一个类实现这个接口(实现子类)public class Sm

2021-07-25 13:54:02 190

原创 Java的反射机制

为什么要使用反射?我们之前已经学过接口的使用,极大的降低了代码的耦合度,并提高了可复用性和可维护性。举一个例子:我们创建一个接口X拥有test方法,还有两个接口实现类A,Bpublic class Test { interface X { public void test(); } class A implements X{ @Override public void test() { System.o.

2021-07-24 18:23:57 271

原创 String为什么不可变?仅仅是因为final关键字吗?

什么是不可变《Effective Java》中对于不可变对象(Immutable Object)的定义是:对象一旦被创建之后,对象所有的状态及属性在其生命周期内不会发生任何变化这就意味着,一旦我们将一个对象分配给一个变量,就无法再通过任何方式更改对象的状态了。String 不可变的表现就是当我们试图对一个已有的对象 “abcd” 赋值为 “abcde”,String 会新创建一个对象:String为什么不可变String 用 final 修饰 char 数组,这个数组无法被修改,这么说确实没啥

2021-07-24 13:33:46 205

原创 String、StringBuilder、StringBuffer三姐妹

字符串不仅是程序设计中最常见的行为之一,在JavaWeb中更是如此三姐妹之一——不可变的String在Java中是没有内置的字符串类型,所以标准Java类库提供了一个String类,只要是双引号(“ab”)括起来的字符串都是一个String实例String e = ""; // 空串String str = "hello";查看Java类库中的String源码,Java8内部是使用char[]数组来存储数据的public final class String implements j.

2021-07-24 12:59:38 79

原创 Java中接口存在的意义

什么是抽象类?在接触接口之前,我们还需要认识到什么是抽象类,简单来说,接口可以认为是一个比抽象类更抽象的类那么先来说说什么是抽象类?包含一个或者多个抽象方法的类就是抽象类,抽象方法就是没有方法体的方法,而且抽象方法和抽象类都必须声明为abstract类型。// 抽象类public abstract class Person { // 抽象方法 public abstract String getDescription();}注意!抽象类必须包含抽象方法,但是也可以同时包含具体数据和.

2021-07-23 23:37:46 257

空空如也

空空如也

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

TA关注的人

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