首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

创建区块链实现之v3本地持久化(bolt数据库的序列化和反序列化)和命令行参数

2023-11-12 来源:华拓网
在之前的版本上修改,实现命令添加data(记账信息)

block.go
package mainimport ( "time" "bytes" "encoding/gob")//定义块结构type Block struct{ Version int64 PrevBlockHash []byte Hash []byte TimeStamp int64 TargetBits int64 Nonce int64 MerKelRoot []byte Data []byte}func (block *Block)Serialize()[]byte{ var buffer bytes.Buffer encoder := gob.NewEncoder(&buffer) err := encoder.Encode(block) CheckErr("Serialize", err) return buffer.Bytes()}func Deserialize(data []byte)*Block{ decoder := gob.NewDecoder(bytes.NewReader(data)) var block Block err := decoder.Decode(&block) CheckErr("Deserialize", err) return &block}//设定创建块的方法func NewBlock(data string, prevBlockHash []byte) *Block{ block := &Block{ Version:1, PrevBlockHash:prevBlockHash, //Hash: TimeStamp:time.Now().Unix(), TargetBits:10, Nonce:0, MerKelRoot:[]byte{}, Data:[]byte(data), } //block.SetHash() //设置区块的哈希值--->>> v2中来自工作量证明 pow := NewProofOfWork(block) nonce, hash := pow.Run() block.Hash = hash block.Nonce = nonce return block}// 添加哈希值---->> v2中来自pow//func (block *Block)SetHash(){// tmp := [][]byte{// //实现int类型转换为byte类型的工具函数// IntToByte(block.Version),// block.PrevBlockHash,// IntToByte(block.TimeStamp),// block.MerKelRoot,// IntToByte(block.Nonce),// block.Data,// }// //将区块的各个字段链接成一个切片,使用【】byte{}进行链接,目的是避免污染源区块的信息// data := bytes.Join(tmp,[]byte{})//// //对区块进行sha256哈希算法,返回值为[32]byte数组,不是切片// hash := sha256.Sum256(data)// block.Hash = hash[:]//由数组转换为切片//}// 创世块的创建,它的钱一个去魁岸的哈希值为空func NewGenesisBlock() *Block{ return NewBlock("Genesis Block!",[]byte{})}
blockchain.go
package mainimport ( "blockChain/v3/boltdb/bolt" "os")//定义区块链条type BlockChain struct{ //blocks []*Block db *bolt.DB lastHash []byte}const dbfile = "blockChainDb.db"const blockBucket = "blockbucket"const lasthash = "lastHash"// 创建区块链,并且添加创世块func NewBlockChain() *BlockChain{ //return &BlockChain{[]*Block{ // NewGenesisBlock(), //}} db, err := bolt.Open(dbfile, 0600, nil) CheckErr("NewBlockChain1",err) var lastHash []byte db.Update(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket != nil { //读取lasthash lastHash = bucket.Get([]byte(lasthash)) }else{ //创建bucket //写数据 genesis := NewGenesisBlock() bucket, err :=tx.CreateBucket([]byte(blockBucket)) CheckErr("NewBlockChain1",err) //1)写入区块 err = bucket.Put(genesis.Hash, genesis.Serialize()) //TODO CheckErr("NewBlockChain2", err) //2) 写入lasthash err = bucket.Put([]byte(lasthash), genesis.Hash) CheckErr("NewBlockChain3", err) //3) 给变量赋值 lastHash = genesis.Hash } return nil }) return &BlockChain{db,lastHash}}//添加区块func (bc *BlockChain)AddBlock(data string){ var prevBlockHash []byte err := bc.db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) lastHash :=bucket.Get([]byte(lasthash)) prevBlockHash = lastHash return nil }) CheckErr("AddBlock1", err) block :=NewBlock(data, prevBlockHash) err = bc.db.Update(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) err := bucket.Put(block.Hash, block.Serialize()) CheckErr("AddBlock2", err) err = bucket.Put([]byte(lasthash), block.Hash) CheckErr("AddBlock3", err) bc.lastHash = block.Hash return nil }) CheckErr("AddBlock4", err)}//定义迭代器structtype BlockChainIterator struct{ db *bolt.DB currentHash []byte}//获取到迭代器func (bc *BlockChain)Iterator() *BlockChainIterator { return &BlockChainIterator{bc.db, bc.lastHash}}//迭代器的Next方法func (it *BlockChainIterator) Next() *Block{ var block *Block err := it.db.View(func(tx *bolt.Tx) error { bucket := tx.Bucket([]byte(blockBucket)) if bucket == nil{ os.Exit(1) } blockTmp := bucket.Get(it.currentHash) block = Deserialize(blockTmp) it.currentHash = block.PrevBlockHash return nil }) CheckErr("Next", err) return block}
utils.go
package mainimport ( "bytes" "encoding/binary" "fmt" "os")func IntToByte(num int64)[]byte{ var buffer bytes.Buffer err := binary.Write(&buffer, binary.BigEndian, num) //if err != nil{ // fmt.Println("IntToByte err occur:",err) // os.Exit(1) //} CheckErr("I", err) return buffer.Bytes()}//@CheckErr错误检查服用,pos参数为方法名称字符串, err为具体错误信息func CheckErr(pos string,err error){ if err != nil{ fmt.Println("current method:%s", pos, "err occur%:",err) os.Exit(1) }}
proofofwork.go
package mainimport ( "math/big" "bytes" "math" "crypto/sha256" "fmt")const targetBits = 24 //假定难度值type ProofOfWork struct{ block *Block targetBit *big.Int}func NewProofOfWork(block *Block) *ProofOfWork{ var IntTarget = big.NewInt(1) // 假定值 //000000000000000000000000000000001 初始值 //100000000000000000000000000000000 十进制 //000000000100000000000000000000000 十进制 //000001000000000000000000000000000 十六进制 目标哈希值 //0000000a0000000000001234560000000 实际值 IntTarget.Lsh(IntTarget, uint(256- targetBits)) return &ProofOfWork{block,IntTarget}}func (pow *ProofOfWork)PrepareRawData(nonce int64) []byte{ block := pow.block //获取需要处理的区块 tmp := [][]byte{ //实现int类型转换为byte类型的工具函数 IntToByte(block.Version), block.PrevBlockHash, IntToByte(block.TimeStamp), block.MerKelRoot, IntToByte(nonce), IntToByte(targetBits), //添加难度值 block.Data, } //将区块的各个字段链接成一个切片,使用【】byte{}进行链接,目的是避免污染源区块的信息 data := bytes.Join(tmp,[]byte{}) return data}func (pow *ProofOfWork)Run()(int64, []byte){ var nonce int64 var hash [32]byte var HashInt big.Int fmt.Println("Begin Minng ...") fmt.Printf("target hash : %x", pow.targetBit.Bytes()) for nonce < math.MaxInt64{ data := pow.PrepareRawData(nonce) hash = sha256.Sum256(data) //取出来后是字符串 HashInt.SetBytes(hash[:]) //将byte值转换为大的数字 // 比较哈希值 if HashInt.Cmp(pow.targetBit) == -1{ fmt.Printf("Found Hash:%x", hash) break }else{ nonce ++ } } return nonce, hash[:]}//提供外部校验的方法func (pow *ProofOfWork)IsValid()bool{ data :=pow.PrepareRawData(pow.block.Nonce) hash := sha256.Sum256(data) var IntHash big.Int IntHash.SetBytes(hash[:]) return IntHash.Cmp(pow.targetBit) == -1}
cli.go
package mainimport ( "os" "fmt" "flag")const Usage = ` ./blockchain addBlock --data DATA "add a block to blockchain" ./blockchain printchain "print all blocks"`type CLI struct{ bc *BlockChain}func (cli *CLI)Run(){ if len(os.Args) <2 { fmt.Println("too few parameters!", Usage) os.Exit(1) } //添加命令 addBlockCmd := flag.NewFlagSet("addBlock", flag.ExitOnError) printCmd := flag.NewFlagSet("printchain",flag.ExitOnError) //获取命令携带的参数 addBlockPara :=addBlockCmd.String("data","", "block info") switch os.Args[1]{ case "addBlock": //解析数据 err := addBlockCmd.Parse(os.Args[2:]) CheckErr("addBlock", err) if addBlockCmd.Parsed(){ if *addBlockPara == "" { //cli.bc.AddBlock(*addBlockCmdPara) fmt.Println("data is empty, pls check!") os.Exit(1) } cli.AddBlock(*addBlockPara) } case "printchain": err := printCmd.Parse(os.Args[2:]) CheckErr("printchain", err) if printCmd.Parsed(){ cli.PrintChain() } default: fmt.Println("invalid cmd", Usage) }}
command.go
package mainimport "fmt"func (cli *CLI)AddBlock(data string){ cli.bc.AddBlock(data) fmt.Println("AddBlock Succeed!")}func (cli *CLI)PrintChain(){ bc := cli.bc it := bc.Iterator() //遍历区块 for{ block := it.Next() //取回当前hash执行的block,将hash值前移 fmt.Printf("Data:%s", block.Data) fmt.Println("Version:",block.Version) fmt.Printf("PrevHash:%x",block.PrevBlockHash) fmt.Printf("Hash:%x",block.TimeStamp) fmt.Printf("TimeStamp:%d",block.TimeStamp) fmt.Printf("MerKel:%x",block.MerKelRoot) fmt.Printf("Nonce:%d",block.Nonce) // pow := NewProofOfWork(block) fmt.Printf("IsvALID:%v",pow.IsValid()) if len(block.PrevBlockHash) == 0{ break } }}
main.go
package mainfunc main(){ bc := NewBlockChain() cli := CLI{bc} cli.Run()}
实现的效果如下:

技术分享图片

创建区块链实现之v3本地持久化(bolt数据库的序列化和反序列化)和命令行参数

标签:反序列化   ddb   ofo   参数   --   oss   col   51cto   join   

小编还为您整理了以下内容,可能对您也有帮助:

python哪些标准库

标准库比较多 功能也不同:
标准库
sys
系统相关的参数和函数。 sys 库一般用来访问和修改系统相关信息,比如查看 python 版本、系统环境变量、模块信息和 python 解释器相关信息等等。
os
操作系统接口模块。这个库提供了访问操作系统相关依赖的方式,比如输入输出操作、读写操作、操作系统异常错误信息、进程线程管理、文件管理、调度程序等等。
re
正则表达式操作。这个库是我喜欢并且经常会用到的库,在对大量字符串进行处理的时候用正则表达式是最快速有效的方式,但是正则表达式的学习曲线较高,有兴趣的朋友可以访问这个网站学习。
math
数学函数库。 math 库提供了对 C 语言标准定义的数学函数访问,比如数论(Number-theoretic)的各种表示方法、幂和对数函数(Power and logarithmic functions)、三角函数(Trigonometric functions)、常量圆周率(π)和自然常数(e)等等。
random
生成伪随机数。
伪随机数与随机数(真随机数)不同的是执行环境,随机数是真实世界中通过物理过程实践得出结论,而伪随机数是通过计算机的特定算法生成的数,所以这个过程是可预测的、有规律的,只是循环周期较长,并不能与现实场景相切合。
random库提供生成随机数,可以模拟现实世界中随机取数、随机抽奖等等。
logging
日志记录工具。这个库提供了对应用程序和库函数的日志记录,日常开发中我们经常需要通过日志打印出当前程序的运行状态,实时查看可能出现的堆栈异常和错误信息。
json
Json 编码和解码器。 json 库提供了对 json 数据的支持,日常开发中我们做前后端分离需要对传输数据 json 进行序列化和反序列化操作,以保证对数据的完整性和有效性,而序列化和反序列化其实就是编码和解码的过程。
pickle
Python 对象序列化库。 pickle 库支持对 python 对象进行序列化和反序列化操作,当我们需要将处理好的对象保存到文件或数据库中时,就可以将其序列化成二进制数据,从而更好的保存起来。
shelve
Python 对象持久化。简单的数据存储方案。
socket
底层网络接口。 socket(套接字) 库提供了标准的BSD(伯克利套接字) Socket API,可以通过访问底层操作系统 Socket 的相关接口进行网络通讯。
datetime
基本日期和时间类型库。该库提供了各种简单和复杂的方式处理日期和时间,日常我们会用时间测算时间消耗、复杂度,对存储的创建时间和修改时间也需要进一步说明,对计时器的描述和控制也需要用到该库。
hashlib
安全哈希和消息摘要。摘要算法 其实就是对某些数据进行加密(不可逆的加密算法),因为被加密的数据无法破解,所以就能防止被篡改。常见的摘要算法有 MD5、SHA1,一般我们会用 MD5 对用户口令进行加密,防止盗用后被轻易破解;而 SHA1 与 MD5 类似,但是 SHA1 会产生更长的长度,也更安全,但是算法的复杂性通常伴随着存储空间和时间的消耗。要说比SHA1更长的字符长度,还有 SHA224、SHA256、SHA384 和 SHA512,看名字就能知道。
大家都知道无论算法生成的字符长度如何都有可能发生碰撞(被破解),这是不可避免的,所以具体场景具体情况而定。
configparser
配置文件解析器。 configparser 库可以轻松定制配置文件,通过解析配置文件的信息我们就可以全局访问相关配置。
urllib
URL 处理模块。 urllib 库集成了处理 URLs(统一资源定位符)的各种模块:
URL urllib.request URL robots.txt urllib 库对访问网络有很好的支持,提供了对数据的访问和处理、文件的上传和下载、记录 cookie 和 session 等等。
itertools
为高效循环而创建迭代器的函数。 itertools 库也是经常需要用到,当我们要对某些数进行 for-in 时就需要先将其处理成一个可迭代对象,之后我们才能进行遍历操作。
collections
容器数据类型库。 collections 库提供了对所有容器数据类型的支持,包括 dict, list, set 和 tuple。我们可以用此库对不同数据类型进行操作,常有的函数方法有这些:
namedtuple() 创建命名元组子类的工厂函数 deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop) ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面 Counter 字典的子类,提供了可哈希对象的计数功能 OrderedDict 字典的子类,保存了他们被添加的顺序 defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 UserDict 封装了字典对象,简化了字典子类化 UserList 封装了列表对象,简化了列表子类化 UserString 封装了列表对象,简化了字符串子类化 functools
高阶函数和可调用对象上的操作。该库主要调用高阶函数,是常规函数的一种补充。目前库中包含以下几种函数:
cmp_to_key lru_cache total_ordering partial partialmethod rece singledispatch update_wrapper wraps threading
线程并行库。 threading 库支持线程和多线程的操作,针对多线程并发的问题可以给数据加同步锁,一次只能让一个线程处理数据,从而避免出现数据读写混乱。
在 CPython 解释器上,因为GIL(全局解释器锁)锁机制的存在的,被设计成线程安全,所以同一时间只能执行一个线程,这就导致了多线程不能发挥出计算机的多核特性。
multiprocessing
进程并行库。 multiprocessing 库与 threading 库很类似,不同的是进程库可以创建子进程避开 GIL,从而弥补线程库存在的劣势和发挥计算机的多核特性。
timeit
测量小代码片段的执行时间。此库主要用来计算运行代码的时间消耗,支持多种方式传入参数。
atexit
退出处理器。当处理一个函数需要立马退出时可以使用该库。
abc
抽象基类。 abc 库定义抽象基类,以便其他类派生出新类。比如 collections 容器库中就有此派生出的 collections.abc 类,派生出来的类可以进一步实现。
asyncio
异步IO库。 asyncio 库是一个用 async/await 关键字编写并发的库,为多个异步框架提供基础功能,能够实现高性能的网络、Web服务器、数据库连接和分布式任务队列等。
copy
浅层和深层复制操作。 copy 库提供对对象的拷贝,我们都知道要制作对象副本,是无法通过简单值传递创建新变量的方式做到,因为新变量所指向的内存空间依旧是原对象本身,所以对新变量进行任何操作都会改变原对象。那么, copy 库就提供了制作对象副本的各种方法,会开辟一个新的内存空间存放副本对象,修改操作不会对原对象有任何干预。
csv
csv(Comma Separated Values)文件读写库。此库支持以纯文本的形式存储表格数据(数字和文本)。
operator
标准运算符替代函数库。此库是将 python 自有的运算符作为有效函数,比如表达式 x+y 可以用函数 operator.add(x, y) 表示;比如表达式 a*b 可以用函数 operator.mul(a, b) 表示,等等。
enum
枚举库。 enum 库支持创建枚举类来存储大量同类型的不可变常量,以便其他函数调用。创建出来的枚举类是可迭代对象,所以可以用 for-in 枚举出所有常量。
heapq
堆队列算法。这个模块提供了堆队列算法的实现,也称为优先队列算法。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务。所以当我们要求前n最大/最小值的时候就可以用此算法来实现, heapq 库中也提供了相应函数实现。
http
HTTP 模块。 http 模块是一个包,收集了多个处理超文本传输协议的模块:
urllib.request http 模块通过 http.HTTPStatus 枚举定义了HTTP状态码 以及相关联消息。
profile、pstats
性能分析工具。 profile 模块提供了 profile 和 cProfile 两种不同实现的性能分析工具,可用来描述程序各个部分的执行时间和频率,统计后的信息可以通过 pstats 模块保存并使用。
ssl
TLS/SSL(传输安全协议)。此模块提供对安全协议的支持,通过应用上下文,可将 TLS(传输层安全性协议)或其前身 SSL(安全套接层)支持安全协议,能为互联网通信提供安全和数据完整性保障。一般 HTTPS 协议都支持 TLS/SSL 加密。
unitest
单元测试框架。 unitest 库常用于单元测试,受到 JUnit 和其他主流测试库的启发, unitest 库的功能和函数与它们有着相似的风格。
uuid
UUID库。 uuid 库主要用途是生成随机字符串,库中有多个版本的 UUID 对象方法,比如版本 1、3、4 和 5 的 uuid1() 、 uuid3() 、 uuid4() 和 uuid5() 。需要注意的是,如果要生成随机字符串,可以使用 uuid1() 和 uuid4() ,但是 uuid1() 会存在隐私风险,因为生成的原理里边包含用户访问计算机的网络地址,而 uuid4() 是通过随机字符生成。
希望可以帮助到你。

python哪些标准库

标准库比较多 功能也不同:
标准库
sys
系统相关的参数和函数。 sys 库一般用来访问和修改系统相关信息,比如查看 python 版本、系统环境变量、模块信息和 python 解释器相关信息等等。
os
操作系统接口模块。这个库提供了访问操作系统相关依赖的方式,比如输入输出操作、读写操作、操作系统异常错误信息、进程线程管理、文件管理、调度程序等等。
re
正则表达式操作。这个库是我喜欢并且经常会用到的库,在对大量字符串进行处理的时候用正则表达式是最快速有效的方式,但是正则表达式的学习曲线较高,有兴趣的朋友可以访问这个网站学习。
math
数学函数库。 math 库提供了对 C 语言标准定义的数学函数访问,比如数论(Number-theoretic)的各种表示方法、幂和对数函数(Power and logarithmic functions)、三角函数(Trigonometric functions)、常量圆周率(π)和自然常数(e)等等。
random
生成伪随机数。
伪随机数与随机数(真随机数)不同的是执行环境,随机数是真实世界中通过物理过程实践得出结论,而伪随机数是通过计算机的特定算法生成的数,所以这个过程是可预测的、有规律的,只是循环周期较长,并不能与现实场景相切合。
random库提供生成随机数,可以模拟现实世界中随机取数、随机抽奖等等。
logging
日志记录工具。这个库提供了对应用程序和库函数的日志记录,日常开发中我们经常需要通过日志打印出当前程序的运行状态,实时查看可能出现的堆栈异常和错误信息。
json
Json 编码和解码器。 json 库提供了对 json 数据的支持,日常开发中我们做前后端分离需要对传输数据 json 进行序列化和反序列化操作,以保证对数据的完整性和有效性,而序列化和反序列化其实就是编码和解码的过程。
pickle
Python 对象序列化库。 pickle 库支持对 python 对象进行序列化和反序列化操作,当我们需要将处理好的对象保存到文件或数据库中时,就可以将其序列化成二进制数据,从而更好的保存起来。
shelve
Python 对象持久化。简单的数据存储方案。
socket
底层网络接口。 socket(套接字) 库提供了标准的BSD(伯克利套接字) Socket API,可以通过访问底层操作系统 Socket 的相关接口进行网络通讯。
datetime
基本日期和时间类型库。该库提供了各种简单和复杂的方式处理日期和时间,日常我们会用时间测算时间消耗、复杂度,对存储的创建时间和修改时间也需要进一步说明,对计时器的描述和控制也需要用到该库。
hashlib
安全哈希和消息摘要。摘要算法 其实就是对某些数据进行加密(不可逆的加密算法),因为被加密的数据无法破解,所以就能防止被篡改。常见的摘要算法有 MD5、SHA1,一般我们会用 MD5 对用户口令进行加密,防止盗用后被轻易破解;而 SHA1 与 MD5 类似,但是 SHA1 会产生更长的长度,也更安全,但是算法的复杂性通常伴随着存储空间和时间的消耗。要说比SHA1更长的字符长度,还有 SHA224、SHA256、SHA384 和 SHA512,看名字就能知道。
大家都知道无论算法生成的字符长度如何都有可能发生碰撞(被破解),这是不可避免的,所以具体场景具体情况而定。
configparser
配置文件解析器。 configparser 库可以轻松定制配置文件,通过解析配置文件的信息我们就可以全局访问相关配置。
urllib
URL 处理模块。 urllib 库集成了处理 URLs(统一资源定位符)的各种模块:
URL urllib.request URL robots.txt urllib 库对访问网络有很好的支持,提供了对数据的访问和处理、文件的上传和下载、记录 cookie 和 session 等等。
itertools
为高效循环而创建迭代器的函数。 itertools 库也是经常需要用到,当我们要对某些数进行 for-in 时就需要先将其处理成一个可迭代对象,之后我们才能进行遍历操作。
collections
容器数据类型库。 collections 库提供了对所有容器数据类型的支持,包括 dict, list, set 和 tuple。我们可以用此库对不同数据类型进行操作,常有的函数方法有这些:
namedtuple() 创建命名元组子类的工厂函数 deque 类似列表(list)的容器,实现了在两端快速添加(append)和弹出(pop) ChainMap 类似字典(dict)的容器类,将多个映射集合到一个视图里面 Counter 字典的子类,提供了可哈希对象的计数功能 OrderedDict 字典的子类,保存了他们被添加的顺序 defaultdict 字典的子类,提供了一个工厂函数,为字典查询提供一个默认值 UserDict 封装了字典对象,简化了字典子类化 UserList 封装了列表对象,简化了列表子类化 UserString 封装了列表对象,简化了字符串子类化 functools
高阶函数和可调用对象上的操作。该库主要调用高阶函数,是常规函数的一种补充。目前库中包含以下几种函数:
cmp_to_key lru_cache total_ordering partial partialmethod rece singledispatch update_wrapper wraps threading
线程并行库。 threading 库支持线程和多线程的操作,针对多线程并发的问题可以给数据加同步锁,一次只能让一个线程处理数据,从而避免出现数据读写混乱。
在 CPython 解释器上,因为GIL(全局解释器锁)锁机制的存在的,被设计成线程安全,所以同一时间只能执行一个线程,这就导致了多线程不能发挥出计算机的多核特性。
multiprocessing
进程并行库。 multiprocessing 库与 threading 库很类似,不同的是进程库可以创建子进程避开 GIL,从而弥补线程库存在的劣势和发挥计算机的多核特性。
timeit
测量小代码片段的执行时间。此库主要用来计算运行代码的时间消耗,支持多种方式传入参数。
atexit
退出处理器。当处理一个函数需要立马退出时可以使用该库。
abc
抽象基类。 abc 库定义抽象基类,以便其他类派生出新类。比如 collections 容器库中就有此派生出的 collections.abc 类,派生出来的类可以进一步实现。
asyncio
异步IO库。 asyncio 库是一个用 async/await 关键字编写并发的库,为多个异步框架提供基础功能,能够实现高性能的网络、Web服务器、数据库连接和分布式任务队列等。
copy
浅层和深层复制操作。 copy 库提供对对象的拷贝,我们都知道要制作对象副本,是无法通过简单值传递创建新变量的方式做到,因为新变量所指向的内存空间依旧是原对象本身,所以对新变量进行任何操作都会改变原对象。那么, copy 库就提供了制作对象副本的各种方法,会开辟一个新的内存空间存放副本对象,修改操作不会对原对象有任何干预。
csv
csv(Comma Separated Values)文件读写库。此库支持以纯文本的形式存储表格数据(数字和文本)。
operator
标准运算符替代函数库。此库是将 python 自有的运算符作为有效函数,比如表达式 x+y 可以用函数 operator.add(x, y) 表示;比如表达式 a*b 可以用函数 operator.mul(a, b) 表示,等等。
enum
枚举库。 enum 库支持创建枚举类来存储大量同类型的不可变常量,以便其他函数调用。创建出来的枚举类是可迭代对象,所以可以用 for-in 枚举出所有常量。
heapq
堆队列算法。这个模块提供了堆队列算法的实现,也称为优先队列算法。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务。所以当我们要求前n最大/最小值的时候就可以用此算法来实现, heapq 库中也提供了相应函数实现。
http
HTTP 模块。 http 模块是一个包,收集了多个处理超文本传输协议的模块:
urllib.request http 模块通过 http.HTTPStatus 枚举定义了HTTP状态码 以及相关联消息。
profile、pstats
性能分析工具。 profile 模块提供了 profile 和 cProfile 两种不同实现的性能分析工具,可用来描述程序各个部分的执行时间和频率,统计后的信息可以通过 pstats 模块保存并使用。
ssl
TLS/SSL(传输安全协议)。此模块提供对安全协议的支持,通过应用上下文,可将 TLS(传输层安全性协议)或其前身 SSL(安全套接层)支持安全协议,能为互联网通信提供安全和数据完整性保障。一般 HTTPS 协议都支持 TLS/SSL 加密。
unitest
单元测试框架。 unitest 库常用于单元测试,受到 JUnit 和其他主流测试库的启发, unitest 库的功能和函数与它们有着相似的风格。
uuid
UUID库。 uuid 库主要用途是生成随机字符串,库中有多个版本的 UUID 对象方法,比如版本 1、3、4 和 5 的 uuid1() 、 uuid3() 、 uuid4() 和 uuid5() 。需要注意的是,如果要生成随机字符串,可以使用 uuid1() 和 uuid4() ,但是 uuid1() 会存在隐私风险,因为生成的原理里边包含用户访问计算机的网络地址,而 uuid4() 是通过随机字符生成。
希望可以帮助到你。

求java学习路线图?

/*回答内容很长,能看完的少走一个月弯路,绝不抖机灵*/

提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获。

废话不多少了,先了解一下Java零基础入门学习路线:

第一阶段:JavaSE阶段

变量、数据类型、运算符

    二进制和十进制的转化

    注释、单行注释、多行注释、文本注释、注释内容和字节码的关系

    标识符、关键字、驼峰原则

    变量的本质、内存画图、变量声明和初始化

    变量的分类和作用域(局部变量、成员变量、静态变量)

    常量和Final

    基本数据类型介绍

    整型变量和整型常量

    浮点类型、float、double

    char字符型、转义字符

    boolean布尔型、if语句使用要点、布尔类型占用空间问题

    运算符介绍

    算数运算符(二元、自增、自减)

    赋值和赋值运算符

    关系运算符详解

    逻辑运算符、短路运算符详解

    位运算符详解

    字符串连接符

    条件运算符(三元运算符)

    运算符优先级问题

    自动类型转换详解

    强制类型装换详解

    基本数据类型装换常见错误、溢出、L问题

    使用Scanner获取键盘输入

控制语句

    控制语句和实现逻辑对应

    if单选结构

    if_elseif_else多选结构

    switch语句_IDEA更换主题

    循环_while

    循环_for循环_dowhile

    嵌套循环

    break和continue语句_标签_控制语句底层原理

    写一个年薪计算机_百度查问题的秘诀(重要)

    个人所得税计算器软件

    方法核心详解_天才思维模型教你高手学习思维模式

    方法的重载

    递归结构讲解_递归头_递归体

面向对象编程-基础

    面向过程和面向对象的区别

    类和对象的概述

    类的属性和方法

    创建对象内存分析

    构造方法(Construtor)及重载

    对象类型的参数传递

    this关键字

    static关键字详解

    局部代码块、构造代码块和静态代码块

    package和import详解

    JavaDoc生成API文档

面向对象编程-进阶

    面向对象的三大特性

    面向对象之【封装(Encapsulation)】

    访问权限修饰符

    面向对象之【继承(Inheritance)】

    Object类

    方法重写Override

    super关键字详解

    重写equals()和toString()

    继承中对象创建的内存分析

    面向对象之【多态(Polymorphism)】

    向上转型

    向下转型

    instanceof运算符

    编译时和运行时详解

    final修饰符

    抽象类和抽象方法(abstrct)

    接口的定义和实现

    JDK8的接口新特性

    接口应用:内部类比较器Comparable

    内部类详解

    Java的内存管理与垃圾回收

异常机制

    异常的概述

    异常的执行过程与分析

    try-catch-finally捕捉异常

    throw抛出异常

    throws声明异常

    异常继承体系

    运行时异常和编译异常

    自定义异常

Java常用类

Wrapper包装类

    自动装箱和自动拆箱

    包装类的源码分析

    String类的使用与内存原理

    String类的源码分析

    StringBuffer

    StringBuilder

    字符串处理类性能分析

    Date类

    System类

    DateFormat类

    Calendat类

    Math类

    BigInteger类和BigDecimal类

    Random类

    枚举类

    File类

    常见的面试题讲述与分析

    数据结构算法

    数据结构的概述

    线性表

    顺序表

    链表

    栈和队列

    二叉树

    二叉查找树

    二叉平衡树

    黑红树

    冒泡排序

    选择排序

    递归

    折半查找

    集合(容器)

    集合和数组的联系和区别

    集合框架体系

    ArrayList的使用和源码分析

    集合中使用泛型

    LinkedList的使用和源码分析

    HashSet的使用和源码分析

    哈希表及原理

    TreeSet的使用和源码分析

    比较器Comparable和Comparator

    HashMap的使用和源码分析

    TreeMap的使用和源码分析

    Iterator于ListIterator

    Collections工具类

    旧集合类Vector、Hashtable

    集合总结和选择依据

    泛型接口

    泛型类

    泛型方法

    IO流

    IO流的概念

    IO流的分类及其原理分析

    文件流FlieInputStream、FileOutputStream

    缓冲流BufferedInputStream、BufferedOutputStream

    数据流ObjectInputStream、ObjectOutputStream

    序列化和反序列化

    转换流InputStreamReader、OutputStreamWriter

    打印流PrintWrite和PrintStream

    数组流ByteArrayOutputStream、ByteArrayInputStream

    使用IO复制文件夹

    多线程

    进程和线程

    线程的创建与启动

    创建线程的三种方式对比

    线程的生命周期

    线程控制

    多线程的安全问题与解决办法

    线程的同步:同步代码块

    线程的同步:同步方法

    线程的同步:Lock锁

    线程的死锁问题

    线程通信

    Condition

    线程的完整生命周期

    线程池ThreadPoolExecutor

    ForkJoin框架

    ThreadLocal类

    网络编程

    计算机网络基础知识

    网络通信协议

    OSI参考模型

    TCP/IP参考模型

    数据的封装与拆封原理解析

    TCP协议

    UDP协议

    IP地址和端口号

    URL和Socket

    使用TCP编程实现登录功能

    使用UDP编程实现客服系统

    使用TCP编程实现文件上传

    集合提升寻训练

    手写ArrayList

    手写单链表

    手写Linkedlist

    手写HashMap

    手写HashSet

    最新并发集合类

    多线程提升训练

    生产者消费者模式扩展

    Lock锁和Condition

    ReadWriteLock

    BlockingQueue

    volatile关键字

    多线程题目练习

    JDK新特征

    面试题详解

    设计模式

    设计模式入门

    面向对象设计七大原则

    简单工厂模式

    工厂方法模式

    单例模式

    原型模式

    装饰模式

    适配器模式

    外观模式

第二阶段:数据库

    MySQL基础

    数据库基础知识

    MySQL基础知识

    MySQL8新特征

    安装和卸载MySQL8

    使用navicat访问数据库

    SQL语言入门

    创建数据库表

    DML

    修改删除数据库表

    表的完整性约束

    表的外键约束

    DML扩展

    MySQL 查询语句

    基本select查询

    where子句

    函数

    group by

    having

    SQL99-内连接查询

    SQL99-外连接查询

    SQL99-自连接查询

    SQL92-连接查询

    不相关子查询

    相关子查询

    分页查询

    数据库对象

    索引

    事务及其特征

    事务的并发问题

    事务的隔离级别

    存储过程

    导入导出数据

    JDBC

    JDBC概述

    使用JDBC完成添加/更新/删除操作

    使用JDBC完成查询操作

    JDBC常用接口

    使用PreparedStatement

    使用事务完成银行转账

    提取DBUtil工具类

    使用Properties读写属性文件

    日志框架log4j

    开发员工管理系统

第三阶段:JavaEE阶段

      Servlet

      web开发概述

      B/S和C/S架构简介

      HTTP协议

      HTTP请求头和响应头

      Tomcat安装使用

      Tomcat目录结构

      Servlet概述

      Servlet快速入门

      Servlet生命周期

      读取配置文件信息

      HttpServletRequest

      HttpServletResponse

      GET和POST区别

      解决中文乱码

      请求转发与重定向

      绝对路径和相对路径

      Cookie

      Session

      ServletContext

      ServletConfig

      JSP

      JSP技术介绍

      JSP的执行过程

      scriptlet

      表达式

      声明

      JSP指令元素

      JSP动作元素

      JSP隐式对象

      JSP底层原理

      九大内置对象

      四个作用域

      Servlet和JSP的关系和区别

      MVC模式

      合并Servlet

      JavaScript

      JavaScript概述与特点

      JS基础语法

      函数

      数组

      Math对象

      String对象

      Date对象

      事件event

      浏览器开发者工具

      console

      DOM和BOM

      window

      location

      navigator

      history

      认识DOM

      DOM获取元素

      jQuery

      jQuery简介及快速入门

      jQuery入口函数

      jQuery对象与DOM对象互相转换

      基本选择器

      属性选择器

      位置选择器

      表单选择器

      内容选择器

      jQuery事件

      jQuery动画效果

      DOM操作-操作文本

      DOM操作-操作属性

      DOM操作-操作元素

      直接操作CSS样式

      操作CSS类样式

      购物车案例

      表单验证

      正则表达式

      EL+JSTL+过滤器+*

      EL介绍及使用

      EL取值原理

      EL隐含对象

      EL逻辑运算

      JSTL介绍-核心标签库

      JSTL核心标签库

      JSTL-格式标签库

      Filter原理

      Filter生命周期

      Filter链

      Filter登录验证

      Filter权限控制

      Listener概述及分类

      Listener监听在线用户

      Ajax和JSON

      Ajax异步请求和局部刷新的原理

      使用原生Ajax验证用户唯一性

      jQuery Ajax

      JSON的格式和使用

      主要JSON解析器

      Jackson的使用

      Jackson的实现原理

      使用jQuery Ajax实现*联动

      使用jQuery Ajax实现自动补全

      分页和文件上传/下载

      分页的意义

      理解分页工具类

      实现基本分页

      实现带查询的分页

      文件上传原理

      文件上传API

      实现文件上传

      文件下载原理

      文件下载响应头

      实现文件下载

    第四阶段:框架阶段

      MyBatis

      MyBatis概述

      MyBatis入门配置

      基本的CRUD操作

      核心配置文件详解

      Mapper.xml基础详解

      模糊查询

      分页的实现及插件PageHelper的使用

      动态sql+sql片段的使用

      一对多、多对一的关系处理

      注解的使用

      一级缓存和二级缓存说明及使用

      generator逆向工程使用

      Spring

      Spring框架简介

      Spring官方压缩包目录介绍

      Spring环境搭建

      IoC/DI容器详解

      Spring创建Bean的三种方式

      scope属性讲解

      Spring中几种注入方式

      静态代理设计模式

      动态代理设计模式

      AOP详解

      AOP中几种通知类型

      AOP两种实现方式

      自动注入

      声明式事务

      事务传播行为

      事务隔离级别

      只读事务

      事务回滚

      基于注解式配置

      常用注解

      Spring 整合MyBatis

      i18n

      Spring整合Junit

      SpringMVC

      MVC架构模式

      手写MVC框架

      SpringMVC简介

      SpringMVC运行原理

      基于配置文件方式搭建环境

      基于注解方式搭建环境

      SpringMVC的跳转及视图解析器的配置

      SpringMVC和Ajax的交互

      Spring 参数注入

      SpringMVC作用域传值

      视图解析器

      文件下载

      文件上传

      Spring*/*栈

      登录状态验证

      SpringMVC容器和Spring容器介绍

      异常处理4种方式

      SpringMVC5其他常用注解

      Maven

      Maven简介

      Maven原理

      Linux安装及注意事项

      Maven项目结构

      POM模型

      Maven 中项目类型

      创建WAR类型的Maven项目

      scope属性可取值

      SSM项目拆分演示

      Maven的常见插件讲解

      热部署

      BootStrap

      BootStrap概述

      BootStrap栅格系统

      BootStrap常用全局CSS样式

      常用组件

      常用JavaScript插件

      RBAC

      RBAC概述

      RBAC发展历史

      基于RBAC的数据库表设计

      URL拦截实现

      动态菜单实现

      密码学

    第五阶段:前后端分离阶段

      Spring Boot

      Spring Boot简介

      Spring Boot实现Spring MVC

      配置文件顺序及类型讲解

      Spring Boot项目结构

      Spring Boot 整合MyBatis

      Spring Boot 整合Druid

      Spring Boot 整合PageHelper

      Spring Boot 整合logback

      Spring Boot 整合JSP

      Spring Boot 整合Thymeleaf

      Spring Boot 开发者工具

      Spring Boot 异常显示页面

      Spring Boot 整合Junit4

      Spring Boot 项目打包部署

      Spring Boot 整合Quartz

      Spring Boot 中Interceptor使用

      Spring Boot Actuator

      HikariCP

      Logback

      Logback简介

      Logback依赖说明

      Logback 配置文件讲解

      Logback 控制台输出

      Logback 文件输出

      Logback 数据库输出

      Spring Security

      Spring Security简介

      Spring Security架构原理

      什么是认证和授权

      基础环境搭建

      自定义认证流程

      UserDetailsService和UserDetails

      PasswordEncoder

      自定义认证结果

      授权-访问路径匹配方式

      授权-权限管理

      基于注解实现权限管理

      Thymeleaf整合Security权限管理

      Rememberme 实现

      退出实现

      CSRF

      Linux - CentOS 8

      Linux简介

      VMWare安装及使用

      Linux安装及注意事项

      Linux目录结构及路径

      Linux常用命令

      VMWare常用配置

      XShell安装及使用

      Xftp安装及使用

      JDK解压版配置步骤

      Tomcat配置步骤

      安装MySQL

      WAR包部署

      Docker

      Docker简介

      Docker与VM对比

      Docker特点

      Docker架构

      Docker安装与启动

      镜像加速器配置

      Docker镜像操作常用命令

      Docker容器操作常用命令

      DockerFile

      搭建本地镜像仓库

      推送镜像到阿里云及本地仓库

      Docker容器生命周期

      Docker数据管理

      Redis

      Redis简介

      Redis 单机版安装

      Redis 数据类型介绍

      Redis 常用命令

      Redis 持久化方案

      Redis 的主从搭建

      Redis的哨兵搭建

      Redis 的集群搭建

      Spring Boot整合Spring Data Redis

      Redis的缓存穿透

      Redis的缓存雪崩

      Redis的缓存击穿

      Vue

      vsCode和插件安装

      webpack介绍

      Vue项目创建

      Vue模板语法

      Vue条件渲染

      Vue列表渲染

      Vue事件处理

      Vue计算属性

      Vue Class与Style

      Vue表单处理

      Vue组件

      Vue组件生命周期

      Vue 路由配置

      Vue Axios网络请求

      Vue跨域处理

      Vue Element

      Mock.js

      Swagger

      Swagger2简介

      Springfox

      Swagger2基本用法

      Swagger-UI用法

      Swagger2配置

      Swagger2常用配置

      Git/GitEE

      Git的下载和安装

      Git和SVN对比

      Git创建版本库

      Git版本控制

      Git远程仓库

      Git分支管理

      Git标签管理

      GitEE建库

      GitEE 连接及使用

      GitEE 组员及管理员配置

    第六阶段:微服务架构

      FastDFS

      分布式文件系统概述

      FastDFS简介

      FastDFS架构

      Tracker Server

      Storage Server

      FastDFS安装

      安装带有FastDFS模块的Nginx

      Fastdfs-java-client的使用

      创建Fastdfs-java-client工具类

      实现文件上传与下载

      KindEditor介绍

      通过KindEditor实现文件上传并回显

      RabbitMQ

      AMQP简介

      RabbitMQ简介

      安装Erlang

      安装RabbitMQ

      RabbitMQ原理

      Spring Boot 集成RabbitMQ

      RabbitMQ的交换器

      Spring AMQP的使用

      Spring Cloud Netflix Eureka

      Eureka简介

      Eureka和Zookeeper 对比

      搭建Eureka注册中心

      Eureka 服务管理平台介绍

      搭建高可用集群

      集群原理

      Eureka优雅停服

      Spring Cloud Netflix Ribbon

      Ribbon简介

      集中式与进程内负载均衡区别

      Ribbon常见的负载均衡策略

      Ribbon的点对点直连

      Spring Cloud OpenFeign

      Feign简介

      Feign的请求参数处理

      Feign的性能优化

      配置Feign负载均衡请求超时时间

      Spring Cloud Netflix Hystrix

      Hystrix简介

      服务降级

      服务熔断

      请求缓存

      Feign的雪崩处理

      可视化的数据监控Hystrix-dashboard

      Spring Cloud Gateway

      Spring Cloud Gateway简介

      Gateway基于配置文件实现路由功能

      Gateway基于配置类实现路由功能

      Gateway中内置过滤器的使用

      Gateway中自定义GatewayFilter过滤器的使用

      Gateway中自定义GlobalFilter过滤器的使用

      Gateway中使用过滤器实现鉴权

      Gateway结合Hystrix实现熔断功能

      Spring Cloud Config

      什么是分布式配置中心

      创建配置中心服务端

      创建配置中心客户端

      基于Gitee存储配置文件

      基于分布式配置中心实现热刷新

      Spring Cloud Bus

      什么是消息总线

      基于消息总线实现全局热刷新

      ELK

      ElasticSearch介绍

      ElasticSearch单机版安装

      ElasticSearch集群版安装

      ElasticSearch索引管理

      ElasticSearch文档管理

      ElasticSearch文档搜索

      SpringDataElasticSearch访问ElasticSearch

      LogStash介绍

      基于LogStash收集系统日志

      TX-LCN

      分布式事务简介

      分布式事务两大理论依据

      分布式事务常见解决方案

      LCN简介

      TX-LCN的3种模式

      LCN原理

      LCN环境搭建及Demo演示

      Nginx

      Nginx的简介

      什么是正向代理、反向代理

      Nginx的安装

      Nginx配置虚拟主机

      Nginx配置服务的反向代理

      Nginx的负载均衡配置

      Spring Session

      Spring Session介绍

      通过Spring Session共享session中的数据

      通过Spring Session同步自定义对象

      Spring Session的Redis存储结构

      设置Session失效时间

      Spring Session序列化器

      MyBatis Plus

      MyBatis Plus简介

      Spring整合MyBatis Plus

      MyBatis Plus的全局策略配置

      MyBatis 的主键生成策略

      MyBatis Plus的CRUD操作

      条件构造器EntityWrapper讲解

      MyBatis Plus的分页插件配置

      MyBatis Plus的分页查询

      MyBatis Plus的其他插件讲解

      MyBatis Plus的代码生成器讲解

      MyBatis Plus的公共字段自动填充

      ShardingSphere

      简介

      数据库切分方式

      基本概念

      MySQL主从配置

      切片规则

      读写分离

      实现分库分表

    第七阶段:云服务阶段

      Kafka

      Kafka简介

      Kafka架构

      分区和日志

      Kafka单机安装

      Kafka集群配置

      自定义分区

      自动控制

      Spring for Apache Kafka

      Zookeeper

      Zookeeper简介和安装

      Zookeeper 数据模型

      Zookeeper 单机版安装

      Zookeeper常见命令

      ZClient操作Zookeeper

      Zookeeper 集群版安装

      Zookeeper 客户端常用命令

      Zookeeper分布式锁

      RPC

      什么是分布式架构

      什么是RFC、RPC

      HttpClient实现RPC

      RestTemplate

      RMI实现RPC

      基于Zookeeper实现RPC 远程过程调用

      Dubbo

      SOA架构介绍

      Dubbo简介

      Dubbo结构图

      Dubbo注册中心

      Dubbo 支持的协议

      Dubbo 注册中心搭建

      Spring Boot 整合 Dubbo

      Admin管理界面

      Dubbo 搭建高可用集群

      Dubbo 负载均衡

      Spring Cloud Alibaba Dubbo

      Spring Cloud Alibaba Dubbo简介

      基于Zookeeper发布服务

      基于Zookeeper订阅服务

      实现远程服务调用处理

      Spring Cloud Alibaba Nacos

      Spring Cloud Alibaba Nacos简介

      搭建Nacos服务器

      基于Nacos发布|订阅服务

      实现远程服务调用处理

      Nacos Config配置中心

      Spring Cloud Alibaba Sentinel

      Spring Cloud Alibaba Sentinel简介

      搭建Sentinel服务器

      Sentinel-实时监控

      Sentinel-簇点链路

      Sentinel-授权规则

      Sentinel-系统规则

      @SentinelResource注解

      持久化规则

      Spring Cloud Alibaba Seata

      Spring Cloud Alibaba Seata简介

      搭建Seata服务器

      Seata支持的事务模式-AT模式

      Seata支持的事务模式-TCC模式

      Seata支持的事务模式-Saga模式

      Seata支持的事务模式-XA模式

      SeataAT事务模式应用方式

      SeataTCC事务模式应用方式

    求java学习路线图?

    /*回答内容很长,能看完的少走一个月弯路,绝不抖机灵*/

    提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获。

    废话不多少了,先了解一下Java零基础入门学习路线:

    第一阶段:JavaSE阶段

    变量、数据类型、运算符

      二进制和十进制的转化

      注释、单行注释、多行注释、文本注释、注释内容和字节码的关系

      标识符、关键字、驼峰原则

      变量的本质、内存画图、变量声明和初始化

      变量的分类和作用域(局部变量、成员变量、静态变量)

      常量和Final

      基本数据类型介绍

      整型变量和整型常量

      浮点类型、float、double

      char字符型、转义字符

      boolean布尔型、if语句使用要点、布尔类型占用空间问题

      运算符介绍

      算数运算符(二元、自增、自减)

      赋值和赋值运算符

      关系运算符详解

      逻辑运算符、短路运算符详解

      位运算符详解

      字符串连接符

      条件运算符(三元运算符)

      运算符优先级问题

      自动类型转换详解

      强制类型装换详解

      基本数据类型装换常见错误、溢出、L问题

      使用Scanner获取键盘输入

    控制语句

      控制语句和实现逻辑对应

      if单选结构

      if_elseif_else多选结构

      switch语句_IDEA更换主题

      循环_while

      循环_for循环_dowhile

      嵌套循环

      break和continue语句_标签_控制语句底层原理

      写一个年薪计算机_百度查问题的秘诀(重要)

      个人所得税计算器软件

      方法核心详解_天才思维模型教你高手学习思维模式

      方法的重载

      递归结构讲解_递归头_递归体

    面向对象编程-基础

      面向过程和面向对象的区别

      类和对象的概述

      类的属性和方法

      创建对象内存分析

      构造方法(Construtor)及重载

      对象类型的参数传递

      this关键字

      static关键字详解

      局部代码块、构造代码块和静态代码块

      package和import详解

      JavaDoc生成API文档

    面向对象编程-进阶

      面向对象的三大特性

      面向对象之【封装(Encapsulation)】

      访问权限修饰符

      面向对象之【继承(Inheritance)】

      Object类

      方法重写Override

      super关键字详解

      重写equals()和toString()

      继承中对象创建的内存分析

      面向对象之【多态(Polymorphism)】

      向上转型

      向下转型

      instanceof运算符

      编译时和运行时详解

      final修饰符

      抽象类和抽象方法(abstrct)

      接口的定义和实现

      JDK8的接口新特性

      接口应用:内部类比较器Comparable

      内部类详解

      Java的内存管理与垃圾回收

    异常机制

      异常的概述

      异常的执行过程与分析

      try-catch-finally捕捉异常

      throw抛出异常

      throws声明异常

      异常继承体系

      运行时异常和编译异常

      自定义异常

    Java常用类

    Wrapper包装类

      自动装箱和自动拆箱

      包装类的源码分析

      String类的使用与内存原理

      String类的源码分析

      StringBuffer

      StringBuilder

      字符串处理类性能分析

      Date类

      System类

      DateFormat类

      Calendat类

      Math类

      BigInteger类和BigDecimal类

      Random类

      枚举类

      File类

      常见的面试题讲述与分析

      数据结构算法

      数据结构的概述

      线性表

      顺序表

      链表

      栈和队列

      二叉树

      二叉查找树

      二叉平衡树

      黑红树

      冒泡排序

      选择排序

      递归

      折半查找

      集合(容器)

      集合和数组的联系和区别

      集合框架体系

      ArrayList的使用和源码分析

      集合中使用泛型

      LinkedList的使用和源码分析

      HashSet的使用和源码分析

      哈希表及原理

      TreeSet的使用和源码分析

      比较器Comparable和Comparator

      HashMap的使用和源码分析

      TreeMap的使用和源码分析

      Iterator于ListIterator

      Collections工具类

      旧集合类Vector、Hashtable

      集合总结和选择依据

      泛型接口

      泛型类

      泛型方法

      IO流

      IO流的概念

      IO流的分类及其原理分析

      文件流FlieInputStream、FileOutputStream

      缓冲流BufferedInputStream、BufferedOutputStream

      数据流ObjectInputStream、ObjectOutputStream

      序列化和反序列化

      转换流InputStreamReader、OutputStreamWriter

      打印流PrintWrite和PrintStream

      数组流ByteArrayOutputStream、ByteArrayInputStream

      使用IO复制文件夹

      多线程

      进程和线程

      线程的创建与启动

      创建线程的三种方式对比

      线程的生命周期

      线程控制

      多线程的安全问题与解决办法

      线程的同步:同步代码块

      线程的同步:同步方法

      线程的同步:Lock锁

      线程的死锁问题

      线程通信

      Condition

      线程的完整生命周期

      线程池ThreadPoolExecutor

      ForkJoin框架

      ThreadLocal类

      网络编程

      计算机网络基础知识

      网络通信协议

      OSI参考模型

      TCP/IP参考模型

      数据的封装与拆封原理解析

      TCP协议

      UDP协议

      IP地址和端口号

      URL和Socket

      使用TCP编程实现登录功能

      使用UDP编程实现客服系统

      使用TCP编程实现文件上传

      集合提升寻训练

      手写ArrayList

      手写单链表

      手写Linkedlist

      手写HashMap

      手写HashSet

      最新并发集合类

      多线程提升训练

      生产者消费者模式扩展

      Lock锁和Condition

      ReadWriteLock

      BlockingQueue

      volatile关键字

      多线程题目练习

      JDK新特征

      面试题详解

      设计模式

      设计模式入门

      面向对象设计七大原则

      简单工厂模式

      工厂方法模式

      单例模式

      原型模式

      装饰模式

      适配器模式

      外观模式

    第二阶段:数据库

      MySQL基础

      数据库基础知识

      MySQL基础知识

      MySQL8新特征

      安装和卸载MySQL8

      使用navicat访问数据库

      SQL语言入门

      创建数据库表

      DML

      修改删除数据库表

      表的完整性约束

      表的外键约束

      DML扩展

      MySQL 查询语句

      基本select查询

      where子句

      函数

      group by

      having

      SQL99-内连接查询

      SQL99-外连接查询

      SQL99-自连接查询

      SQL92-连接查询

      不相关子查询

      相关子查询

      分页查询

      数据库对象

      索引

      事务及其特征

      事务的并发问题

      事务的隔离级别

      存储过程

      导入导出数据

      JDBC

      JDBC概述

      使用JDBC完成添加/更新/删除操作

      使用JDBC完成查询操作

      JDBC常用接口

      使用PreparedStatement

      使用事务完成银行转账

      提取DBUtil工具类

      使用Properties读写属性文件

      日志框架log4j

      开发员工管理系统

    第三阶段:JavaEE阶段

        Servlet

        web开发概述

        B/S和C/S架构简介

        HTTP协议

        HTTP请求头和响应头

        Tomcat安装使用

        Tomcat目录结构

        Servlet概述

        Servlet快速入门

        Servlet生命周期

        读取配置文件信息

        HttpServletRequest

        HttpServletResponse

        GET和POST区别

        解决中文乱码

        请求转发与重定向

        绝对路径和相对路径

        Cookie

        Session

        ServletContext

        ServletConfig

        JSP

        JSP技术介绍

        JSP的执行过程

        scriptlet

        表达式

        声明

        JSP指令元素

        JSP动作元素

        JSP隐式对象

        JSP底层原理

        九大内置对象

        四个作用域

        Servlet和JSP的关系和区别

        MVC模式

        合并Servlet

        JavaScript

        JavaScript概述与特点

        JS基础语法

        函数

        数组

        Math对象

        String对象

        Date对象

        事件event

        浏览器开发者工具

        console

        DOM和BOM

        window

        location

        navigator

        history

        认识DOM

        DOM获取元素

        jQuery

        jQuery简介及快速入门

        jQuery入口函数

        jQuery对象与DOM对象互相转换

        基本选择器

        属性选择器

        位置选择器

        表单选择器

        内容选择器

        jQuery事件

        jQuery动画效果

        DOM操作-操作文本

        DOM操作-操作属性

        DOM操作-操作元素

        直接操作CSS样式

        操作CSS类样式

        购物车案例

        表单验证

        正则表达式

        EL+JSTL+过滤器+*

        EL介绍及使用

        EL取值原理

        EL隐含对象

        EL逻辑运算

        JSTL介绍-核心标签库

        JSTL核心标签库

        JSTL-格式标签库

        Filter原理

        Filter生命周期

        Filter链

        Filter登录验证

        Filter权限控制

        Listener概述及分类

        Listener监听在线用户

        Ajax和JSON

        Ajax异步请求和局部刷新的原理

        使用原生Ajax验证用户唯一性

        jQuery Ajax

        JSON的格式和使用

        主要JSON解析器

        Jackson的使用

        Jackson的实现原理

        使用jQuery Ajax实现*联动

        使用jQuery Ajax实现自动补全

        分页和文件上传/下载

        分页的意义

        理解分页工具类

        实现基本分页

        实现带查询的分页

        文件上传原理

        文件上传API

        实现文件上传

        文件下载原理

        文件下载响应头

        实现文件下载

      第四阶段:框架阶段

        MyBatis

        MyBatis概述

        MyBatis入门配置

        基本的CRUD操作

        核心配置文件详解

        Mapper.xml基础详解

        模糊查询

        分页的实现及插件PageHelper的使用

        动态sql+sql片段的使用

        一对多、多对一的关系处理

        注解的使用

        一级缓存和二级缓存说明及使用

        generator逆向工程使用

        Spring

        Spring框架简介

        Spring官方压缩包目录介绍

        Spring环境搭建

        IoC/DI容器详解

        Spring创建Bean的三种方式

        scope属性讲解

        Spring中几种注入方式

        静态代理设计模式

        动态代理设计模式

        AOP详解

        AOP中几种通知类型

        AOP两种实现方式

        自动注入

        声明式事务

        事务传播行为

        事务隔离级别

        只读事务

        事务回滚

        基于注解式配置

        常用注解

        Spring 整合MyBatis

        i18n

        Spring整合Junit

        SpringMVC

        MVC架构模式

        手写MVC框架

        SpringMVC简介

        SpringMVC运行原理

        基于配置文件方式搭建环境

        基于注解方式搭建环境

        SpringMVC的跳转及视图解析器的配置

        SpringMVC和Ajax的交互

        Spring 参数注入

        SpringMVC作用域传值

        视图解析器

        文件下载

        文件上传

        Spring*/*栈

        登录状态验证

        SpringMVC容器和Spring容器介绍

        异常处理4种方式

        SpringMVC5其他常用注解

        Maven

        Maven简介

        Maven原理

        Linux安装及注意事项

        Maven项目结构

        POM模型

        Maven 中项目类型

        创建WAR类型的Maven项目

        scope属性可取值

        SSM项目拆分演示

        Maven的常见插件讲解

        热部署

        BootStrap

        BootStrap概述

        BootStrap栅格系统

        BootStrap常用全局CSS样式

        常用组件

        常用JavaScript插件

        RBAC

        RBAC概述

        RBAC发展历史

        基于RBAC的数据库表设计

        URL拦截实现

        动态菜单实现

        密码学

      第五阶段:前后端分离阶段

        Spring Boot

        Spring Boot简介

        Spring Boot实现Spring MVC

        配置文件顺序及类型讲解

        Spring Boot项目结构

        Spring Boot 整合MyBatis

        Spring Boot 整合Druid

        Spring Boot 整合PageHelper

        Spring Boot 整合logback

        Spring Boot 整合JSP

        Spring Boot 整合Thymeleaf

        Spring Boot 开发者工具

        Spring Boot 异常显示页面

        Spring Boot 整合Junit4

        Spring Boot 项目打包部署

        Spring Boot 整合Quartz

        Spring Boot 中Interceptor使用

        Spring Boot Actuator

        HikariCP

        Logback

        Logback简介

        Logback依赖说明

        Logback 配置文件讲解

        Logback 控制台输出

        Logback 文件输出

        Logback 数据库输出

        Spring Security

        Spring Security简介

        Spring Security架构原理

        什么是认证和授权

        基础环境搭建

        自定义认证流程

        UserDetailsService和UserDetails

        PasswordEncoder

        自定义认证结果

        授权-访问路径匹配方式

        授权-权限管理

        基于注解实现权限管理

        Thymeleaf整合Security权限管理

        Rememberme 实现

        退出实现

        CSRF

        Linux - CentOS 8

        Linux简介

        VMWare安装及使用

        Linux安装及注意事项

        Linux目录结构及路径

        Linux常用命令

        VMWare常用配置

        XShell安装及使用

        Xftp安装及使用

        JDK解压版配置步骤

        Tomcat配置步骤

        安装MySQL

        WAR包部署

        Docker

        Docker简介

        Docker与VM对比

        Docker特点

        Docker架构

        Docker安装与启动

        镜像加速器配置

        Docker镜像操作常用命令

        Docker容器操作常用命令

        DockerFile

        搭建本地镜像仓库

        推送镜像到阿里云及本地仓库

        Docker容器生命周期

        Docker数据管理

        Redis

        Redis简介

        Redis 单机版安装

        Redis 数据类型介绍

        Redis 常用命令

        Redis 持久化方案

        Redis 的主从搭建

        Redis的哨兵搭建

        Redis 的集群搭建

        Spring Boot整合Spring Data Redis

        Redis的缓存穿透

        Redis的缓存雪崩

        Redis的缓存击穿

        Vue

        vsCode和插件安装

        webpack介绍

        Vue项目创建

        Vue模板语法

        Vue条件渲染

        Vue列表渲染

        Vue事件处理

        Vue计算属性

        Vue Class与Style

        Vue表单处理

        Vue组件

        Vue组件生命周期

        Vue 路由配置

        Vue Axios网络请求

        Vue跨域处理

        Vue Element

        Mock.js

        Swagger

        Swagger2简介

        Springfox

        Swagger2基本用法

        Swagger-UI用法

        Swagger2配置

        Swagger2常用配置

        Git/GitEE

        Git的下载和安装

        Git和SVN对比

        Git创建版本库

        Git版本控制

        Git远程仓库

        Git分支管理

        Git标签管理

        GitEE建库

        GitEE 连接及使用

        GitEE 组员及管理员配置

      第六阶段:微服务架构

        FastDFS

        分布式文件系统概述

        FastDFS简介

        FastDFS架构

        Tracker Server

        Storage Server

        FastDFS安装

        安装带有FastDFS模块的Nginx

        Fastdfs-java-client的使用

        创建Fastdfs-java-client工具类

        实现文件上传与下载

        KindEditor介绍

        通过KindEditor实现文件上传并回显

        RabbitMQ

        AMQP简介

        RabbitMQ简介

        安装Erlang

        安装RabbitMQ

        RabbitMQ原理

        Spring Boot 集成RabbitMQ

        RabbitMQ的交换器

        Spring AMQP的使用

        Spring Cloud Netflix Eureka

        Eureka简介

        Eureka和Zookeeper 对比

        搭建Eureka注册中心

        Eureka 服务管理平台介绍

        搭建高可用集群

        集群原理

        Eureka优雅停服

        Spring Cloud Netflix Ribbon

        Ribbon简介

        集中式与进程内负载均衡区别

        Ribbon常见的负载均衡策略

        Ribbon的点对点直连

        Spring Cloud OpenFeign

        Feign简介

        Feign的请求参数处理

        Feign的性能优化

        配置Feign负载均衡请求超时时间

        Spring Cloud Netflix Hystrix

        Hystrix简介

        服务降级

        服务熔断

        请求缓存

        Feign的雪崩处理

        可视化的数据监控Hystrix-dashboard

        Spring Cloud Gateway

        Spring Cloud Gateway简介

        Gateway基于配置文件实现路由功能

        Gateway基于配置类实现路由功能

        Gateway中内置过滤器的使用

        Gateway中自定义GatewayFilter过滤器的使用

        Gateway中自定义GlobalFilter过滤器的使用

        Gateway中使用过滤器实现鉴权

        Gateway结合Hystrix实现熔断功能

        Spring Cloud Config

        什么是分布式配置中心

        创建配置中心服务端

        创建配置中心客户端

        基于Gitee存储配置文件

        基于分布式配置中心实现热刷新

        Spring Cloud Bus

        什么是消息总线

        基于消息总线实现全局热刷新

        ELK

        ElasticSearch介绍

        ElasticSearch单机版安装

        ElasticSearch集群版安装

        ElasticSearch索引管理

        ElasticSearch文档管理

        ElasticSearch文档搜索

        SpringDataElasticSearch访问ElasticSearch

        LogStash介绍

        基于LogStash收集系统日志

        TX-LCN

        分布式事务简介

        分布式事务两大理论依据

        分布式事务常见解决方案

        LCN简介

        TX-LCN的3种模式

        LCN原理

        LCN环境搭建及Demo演示

        Nginx

        Nginx的简介

        什么是正向代理、反向代理

        Nginx的安装

        Nginx配置虚拟主机

        Nginx配置服务的反向代理

        Nginx的负载均衡配置

        Spring Session

        Spring Session介绍

        通过Spring Session共享session中的数据

        通过Spring Session同步自定义对象

        Spring Session的Redis存储结构

        设置Session失效时间

        Spring Session序列化器

        MyBatis Plus

        MyBatis Plus简介

        Spring整合MyBatis Plus

        MyBatis Plus的全局策略配置

        MyBatis 的主键生成策略

        MyBatis Plus的CRUD操作

        条件构造器EntityWrapper讲解

        MyBatis Plus的分页插件配置

        MyBatis Plus的分页查询

        MyBatis Plus的其他插件讲解

        MyBatis Plus的代码生成器讲解

        MyBatis Plus的公共字段自动填充

        ShardingSphere

        简介

        数据库切分方式

        基本概念

        MySQL主从配置

        切片规则

        读写分离

        实现分库分表

      第七阶段:云服务阶段

        Kafka

        Kafka简介

        Kafka架构

        分区和日志

        Kafka单机安装

        Kafka集群配置

        自定义分区

        自动控制

        Spring for Apache Kafka

        Zookeeper

        Zookeeper简介和安装

        Zookeeper 数据模型

        Zookeeper 单机版安装

        Zookeeper常见命令

        ZClient操作Zookeeper

        Zookeeper 集群版安装

        Zookeeper 客户端常用命令

        Zookeeper分布式锁

        RPC

        什么是分布式架构

        什么是RFC、RPC

        HttpClient实现RPC

        RestTemplate

        RMI实现RPC

        基于Zookeeper实现RPC 远程过程调用

        Dubbo

        SOA架构介绍

        Dubbo简介

        Dubbo结构图

        Dubbo注册中心

        Dubbo 支持的协议

        Dubbo 注册中心搭建

        Spring Boot 整合 Dubbo

        Admin管理界面

        Dubbo 搭建高可用集群

        Dubbo 负载均衡

        Spring Cloud Alibaba Dubbo

        Spring Cloud Alibaba Dubbo简介

        基于Zookeeper发布服务

        基于Zookeeper订阅服务

        实现远程服务调用处理

        Spring Cloud Alibaba Nacos

        Spring Cloud Alibaba Nacos简介

        搭建Nacos服务器

        基于Nacos发布|订阅服务

        实现远程服务调用处理

        Nacos Config配置中心

        Spring Cloud Alibaba Sentinel

        Spring Cloud Alibaba Sentinel简介

        搭建Sentinel服务器

        Sentinel-实时监控

        Sentinel-簇点链路

        Sentinel-授权规则

        Sentinel-系统规则

        @SentinelResource注解

        持久化规则

        Spring Cloud Alibaba Seata

        Spring Cloud Alibaba Seata简介

        搭建Seata服务器

        Seata支持的事务模式-AT模式

        Seata支持的事务模式-TCC模式

        Seata支持的事务模式-Saga模式

        Seata支持的事务模式-XA模式

        SeataAT事务模式应用方式

        SeataTCC事务模式应用方式

      显示全文