├── README.md ├── docs ├── .nojekyll ├── README.md ├── _coverpage.md ├── _navbar.md ├── _sidebar.md ├── articles │ ├── JVM │ │ ├── JVM掌握的知识点.md │ │ ├── Java内存区域.md │ │ ├── Java内存模型.md │ │ ├── Java内存模型的happen-before.md │ │ ├── 类加载机制.md │ │ ├── 聊聊你熟悉的垃圾回收器.md │ │ └── 谈谈Java的垃圾回收.md │ ├── Java基础 │ │ ├── Java入门 │ │ │ ├── IDEA快捷键.md │ │ │ ├── JavaIDE介绍.md │ │ │ ├── Java介绍.md │ │ │ ├── Java的就业和发展.md │ │ │ ├── picture │ │ │ │ ├── image-20210104105506719.png │ │ │ │ ├── image-20210104135710398.png │ │ │ │ ├── image-20210104150140677.png │ │ │ │ ├── image-20210104150308595.png │ │ │ │ ├── image-20210104162158102.png │ │ │ │ ├── image-20210104163638568.png │ │ │ │ ├── image-20210104180530916.png │ │ │ │ └── image-20210104182531278.png │ │ │ ├── 使用IDEA编写第一个Java程序.md │ │ │ ├── 安装Java运行环境.md │ │ │ └── 运行第一个Java程序.md │ │ ├── Java基础 │ │ │ ├── 1、Java基础语法.md │ │ │ ├── 2、Java数据变量和类型.md │ │ │ ├── 3、Java数组.md │ │ │ ├── 4、Java运算符.md │ │ │ ├── 5、字符和字符串.md │ │ │ ├── 6、注释.md │ │ │ └── picture │ │ │ │ ├── image-20210105112121205.png │ │ │ │ ├── image-20210106105230992.png │ │ │ │ ├── image-20210106144859241.png │ │ │ │ ├── image-20210106145934674.png │ │ │ │ ├── image-20210107110919861.png │ │ │ │ ├── image-20210107111002172.png │ │ │ │ ├── image-20210107112141838.png │ │ │ │ ├── image-20210108101209502.png │ │ │ │ ├── image-20210108101424894.png │ │ │ │ ├── image-20210108111838227.png │ │ │ │ └── image-20210324231018184.png │ │ └── Java流程控制 │ │ │ ├── 6、Java控制流程.md │ │ │ ├── picture │ │ │ └── image-20210615232438777.png │ │ │ ├── switch-case匹配语句.md │ │ │ ├── 循环语句.md │ │ │ ├── 条件语句.md │ │ │ └── 跳出语句.md │ ├── Java新特性 │ │ ├── Java8之Optional.md │ │ ├── Java8之Stream.md │ │ ├── Java8新特性.md │ │ └── picture │ │ │ ├── image-20210610140137943.png │ │ │ └── image-20210610174148178.png │ ├── Java线程 │ │ ├── OS线程与进程.vsdx │ │ ├── ThreadLocal强弱引用.vsdx │ │ ├── picture │ │ │ ├── 20181026185652119.png │ │ │ ├── 2615789-08f16aeac7e0977d.webp │ │ │ ├── 640-1594691307404.jpg │ │ │ ├── 640.jpg │ │ │ ├── clipboard-1604383870276.png │ │ │ ├── clipboard.png │ │ │ ├── image-20200611004316963-1594691307317.png │ │ │ ├── image-20200611004316963.png │ │ │ ├── image-20200611004413289.png │ │ │ ├── image-20200611004743718.png │ │ │ ├── image-20200611005459456.png │ │ │ ├── image-20200615233613878-1594691307357.png │ │ │ ├── image-20200615233613878.png │ │ │ ├── image-20200616002629744-1594691307411.png │ │ │ ├── image-20200616002629744.png │ │ │ ├── image-20200624002751824.png │ │ │ ├── image-20200722173317229.png │ │ │ ├── image-20200727101151586.png │ │ │ ├── image-20200727183048768.png │ │ │ ├── image-20200727183451141.png │ │ │ ├── image-20201208232406847.png │ │ │ ├── image-20210204183213218.png │ │ │ ├── image-20210204183904116.png │ │ │ ├── image-20210205092133132.png │ │ │ ├── image-20210205092256711.png │ │ │ ├── image-20210205142952344.png │ │ │ ├── image-20210205144120771.png │ │ │ ├── image-20210205144158831.png │ │ │ ├── image-20210226140911934.png │ │ │ ├── image-20210428145418753.png │ │ │ ├── image-20210525230256204.png │ │ │ ├── image-20210525232155784.png │ │ │ ├── image-20210526001730670.png │ │ │ ├── image-20210526001808630.png │ │ │ ├── image-20210526001836411.png │ │ │ ├── image-20210526001908361.png │ │ │ ├── image-20211227171629856.png │ │ │ └── java-volatile-1.png │ │ ├── 目录.md │ │ ├── 线程生命周期.vsdx │ │ ├── (一)线程是什么.md │ │ ├── (七)线程池的大小如何确定.md │ │ ├── (三)Java线程创建方式.md │ │ ├── (九)线程池异常捕获.md │ │ ├── (二)Java线程与系统线程和生命周期.md │ │ ├── (五)四种线程池底层详解.md │ │ ├── (八)Callable和Runnable的区别.md │ │ ├── (六)ThreadPoolExecutor自定义线程池.md │ │ ├── (十一)sleep(1)、sleep(0)和sleep(1000)的区别.md │ │ ├── (十七)AtomicInteger.md │ │ ├── (十三)synchronized.md │ │ ├── (十二)yield、notify、notifyAll、sleep、join、wait的区别.md │ │ ├── (十五)ThreadLocal的使用.md │ │ ├── (十八)Worker线程管理.md │ │ ├── (十六)ReentrantLock可重入锁.md │ │ ├── (十四)volatile.md │ │ ├── (十)线程池参数——workQueue用法.md │ │ └── (四)为什么要使用线程池.md │ ├── Java进阶 │ │ ├── IO │ │ │ ├── IO.md │ │ │ └── picture │ │ │ │ ├── image-20210129104236502.png │ │ │ │ ├── image-20210129105449996.png │ │ │ │ ├── image-20210129110127528.png │ │ │ │ ├── image-20210129110918410.png │ │ │ │ ├── image-20210129112440603.png │ │ │ │ ├── image-20210202160401298.png │ │ │ │ ├── image-20210202162909660.png │ │ │ │ ├── image-20210202165332796.png │ │ │ │ ├── image-20210203141103518.png │ │ │ │ ├── image-20210203141105472.png │ │ │ │ └── image-20211216234151599.png │ │ ├── picture │ │ │ ├── image-20210308152538839.png │ │ │ ├── image-20210308152634653.png │ │ │ └── image-20210308153542701.png │ │ ├── 反射 │ │ │ └── Java反射.md │ │ ├── 常用类 │ │ │ ├── BigDecimal.md │ │ │ ├── File类.md │ │ │ ├── Java常用类.md │ │ │ ├── Math类.md │ │ │ ├── String.md │ │ │ ├── StringBuilder、StringBuffer、StringJoiner.md │ │ │ ├── picture │ │ │ │ ├── clipboard-1611561219762.png │ │ │ │ ├── clipboard.png │ │ │ │ ├── image-20210120160540203.png │ │ │ │ ├── image-20210120162055534.png │ │ │ │ ├── image-20210120162232346.png │ │ │ │ ├── image-20210120162301580.png │ │ │ │ ├── image-20210120173256307.png │ │ │ │ ├── image-20210121144951658.png │ │ │ │ ├── image-20210121150102127.png │ │ │ │ ├── image-20210201170821969.png │ │ │ │ ├── image-20210201172326048.png │ │ │ │ └── image-20210201172947437.png │ │ │ ├── 包装类型.md │ │ │ └── 日期类.md │ │ ├── 序列化与反序列.md │ │ ├── 泛型.md │ │ └── 集合 │ │ │ ├── Comparable接口.md │ │ │ ├── Deque.md │ │ │ ├── HashCode和equals.md │ │ │ ├── Iterator与Collection.md │ │ │ ├── List.md │ │ │ ├── Map.md │ │ │ ├── Queue.md │ │ │ ├── Set.md │ │ │ ├── Stack.md │ │ │ ├── picture │ │ │ ├── image-20210127100352350.png │ │ │ ├── image-20210128095931650.png │ │ │ ├── image-20210128105508292.png │ │ │ ├── image-20210128153543008.png │ │ │ ├── image-20210407113029806.png │ │ │ ├── image-20210512103607675.png │ │ │ ├── image-20210512103923684.png │ │ │ ├── image-20210906232009788.png │ │ │ ├── image-20210906232124858.png │ │ │ ├── image-20210906232253171.png │ │ │ └── image-20210906232551794.png │ │ │ └── 集合类的介绍.md │ ├── Linux │ │ ├── 10个实用的Linux技巧.md │ │ ├── Centos使用教程.md │ │ ├── Linux三剑客之awk命令.md │ │ ├── Linux三剑客之grep命令.md │ │ ├── Linux三剑客之seq命令.md │ │ ├── Linux保姆级入门详细教程.md │ │ ├── Linux入门到进阶路线.md │ │ ├── centos开机流程详解.md │ │ ├── picture │ │ │ ├── Linux20210323-1.gif │ │ │ ├── Linux20210323.gif │ │ │ ├── image-20210310172243404.png │ │ │ ├── image-20210310172319129.png │ │ │ ├── image-20210310173444937.png │ │ │ ├── image-20210310174401469.png │ │ │ ├── image-20210315111019370.png │ │ │ ├── image-20210315111106323.png │ │ │ ├── image-20210315182357675.png │ │ │ ├── image-20210315182853202.png │ │ │ ├── image-20210322161236954.png │ │ │ ├── image-20210323172610829.png │ │ │ ├── image-20210323205539550.png │ │ │ ├── image-20210331172314910.png │ │ │ ├── image-20210414173049472.png │ │ │ ├── image-20211221154853360.png │ │ │ ├── image-20211221163738048.png │ │ │ └── image-20220414144939532.png │ │ ├── shell编程学习.md │ │ ├── vim快捷键.md │ │ ├── 八个能提升效率的Linux快捷键.md │ │ └── 占用几分钟时间,让你掌握top命令.md │ ├── MQ │ │ ├── Kafka的入门.md │ │ ├── RocketMQ的入门.md │ │ ├── picture │ │ │ ├── image-20210416141022742.png │ │ │ ├── image-20210416155825505.png │ │ │ ├── image-20210416165208028.png │ │ │ ├── image-20210930103755270.png │ │ │ └── image-20211012091010457.png │ │ └── 消息队列入门.md │ ├── Maven │ │ ├── Maven的介绍.md │ │ ├── Maven的高级使用.md │ │ ├── picture │ │ │ ├── image-2022-03-09-1646811043.png │ │ │ ├── image-2022-03-09-1646817991.png │ │ │ └── image-20220309150339060.png │ │ └── 使用新版Maven-mvnd.md │ ├── MySQL │ │ └── 新手如何入门SQL.md │ ├── Nginx │ │ ├── Nginx入门.md │ │ ├── Nginx核心原理.md │ │ ├── picture │ │ │ ├── image-20210429101548741.png │ │ │ ├── image-20210429101604508.png │ │ │ ├── image-20210512170525988.png │ │ │ ├── image-20210512170646794.png │ │ │ ├── image-20210512171043631.png │ │ │ ├── image-20210512173151815.png │ │ │ ├── image-20210512173244062.png │ │ │ ├── image-20210512173300494.png │ │ │ ├── image-20210512173409606.png │ │ │ ├── image-20210512173450424.png │ │ │ ├── image-20210518164046719.png │ │ │ ├── image-20210518164206239.png │ │ │ ├── image-20210518164842720.png │ │ │ └── image-20210518165524708.png │ │ └── 推荐一款Nginx可视化操作工具.md │ ├── Redis │ │ ├── Redis为什么要把字符串设计成SDS?.md │ │ ├── Redis之缓存击穿、穿透、雪崩.md │ │ ├── Redis分布式事务锁.vsdx │ │ ├── Redis分布式事务锁的原理.md │ │ ├── Redis分布式事务锁的秒杀、超卖简单例子.md │ │ ├── Redis的使用规范有哪些?.md │ │ ├── Redis的删除策略和内存淘汰机制.md │ │ ├── Redis的持久化机制,RDB和AOF.md │ │ ├── picture │ │ │ ├── 20180919143214879.png │ │ │ ├── image-20200608113313177.png │ │ │ ├── image-20201019180304613.png │ │ │ ├── image-20201019180406853.png │ │ │ ├── image-20201019180436917.png │ │ │ ├── image-20201019180647650.png │ │ │ ├── image-20201020143140251.png │ │ │ ├── image-20201020174334487.png │ │ │ ├── image-20201020174358161.png │ │ │ ├── image-20201020174428480.png │ │ │ ├── image-20201020174536968.png │ │ │ ├── image-20201020175113982.png │ │ │ ├── image-20201020175141910.png │ │ │ ├── image-20201020175235437.png │ │ │ ├── image-20201020175254479.png │ │ │ ├── image-20201020175418983.png │ │ │ ├── image-20201020175636010.png │ │ │ ├── image-20201020175927806.png │ │ │ ├── image-20201020180003725.png │ │ │ ├── image-20201020180107177.png │ │ │ ├── image-20201020180120705.png │ │ │ ├── image-20201027154237836.png │ │ │ ├── image-20201027155614967.png │ │ │ ├── image-20201027170452172.png │ │ │ ├── image-20201028231527081.png │ │ │ ├── image-20201028233114175.png │ │ │ ├── image-20201028233133015.png │ │ │ ├── image-20201028233209257.png │ │ │ ├── image-20210222101300888.png │ │ │ ├── image-20210222103537364.png │ │ │ ├── image-20210222125022614.png │ │ │ ├── image-20210222125222306.png │ │ │ ├── image-20210222141751272.png │ │ │ ├── image-20210222142550808.png │ │ │ ├── image-20210222144222171.png │ │ │ └── redis-desk.png │ │ └── 缓存穿透、击穿、雪崩.vsdx │ ├── springboot教程 │ │ └── SpringBoot经典学习笔记.md │ ├── 其他 │ │ ├── GitHub超详细的编程学习路线.md │ │ ├── Java代码优化细节.md │ │ ├── Java后端知识掌握的一些常用图.md │ │ ├── Java快速学习路线图.md │ │ ├── picture │ │ │ ├── clipboard.png │ │ │ ├── image-20210321212351006.png │ │ │ ├── image-20210324110419325.png │ │ │ ├── image-20210324110808775.png │ │ │ ├── image-20210324111718270.png │ │ │ ├── image-20210324113606571.png │ │ │ ├── image-20210324123258096.png │ │ │ ├── image-20210324170431606.png │ │ │ ├── image-20210324171119960.png │ │ │ ├── image-20210324171138846.png │ │ │ ├── image-20210324171649086.png │ │ │ ├── image-20210324172320145.png │ │ │ ├── image-20210324173113836.png │ │ │ ├── image-20210324175522413.png │ │ │ ├── image-20210324175938340.png │ │ │ ├── image-20210324180526332.png │ │ │ ├── image-20210324180925820.png │ │ │ ├── image-20210324181238602.png │ │ │ ├── image-20210324181457767.png │ │ │ ├── image-20210325234016737.png │ │ │ ├── image-20210325234144662.png │ │ │ ├── image-20210325234303187.png │ │ │ ├── image-20210325234406955.png │ │ │ ├── image-20210325234622169.png │ │ │ ├── image-20210325234918307.png │ │ │ ├── image-20210326000050881.png │ │ │ ├── image-20210326000807549.png │ │ │ ├── image-20210326001030514.png │ │ │ ├── image-20210507111759609.png │ │ │ ├── image-20210604110816912.png │ │ │ ├── image-20210604110841217.png │ │ │ └── image-20210604110851885.png │ │ ├── 一些学习的网站推荐.md │ │ ├── 一些有趣的博客和网站.md │ │ ├── 如何学会提问.md │ │ ├── 推荐一些B站的学习视频.md │ │ └── 自学Java的建议.md │ ├── 开发辅助工具 │ │ ├── Git的使用.md │ │ ├── JSON的使用.md │ │ ├── github使用教程 │ │ │ ├── picture │ │ │ │ ├── image-20210311101702647.png │ │ │ │ ├── image-20210311101815088.png │ │ │ │ ├── image-20210311103140903.png │ │ │ │ ├── image-20210311104108118.png │ │ │ │ ├── image-20210311111008688.png │ │ │ │ ├── image-20210311141028741-1.png │ │ │ │ ├── image-20210311141251744.png │ │ │ │ ├── image-20210311143225194.png │ │ │ │ └── image-20210311143651096.png │ │ │ └── 学会在Github精准搜索项目.md │ │ ├── picture │ │ │ ├── image-20210312101356615.png │ │ │ ├── image-20210407154548005.png │ │ │ ├── image-20210511094124483.png │ │ │ ├── image-20210511100824802.png │ │ │ ├── image-20210824101138022.png │ │ │ ├── image-20210824103325691.png │ │ │ ├── image-20210824112216025.png │ │ │ ├── image-20210824112452610.png │ │ │ ├── image-20210824113514128.png │ │ │ ├── image-20210824113643717.png │ │ │ ├── image-20210824114429643.png │ │ │ ├── image-20210824114540025.png │ │ │ └── image-20210824135124607.png │ │ ├── 四款Java死锁检测工具.md │ │ └── 我常用的开发工具.md │ ├── 异常处理 │ │ ├── 1、Java异常.md │ │ ├── 2、异常处理.md │ │ ├── 3、自定义异常.md │ │ └── picture │ │ │ ├── image-20210115150112189.png │ │ │ ├── image-20210115150402927.png │ │ │ ├── image-20210115172917862.png │ │ │ ├── image-20210118112833111.png │ │ │ ├── image-20210425225606460.png │ │ │ └── image-20210425230218025.png │ ├── 数据库 │ │ └── MongoDB.md │ ├── 数据结构与算法 │ │ ├── picture │ │ │ ├── 2243690-531c8fbb6b2b55c4.webp │ │ │ ├── 2243690-e20ffe8f48bfcfbc.webp │ │ │ ├── aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA │ │ │ ├── aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA-1617777970741 │ │ │ ├── image-20210407104618787.png │ │ │ ├── image-20210407141642981.png │ │ │ ├── image-20210407142845688.png │ │ │ ├── image-20210407143725029.png │ │ │ ├── image-20210407144637998.png │ │ │ └── image-20210407145025409.png │ │ ├── 常见的数据结构.md │ │ └── 常见的算法.md │ ├── 架构 │ │ ├── DevOps.md │ │ ├── picture │ │ │ └── image-20220302135109186.png │ │ └── 高可用架构技术之无状态服务md │ ├── 框架 │ │ └── cookie、session、token的区别.md │ ├── 计算机网络 │ │ └── HTTP、RPC.md │ └── 面向对象 │ │ ├── 1、方法.md │ │ ├── 2、静态字段和静态方法.md │ │ ├── 3、继承.md │ │ ├── 4、重载和重写.md │ │ ├── 5、多态.md │ │ ├── 6、抽象类.md │ │ ├── 7、接口.md │ │ ├── 8、值传递和引用传递.md │ │ ├── 9、枚举.md │ │ ├── Head-Java对象的理解.md │ │ └── picture │ │ ├── image-20210115123015487.png │ │ ├── image-2021011512304995811.png │ │ └── image-20210115123544141.png ├── index.html ├── js │ ├── docsify-copy-code.js │ ├── docsify-pagination.min.js │ ├── docsify.js │ ├── docsify@4.js │ └── search.min.js ├── mycss.css └── picture │ ├── 20210311-HelloCoder.png │ └── HelloCoder.png └── 思维导图 ├── .java文件.xmind ├── 20210131Java学习路线公众号HelloCoder.png ├── 值传递和引用传递.vsdx └── 异常.xmind /README.md: -------------------------------------------------------------------------------- 1 | # Hello,Coder 2 | 3 | 4 | 5 | ## 絮&叨 6 | 7 | ### PureJavaCoderRoad 是什么? 8 | 9 | 《Java小白之路》PureJavaCoderRoad 是一个帮助【Java小白】从入门到找到一份工作所需掌握的技能教程,对标目前企业招聘要求(大概是一线12k)。 10 | 11 | 本项目包含JavaSE、JavaEE(Spring、Mybatis、SpringCloud)、Mysql、Redis、Maven、Nginx、Linux服务器、Git、工具使用、算法 等基础教程。 12 | 13 | ### 为什么是12K? 14 | 15 | 通过爬虫抓取BOSS招聘,还有CSDN公布的薪资情况,统计得到的Java开发者薪资中位数 。 16 | 17 | 最后分析BOSS中的要求,写下这份文档。 18 | 19 | 20 | 21 | ### 为什么要做PureJavaCoderRoad ? 22 | 起初了为了总结自己一路过来入行Java的历程,写了大量的笔记,后来越写越多,遂完整写下来了。 23 | 24 | 25 | 26 | 在这里,期待与各位共同进步。 27 | 28 | 29 | 30 | 愿各位看完有收获,找到一份满意的工作。 31 | 32 | 33 | 34 | ## 本项目学习路线 35 | 36 | 项目是根据HaC我本人的工作经历和学习历程的路线整理,本项目也将根据以下的学习路线进行展开: 37 | 38 | > 文件太大,右击 `在新标签页打开图片` 39 | 40 | ![HelloCoder](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/20210311-HelloCoder.png) 41 | 42 | 点击访问思维导图 43 | 44 | ## 更新时间线 45 | 46 | | 版本 | 时间 | 更新内容 | 47 | | ---- | ---------- | --------------------------------- | 48 | | 1.0 | 2021-01-01 | 第一次发布,只有Java基础知识 | 49 | | 2.0 | 2021-03-01 | Java进阶内容,包含IO、多线程、JVM | 50 | | 2.1 | 2021-07-01 | Linux、MySQL | 51 | | 2.2 | 2022-03-01 | 开发工具、NGINX、Redis、架构 | 52 | 53 | 54 | 55 | ## 联系我 56 | 57 | ### 1、公众号联系我 58 | 59 | 由于都是我一个人在维护,难免出现错误,欢迎给我提bug。 60 | 61 | 欢迎关注我的Java技术公众号,不定时分享Java技术干货(虽然也什么没什么干货😅.....) 62 | 63 |
64 | 65 | 66 | 67 | 同时,本项目后续会整理成PDF,Github 更新可能存在延迟,如果需要第一时间获取最新版本,可以关注我的公众号,也可以不关,反正都会更新到这里。(目前整理比较费时间,筒子们可以不定时打开) 68 | 69 | 70 | 71 | ### 2、博客联系我 72 | 73 | - [http://rain.baimuxym.cn](http://rain.baimuxym.cn) 欢迎来玩,交个两毛钱的朋友。 74 | 75 | 76 | 77 | 78 | 79 | ## 在线阅读地址: 80 | 81 | 本项目支持在线阅读: 82 | 83 | - [https://purejava.baimuxym.cn/](https://purejava.baimuxym.cn/) 84 | 85 | 86 | 87 | --- 88 | ## 友情链接 89 | - [LearnJavaToFindAJob](https://github.com/DogerRain/LearnJavaToFindAJob) 作者本人求职面试的过程+面试题目 90 | 91 | - [awesome-programming-resources ](https://github.com/DogerRain/awesome-programming-resources)一个收集开源计算机资源的合集 92 | 93 | 最后,求点一个 star :star: 奥利给,老铁们。 94 | 95 | > 最后更新时间:2022年3月29日 16:01:14 96 | 97 | 98 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/.nojekyll -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Hello,Coder 2 | 3 | ## 絮&叨 4 | 5 | ### PureJavaCoderRoad 是什么? 6 | 7 | 《Java小白之路》PureJavaCoderRoad 是一个帮助【Java小白】从入门到找到一份工作所需掌握的技能教程,对标目前企业招聘要求(一线12k)。 8 | 9 | ### 为什么是12K? 10 | 11 | 通过爬虫抓取BOSS招聘,还有CSDN公布的薪资情况,统计得到的Java开发者薪资中位数 。 12 | 13 | 14 | 15 | 本项目包含JavaSE、JavaEE(Spring、Mybatis、SpringCloud)、Mysql、Redis、Maven、Nginx、Linux服务器、Git、工具使用、算法 等基础教程。 16 | 17 | - JavaSE 18 | - 数据结构 19 | - 计算机网络 20 | - 操作系统 21 | - MySQL 22 | - JavaEE 23 | - Maven 24 | - Git 25 | - Linux 26 | - 服务器基础 27 | - 设计模式 28 | - 常见架构 29 | - 常见面试题 30 | - ...... 31 | 32 | 33 | 34 | ### 为什么要做PureJavaCoderRoad ? 35 | 起初了为了总结自己的经验,写了大量的笔记,后来越写越多,遂完整写下来了。 36 | 37 | 38 | 39 | 在这里,期待与各位共同进步。 40 | 41 | 愿各位看完有收获,找到一份满意的工作。 42 | 43 | 44 | 45 | ## 本项目学习路线 46 | 47 | 项目是根据HaC我本人的工作经历和学习历程的路线整理,本项目也将根据以下的学习路线进行展开: 48 | 49 | > 文件太大,右击 `在新标签页打开图片` 50 | 51 | ![HelloCoder](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/20210311-HelloCoder.png) 52 | 53 | 点击访问思维导图 54 | 55 | 更新时间线 56 | 57 | | 版本 | 时间 | 更新内容 | 58 | | ---- | ---------- | --------------------------------- | 59 | | 1.0 | 2021-01-01 | 第一次发布,只有Java基础知识 | 60 | | 2.0 | 2021-03-01 | Java进阶内容,包含IO、多线程、JVM | 61 | | 2.1 | 2021-07-01 | Linux、MySQL | 62 | | 2.2 | 2022-03-01 | 开发工具、NGINX、Redis、架构 | 63 | 64 | 65 | 66 | ## 联系我 67 | 68 | ### 1、公众号联系我 69 | 70 | 由于都是我一个人在维护,难免出现错误,欢迎给我提bug。 71 | 72 | 欢迎关注我的Java技术公众号,不定时分享Java技术干货(虽然也什么没什么干货😅.....) 73 | 74 |
75 | 76 | 77 | 78 | 同时,本项目后续会整理成PDF,Github 更新可能存在延迟,如果需要第一时间获取最新版本,可以关注我的公众号,也可以不关,反正都会更新到这里。(目前整理比较费时间,筒子们可以不定时打开) 79 | 80 | 81 | 82 | ### 2、博客联系我 83 | 84 | - [http://rain.baimuxym.cn](http://rain.baimuxym.cn) 欢迎来玩,交个两毛钱的朋友。 85 | 86 | 87 | 88 | ## 在线阅读地址: 89 | 90 | - [https://purejava.baimuxym.cn/](https://purejava.baimuxym.cn/) 91 | 92 | 93 | 94 | --- 95 | 96 | ## 友情链接 97 | 98 | - [LearnJavaToFindAJob](https://github.com/DogerRain/LearnJavaToFindAJob) 作者本人求职面试的过程+面试题目 99 | 100 | - [awesome-programming-resources](https://github.com/DogerRain/awesome-programming-resources) 一个收集开源计算机资源的合集 101 | 102 | 最后,求点一个 star :star: 奥利给,老铁们。 103 | 104 | > 最后更新时间:2022年3月29日 16:01:14 105 | 106 | -------------------------------------------------------------------------------- /docs/_coverpage.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | # 《Java小白之路》 4 | 5 | > Java小白学到什么程度才能找到一份工作? 6 | 7 | ### 《Java小白之路》 是一个帮助Java**初学者**从入门到找到一份工作所需技能的教程文档,用极其简单的文字,让你快速掌握核心知识 8 | - JavaSE 9 | - 数据结构 10 | - 计算机网络 11 | - 操作系统 12 | - MySQL 13 | - JavaEE 14 | - Maven 15 | - Git 16 | - Linux 17 | - 服务器基础 18 | - 设计模式 19 | - 常见架构 20 | - 常见面试题 21 | - ...... 22 | 23 | 24 | 👀 本站总访问量 次 25 | | 🐒本站访客数人次 26 | 27 | [开始阅读](/README.md) 28 | 29 | -------------------------------------------------------------------------------- /docs/_navbar.md: -------------------------------------------------------------------------------- 1 | * [《Java小白求职之路》](https://github.com/DogerRain/LearnJavaToFindAJob) 2 | * [我的博客](https://rain.baimuxym.cn/) 3 | -------------------------------------------------------------------------------- /docs/articles/JVM/JVM掌握的知识点.md: -------------------------------------------------------------------------------- 1 | Java基础学完之后,JVM相关的知识点也要知道一点。 2 | 3 | JVM作为Java背后运行的基础支撑,对一个资深的程序员来说,是必须掌握的,在面试中,也是必问的。 4 | 5 | 个人认为JVM知识能够提高写代码的质量,而且在出现bug的时候,可以通过JVM知识进行快速定位问题,比如堆栈溢出、GC(Java垃圾回收)等等。 6 | 7 | 那要掌握哪些JVM知识呢?个人觉得初入门Java的小伙伴,掌握以下知识点就够了,随着经验越来越丰富,相信你也会不言而喻的: 8 | 9 | - JVM内存模型 10 | - Java运行区域 11 | - 类加载过程 12 | - Java垃圾回收和JVM常见参数 13 | - 二进制字节码查看,Java常用的命令、使用(jmap, jvisualvm, jstat, jconsole等) 14 | 15 | 相信大部分小伙伴都会问一个问题: 16 | 17 | 就是**掌握这些JVM知识点有什么用?** 18 | 19 | 20 | 21 | 在刚入门Java的时候,我并没有想过这个问题。 22 | 23 | 因为在那个资源匮乏和[Java 数组](http://localhost:3000/#/articles\Java基础\Java基础\3、Java数组?id=java-数组)没有引路人的时代,我是通过自学进入这个行业的,大部分的Java基础书籍,都没有讲到这些JVM内容。 24 | 25 | 26 | 27 | 所以在学习完了Java,甚至在工作了一年多的时候,我很好奇Java到底是怎么运行的。而不是简简单单的知道它是需要JVM、通过 `java -c` 编译,需要通过main方法运行的..... 28 | 29 | 为此,我疑惑了很久。 30 | 31 | > 有一种囫囵吞枣地学习,却无法理解背后的原理,无法把知识串联起来的感觉 32 | 33 | 后来,随着开发经验的积累,我终于把JVM和Java串联了起来。 34 | 35 | 刚开始接触JVM知识点的时候,觉得很乏味,晦涩难懂,对日常开发并没有明显的作用,但因为接触了JVM,因为一次线上的bug,通过JVM的知识更快的解决了线上的问题。 36 | 37 | 也解决了很多疑问,比如说: 38 | 39 | - Java内存模型的出现和CPU的MESI有关系,你在用`synchronized`和`volatile`的时候,其实并不是Java层面的实现。 40 | - Java运行区域让栈堆溢出的原因更容易排查,类、方法、对象的使用和创建为什么要注意,直接的用法是String和StringBuilder的使用。 41 | - 类加载过程会让你知道一个类是怎么样运行的,springboot的jar为什么可以运行,tomcat下的war为什么又可以自动运行。 42 | - Java垃圾回收就更重要了,Java的垃圾回收的一个过程,频繁的GC会影响Java的运行,而掌握Java的命令,则可以看到GC的原因。 43 | - ..... 44 | 45 | 说了这么多,其实就是想说 JVM虽然不能提高我们的开发效率,但是有助于提高我们的开发质量。 46 | 47 | 而不是仅仅为了面试。 48 | 49 | --- 50 | 51 | 52 | 53 | 在这里推荐一本书: 54 | 55 | 《深入Java虚拟机》 -------------------------------------------------------------------------------- /docs/articles/JVM/类加载机制.md: -------------------------------------------------------------------------------- 1 | ### 类加载过程以及加载机制 2 | 3 | **类加载器的种类:** 4 | 5 | - 启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载Java_HOME/lib/目录中的,或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库; 6 | 7 | 其他类加载器: 8 | 9 | - 扩展类加载器(Extension ClassLoader):负责加载\lib\ext目录或Java. ext. dirs系统变量指定的路径中的所有类库; 10 | 11 | - 应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。 12 | 13 | ![ ](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20200917103311630.png) 14 | 15 | 类加载器 就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。 16 | 17 | 加载过程: 18 | 19 | **加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载** 20 | 21 | **验证 -> 准备 -> 解析** 这三步合起来称为 **连接** 22 | 23 | 1.**加载** 24 | 25 | ​ 加载简单来说分为三步。 26 | 27 | 第一步:获取二进制字节流也就是上面的class文件。 28 | 29 | 第二步:将静态的存储结构转换为方法区中的运行时数据结构。 30 | 31 | 第三步:生成一个对象放入java堆中,做为对方法区的引用。 32 | 33 | (类的加载就是将class文件中的二进制数据读取到内存中,然后将该字节流所代表的静态数据结构转化为方法区中运行的数据结构,并且在堆内存中生成一个java.lang.Class对象作为访问方法区数据结构的入口) 34 | 35 | 2.**验证** 36 | 37 | 验证主要是检验如下的几项是否正确 38 | 39 | ​ class文件的表示(魔数),class文件的版本号,class文件的每个部分是否正确(字段表、方法表等),验证常量池(常量类型、常量类型数据结构是否正确,utf-8是否标准),元数据验证(父类验证,继承验证,final验证),字节码(指令)验证,符号引用验证(是否能根据符号找到对应的字段、表、方法等) 40 | 41 | 如果一项不对,就会验证失败。 42 | 43 | 3.**准备** 44 | 45 | 准备阶段为类变量分配内存 和设置类变量初始化。这个过程中,只对static类变量进行内存分配,这个时候只是分配内存,没有进行复制,所有的类变量都是初始化值。如果是final的话,会直接对应到常量池中。会在准备阶段直接赋值。 46 | 47 | 4.**解析** 48 | 49 | 解析阶段是读符号引用进行解析。将符号引用解析为直接引用(指向目标的指针或者偏移量)。主要涉及到的解析有类,接口,字段,方法等。 50 | 51 | 5.**初始化** 52 | 53 | 初始化就是执行方法的过程, 对静态变量,静态代码块进行初始化,对类进行初始化。 54 | 55 | 6.**使用** 56 | 57 | 使用阶段就是使用这个class。 58 | 59 | 7.**卸载** 60 | 61 | 卸载阶段就是不在使用,将class给卸载。 62 | 63 | -------------------------------------------------------------------------------- /docs/articles/JVM/聊聊你熟悉的垃圾回收器.md: -------------------------------------------------------------------------------- 1 | https://mp.weixin.qq.com/s/OmSe89hw-0s9pb8qwzZHcA 2 | 3 | 以HotSpot VM来说,垃圾回收器大致分为七种类型: 4 | 5 | - 串行:Serial New收集器 6 | - 串行:Serial Old收集器 7 | - 串行:ParNew收集器 8 | - 并行:Parallel收集器 9 | - 并行:Parallel Old 收集器 10 | - 并发 标记扫描CMS收集器 11 | - G1收集器 12 | 13 | ![ ](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20201105180041789.png) 14 | 15 | >注:串行、并行 其它工作线程要暂停,并发不会。 16 | 17 | parallel 的意思是并行的意思。 18 | 19 | Concurrent 是并发的意思。 -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/JavaIDE介绍.md: -------------------------------------------------------------------------------- 1 | 使用记事本编写代码很不方便,没有代码提示,也没有一键运行的快捷入口。 2 | 3 | 初入门Java的小伙伴,就需要一款好用的IDE去解放我们的生产力。 4 | 5 | 在这里比较三款Java IDEA 的优劣,供大家选择: 6 | 7 | 8 | 9 | >初学Java,刚开始一般都是配置jdk的环境变量,配置完jdk,就可以使用IDE进行开发了,目前市场上用于Java开发的IDE有以下三种。 10 | 11 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200525234211778.png) 12 | 13 | ## 1 、eclipse 14 | 15 | 下载地址:https://www.eclipse.org/downloads/ 16 | 17 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/5862033-c11fa3de611d671c.webp) 18 | 19 | eclipse也是一个非常优秀的开源免费的集成开发工具,Eclipse原来是IBM公司开发专门用于java的IDE开发环境,2001年11月贡献给开源社区,现在它由非营利软件供应商联盟Eclipse基金会管理,Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。 20 | 21 | 22 | 23 | Eclipse设计非常优良,它本身只是一个框架和一组服务,可以通过插件的方式构建开发环境,并扩展其功能。而且,Eclipse 附带了一个标准的插件集,其中就包括Java开发工具(Java Development Kit,JDK)。 24 | 25 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200525234502327.png) 26 | 27 | 28 | 29 | 由于Eclipse需要基于Java环境,安装后运行时需要确认计算机中是否对JAVA_HOME与path环境变量进行配置,如果没有配置好jdk,会打不开。 30 | 31 | 打开eclipse后,首先需要选择工作空间,打开后长这个样子: 32 | 33 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200525235347862.png) 34 | 35 | 打开后需要配置你本地的服务器,选择新建即可。 36 | 37 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200525235601617.png) 38 | 39 | 然后导入你的项目,即可使用eclipse进行开发。 40 | 41 | ## 2 、Myeclipse 42 | 43 | 下载地址:https://www.myeclipsecn.com/download/ 44 | 45 | MyEclipse,是在eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境. 46 | 47 | MyEclipse不需要jdk环境,因为已经内置了,而且内置了tomcat,你只需要像安装其他软件一样安装Myeclispe即可,导入项目就可以运行项目。虽然内置了tomcat和jdk,但是在Myeclipse中可以手动的配置Tomcat和JDK。 48 | 49 | 相对于eclipse,MyEclipse省去了很多功夫,缺点是MyEclipse太臃肿了,集成了很多不需要使用的插件,因此安装包会比eclipse大很多,占用更多的内存和空间,但如果是初学者,可以尝试使用MyEclipse。 50 | 51 | 注意:MyEclipse是收费的。 52 | 53 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20201015224848787.png) 54 | 55 | 56 | 57 | 界面和eclipse没有很大的区别,快捷键都是一样的。 58 | 59 | ## 3 、IntelliJ IDEA 60 | 61 | 下载地址:https://www.myeclipsecn.com/download/ 62 | 63 | 简称IDEA ,IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 64 | 65 | 至于有多超前,在你用了IDEA后,你根本不想再用eclipse和MyEclipse。 66 | 67 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200526001206345.png) 68 | 69 | 例如 70 | 71 | 输入 `psvm`,快速生成 main 方法, 72 | 73 | 输入`syso` 可以快速生成`System.out.println()`等等。 74 | 75 | 而且IDEA还支持多种语言的开发,IDEA市场上有大量的插件可以缩减我们的开发工作量。 76 | 77 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200526001612814.png) 78 | 79 | 80 | 81 | 注意:IDEA分两个版本:免费的社区版和付费的终极版,学生使用邮箱认证后可以使用免费的社区版。 82 | 83 | 84 | 85 | **经验总结:** 86 | 87 | 1. IDEA调试功能非常优秀,代码编辑功能比eclipse、Myclipse优秀许多,但是资源消耗比较大。 88 | 2. eclipse虽然体积小,但是扩展需要自己下载插件,崩溃了较高 89 | 3. 个人推荐IDEA > eclipse > MyEclipse。 90 | 91 | ![](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200928112958310.png) 92 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/Java的就业和发展.md: -------------------------------------------------------------------------------- 1 | ## Java的受欢迎程度 2 | 3 | TIOBE 编程语言社区排行榜是编程语言流行趋势的一个指标,每月更新,这份排行榜排名基于全球技术工程师、课程和第三方供应商的数量,其中包括了流行的搜索引擎以及技术社区,如 Google、百度、维基百科、CSDN、必应、Hao 123 等等。 4 | 5 | Java和C 的受欢迎程度可以说是一马当先。 6 | 7 | 2020年7月: 8 | 9 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104135710398.png) 10 | 11 | 2021年1月 12 | 13 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104150140677.png) 14 | 15 | 历史排名(1985~2021) 16 | 17 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104150308595.png) 18 | 19 | 20 | 21 | ## Java的应用 22 | 23 | 1、Android应用 24 | 许多的 Android应用都是Java程序员开发者开发。虽然 Android运用了不同的JVM以及不同的封装方式,但是代码还是用Java语言所编写。相当一部分的手机中都支持JAVA游戏,这就使很多非编程人员都认识了JAVA。 25 | 2、在金融业应用的服务器程序 26 | Java在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用Java开发,因为相对而言,Java较安全 。大型跨国投资银行用Java来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。 27 | 3、网站 28 | Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建web项目,SpringMVC,Struts2.0以及frameworks。 29 | 4、嵌入式领域 30 | Java在嵌入式领域发展空间很大。在这个平台上,只需130KB就能够使用Java技术(在智能卡或者传感器上)。 31 | 5、大数据技术 32 | Hadoop以及其他大数据处理技术很多都是用Java,例如Apache的基于Java的HBase和Accumulo以及 ElasticSearchas。 33 | 6、高频交易的空间 34 | Java平台提高了这个平台的特性和即使编译,他同时也能够像 C++ 一样传递数据。正是由于这个原因,Java成为的程序员编写交易平台的语言,因为虽然性能不比C++,但开发人员可以避开安全性,可移植性和可维护性等问题。 35 | 7、科学应用 36 | Java在科学应用中是很好选择,包括自然语言处理。最主要的原因是因为Java比C++或者其他语言相对其安全性、便携性、可维护性以及其他高级语言的并发性更好。 37 | 38 | 39 | 40 | 所以说Java的应用还是很广泛的,虽然免不了CURD,但是薪资不会太低,相对于其他行业,你是很难做到的。 41 | 42 | 说白了, 43 | 44 | Java是一门入门简单的语言,只要你能吃苦,找到一份薪资不错的工作是容易的; 45 | 46 | 如果你想往更高的目标追求,那就再咬咬牙坚持、不断学习, 47 | 48 | 49 | 50 | ## Java学到什么程度才能找到工作呢? 51 | 52 | 由于移动端的普及,网站开发成为了Java使用最广的应用,而招聘中,会使用JavaWeb框架(spring、springboot、hibernate等等)、MySQL(curd)、Linux(查日志、部署)成为了必须掌握的技能。 53 | 54 | boss上找几个招聘要求看看: 55 | 56 | ### 8k 的要求 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104105506719.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104105506719.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104135710398.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104135710398.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104150140677.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104150140677.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104150308595.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104150308595.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104162158102.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104162158102.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104163638568.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104163638568.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104180530916.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104180530916.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/picture/image-20210104182531278.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java入门/picture/image-20210104182531278.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/使用IDEA编写第一个Java程序.md: -------------------------------------------------------------------------------- 1 | 废话少说,上号,打开你的IDEA 2 | 3 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104182531278.png) 4 | 5 | 6 | 7 | ## 1、新建项目 8 | 9 | 打开IDEA,点击 `create new project` 10 | 11 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105232603018.png) 12 | 13 | 14 | 15 | 16 | 17 | 选择一个`Empty project` 18 | 19 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105232918761.png) 20 | 21 | 设置项目名称和项目路径 22 | 23 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105233032662.png) 24 | 25 | ## 2、配置项目的JDK 26 | 27 | 打开配置选项,快捷键 `Ctrl+Alt+Shift+S` 28 | 29 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105233442126.png) 30 | 31 | 保存就可以看到右侧出现了刚刚新建的项目,如果没有就重启一下IDEA: 32 | 33 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105233706648.png) 34 | 35 | ## 3、配置Java的源文件路径 36 | 37 | 打开配置选项,快捷键 `Ctrl+Alt+Shift+S` 38 | 39 | 找到 `Modules` ,右击项目路径,新建一个文件夹 `src`,然后点击 上面的 `Sources` ,表示这个路径就是写java的路径了。 40 | 41 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105234914955.png) 42 | 43 | ## 4、新建一个package 44 | 45 | 文件夹路径在Java中又叫**包** 46 | 47 | 右击项目,新建一个 `package` 48 | 49 | 你可以自定义名称,我这里输入:`com.hac.first` 50 | 51 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105235218744.png) 52 | 53 | 54 | 55 | ## 5、新建一个 class 56 | 57 | 在 `first` 这个包右击,点击新建一个 `Java Class` 58 | 59 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105235320389.png) 60 | 61 | 名字就叫 `Hello` 62 | 63 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105235413431.png) 64 | 65 | 66 | 67 | 新建类后,我们发现这个**类的名称和我们的文件名是一样的**。 68 | 69 | 70 | 71 | 然后在类里面编写代码: 72 | 73 | ```java 74 | package com.hac.first; 75 | 76 | public class Hello { 77 | public static void main(String[] args) { 78 | System.out.println("Hello, world! I am HaC."); 79 | } 80 | } 81 | ``` 82 | 83 | ## 6、运行 84 | 85 | 在代码编辑区,鼠标右击 ,选择 `Run`,快捷键是 `Ctrl+Shift+F10` 86 | 87 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210106000200463.png) 88 | 89 | 看到控制台输出: 90 | 91 | ```Java 92 | Hello, world! I am HaC. 93 | ``` 94 | 95 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210105235941850.png) 96 | 97 | 至此,接下来你就可以使用IDEA进行Java开发了。 -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/安装Java运行环境.md: -------------------------------------------------------------------------------- 1 | Windows系统是使用C++和C语言编写的,你要想Java运行在Windows系统,那就要安装Java的运行环境(Java 虚拟机)才行,不然Windows是无法识别你的代码的。 2 | 3 | 在Mac、Linux也是同理,你要运行Python、C++,也一样要安装语言支持的环境。 4 | 5 | 6 | 7 | ## 1、安装Java运行环境 8 | 9 | > 以Windows10、jdk1.8 为例 10 | 11 | JDK是 Java 语言的软件开发工具包,JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。 12 | 13 | 这是Java程序运行必须依赖当前环境。也是我们使用Java开发必须安装的环境,安装完毕配置jdk的环境即可。 14 | 15 | 16 | 17 | ### 1、下载 jdk 18 | 19 | 下载地址: 20 | 21 | https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html 22 | 23 | Windows 64位版本: 24 | 25 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104162158102.png) 26 | 27 | 其他jdk版本也是一样。 28 | 29 | 30 | 31 | ### 2、安装 32 | 33 | 安装成功后,打开电脑的 `环境变量` 34 | 35 | 1、新建一个名为“`JAVA_HOME`”的环境变量,变量值为Java的安装路径,本人为:`D:\project\Java\jdk8` 36 | 37 | 2、设置Path环境变量,该变量已经存在,所以在列表中选择Path,点击下方的“编辑”按钮,在弹出的窗口中添加如下信息: `%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin`,然后点击“确认”按钮即可,如果你是win7,前面需要加`;`,即`;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin` 38 | 39 | 3、和`JAVA_HOME`一样,新建一个名为“`classpath`”的环境变量,变量值为:`%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar` 40 | 41 | ### 3、验证 42 | 43 | `win+R` 输入 `java -version` 44 | 45 | ```java 46 | C:\Users\HaC>java -version 47 | java version "1.8.0_131" 48 | Java(TM) SE Runtime Environment (build 1.8.0_131-b11) 49 | Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode) 50 | ``` 51 | 52 | 出现版本信息表示安装成功。 53 | 54 | 55 | 56 | ## JDK、JRE、JVM 的关系 57 | 58 | JDK:Java 开发工具包,同时还包含了编译java源码的编译器javac,供开发使用。 59 | JRE:Java 运行时环境,一些基本类库,供运行使用。 60 | JVM:Java 虚拟机。它只认识 xxx.class 这种类型的文件,它能够将 class 文件中的字节码指令进行识别并针对不同操作系统向上的 API 完成动作。 61 | 62 | ![ ](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20201014161247843.png) -------------------------------------------------------------------------------- /docs/articles/Java基础/Java入门/运行第一个Java程序.md: -------------------------------------------------------------------------------- 1 | ## 编写第一个Java程序 2 | 3 | ### 1、新建一个txt文本 4 | 5 | 输入下面的代码内容: 6 | 7 | ```java 8 | public class Hello { 9 | public static void main(String[] args) { 10 | System.out.println("Hello, world!,I am HaC."); 11 | } 12 | } 13 | ``` 14 | 15 | `public class Hello` 表示是一个类,叫做 `Hello` 16 | 17 | `public static void main(String[] args)` 是程序的入口,方法名是`main` 18 | 19 | `System.out.println("Hello, world!,I am HaC.");` 表示打印,`;`表示该语句结束。 20 | 21 | 以上不明白不重要,下面会详细介绍Java的语法。 22 | 23 | ### 2、保存 24 | 25 | 另存为 `Hello.java` 文件。 `.java`是java文件的标识 26 | 27 | 这里必须保存为与 代码中 `public class Hello` 的class名字一样,即 `Hello` 28 | 29 | ### 3、编译 30 | 31 | `.java` 文件是用户编写的文件,但是计算机是无法识别的,所以需要先编译,编译的命令是`javac` 32 | 33 | ``` 34 | javac Hello.java 35 | ``` 36 | 37 | 编译成功后会出现 一个 `.class` 文件, `.class` 是一个二进制文件,是能被JVM识别的文件。 38 | 39 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104163638568.png) 40 | 41 | ### 4、执行 42 | 43 | 注意:`java命令`不需要带文件后缀 44 | 45 | ```java 46 | java Hello 47 | ``` 48 | 49 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210104180530916.png) 50 | 51 | 执行成功就会输入该java文件编写好的内容。 52 | 53 | 54 | 55 | ## 运行的原理 56 | 57 | `.java、.class、jvm` 的关系,以及跨平台的理解: 58 | 59 | ![java程序执行流程](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20201014154245544.png) 60 | 61 | 62 | 63 | 我们编写的代码就叫做`.java 源文件`,但是计算机并不会识别你的源文件,所以就需要编译器了,这是JDK帮我们编译的,编译器编译后生成`.class 文件`。 64 | 65 | 生成`.class 文件` 为了确保可以在不同平台运行,这也是JDK做的,JDK(准确的说是JVM,但JDK包括JVM)会把`.class文件`再解释为机器码,让不同的设备运行。 66 | 67 | 所以说,只要我们的设备安装了jdk,就能运行我们编写的代码了。 68 | 69 | 而我们,只限于编写`.java 文件`的代码就行了。 -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/3、Java数组.md: -------------------------------------------------------------------------------- 1 | ## Java 数组 2 | 3 | `数组` 是Java中很常见的数据结构。 4 | 5 | 存储一个整型的数据,我们可以使用以下的方式表示: 6 | 7 | ```java 8 | int x = 1; 9 | ``` 10 | 11 | 如果要存储 10个 、100个不同的整型、布尔型、字符串 数据,如果要定义,是一件效率很低的事情,这时候数组就派上用场了。 12 | 13 | ## 数组声明 14 | 15 | 语法: 16 | 17 | ```java 18 | dataType[] arrays; 19 | //或 20 | dataType arrays[]; 21 | ``` 22 | 23 | dataType 表示数据类型,可以是任意类型,arrays是数组的名称。 24 | 25 | ```java 26 | String[] StringArrays; //定义一个String 类型的数组 27 | int[] intArrays;//定义一个int 类型的数组 28 | ``` 29 | 30 | ## 创建数组 31 | 32 | 创建数组的时候,需要指定大小,不然系统不会为它分配内存空间。 33 | 34 | ```java 35 | int[] intArrays = new int[5]; //指定长度为 5 的数组大小。 36 | intArrays[0] = 100; 37 | intArrays[1] = 200; 38 | ``` 39 | 40 | > Java中数组的起始值下标是从 `0` 开始,末尾下标是 `数组长度-1`,上面的数组范围就是`0~4` 41 | 42 | 数组所有元素初始化为默认值,如果是 int 数组,那就是 `0` ,如果是 double数组,就是`0.0`,布尔型是`false`; 43 | 44 | 数组一旦创建后,大小就不可改变。这也是初始化的时候必须声明大小的原因。 45 | 46 | 可以单独修改数组的某一个值,比如 `intArrays[0] = 100;` 47 | 48 | 可以使用 `数组名称.length` 获取数组的大小 49 | 50 | ```java 51 | intArrays.length //5 52 | ``` 53 | 54 | 如果数组越界,就会报错: 55 | 56 | ```java 57 | intArrays[5] =100; //报 java.lang.ArrayIndexOutOfBoundsException 58 | ``` 59 | 60 | 数组还可以简写: 61 | 62 | ```java 63 | int[] intArrays ={100,200}; 64 | char[] charArrays ={'a','b','c'}; 65 | ``` 66 | 67 | ## 多维数组 68 | 69 | 以二维数组为例: 70 | 71 | ```java 72 | int[][] intArrays = new int[3][3]; 73 | intArrays[0][0] = 1; 74 | intArrays[0][1] = 2; 75 | intArrays[0][2] = 3; 76 | ``` 77 | 78 | `intArrays[0][0]` 表示 第0行0列,你可以理解二维数组是一个矩阵。 79 | 80 | 下标对应位置: 81 | 82 | ``` 83 | [0][0] [0][1] [0][2] 84 | [1][0] [1][1] [1][2] 85 | [2][0] [2][1] [2][2] 86 | ``` 87 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210105112121205.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210105112121205.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210106105230992.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210106105230992.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210106144859241.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210106144859241.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210106145934674.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210106145934674.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210107110919861.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210107110919861.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210107111002172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210107111002172.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210107112141838.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210107112141838.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210108101209502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210108101209502.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210108101424894.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210108101424894.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210108111838227.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210108111838227.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java基础/picture/image-20210324231018184.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java基础/picture/image-20210324231018184.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/6、Java控制流程.md: -------------------------------------------------------------------------------- 1 | Java的变量可以定义不同的数据,但是Java作为一门逻辑的语言,少不了逻辑结构。 2 | 3 | > Java的执行是从main方法开始的,但是进入了main方法之后,Java是自上而下执行的。 4 | 5 | Java就像流程图一样,用户可以自定义逻辑判断、循环、返回、结束等等,Java也有这些流程语句。 6 | 7 | Java的程序控制语句关键字有: 8 | 9 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210108111838227.png) 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/picture/image-20210615232438777.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java基础/Java流程控制/picture/image-20210615232438777.png -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/switch-case匹配语句.md: -------------------------------------------------------------------------------- 1 | switch case 合理运用可以降低if-else的工作量。 2 | 3 | ## switch case匹配语句 4 | 5 | 语法结构: 6 | 7 | ```java 8 | switch(expression){ 9 | case value : 10 | //语句 11 | break; //可选 12 | case value : 13 | //语句 14 | break; //可选 15 | //你可以有任意数量的case语句 16 | default : //可选 17 | //语句 18 | } 19 | ``` 20 | 21 | switch的规则: 22 | 23 | switch 语句中的变量类型可以是(即上面的expression): byte、short、int 或者 char。 24 | 25 | > 从 Java SE 7 开始,switch 支持字符串 String 类型了 26 | 27 | switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。且case后面必须是常量 28 | 29 | 当变量的值与 case 语句的值相等时,case 语句开始执行,**直到 break 语句出现才会跳出 switch 语句。**(所以说如果没有break会一直执行) 30 | 31 | > break 和 default 是非必须的。default是没有匹配就会执行 32 | 33 | switch-case例子: 34 | 35 | ```java 36 | String grade = "B"; 37 | switch (grade) { 38 | case "A": 39 | System.out.println("优秀"); 40 | break; 41 | case "B": 42 | case "C": 43 | System.out.println("良好"); 44 | break; 45 | case "D": 46 | System.out.println("及格"); 47 | break; 48 | case "F": 49 | System.out.println("不及格"); 50 | break; 51 | default: 52 | System.out.println("回家小心点"); 53 | } 54 | ``` 55 | 56 | 输出: 57 | 58 | ``` 59 | 良好 60 | ``` 61 | 62 | 63 | 64 | 如果语句没有break,会输出配到到第一个case以及往下的所有case,直到遇到第一个case。 65 | 66 | eg2: 67 | 68 | ```java 69 | int i = 1; 70 | switch(i){ 71 | case 0: 72 | System.out.println("0"); 73 | case 1: 74 | System.out.println("1"); 75 | case 2: 76 | System.out.println("2"); 77 | default: 78 | System.out.println("default"); 79 | } 80 | ``` 81 | 82 | 输出: 83 | 84 | ``` 85 | 1 86 | 2 87 | default 88 | ``` 89 | 90 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/循环语句.md: -------------------------------------------------------------------------------- 1 | 循环结构可以帮助我们执行一条语句多次。 2 | 3 | Java中有三种主要的循环结构: 4 | 5 | - **while** 循环 6 | - **do…while** 循环 7 | - **for** 循环 8 | 9 | 10 | 11 | ## 循环结构 12 | 13 | for、while 、do...while 这三个都是循环结构 14 | 15 | ### while 16 | 17 | while循环比较简单,结构: 18 | 19 | ```java 20 | while( 布尔表达式 ) { 21 | //循环执行内容 22 | } 23 | ``` 24 | 25 | eg: 26 | 27 | ```java 28 | public static void main(String args[]) { 29 | int x = 5; 30 | while (x >= 1) { 31 | System.out.println("x的值:" + x); 32 | x--; 33 | } 34 | } 35 | ``` 36 | 37 | 输出结果: 38 | 39 | ``` 40 | x的值:5 41 | x的值:4 42 | x的值:3 43 | x的值:2 44 | x的值:1 45 | ``` 46 | 47 | ### do…while 循环 48 | 49 | eg: 50 | 51 | ```java 52 | public static void main(String args[]) { 53 | int x = 5; 54 | do { 55 | System.out.println("x的值:" + x); 56 | x--; 57 | } while (x >= 1); 58 | } 59 | ``` 60 | 61 | 输出结果: 62 | 63 | ``` 64 | x的值:5 65 | x的值:4 66 | x的值:3 67 | x的值:2 68 | x的值:1 69 | ``` 70 | 71 | 可以看到do…while表达式中,布尔表达式在循环体的后面,所以语句块在检测布尔表达式之前已经执行了,所以 do…while 循环至少会执行一次。 72 | 73 | > 代码中,不建议使用 do…while 74 | 75 | **while 和 do...while 的区别:** 76 | 77 | 1、对于 while 语句而言,如果不满足条件,则不能进入循环 78 | 79 | 2、do…while 循环至少会执行一次。 80 | 81 | 82 | 83 | ### for 84 | 85 | for循环可以让循环变得更简单。 86 | 87 | 语法结构: 88 | 89 | ```java 90 | for(初始化表达式; 布尔表达式; 更新表达式) { 91 | //循环执行内容 92 | } 93 | ``` 94 | 95 | eg: 96 | 97 | ```java 98 | for (int x = 5; x >= 1; x--) { 99 | System.out.println("x的值:" + x); 100 | } 101 | ``` 102 | 103 | 输出结果: 104 | 105 | ``` 106 | x的值:5 107 | x的值:4 108 | x的值:3 109 | x的值:2 110 | x的值:1 111 | ``` 112 | 113 | `x--` ,即第三个更新表达式,表示单次循环执行结束,就会执行该表达式 114 | 115 | 可以这样理解: 116 | 117 | ```java 118 | int x = 5; 119 | for (; x >= 1 ; ) { 120 | System.out.println("x的值:" + x); 121 | x--; 122 | } 123 | ``` 124 | 125 | ### 增强型for 126 | 127 | Java5 引入了一种主要用于数组、List列表 的增强型 for 循环 128 | 129 | 语法结构: 130 | 131 | ```java 132 | for( 类型声明 : 数组) 133 | { 134 | //代码句子 135 | } 136 | ``` 137 | 138 | eg: 139 | 140 | ```java 141 | int[] numbers = {5, 4, 3, 2, 1}; 142 | for (int num : numbers) { 143 | System.out.println("num:" + num); 144 | } 145 | ``` 146 | 147 | 输出: 148 | 149 | ``` 150 | num:5 151 | num:4 152 | num:3 153 | num:2 154 | num:1 155 | ``` 156 | 157 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/条件语句.md: -------------------------------------------------------------------------------- 1 | 条件语句就相当于流程图的判断,我们可以指定条件,通过判断是否符合条件去执行我们想要的语句。 2 | 3 | 条件语句只要分为: 4 | 5 | - **if...else** 6 | - **if...else if...else** 7 | - **嵌套 if** 8 | 9 | 10 | 11 | ## 条件语句 12 | 13 | ### if...else 14 | 15 | 语法结构: 16 | 17 | ```java 18 | if(布尔表达式){ 19 | //如果布尔表达式的值为true 20 | }else{ 21 | //如果布尔表达式的值为false 22 | } 23 | ``` 24 | 25 | if 语句后面可以跟 else 语句,当 if 语句的布尔表达式值为 false 时,else 语句块会被执行。 26 | 27 | if语句也可以不需要else语句,但是else语句一定要和if语句配套使用,且和上方最近的第一个if匹配。 28 | 29 | eg: 30 | 31 | ```java 32 | int x = 10; 33 | if (x == 10){ 34 | System.out.println("x等于10"); 35 | } 36 | if (x > 20) { 37 | System.out.println("x大于20"); 38 | } else { //该else只和上面最近的第一个if匹配 39 | System.out.println("x小于20"); 40 | } 41 | ``` 42 | 43 | 输出: 44 | 45 | ``` 46 | x等于10 47 | x小于20 48 | ``` 49 | 50 | ### if...else if...else 51 | 52 | if 语句后面可以跟 else if…else 语句,这种语句可以检测到多种可能的情况 53 | 54 | eg: 55 | 56 | ```java 57 | int x = 10; 58 | if (x == 40) { 59 | System.out.println("x等于30"); 60 | } else if (x == 20) { 61 | System.out.println("x等于20"); 62 | } else if (x == 10) { 63 | System.out.println("x等于10"); 64 | } else { 65 | System.out.println("都不是"); 66 | } 67 | ``` 68 | 69 | 输出: 70 | 71 | ``` 72 | System.out.println("x等于10"); 73 | ``` 74 | 75 | 76 | 77 | ### 嵌套 if…else 语句 78 | 79 | ```java 80 | if (x < 10) { 81 | if (x < 5) { 82 | System.out.println("x小于10且小于5"); 83 | } else { 84 | System.out.println("x大于5且小于10"); 85 | } 86 | }else { 87 | System.out.println("x大于10"); 88 | } 89 | ``` 90 | 91 | 输出: 92 | 93 | ``` 94 | x大于5且小于10 95 | ``` 96 | 97 | -------------------------------------------------------------------------------- /docs/articles/Java基础/Java流程控制/跳出语句.md: -------------------------------------------------------------------------------- 1 | for循环有时候不一定需要全部循环体都执行,我们就需要用到中跳出语句。 2 | 3 | 循环体跳出语句: 4 | 5 | - **contine** 6 | - **break** 7 | 8 | 9 | 10 | ## continue 11 | 12 | continue 表示 不再执行循环体中continue语句之后的代码,直接进行下一次循环。 13 | 14 | eg: 15 | 16 | ```java 17 | for (int x = 5; x >= 1; x--) { 18 | if (x == 3) { 19 | continue; //相当于跳过当次循环 20 | } 21 | System.out.println("x的值:" + x); 22 | } 23 | ``` 24 | 25 | 输出: 26 | 27 | ``` 28 | x的值:5 29 | x的值:4 30 | x的值:2 31 | x的值:1 32 | ``` 33 | 34 | 35 | 36 | ## break 37 | 38 | break可用于跳出当前循环体(while、for、do while)或程序块(switch) 39 | 40 | eg: 41 | 42 | ```java 43 | for (int x = 5; x >= 1; x--) { 44 | if (x == 3) { 45 | break; 46 | } 47 | System.out.println("x的值:" + x); 48 | } 49 | ``` 50 | 51 | 输出: 52 | 53 | ``` 54 | x的值:5 55 | x的值:4 56 | ``` 57 | 58 | 59 | 60 | 61 | 62 | ### 双重for循环的跳出 63 | 64 | continue 和 break 只是跳出当前的循环体,并不影响外层循环的执行。 65 | 66 | 67 | 68 | eg: 69 | 70 | 相当于 一个 2*3 的循环 71 | 72 | ```java 73 | for (int x = 2; x >= 1; x--) { 74 | for (int y = 1; y <= 3; y++) { 75 | if (x == 1 && y == 2) { 76 | continue; 77 | } 78 | System.out.println("x的值:" + x + ",y的值:" + y); 79 | } 80 | } 81 | ``` 82 | 83 | 输出: 84 | 85 | ``` 86 | x的值:2,y的值:1 87 | x的值:2,y的值:2 88 | x的值:2,y的值:3 89 | x的值:1,y的值:1 90 | x的值:1,y的值:3 91 | ``` 92 | 93 | 94 | 95 | eg2: 96 | 97 | ```java 98 | for (int x = 2; x >= 1; x--) { 99 | for (int y = 1; y <= 3; y++) { 100 | if (x == 1 && y == 2) { 101 | break; 102 | } 103 | System.out.println("x的值:" + x + ",y的值:" + y); 104 | } 105 | } 106 | ``` 107 | 108 | 输出: 109 | 110 | ``` 111 | x的值:2,y的值:1 112 | x的值:2,y的值:2 113 | x的值:2,y的值:3 114 | x的值:1,y的值:1 115 | ``` 116 | 117 | -------------------------------------------------------------------------------- /docs/articles/Java新特性/Java8之Stream.md: -------------------------------------------------------------------------------- 1 | ## 1、Streams是什么 2 | 3 | ![](F:\笔记\PureJavaCoderRoad(Java基础教程)\docs\articles\Java新特性\picture\image-20210610140137943.png) 4 | 5 | Stream 是 Java8 中处理集合的关键抽象概念,它可以对指定集合进行一些复杂的操作,比如说查找、过滤、分组、求和等等。 6 | 7 | 你可以理解为MySQL的group by、having、order 等等。 8 | 9 | Stream 可以极大提高Java程序员的生产力,让程序员写出更简洁的代码。 10 | 11 | 其特点是: 12 | 13 | - 不是数据结构,也就是说不会保存数据,也不会修改原集合的数据,它会把操作后的数据保存到另外一个对象中 14 | - Stream也是个lambda表达式,具有延迟执行特性,只有调用终端操作时,中间操作才会执行。 15 | 16 | 17 | 18 | ## 2、Stream、parallelStream、Iterator的区别 19 | 20 | `Stream` 是流的串行处理方式。 21 | 22 | `parallelStream`提供了流的并行处理,它是Stream的另一重要特性,其底层使用`Fork/Join`框架实现。简单理解就是多线程异步任务的一种实现。(集合的数据会分成多个段,由多个线程处理),`parallelStream` 作为多线程版的Stream ,如果用法不正确,反而适得其反。 23 | 24 | **`stream`和`parallelStream`的简单区分:** `stream`是顺序流,由主线程按顺序对流执行操作,而`parallelStream`是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求。 25 | 26 | ![](F:\笔记\PureJavaCoderRoad(Java基础教程)\docs\articles\Java新特性\picture\image-20210610174148178.png) 27 | 28 | `Iterator`是一个迭代器。java通过提供`Iterator`和`Iterable`俩个接口来实现集合类的可迭代性,迭代器主要的用法是:首先用`hasNext()`作为循环条件,再用`next()`方法得到每一个元素,最后在进行相关的操作。 29 | 30 | 迭代提供一种访问一个集合对象各个元素的途径,同时又不需要暴露该对象的内部细节。 31 | 32 | 如: 33 | 34 | ```java 35 | Iterator it = list.iterator();//得到lits的迭代器 36 | //调用迭代器的hasNext方法,判断是否有下一个元素 37 | while (it.hasNext()) { 38 | //将迭代器的下标移动一位,并得到当前位置的元素值 39 | System.out.println(it.next()); 40 | } 41 | ``` 42 | 43 | > 从Java5.0开始,迭代器可以被foreach循环所替代,但是foreach循环的本质也是使用Iterator进行遍历的。 44 | 45 | 46 | 47 | Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。 48 | 49 | 三者使用: 50 | 51 | ```java 52 | List list = Arrays.asList("a", "b", "c"); 53 | //创建一个迭代器 54 | Iterator iterator = list.iterator(); 55 | // 创建一个串行顺序流 56 | Stream stream = list.stream(); 57 | // 创建一个并行流 58 | Stream parallelStream = list.parallelStream(); 59 | ``` 60 | 61 | 62 | 63 | ## 3、例子 64 | 65 | 先来一个公共的类: 66 | 67 | ```java 68 | @Data 69 | @AllArgsConstructor 70 | class Person{ 71 | String name ; 72 | int age; 73 | String sex; 74 | int salary; 75 | } 76 | 77 | List personList = new ArrayList<>(); 78 | personList.add(new Person("醋酸菌",25,"男",12000)); 79 | personList.add(new Person("马冬梅",23,"女",8000)); 80 | personList.add(new Person("三上悠亚",24,"女",18000)); 81 | ``` 82 | 83 | ### 3.1、遍历(foreach) 84 | 85 | ```java 86 | personList.stream().forEach(x-> System.out.println(x.getName())); 87 | ``` 88 | 89 | 输出: 90 | 91 | ``` 92 | 醋酸菌 93 | 马冬梅 94 | 三上悠亚 95 | ``` 96 | 97 | 98 | 99 | ### 3.2、过滤(filter) 100 | 101 | ```java 102 | personList.stream() 103 | .filter(x -> x.getAge() > 23) 104 | .filter(x->x.getSalary() > 12000) 105 | .forEach(x-> System.out.println(x.getName())); 106 | ``` 107 | 108 | 把符合的数据丢进一个Map然后再转成List: 109 | 110 | ```java 111 | List stringList = personList.stream().filter(x -> x.getAge() > 23) 112 | .filter(x -> x.getSalary() > 12000) 113 | .map(person -> person.getName()).collect(Collectors.toList()); 114 | System.out.println(stringList); 115 | ``` 116 | 117 | -------------------------------------------------------------------------------- /docs/articles/Java新特性/Java8新特性.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 现在很多公司还是很青睐Java8,因为Java8这个版本可以说是有了重大的突破。 4 | 5 | Oracle 公司于 2014 年 3 月 18 日发布 Java 8,Java8主要是在原来面向对象的基础上增加了函数式编程的能力。 6 | 7 | 这样就出现了在Java中使用Lambda表达式,将一个函数作为方法的参数来进行传递。Java8的Stream就是典型的例子,Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 8 | 9 | 10 | 11 | 简而言之,新特性的出现是为了让程序员写出更简洁的代码。 12 | 13 | 但是,对于不了解新特性的程序员来说,这将是一个很痛苦的事情。 14 | 15 | 因为可读性并不是很好,比如说Java8的lambda、Optional、Stream 等等,需要一定的了解才知道它的逻辑是怎么样的。 16 | 17 | 18 | 19 | 但,jdk总是在不断的更新,我们也不要总停留在旧的版本,应该吸取新版本的特性,拥抱它。 20 | 21 | 22 | 23 | 下面就来看一下有哪些好用的新特性吧。 24 | 25 | 26 | 27 | 推荐几个Java新特性的学习仓库: 28 | 29 | ## 1、Java8-tutorial 30 | 31 | [https://github.com/winterbe/java8-tutorial](https://github.com/winterbe/java8-tutorial) 32 | 33 | 外国一程序员写的教程,内容很少,但是star的人数超级多,不需要花很多时间就可以学会了。 34 | 35 | 这个教程会指导您一步一步地学习所有新的语言特性。在简短的代码示例的支持下,您将学习如何使用默认接口方法、 lambda 表达式、方法引用和可重复的注释。在本文的最后,您将熟悉最新的 API 变化,如流、功能接口、映射扩展和新的 Date API。 36 | 37 | 38 | 39 | ## 2、Java11新特性 40 | 41 | [https://winterbe.com/posts/2018/09/24/java-11-tutorial/](https://winterbe.com/posts/2018/09/24/java-11-tutorial/) 42 | 43 | -------------------------------------------------------------------------------- /docs/articles/Java新特性/picture/image-20210610140137943.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java新特性/picture/image-20210610140137943.png -------------------------------------------------------------------------------- /docs/articles/Java新特性/picture/image-20210610174148178.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java新特性/picture/image-20210610174148178.png -------------------------------------------------------------------------------- /docs/articles/Java线程/OS线程与进程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/OS线程与进程.vsdx -------------------------------------------------------------------------------- /docs/articles/Java线程/ThreadLocal强弱引用.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/ThreadLocal强弱引用.vsdx -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/20181026185652119.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/20181026185652119.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/2615789-08f16aeac7e0977d.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/2615789-08f16aeac7e0977d.webp -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/640-1594691307404.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/640-1594691307404.jpg -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/640.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/640.jpg -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/clipboard-1604383870276.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/clipboard-1604383870276.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/clipboard.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200611004316963-1594691307317.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200611004316963-1594691307317.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200611004316963.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200611004316963.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200611004413289.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200611004413289.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200611004743718.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200611004743718.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200611005459456.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200611005459456.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200615233613878-1594691307357.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200615233613878-1594691307357.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200615233613878.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200615233613878.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200616002629744-1594691307411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200616002629744-1594691307411.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200616002629744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200616002629744.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200624002751824.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200624002751824.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200722173317229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200722173317229.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200727101151586.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200727101151586.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200727183048768.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200727183048768.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20200727183451141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20200727183451141.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20201208232406847.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20201208232406847.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210204183213218.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210204183213218.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210204183904116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210204183904116.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210205092133132.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210205092133132.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210205092256711.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210205092256711.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210205142952344.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210205142952344.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210205144120771.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210205144120771.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210205144158831.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210205144158831.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210226140911934.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210226140911934.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210428145418753.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210428145418753.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210525230256204.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210525230256204.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210525232155784.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210525232155784.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210526001730670.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210526001730670.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210526001808630.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210526001808630.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210526001836411.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210526001836411.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20210526001908361.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20210526001908361.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/image-20211227171629856.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/image-20211227171629856.png -------------------------------------------------------------------------------- /docs/articles/Java线程/picture/java-volatile-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/picture/java-volatile-1.png -------------------------------------------------------------------------------- /docs/articles/Java线程/目录.md: -------------------------------------------------------------------------------- 1 | **本专栏多线程目录:** 2 | 3 | [(一)线程是什么](https://blog.csdn.net/yudianxiaoxiao/article/details/107580027) 4 | 5 | [(二)Java线程与系统线程和生命周期](https://blog.csdn.net/yudianxiaoxiao/article/details/107580082) 6 | 7 | [(三)Java线程创建方式](https://blog.csdn.net/yudianxiaoxiao/article/details/107580103) 8 | 9 | [(四)为什么要使用线程池](https://blog.csdn.net/yudianxiaoxiao/article/details/107580117) 10 | 11 | [(五)四种线程池底层详解](https://blog.csdn.net/yudianxiaoxiao/article/details/107580148) 12 | 13 | [(六)ThreadPoolExecutor自定义线程池](https://blog.csdn.net/yudianxiaoxiao/article/details/107580169) 14 | 15 | [(七)线程池的大小如何确定](https://blog.csdn.net/yudianxiaoxiao/article/details/107580183) 16 | 17 | [(八)Callable和Runnable的区别](https://blog.csdn.net/yudianxiaoxiao/article/details/107580192) 18 | 19 | [(九)线程池异常捕获](https://blog.csdn.net/yudianxiaoxiao/article/details/107580289) 20 | 21 | [(十)线程池参数——workQueue用法](https://blog.csdn.net/yudianxiaoxiao/article/details/107580289) 22 | 23 | [(十一)sleep(1)、sleep(0)和sleep(1000)的区别](https://blog.csdn.net/yudianxiaoxiao/article/details/107580336) 24 | 25 | [(十二)yield、notify、notifyAll、sleep、join、wait的区别](https://blog.csdn.net/yudianxiaoxiao/article/details/107592441) 26 | 27 | [(十三)synchronized用法,四种锁范围](https://blog.csdn.net/yudianxiaoxiao/article/details/107592447) 28 | 29 | [(十四)volatile的用法,原子性问题](https://blog.csdn.net/yudianxiaoxiao/article/details/107592452) 30 | 31 | [(十五)ThreadLocal的用法,如何解决内存泄漏](https://blog.csdn.net/yudianxiaoxiao/article/details/107678725) 32 | 33 | [(十六)ReentrantLock可重入锁使用和介绍](https://blog.csdn.net/yudianxiaoxiao/article/details/114121436) 34 | 35 | [(十七)AtomicInteger原子类的介绍和使用](https://blog.csdn.net/yudianxiaoxiao/article/details/117003021) 36 | 37 | [(十八)Worker线程管理](https://blog.csdn.net/yudianxiaoxiao/article/details/124016278) 38 | 39 | --- -------------------------------------------------------------------------------- /docs/articles/Java线程/线程生命周期.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java线程/线程生命周期.vsdx -------------------------------------------------------------------------------- /docs/articles/Java线程/(一)线程是什么.md: -------------------------------------------------------------------------------- 1 | >多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。 2 | 在单CPU计算机中,为了运行所有这些线程,操作系统需要为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,在宏观上似乎这些线程都在同时运行。 3 | 简单的说,就是更好的利用CPU的资源。 4 | 5 | ## 1. 程序 6 | 7 | 计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。 8 | 9 | ## 2. 进程 10 | 11 | 为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了进程,使参与并发执行的每个程序都能独立地运行,在操作系统中必须为之配置一个专门的数据结构,称作进程控制块(PCB)。 12 | 13 | 系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程。这样,有程序段、相关数据段和PCB三部分就构成了进程实体(又叫进程映像)。我们一般情况下把进程实体就简称为进程。可以定义为:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。 14 | 15 | ## 3. 线程 16 | 17 | 线程是进程的基础,线程的引入是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。进一步改善系统的服务质量。线程是比进程的更小基本单位。 18 | 19 | 20 | 21 | 简单地说,把正在计算机中执行的程序叫做“进程(Process)”。而“线程(Thread)”是进程中某个单一顺序的控制流,它记录了程序指令的踪迹。线程是进程内部的一个执行单元。 22 | 23 | 24 | 25 | 例如QQ是一个程序,更新是一个进程,下载包数据 是其中一个线程,清理旧版本数据也是其中一个线程。 26 | 27 | 28 | 29 | ## Java线程的好处 30 | 31 | (1)进程间不能共享内存,但线程之间可以共享内存非常容易。 32 | 33 | (2)系统创建进程需要为该进程重新分配系统资源,但创建线程则代价小的多,因此使用多线程来实现多任务并发比多进程的效率高。 34 | 35 | (3)Java语言内置多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程。 36 | 37 | 38 | 39 | 40 | 41 | Java中,线程是一个轻量级的子进程,是最小的处理单元,一个系统下可以有多个进程,一个进程中又有多个线程: 42 | 43 | ![OS、进程、线程](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200624002751824.png) 44 | 45 | --- 46 | 47 | **JUC** ,即 java.util.concurrent包名的简写,Java 5.0 引入的,是关于并发编程的API。 48 | 49 | 这里面包含了Java线程的关键知识点。 50 | 51 | 本教程也是围绕以下进行讲述。 52 | 53 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210226140911934.png) 54 | 55 | 56 | 57 | 在锁的章节(volatile、synchronized、ReentrantLock),你需要了解底层的原理,为什么会出现锁?这和Java内存模型有不可或缺的联系。 58 | 59 | 在线程的普通常见模式中,假如线程过多,如何进行管理,Java线程池如何选择大小。 60 | 61 | 还有很多因为线程引出的通信方式,比如说线程的休眠、阻塞、唤醒、同步。 62 | 63 | ....等等。 64 | 65 | 在这里,期待和各位进步。 -------------------------------------------------------------------------------- /docs/articles/Java线程/(三)Java线程创建方式.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 我们平时用main方法执行的代码,都是以主线程去执行。如果要使用多线程,可以使用以下三种方式去创建: 4 | 5 | 6 | 7 | ## 1. 继承Thread类 8 | 9 | ```java 10 | class MyThread extends Thread { 11 | @Override 12 | public void run() { 13 | System.out.println(Thread.currentThread().getName() + "---->>>>" +"继承Thread类"); 14 | } 15 | } 16 | ``` 17 | 18 | 19 | 20 | ## 2. 实现Runnable接口 21 | 22 | ```java 23 | class MyRunnable implements Runnable { 24 | @Override 25 | public void run() { 26 | System.out.println(Thread.currentThread().getName() + "---->>>>" +"实现Runable接口"); 27 | } 28 | } 29 | ``` 30 | 31 | 32 | 33 | 启动线程: 34 | 35 | ```java 36 | Thread myThread = new MyThread(); 37 | // myThread.run();//run()只是当普通方法去执行 38 | myThread.start(); 39 | 40 | Thread myRunnable = new Thread(new MyRunnable()); 41 | myRunnable.start(); 42 | ``` 43 | 44 | 45 | 46 | **语法糖:** 47 | 48 | 如果不想这么麻烦,可以使用这种方法启动一个线程执行需要的内容 49 | 50 | ```java 51 | new Thread(new Runnable() { 52 | @Override 53 | public void run() { 54 | System.out.println( Thread.currentThread().getName() + "---->>>>" + "简易创建线程"); 55 | } 56 | }); 57 | //jdk1.8以上可以用lambda语法 58 | new Thread(() -> { 59 | System.out.println(Thread.currentThread().getName() + "---->>>>" + "简易创建线程"); 60 | }).start(); 61 | ``` 62 | 63 | 64 | 65 | ## 3. 实现callable接口 66 | 67 | ```java 68 | public class ThreadDemo3 { 69 | public static void main(String[] args) { 70 | ExecutorService service = Executors.newFixedThreadPool(1); 71 | Future future = service.submit(new Callable() { 72 | @Override 73 | public String call() throws Exception { 74 | System.out.println("通过实现Callable接口"); 75 | return "TRUE"; 76 | } 77 | }); 78 | try { 79 | String result = future.get(); 80 | if (result.equals("TRUE")){ 81 | System.out.println("线程执行完成"); 82 | } 83 | } catch (InterruptedException e) { 84 | e.printStackTrace(); 85 | } catch (ExecutionException e) { 86 | e.printStackTrace(); 87 | } 88 | } 89 | } 90 | ``` 91 | 92 | 实现Callable接口,可以使用Future.get()方法获取线程执行的结果。 93 | 94 | 95 | 96 | ### Thread与Runnable的区别 97 | 98 | 事实是Thread和Runnable没有本质的区别。 99 | 100 | 点击Thread类,看一下源码,你会发现其实Thread也是实现了Runnable接口 101 | 102 | ```java 103 | public class Thread implements Runnable { 104 | /* Make sure registerNatives is the first thing does. */ 105 | private static native void registerNatives(); 106 | static { 107 | registerNatives(); 108 | } 109 | ``` 110 | 111 | 112 | 113 | **区别就是执行顺序:** 114 | 115 | 继承Thread类的顺序是: 116 | 117 | ``` 118 | Thread.start()→Thread.run() 119 | ``` 120 | 121 | 实现Runable接口顺序是: 122 | 123 | ``` 124 | Thread.start()→Thread.run()→Runable.run() 125 | ``` 126 | 127 | 128 | -------------------------------------------------------------------------------- /docs/articles/Java线程/(十一)sleep(1)、sleep(0)和sleep(1000)的区别.md: -------------------------------------------------------------------------------- 1 | > 众所周知,sleep是让线程处于等待运行状态,不会占用CPU,OS会将执行时间分配给其它线程。 2 | > 3 | > sleep(0)字面意思是睡眠0毫秒,大家可能觉得跟没写一样,其实不是的。 4 | > 5 | > sleep(1000)比较容易理解,就是让线程睡眠1000毫秒,但是1000毫秒后,线程会执行吗,是立即执行吗? 6 | > 7 | 8 | 本篇文章主要是探究以上的问题。 9 | 10 | 11 | 12 | ## 1、sleep()函数 13 | 14 | `Thread.sleep(long millis)` 简单的说就是指让当前正在运行的占用cpu时间片的线程挂起 millis ms,线程进入TIMED_WAITING状态,**但不释放对象锁**,然后把CPU的资源让给其他线程,但是我们只能指定了线程休眠时间,不能决定CPU的调度,不能决定接下来是哪个线程执行,而让这些线程自己去竞争,一般是OS根据线程的优先度执行。但是,millis后线程自动苏醒进入就绪状态,即线程的睡眠时间到了,它也不会立马被执行。 15 | 16 | 17 | 18 | ## 2、 windows和Unix的竞争策略 19 | 20 | Unix系统:时间片算法,一个轮询方法,给每个线程指定的运行时间,如果指定时间还没执行完毕,就剥夺CPU资源给到下一个线程,如果在指定时间前运行完毕或者阻塞了,CPU会检测立马进行切换。 21 | 22 | Windows:抢占式算法,一个线程获得了CPU资源,触发自己主动放弃使用CPU,不然会一直霸占CPU资源,或者遇到优先级更高的线程,OS发起一次重新调度,高优先级的线程才有机会继续执行。 有一些线程会主动挂起,这时候OS重新计算一次所有进程的总优先级,选出一个优先级最高的线程交给CPU。 23 | 24 | 25 | 26 | ## 3、sleep(0)和sleep(1000) 27 | 28 | 引用自马老师的经典比喻。 29 | 30 | 31 | 32 | 我们用上厕所这件事来说描述一下这两种竞争策略。厕所的马桶是CPU,有两个人等上厕所,分别是胖虎和小夫(2个进程)。 33 | 34 | 如果是Unix系统,每个人轮流上厕所10分钟,胖虎先上,时间到了,轮到小夫,这样两个人都能上厕所了,当然,如果胖虎10分钟都没解决,那么厕所管理员(OS)只能把胖虎强硬拉出来,让小夫去;或者胖虎提前解决了(挂起),就告诉厕所管理员我已经解决了,让下一位上,然后管理员就让小夫上了。 35 | 36 | 37 | 38 | 如果是 Windows 操作系统,假如胖虎排泄量大,地位高,厕所管理员(OS)会根据胖虎的小夫的情况做一个排序,最后选择出胖虎,直到胖虎不想用厕所了。等胖虎用完了,然后厕所管理员(OS)再排序一次。 39 | 40 | 胖虎上完厕所,这时候万一还有其他人,假如又来了大雄和静香,他们两个人的优先级更急,这时候厕所管理员(OS)就把雄和静香排在小夫面前,这样小夫就很难有机会上厕所了,还有一种情况就是,万一胖虎又想上厕所, 优先级还是比小夫高,这样胖虎上了多次厕所,也轮不到小夫,也有可能是厕所管理员(OS)觉得静香化的妆不好看,又把优先级给了她,明明静香不想再化妆,但是在厕所管理员(OS)这里优先级就是比小夫要上厕所的优先级高。 41 | 42 | 43 | 44 | `Thread.Sleep(1 * 60 * 60 * 1000)` 就是说,静香表示不想上厕所了,我想休息一下跟管理员说 一个小时内不要叫我上厕所,我不需要了,然后把厕所让给别人,然后管理员就知道了,下次优先级竞争就不需要把静香纳入计算了。 45 | 46 | `sleep(0)` 的话,就是说静香表示我现在上厕所中,会不会还有比我更需要使用厕所的人,比如小夫这么惨了都没上过厕所,然后她告诉管理员,在未来的 0毫秒之内不要再叫我上厕所,管理员也是接受这个0毫秒的,但是只是0毫秒,管理员在优先级排序的时候,一样会把静香纳入计算,和`Thread.Sleep(1 * 60 * 60 * 1000)` 一样,休息1小时后同样的也会把自己纳入重新计算。 47 | 48 | 49 | 50 | >因此,Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。 51 | 52 | 53 | 54 | ## 4、sleep(1000) ,线程睡眠1000毫秒后,线程会执行吗,是立即执行吗? 55 | 56 | 会执行,但不一定是立即执行。 57 | 58 | 静香(线程)只是告诉厕所管理员(OS):在未来的1000毫秒内不想再参与到厕所(CPU)的竞争。那么1000毫秒过去之后,这时候也许大雄正在使用厕所,那么这时候厕所管理员是不会重新分配厕所的,直到大雄结束(或者提前结束)或者大雄突然抽筋了不能使用厕所(阻塞);况且,即使这个时候厕所管理员恰巧进行 厕所分配,那么当前静香也不一定就是总优先级最高的那个,厕所还是可能被胖虎、大雄、小夫 抢占去。 59 | 60 | 61 | 62 | >与此相似的,Thread有个Resume 函数,是用来唤醒挂起的线程。好像上面所说的一样,这个函数只是**告诉操作系统我从现在起开始参与CPU竞争了,这个函数的调用并不能马上使得这个线程获得CPU控制权**。 63 | 64 | 65 | 66 | 操作系统会监控你霸占CPU的情况,如果发现某个线程长时间霸占CPU,会强制使这个线程挂起,因此在实际上不会出现“一个线程一直霸占着 CPU 不放”的情况。 67 | 68 | 有时候我们的大循环造成程序假死(看到都是一个方法在输出这种),并不是因为这个线程一直在霸占着CPU。**实际上在这段时间操作系统已经进行过多次CPU竞争了**,只不过其他线程在获得CPU控制权之后很短时间内马上就退出了,于是就又轮到了这个线程继续执行循环,于是就又用了很久才被操作系统强制挂起。我们看起来就好像这个线程一直在霸占着CPU一样,其实不然。 69 | 70 | 71 | 72 | 由于粒度的原因,诸如sleep(1)之类的时间可能会长于1毫秒,所以sleep(1)会进入到睡眠然后进入等待状态;但sleep(0)不会,如果线程调度器的可运行队列中有大于或等于当前线程优先级的就绪线程存在,操作系统会将当前线程从处理器上移除,**时间片只能让给优先级相同或更高的线程**,如果可运行队列中的没有就绪线程或所有就绪线程的优先级均低于当前线程优先级,那么当前线程会继续执行,就像没有调用 Sleep(0)一样。 73 | 74 | ## 5、总结 75 | 76 | 1. Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行。Thread.Sleep(0) 是你的线程暂时放弃cpu,也就是释放一些未用的时间片给其他线程或进程使用,就相当于一个让位动作。 77 | 2. sleep(n)之所以在n秒内不会参与CPU竞争,是因为当线程调用sleep(n)的时候,线程是由运行态转入等待态,线程被放入等待队列中,等待定时器n秒后的中断事件,当到达n秒计时后,**线程才重新由等待态转入就绪态**,被放入就绪队列中,**等待队列中的线程是不参与cpu竞争的,只有就绪队列中的线程才会参与cpu竞争**,所谓的cpu调度,就是根据一定的算法(优先级,FIFO等。。。),从就绪队列中选择一个线程来分配cpu时间。而sleep(0)之所以马上回去参与cpu竞争,是因为调用sleep(0)后,**因为0的原因,线程直接回到就绪队列**,而非进入等待队列,只要进入就绪队列,那么它就参与cpu竞争。 78 | 79 | 80 | 81 | 82 | 83 | 参考: 84 | 85 | [https://www.cnblogs.com/keyyang/p/4128424.html](https://www.cnblogs.com/keyyang/p/4128424.html) 86 | 87 | [https://www.cnblogs.com/keyyang/p/4128424.html](https://www.cnblogs.com/keyyang/p/4128424.html) -------------------------------------------------------------------------------- /docs/articles/Java线程/(十)线程池参数——workQueue用法.md: -------------------------------------------------------------------------------- 1 | 线程池参数的 `workQueue` 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。 2 | 3 | 我们只需要实现`BlockingQueue` 这个接口即可。 4 | 5 | ![图片出处找不到了](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/20181026185652119.png) 6 | 7 | 8 | 9 | JDK7 提供了 7 个阻塞队列。分别是: 10 | 11 | ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。 12 | 13 | LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。 14 | 15 | PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。 16 | 17 | DelayQueue:一个使用优先级队列实现的无界阻塞队列。 18 | 19 | SynchronousQueue:一个不存储元素的阻塞队列。 20 | 21 | LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。 22 | 23 | LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。 24 | 25 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20210525232155784.png) 26 | 27 | 介绍一下常用的有三种`workQueue` 28 | 29 | ## 1. SynchronousQueue 30 | 31 | SynchronousQueue**没有容量**,是无缓冲等待队列,是一个**不存储元素的阻塞队列**,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueue阻塞队列一般要求maximumPoolSizes为无界,避免线程拒绝执行操作。 32 | 33 | 插入元素到队列的线程被阻塞,直到另一个线程从队列中获取了队列中存储的元素。同样,如果线程尝试获取元素并且当前不存在任何元素,则该线程将被阻塞,直到线程将元素插入队列。 34 | 35 | 36 | 37 | ## 2. LinkedBlockingQueue 38 | 39 | LinkedBlockingQueue如果不指定大小,默认值是 `Integer.MAX_VALUE` 40 | 41 | 源码在此: 42 | 43 | ```java 44 | public LinkedBlockingQueue() { 45 | this(Integer.MAX_VALUE); 46 | } 47 | ``` 48 | 49 | ```java 50 | @Native public static final int MAX_VALUE = 0x7fffffff; 51 | ``` 52 | 53 | 就是说这个队列里面可以放 2^31-1 = 2147483647 个 任务,也就是无界队列。 54 | 55 | 所以为了避免队列过大造成机器负载或者内存爆满的情况出现,我们在使用的时候建议手动传一个队列的大小。 56 | 57 | 与ArrayBlockingQueue不同的是,LinkedBlockingQueue内部分别使用了takeLock 和 putLock 对并发进行控制,也就是说,添加和删除操作并不是互斥操作,可以同时进行,这样也就可以大大提高吞吐量。 58 | 59 | 与之类似的是 LinkedBlockingDeque。 60 | 61 | LinkedBlockingDeque: 使用双向队列实现的双端阻塞队列,双端意味着可以像普通队列一样FIFO(先进先出),可以像栈一样FILO(先进后出) 62 | 63 | ## 3. DelayQueue 64 | 65 | DelayQueue是一个延迟队列,无界,队列中每个元素都有过期时间,当从队列获取元素时,只有过期元素才会出队列,而队列头部的元素是过期最快的元素。 66 | 67 | 能够准确的把握任务的执行时间,通常可以使用在: 68 | 69 | 1. 定时任务调度,比如订单过期未支付自动取消 70 | 71 | 2. 缓存 72 | 73 | 74 | 75 | 如何使用,可以参考这篇文章:[https://blog.csdn.net/zhu_tianwei/article/details/53549653](https://blog.csdn.net/zhu_tianwei/article/details/53549653) 76 | 77 | 78 | 79 | --- 80 | 81 | 参考: 82 | 83 | - 【细谈Java并发】谈谈LinkedBlockingQueue:[https://blog.csdn.net/tonywu1992/article/details/83419448](https://blog.csdn.net/tonywu1992/article/details/83419448) -------------------------------------------------------------------------------- /docs/articles/Java线程/(四)为什么要使用线程池.md: -------------------------------------------------------------------------------- 1 | 阿里开发手册有一段描述: 2 | 3 | >【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 4 | > 5 | >说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。 6 | 7 | 上一篇文章介绍了Java线程是什么,以及用显式创建线程的两种方式(继承Thread类或者实现Runnable接口): 8 | 9 | ## 1. 手动创建线程的缺点 10 | 11 | 继承extend类或者实现runnable接口都是最简单创建线程的方式,但是这种方式有以下缺点: 12 | 13 | 1. 不受风险控制 14 | 2. 频繁创建,开销大 15 | 3. 不好管理(不知道哪里创建了线程、线程名字可能没有) 16 | 17 | ### 1.1 不受风险控制 18 | 19 | 服务器CPU资源有限,如果每个人都显示手动创建线程,不知道哪里的代码出现了多线程,在运行的时候所有线程都在抢占资源,不好控制。 20 | 21 | ### 1.2 频繁创建,开销大 22 | 23 | 虽然说`new Theard()`的父类也是`Object`,但是`new Theard()`和`new Object()`还是有区别的。 24 | 25 | 以下参考:[我会手动创建线程,为什么让我使用线程池?](https://mp.weixin.qq.com/s/LilY5ZfsaMLELf6e13Hlzw) 26 | 27 | #### new Object()过程: 28 | 29 | 1. 分配一块内存 M 30 | 2. 在内存 M 上初始化该对象 31 | 3. 将内存 M 的地址赋值给引用变量 obj 32 | 33 | #### 创建一个线程的过程: 34 | 35 | 1. 它为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧 36 | 2. 每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量池组成 37 | 3. 一些支持本机方法的 jvm 也会分配一个本机堆栈 38 | 4. 每个线程获得一个程序计数器,告诉它当前处理器执行的指令是什么 39 | 5. 系统创建一个与Java线程对应的本机线程 40 | 6. 将与线程相关的描述符添加到JVM内部数据结构中 41 | 7. 线程共享堆和方法区域 42 | 43 | 这段描述稍稍有点抽象,用数据来说明创建一个线程(即便不干什么)需要多大空间呢?答案是大约 `1M` 左右 44 | 45 | ### 1.3 不好管理 46 | 47 | 线程的名字不统一,可能无限制新建线程,可能占用过多系统资源导致死机或OOM。而重用存在的线程,减少对象创建、消亡的开销,性能佳。 48 | 49 | 50 | 51 | ## 2. 什么是线程池 52 | 53 | 在Java 5之后,Java通过Executor来启动线程,比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题。 54 | 55 | 简单的说就是把线程统一管理。 56 | 57 | 线程池优势: 58 | (1)降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗; 59 | 60 | (2)提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行; 61 | 62 | (3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。 63 | 64 | (4)提供更强大的功能,延时定时线程池。 65 | 66 | 67 | 68 | ### Java的4种默认线程池: 69 | 70 | 1. #### newSingleThreadExecutor 71 | 72 | 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 73 | 74 | 2. #### newFixeThreadPool 75 | 76 | 77 | 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 78 | 79 | 3. #### newCachedThreadPool 80 | 81 | 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。 82 | 83 | 4. #### newScheduledThreadPool 84 | 85 | 创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 86 | 87 | 88 | 89 | --- 90 | 91 | 参考: 92 | 93 | - [我会手动创建线程,为什么让我使用线程池?](https://mp.weixin.qq.com/s/LilY5ZfsaMLELf6e13Hlzw) 94 | 95 | 96 | -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210129104236502.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210129104236502.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210129105449996.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210129105449996.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210129110127528.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210129110127528.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210129110918410.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210129110918410.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210129112440603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210129112440603.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210202160401298.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210202160401298.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210202162909660.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210202162909660.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210202165332796.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210202165332796.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210203141103518.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210203141103518.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20210203141105472.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20210203141105472.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/IO/picture/image-20211216234151599.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/IO/picture/image-20211216234151599.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/picture/image-20210308152538839.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/picture/image-20210308152538839.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/picture/image-20210308152634653.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/picture/image-20210308152634653.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/picture/image-20210308153542701.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/picture/image-20210308153542701.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/BigDecimal.md: -------------------------------------------------------------------------------- 1 | 在基本数据类型中,我们可以使用double或者float表示一个浮点数,使用double比较常见,但是在精度要求极高的情况下,比如金额计算,double就会有一个**精度丢失**问题。 2 | 3 | eg: 4 | 5 | ```java 6 | double d =0.03; 7 | double d2 =300.03; 8 | System.out.println(d + d2); 9 | ``` 10 | 11 | 输出: 12 | 13 | ```java 14 | 300.05999999999995 15 | ``` 16 | 17 | 各位小伙伴可以尝试一下,两个double的浮点数相加,结果是`300.05999999999995` ,结果理应是 `301.06`。 18 | 19 | 这就是浮点类型的精度丢失。 20 | 21 | > 为什么会有这个问题? 22 | > 23 | > 因为计算机中表示的数据是二进制的 0和1,而不是所有的浮点数都能准确地用二进制表示的。 24 | 25 | 26 | 27 | 所以我们在运算**高精度**的数据的时候,可以使用 `java.math.BigDecimal` 类 28 | 29 | `BigDecimal`可以表示一个任意大小且精度完全准确的浮点数。 30 | 31 | 32 | 33 | ## BigDecimal使用介绍 34 | 35 | ### 1、初始化 36 | 37 | ```java 38 | BigDecimal num12 = new BigDecimal("0.005"); 39 | BigDecimal num22 = new BigDecimal("1000000"); 40 | BigDecimal num32 = new BigDecimal("-1000000"); 41 | ``` 42 | 43 | ### 2、加、减、乘、除 44 | 45 | ```java 46 | // 加法 47 | BigDecimal result1 = num1.add(num2); 48 | // 减法 49 | BigDecimal result2 = num1.subtract(num2); 50 | // 乘法 51 | BigDecimal result3 = num1.multiply(num2); 52 | // 除法 53 | BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP); 54 | // 绝对值 55 | BigDecimal result4 = num3.abs(); 56 | ``` 57 | 58 | 这里可以看到,**除法**是需要用到一个舍入模式的参数,因为一旦除不尽,你没有声明舍入模式,结果是会报错的。 59 | 60 | ### 3、八种舍入模式 61 | 62 | BigDecimal提供了8种舍入方式 63 | 64 | 1、ROUND_UP: 直接舍入+1 65 | 66 | 67 | 2、ROUND_DOWN: 直接舍去 68 | 69 | 70 | 3、ROUND_CEILING:接近正无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。 71 | 注意,此舍入模式始终不会减少计算值。 72 | 73 | 74 | 4、ROUND_FLOOR:接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。 75 | 注意,此舍入模式始终不会增加计算值。 76 | 77 | 78 | 5、**ROUND_HALF_UP**:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 79 | 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。 80 | 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。 81 | 82 | 83 | 6、ROUND_HALF_DOWN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 84 | 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。 85 | 86 | 87 | 7、ROUND_HALF_EVEN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 88 | 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同; 89 | 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。 90 | 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。 91 | 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。如果前一位为奇数,则入位,否则舍去。以下例子为保留小数点1位,那么这种舍入方式下的结果。 92 | 1.15>1.2 1.25>1.2 93 | 94 | 95 | 8、ROUND_UNNECESSARY:断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。 96 | 97 | 98 | 99 | **ROUND_HALF_UP** 常用,表示四舍五入。 -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/Java常用类.md: -------------------------------------------------------------------------------- 1 | Java是一门成熟的语言,也是一门包含许多第三方库(jar包)的语言,我们不需要特意的造轮子(封装自己的方法)。 2 | 3 | 比如说: 4 | 5 | 我们要比较要使用判断一个字符串是否为空或者空串,如下 6 | 7 | ``` 8 | String name = " "; 9 | ``` 10 | 11 | 你可以这样写: 12 | 13 | ```java 14 | public static boolean isBlank(String str) { 15 | if (str != null && str.trim().length() != 0) { //trim() 是String的API, 表示去除空格 16 | return false; 17 | } 18 | return true; 19 | } 20 | ``` 21 | 22 | 如果你不想`trim()`,那你需要把`String` 转成一个`char[]` 数组,遍历每一位下标的值是否等于 `''`,如果存在一个不等于空串,就返回`false`,但这样做就太麻烦了。 23 | 24 | JDK已经提供了很多很多的API给我们使用,必要时我们应该查看类和方法的说明,尤其是八大数据类型的包装类(下一节会讲到)和String的API。 25 | 26 | 27 | 28 | 上面这种判断字符串是否为空也是有点麻烦的。 29 | 30 | 但是如果我们用了第三方的jar——`org.apache.commons.lang3.StringUtils` 31 | 32 | ```java 33 | public static boolean isBlank2(String str) { 34 | return StringUtils.isBlank(str); 35 | } 36 | ``` 37 | 38 | 导入包,就直接可以使用`StringUtils.isBlank()` 去判断了。 39 | 40 | 41 | 42 | maven的仓库通过了许多jar供下载: 43 | 44 | > https://mvnrepository.com/ 45 | 46 | 搜索 `commons.lang3` 就能下载了,因为项目没有配置`maven`,所以这里先演示导入包的形式: 47 | 48 | ![点击jar下载](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210120160540203.png) 49 | 50 | 51 | 52 | 打开项目结构,点击 **Libraries** ——> **左上角 +** ——> **Java** ,导入刚刚下载的jar包 53 | 54 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210120162055534.png) 55 | 56 | 回到项目,你就发现多了一个提示: 57 | 58 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210120162301580.png) 59 | 60 | 这样就能使用`commons.lang3`这个jar包的API功能了,当然这个包还提供了很多功能,详细的可以自行了解。 61 | 62 | `commons.lang3`详细介绍可以参考:https://blog.csdn.net/f641385712/article/details/82468927 63 | 64 | 65 | 66 | 如果jar包在项目用的多了,就很难去管理了,这时候就尝试一下使用构建管理工具了,现在流行的常用构建工具有 67 | 68 | - Maven 69 | - gradle 70 | 71 | 早期的ant也不错,不过现在没什么人用了。 72 | 73 | 这两个不仅可以管理jar,还可以把项目打成jar包,供他人使用或者直接发布到仓库和服务器。 74 | 75 | 但这里就不介绍了。 -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/Math类.md: -------------------------------------------------------------------------------- 1 | `java.lang.Math` 是Java库提供的一个计算数学相关的类。 2 | 3 | 包括 指数、对数、随机数、平方根、三角函数等等。 4 | 5 | 6 | 7 | ### 1、求绝对值 8 | 9 | ```java 10 | Math.abs(-10); // 10 11 | ``` 12 | 13 | ### 2、取最大或最小值 14 | 15 | ```java 16 | Math.max(100, 1); // 100 17 | Math.min(1.2, 2.3); // 1.2 18 | ``` 19 | 20 | ### 3、计算x^y次方 21 | 22 | ```java 23 | Math.pow(2, 3); // 2的3次方 8 24 | ``` 25 | 26 | ### 4、计算√x 27 | 28 | ```java 29 | Math.sqrt(4) // 2 30 | ``` 31 | 32 | ### 5、三角函数 33 | 34 | ``` 35 | Math.sin(3.14); // 0.00159... 36 | Math.cos(3.14); // -0.9999... 37 | Math.tan(3.14); // -0.0015... 38 | Math.asin(1.0); // 1.57079... 39 | Math.acos(1.0); // 0.0 40 | ``` 41 | 42 | 计算以e为底的对数: 43 | 44 | ``` 45 | Math.log(4); // 1.386... 46 | ``` 47 | 48 | 计算以10为底的对数: 49 | 50 | ``` 51 | Math.log10(100); // 2 52 | ``` 53 | 54 | ### 6、常量 55 | 56 | Math还提供了几个数学常量: 57 | 58 | ``` 59 | double pi = Math.PI; // 3.14159... 60 | double e = Math.E; // 2.7182818... 61 | Math.sin(Math.PI / 6); // sin(π/6) = 0.5 62 | ``` 63 | 64 | ### 7、随机数 65 | 66 | #### 不带种子 67 | 68 | 生成一个随机数x,x的范围是`0 <= x < 1`: 69 | 70 | ``` 71 | Math.random(); // 0.53907... 每次都不一样 72 | ``` 73 | 74 | `random()函数`默认是返回一个double的浮点类型的随机数,其范围是:`[ 0 , 100 )` 75 | 76 | **如果要指定范围**,这里指定`[ 0 , 100 )`,可以这样写: 77 | 78 | ```java 79 | int num = (int) (Math.random() * 100); // 注意不要写成(int)Math.random()*3,这个结果为0,因为先执行了强制转换 80 | ``` 81 | 82 | 还可以这样写,通过`nextInt()` 指定范围,同时输出一个整型的随机数,**每次执行都是不一样的结果:** 83 | 84 | ```java 85 | Random randNoSeed = new Random(); 86 | for (int i = 0; i < 10; i++) 87 | System.out.print(randNoSeed.nextInt(100)+" "); 88 | ``` 89 | 90 | 91 | 92 | #### 带种子 93 | 94 | Java中生成随机数,也是通过某一种算法实现的,其真正意义上,不是随机数,只是通过一种算法实现的伪随机数。 95 | 96 | 带种子的: 97 | 98 | ```java 99 | Random randSeed = new Random(47); 100 | for (int i = 0; i < 10; i++) 101 | System.out.print(randSeed.nextInt(100) +" "); 102 | ``` 103 | 104 | 105 | 106 | 以上第一次执行都是输出: 107 | 108 | ``` 109 | 58 55 93 61 61 29 68 0 22 7 110 | ``` 111 | 112 | 第二次执行输出: 113 | 114 | ``` 115 | 58 55 93 61 61 29 68 0 22 7 116 | ``` 117 | 118 | 你会发现**每次执行,输出都是同样的一组数字**。 119 | 120 | 所以说随机数也是按照某种算法进行的,只要给一个初始值,同一台机器上每次都是相同的结果。 121 | 122 | > 参考:https://www.liaoxuefeng.com/wiki/1252599548343744/1260473555087392 -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/clipboard-1611561219762.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/clipboard-1611561219762.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/clipboard.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210120160540203.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210120160540203.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210120162055534.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210120162055534.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210120162232346.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210120162232346.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210120162301580.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210120162301580.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210120173256307.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210120173256307.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210121144951658.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210121144951658.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210121150102127.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210121150102127.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210201170821969.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210201170821969.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210201172326048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210201172326048.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/常用类/picture/image-20210201172947437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/常用类/picture/image-20210201172947437.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/泛型.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/泛型.md -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/Deque.md: -------------------------------------------------------------------------------- 1 | ## Deque是什么 2 | 3 | **Java堆栈Stack类已经过时,Java官方推荐使用`Deque`替代Stack使用。** 4 | 5 | Deque是一个**双端队列接口**,继承自Queue接口,Deque的实现类是LinkedList、ArrayDeque、LinkedBlockingDeque,其中LinkedList是最常用的。 6 | 7 | > 双向操作,即Deque会更灵活一点,它两端都可以进出,**集合了Stack和Queue的共同点** 8 | 9 | ```java 10 | Deque deque = new LinkedList(); 11 | ``` 12 | 13 | 14 | 15 | Deque是一个线性collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。 16 | 17 | 大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。 18 | 19 | 此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。 20 | 21 | 每种方法都存在两种形式: 22 | 23 | - 一种形式在操作失败时抛出异常 24 | - 另一种形式返回一个特殊值(null 或 false,具体取决于操作)。 25 | 26 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512103923684.png) 27 | 28 | 举个例子你就明白了: 29 | 30 | ```java 31 | Deque deque = new LinkedList(); 32 | // 以下这两个方法一样,只是通过名字区分 33 | deque.peek(); // 返回特殊值 null 34 | deque.peekFirst(); // 返回特殊值 null 35 | deque.getFirst() //抛出错误 NoSuchElementException 36 | ``` 37 | 38 | 39 | 40 | **下面是Deque的一些API以及 汇集了 队列、栈的替代方法:** 41 | 42 | ### 1、与队列一样的FIFO(先进先出)行为: 43 | 44 | | **Queue方法** | **等效Deque方法** | 45 | | ------------- | ----------------- | 46 | | add add(e) | addLast(e) | 47 | | offer(e) | offerLast(e) | 48 | | remove() | removeFirst() | 49 | | poll() | pollFirst() | 50 | | element() | getFirst() | 51 | | peek() | peekFirst() | 52 | 53 | ### 2、与栈一样的 LIFO(后进先出)行为: 54 | 55 | | **Stack方法** | **等效Deque方法** | 56 | | ------------- | ----------------- | 57 | | push(e) | addFirst(e) | 58 | | pop() | removeFirst() | 59 | | peek() | peekFirst() | 60 | 61 | 62 | 63 | ## 总结: 64 | 65 | 简而言之,这是一个队列、又是一个栈,即保留了栈的操作方法、又保留了队列的方法,但是又引入了自己的方法名(更容易理解,比如 队列的`element()`方法是是什么意思一般很难想起来,但是Deque用了`removeFirst()`这个名字替代,就很显而易见了) -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/Iterator与Collection.md: -------------------------------------------------------------------------------- 1 | > 版本:jdk1.8 2 | 3 | 回顾一下Java集合的关系: 4 | 5 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20210128105508292.png) 6 | 7 | Java的集合都是实现Iterator接口,主要的三个集合是: 8 | 9 | - Map 10 | - List 11 | - Set 12 | 13 | 这三个接口又衍生出很多实现类。 14 | 15 | 这个`Iterator`到底是个啥呢? 16 | 17 | ## Iterator 18 | 19 | 即 `java.util.Iterator` 20 | 21 | 可以看到这个接口只有三个方法: 22 | 23 | ```java 24 | public interface Iterator { 25 |   boolean hasNext(); 26 |   Object next(); 27 |   void remove(); 28 | } 29 | ``` 30 | 31 | 其中: 32 | 33 | ​ `Object next()`:返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型 34 | 35 | ​ `boolean hasNext()`:判断容器内是否还有可供访问的元素 36 | 37 | ​ `void remove()`:删除迭代器刚越过的元素 38 | 39 | 40 | 41 | 常用的就是用来遍历一个集合: 42 | 43 | ```java 44 | //Iterator 迭代器 遍历 45 | Iterator> it = map.entrySet().iterator(); 46 | while (it.hasNext()) { 47 | Map.Entry entry = it.next(); 48 | Integer key = entry.getKey(); 49 | String value = entry.getValue(); 50 | System.out.println(key + " = " + value); 51 | } 52 | ``` 53 | 54 | 55 | 56 | 57 | ## Collection 58 | 59 | ```java 60 | public interface Collection extends Iterable { 61 | 62 | } 63 | ``` 64 | 65 | Collection 接口有 3 种子类型集合: `List`、`Set` 和 `Queue` 66 | 67 | > `Queue`是一个队列,元素先进先出。 68 | 69 | Collection 的API: 70 | 71 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20210128153543008.png) 72 | 73 | Collection 是一个对集合操作的接口,定义了未实现的方法,这也是接口的一种编程思想,只要实现类实现Collection 接口,就必须实现这些方法。 74 | 75 | 这也是集合的共同操作,比如插入insert、删除delete、遍历、清空等等。 -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/Queue.md: -------------------------------------------------------------------------------- 1 | ## Queue介绍 2 | 3 | Queue 是我们常说的队列,队列是一种**先进先出**的数据结构,元素在队列末尾添加,在队列头部删除。 4 | 5 | Queue接口扩展自Collection,并提供插入、提取、检验等操作。 6 | 7 | 8 | 9 | ## Queue 接口的API 10 | 11 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210407113029806.png) 12 | 13 | `add()`、`offer()`表示向队列添加一个元素 14 | 15 | `poll()`与`remove()`方法都是**移除队列头部的元素并返回该元素** 16 | 17 | > 两者的区别在于如果队列为空,那么poll()返回的是null,而remove()会抛出一个NoSuchElementException异常。 18 | 19 | `element()`与`peek()`主要是**获取头部元素,不删除**。 20 | 21 | > 以上6个方法,规律就是 同一个功能有两个方法,区别就是是否抛出异常 22 | 23 | | | 抛出异常 | **返回特殊值** | 24 | | -------- | --------- | -------------- | 25 | | **插入** | add(e) | offer(e) | 26 | | **删除** | remove() | poll() | 27 | | **检查** | element() | peek() | 28 | 29 | 30 | 31 | ## Queue 接口的实现类 32 | 33 | Queue 接口的实现类的实现类比较多。常见的有: 34 | 35 | - LinkedList 36 | - PriorityQueue 37 | - CustomLinkedQueue 38 | - DelayQueue 39 | 40 | LinkedList支持在两端插入和删除元素,因为LinkedList类实现了Deque接口,所以通常我们可以使用LinkedList来创建一个队列。 41 | 42 | > LinkedList底层是双向链表的结构,得益于实现了Deque 43 | 44 | PriorityQueue类实现了一个优先队列,优先队列中元素被赋予优先级,拥有高优先级的先被删除。 45 | 46 | ```java 47 | public class QueueTest { 48 | public static void main(String[] args) { 49 | Queue queue = new LinkedList(); 50 | queue.add("1"); 51 | queue.add("2"); 52 | queue.add("3"); 53 | queue.add("3"); 54 | queue.offer("0"); 55 | while (queue.size()>0){ 56 | System.out.print(queue.remove()+" "); 57 | } 58 | } 59 | } 60 | ``` 61 | 62 | 控制台打印: 63 | 64 | ``` 65 | 1 2 3 3 0 66 | ``` 67 | 68 | 69 | 70 | ## 总结: 71 | 72 | Queue 是一个**先进先出**的数据结构,常见的用法是 73 | 74 | ```java 75 | Queue queue2 = new LinkedList(); 76 | ``` 77 | 78 | 在使用方法时,只有6个API,可以看情况是否需要抛出异常进行选择。 -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/Set.md: -------------------------------------------------------------------------------- 1 | ## Set 介绍 2 | 3 | `Set`是一个 **可为null、不可重复** 的集合。 4 | 5 | 至于 是否有序,要看子类的实现。 6 | 7 | > `List` 是 **有序、可为null、可重复**的集合 8 | 9 | 使用: 10 | 11 | ```java 12 | import java.util.Set; 13 | ``` 14 | 15 | 16 | 17 | ## Set 接口的API 18 | 19 | `Set` 接口的API比List少,但用法基本一致: 20 | 21 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210128095931650.png) 22 | 23 | 24 | 25 | 一般在业务开发中,使用Set的情况比较少。 26 | 27 | 28 | 29 | ## Set接口的实现类 30 | 31 | 常见的实现类有: 32 | 33 | - HashSet 34 | - TreeSet 35 | - LinkedHashSet 36 | 37 | 38 | 39 | ### HashSet 40 | 41 | HashSet是Set接口的典型实现,大多数时候使用Set集合时一般是使用HashSet。 42 | 43 | HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。底层数据结构是**哈希表**。 44 | 45 | ```java 46 | Set set = new HashSet(); 47 | ``` 48 | 49 | HashSet具有以下特点: 50 | 51 | - **不能保证元素的排列顺序**; 52 | - HashSet不是同步的(线程不安全); 53 | - 集合元素值可以是null; 54 | 55 | 56 | 57 | HashSet 和 HashMap 一样,用每个元素的hashCode值来计算其存储位置。 58 | 59 | 60 | 61 | ### LinkedHashSet 62 | 63 | ```java 64 | Set linkedHashSet = new LinkedHashSet(); 65 | ``` 66 | 67 | LinkedHashSet 继承 HashSet ,也是根据元素的hashCode值来决定元素的存储位置。底层数据结构是**链表**。 68 | 69 | 但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的。 70 | 71 | 输出集合里的元素时,元素顺序总是与添加顺序一致,因此LinkedHashSet 是有序的。 72 | 73 | 但是`LinkedHashSet`依然是`HashSet`,因此它**不允许集合重复**。 74 | 75 | 76 | 77 | ### TreeSet 78 | 79 | ```java 80 | Set treeSet = new TreeSet(); 81 | ``` 82 | 83 | TreeSet可以确保集合元素处于排序状态。 84 | 85 | TreeSet内部实现的是**红黑树**,默认整型排序为从小到大。 86 | 87 | 可以通过Comparator接口实现自定义排序。 88 | 89 | -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/Stack.md: -------------------------------------------------------------------------------- 1 | ## Stack介绍 2 | 3 | 栈是`Vector`的一个子类,它实现了一个标准的**后进先出**的栈。 4 | 5 | ```java 6 | public class Stack extends Vector { 7 | ``` 8 | 9 | > 和队列Queue恰好相反,队列是先进先出 10 | 11 | Vector是通过数组实现的,这就意味着,**Stack也是通过数组实现的**,**而非链表**。 12 | 13 | Stack的继承关系: 14 | 15 | ```java 16 | java.lang.Object 17 | ↳ java.util.AbstractCollection 18 | ↳ java.util.AbstractList 19 | ↳ java.util.Vector 20 | ↳ java.util.Stack 21 | ``` 22 | 23 | **Stack和Collection的关系如下图**: 24 | 25 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/1112483-20190706143228825-1406445944.png) 26 | 27 | ## Stack 的API 28 | 29 | | 序号 | 方法描述 | 30 | | :--- | :----------------------------------------------------------- | 31 | | 1 | boolean empty() 测试堆栈是否为空。 | 32 | | 2 | Object peek( ) 查看堆栈顶部的对象,但不从堆栈中移除它。 | 33 | | 3 | Object pop( ) 移除堆栈顶部的对象,并作为此函数的值返回该对象。 | 34 | | 4 | Object push(Object element) 把项压入堆栈顶部。 | 35 | | 5 | int search(Object element) 返回对象在堆栈中的位置,以 1 为基数。 | 36 | 37 | 38 | 39 | 使用例子: 40 | 41 | ```java 42 | public class StackTest { 43 | public static void main(String[] args) { 44 | Stack stack = new Stack<>(); 45 | stack.add("0"); 46 | stack.add("1"); 47 | stack.add("2"); 48 | stack.add("3"); 49 | while (stack.size()>0){ 50 | System.out.print(stack.pop()+" "); 51 | } 52 | } 53 | } 54 | ``` 55 | 56 | 控制台输出: 57 | 58 | ``` 59 | 3 2 1 0 60 | ``` 61 | 62 | 63 | -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210127100352350.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210127100352350.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210128095931650.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210128095931650.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210128105508292.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210128105508292.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210128153543008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210128153543008.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210407113029806.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210407113029806.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210512103607675.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210512103607675.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210512103923684.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210512103923684.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210906232009788.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210906232009788.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210906232124858.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210906232124858.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210906232253171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210906232253171.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/picture/image-20210906232551794.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Java进阶/集合/picture/image-20210906232551794.png -------------------------------------------------------------------------------- /docs/articles/Java进阶/集合/集合类的介绍.md: -------------------------------------------------------------------------------- 1 | Java的集合是一种强大的数据结构,为开发者提供了很方便使用的类。 2 | 3 | 这也使得Java和C语言有了很明确的区别:**Java的轮子很多** 4 | 5 | 6 | 7 | 在日常的开发中,我们可能会遇到需要存储数据的需要,存储数据还必须要进行数据处理,比如排序、去重、交集等等。 8 | 9 | 此前学习的数组可以做到,但是数组并不具有数据处理的优势,因为诞生了集合。 10 | 11 | 例如要存储我的三辆车,五菱宏光、宝马、奥迪信息等等;存储一个班级的学生信息,并通过学号排序、计算平均成绩等等。 12 | 13 | 14 | 15 | ## Java 集合框架 16 | 17 | 在集合诞生之前,还出现了很多类,比如说Dictionary, Vector, Stack, Properties 这些。 18 | 19 | 随着Java的版本迭代,在jdk1.2版本中,新增了Java 集合框架。 20 | 21 | > Java 2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类,比如Vector,Stack,Hashtable等,所以很多的集合都是开箱即用,以下的集合是**必须是要掌握的**。 22 | 23 | 我们常说的Java集合包括: 24 | 25 | - 集合框架(Collection),存储一个元素集合,包括List、Set 、Queue,这三个又衍生出ArrayList、LinkList等等。 26 | 27 | - 图(Map),存储键/值对映射。主要的子类有HashMap、TreeMap等等。 28 | 29 | ![集合框架](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20200918183042733.png) 30 | 31 | 32 | 33 | Java的集合框架是Java的重点,在进行业务开发的时候,能否使用合理的集合快速处理数据,是一个Java程序员的基本功。 34 | 35 | Java的集合类定义在`java.util`包中,我们需要掌握的有 `Map`、`List`、`Set`、`Queue`、`Stack`。 36 | 37 | 接下来将详细展开学习。 -------------------------------------------------------------------------------- /docs/articles/Linux/Centos使用教程.md: -------------------------------------------------------------------------------- 1 | > 本文演示Linux版本:Centos8.8 2 | 3 | ## 1、Centos介绍 4 | 5 | 常见的Linux系统版本: 6 | 7 | | 版本名称 | 网 址 | 特 点 | 软件包管理器 | 8 | | ------------ | ---------------------------------------- | ------------------------------------------------------------ | --------------------------------------------------- | 9 | | Debian Linux | [www.debian.org](http://www.debian.org/) | 开放的开发模式,且易于进行软件包升级 | apt | 10 | | Fedora Core | [www.redhat.com](http://www.redhat.com/) | 优秀带桌面环境的系统,拥有数量庞人的用户,优秀的社区技术支持. 并且有许多创新 | up2date(rpm),yum (rpm) | 11 | | CentOS | [www.centos.org](http://www.centos.org/) | CentOS 是一种对 RHEL(Red Hat Enterprise Linux)源代码再编译的产物,由于 Linux 是开发源代码的操作系统,并不排斥样基于源代码的再分发,CentOS 就是将商业的 Linux 操作系统 RHEL 进行源代码再编译后分发,并在 RHEL 的基础上修正了不少已知的漏洞 | rpm | 12 | | SUSE Linux | [www.suse.com](http://www.suse.com/) | 专业的操作系统,易用的 YaST 软件包管理系统 | YaST(rpm),第三方 apt (rpm)软件库(repository) | 13 | | Ubuntu | [www.ubuntu.com](http://www.ubuntu.com/) | 优秀带桌面环境的系统,基于 Debian 构建,对新款硬件具有极强的兼容能力。 | apt | 14 | 15 | 16 | 17 | 目前市面上用的比较多的是CentOS,个人如果要学习用,建议用Ubuntu,因为是可视化的桌面,操作方便。 18 | 19 | 不同的系统命令有所差异,但是不会很大。 20 | 21 | ## 2、结构 22 | 23 | 随便进入一个目录,键入 `ls` 24 | 25 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img2/image-20210310172319129.png) 26 | 27 | 前面一串东西表示: 28 | 29 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img2/image-20210310173444937.png) 30 | 31 | 文件的颜色表示: 32 | 33 | - 蓝色 表示文件夹; 34 | - 灰色 表示普通文件; 35 | - 绿色 表示可执行文件; 36 | - 红色 表示压缩文件; 37 | - 天蓝色 表示链接文件(快捷方式); 38 | 39 | 常见的目录结构: 40 | 41 | - **bin:** 存放普通用户可执行的指令,普通用户也可以执行; 42 | - **dev :** 设备目录,所有的硬件设备及周边均放置在这个设备目录中; 43 | - **boot :** 开机引导目录,包括 Linux 内核文件与开机所需要的文件; 44 | - **home:** 这里主要存放你的个人数据,具体每个用户的设置文件,用户的桌面文件夹,还有用户的数据都放在这里。每个用户都有自己的用户目录,位置为: `/home/用户名`。当然,root 用户除外; 45 | - **usr:** 应用程序放置目录; 46 | - **lib:** 开机时常用的动态链接库,bin 及 sbin 指令也会调用对应的 lib 库; 47 | - **tmp:** 临时文件存放目录 ; 48 | - **etc:** 各种配置文件目录,大部分配置属性均存放在这里; 49 | 50 | ## 3、常见的命令 51 | 52 | ### 1、目录、文件操作命令 53 | 54 | #### 1、touch 55 | 56 | 创建文件 57 | 58 | ```bash 59 | [root@VM-8-8-centos ~]# touch HaC.txt 60 | ``` 61 | 62 | #### 2、vi、vim 文件编辑命令 63 | 64 | 65 | 66 | vi 只能编辑已存在的文件 67 | ```bash 68 | [root@VM-8-8-centos ~]# vi HaC.txt 69 | ``` 70 | 71 | vim 假如文件不存在会自动创建文件: 72 | 73 | ```bash 74 | [root@VM-8-8-centos ~]# vim HaC.txt 75 | ``` 76 | 77 | 进入文件编辑模式后,按下 `i 键` ,左下角出现 **INSERT** 即可编辑。 78 | 79 | 80 | 81 | 再按 `Esc 键` ,此时编辑模式消失,左下角输入 82 | 83 | `:w` 表示保存 84 | 85 | `:wq` 表示保存并且退出 86 | 87 | `:wq!` 表示强制保存并且退出 88 | 89 | `:q!` 表示不保存,强制退出 90 | 91 | 92 | 93 | 94 | 95 | 常用的命令见下: 96 | 97 | | 作用 | 命令 | 98 | | :------------------------------- | :--------------- | 99 | | 切换目录 | `cd` | 100 | | 显示当前目录完整路径 | `pwd` | 101 | | 查看目录下的信息(包括隐藏文件) | `ls`( `ls -a`) | 102 | | 列出目录下的文件和详细信息 | `ll` | 103 | | 创建目录 | `mkdir` | 104 | | 复制文件(文件夹) | `cp` | 105 | | 移动/重命名文件夹和目录 | `mv` | 106 | | 删除文件(目录) | `rm`( `rm -rf`) | 107 | 108 | 109 | 110 | 111 | 112 | 最后推荐个B站的入门教程:[基于CentOS7的Linux操作系统的入门与服务器的配置](https://www.bilibili.com/video/BV134411G7Jr) 113 | 114 | -------------------------------------------------------------------------------- /docs/articles/Linux/Linux三剑客之seq命令.md: -------------------------------------------------------------------------------- 1 | 待.... -------------------------------------------------------------------------------- /docs/articles/Linux/centos开机流程详解.md: -------------------------------------------------------------------------------- 1 | 一、linux开机流程: 2 | 3 | 4 | 5 | 6 | 7 | BIOS:(Basic Input Output System)基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片 上的程序,保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,可从CMOS中读写系统设置的具体信息。 8 | 9 | MBR:Master Boot Record,主要引导记录区。 10 | 11 | Boot Loader:启动引导程序。 12 | 13 | 14 | 15 | 二、详细流程 16 | 17 | 18 | 19 | 第一步:加载BIOS 20 | 21 | 打开计算机电源,计算机硬件会自动加载BIOS,读取BIOS内相关硬件信息及进行硬件系统的自检,随后根据BIOS配置找到第一个有引导程序的的设备。 22 | 23 | 第二步:读取MBR 24 | 25 | 硬盘上第0磁道第一个扇区被称为MBR,即主引导记录,大小是512字节,存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到物理内存中,被复制到物理内存的内容就是Boot Loader(lilo或者grub)。 26 | 27 | 第三步:启动Boot Loader 28 | 29 | Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。 30 | Boot Loader有若干种,其中Grub、Lilo是常见的Loader。 31 | 本文以Grub为例讲解,grub功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开。 32 | 33 | 系统读取内存中的grub配置信息(一般为menu.lst或grub.conf),并依照此配置信息来加载指定内核。 34 | 35 | 36 | 37 | 第四步:加载内核 38 | 39 | grub把系统控制权移交给内核,内核开始探测可识别到的所有硬件设备及尝试挂载根目录以获取其驱动程序。此时就需要首先加载磁盘驱动程序以便读取磁盘,而磁盘驱动程序又保存在磁盘内,这样就会导致linux无法启动。此时需要通过伪文件系统来解决这一问题。 40 | 41 | 虚拟文件系统 (Initial RAM Disk) 即/boot/initramfs-release.img ,这个文件的特色是,能够通过boot loader 来加载到内存中, 然后这个文件会被解压缩并且在内存当中模拟成一个根目录,且此模拟在内存当中的文件系统能够提供一支可运行的程序,透过该程序来加载启动过程中所最需要的核心模块,通常这些模块就是 U盘, RAID, LVM, SCSI 等文件系统与磁盘的驱动程序。等加载完成后, 会帮助核心重新呼叫 /sbin/init 来开始后续的正常启动流程。 42 | 43 | 注:RamDisk是辅助性文件,并非必须,取决于内核是否能直接驱动根文件系统所在的设备。 44 | 45 | 46 | 47 | 第五步:运行/sbin/init程序,设定linux的运行等级 48 | 49 | 内核加载完毕后,运行用户空间内第一个应用程序就是/sbin/init,然后读取/etc/inttab文件,依据文件配置设定系统运行等级; 50 | 51 | 52 | 53 | 第六步:init进程执行rc.sysinit 54 | 设定了运行等级后,Linux系统执行/etc/rc.d/rc.sysinit系统初始化脚本程序。初始化包括:设置主机名、设置欢迎信息、激活Udex和seliux、挂载/etc/fstab文件中定义的所有文件系统、检测根文件系统、设置系统时钟、根据/etc/sysctl.conf文件来设置内核参数、激活LVM及软RAID设备、激活swap设备、加载额外设备的驱动程序、执行清理操作。 55 | 56 | 第七步:启动内核模块 57 | 58 | 具体是依据/etc/sysconfig/modules文件目录下的文件来装载内核模块。 59 | 60 | 第八步: 执行 run-level 的各个服务启动 (script 方式) 61 | 62 | 根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。 63 | 64 | 65 | 66 | 第九步:执行/etc/rc.d/rc.local 67 | rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。 68 | 69 | 70 | 71 | 第十步:执行/bin/login程序,进入登录状态 72 | Linux 就会启动终端机或者是 X Window 来等待使用者登陆。 73 | 74 | ----------------------------------- 75 | ©著作权归作者所有:来自51CTO博客作者zpgood的原创作品,如需转载,请注明出处,否则将追究法律责任 76 | CentOS开机流程详解 77 | https://blog.51cto.com/zhangpenglinux/1760206 -------------------------------------------------------------------------------- /docs/articles/Linux/picture/Linux20210323-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/Linux20210323-1.gif -------------------------------------------------------------------------------- /docs/articles/Linux/picture/Linux20210323.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/Linux20210323.gif -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210310172243404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210310172243404.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210310172319129.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210310172319129.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210310173444937.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210310173444937.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210310174401469.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210310174401469.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210315111019370.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210315111019370.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210315111106323.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210315111106323.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210315182357675.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210315182357675.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210315182853202.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210315182853202.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210322161236954.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210322161236954.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210323172610829.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210323172610829.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210323205539550.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210323205539550.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210331172314910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210331172314910.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20210414173049472.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20210414173049472.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20211221154853360.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20211221154853360.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20211221163738048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20211221163738048.png -------------------------------------------------------------------------------- /docs/articles/Linux/picture/image-20220414144939532.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Linux/picture/image-20220414144939532.png -------------------------------------------------------------------------------- /docs/articles/Linux/shell编程学习.md: -------------------------------------------------------------------------------- 1 | ## shell编程的一些习惯 2 | 3 | 1. 开头指定使用什么shell,例如:bash,ksh,csh等 4 | 2. 脚本功能描述,使用方法,作者,版本,日期等 5 | 3. 变量名,函数名要有实际意义,函数名以动名词形式,第二个单词首字母要大写。例如:updateConfig() 6 | 4. 缩进统一用4个空格,不用TAB 7 | 8 | 9 | 10 | ## 1、if 11 | 12 | ```bash 13 | if 判断条件 1 ; then 14 | 条件为真的分支代码 15 | elif 判断条件 2 ; then 16 | 条件为真的分支代码 17 | else 18 | 以上条件都为假的分支代码 19 | fi 20 | ``` 21 | 22 | demo: 23 | 24 | ```bash 25 | #!/bin/bash 26 | # 用一个age变量接收输入的行的值 27 | read -p "Please input your age: " age 28 | # ~表示非,表示是否有除了0~9的以外的字符 29 | if [[ $age =~ [^0-9] ]] ;then 30 | echo "please input a int" 31 | exit 10 32 | # 大于 33 | elif [ $age -ge 150 ];then 34 | echo "your age is wrong" 35 | exit 20 36 | # 小于 37 | elif [ $age -gt 18 ];then 38 | echo "good good work,day day up" 39 | else 40 | echo "good good study,day day up" 41 | fi 42 | ``` 43 | 44 | 45 | 46 | exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。 47 | 48 | ## 2、case 49 | 50 | ```bash 51 | case $name in; 52 | PART1) 53 | cmd 54 | ;; 55 | PART2) 56 | cmd 57 | ;; 58 | *) 59 | cmd 60 | ;; 61 | esac 62 | ``` 63 | 64 | 注意,case支持一些通配符: 65 | 66 | ```bash 67 | *: 任意长度任意字符 68 | ?: 任意单个字符 69 | [] :指定范围内的任意单个字符 70 | a|b: a 或b 71 | ``` 72 | 73 | demo: 74 | 75 | ```bash 76 | #判断yes or no 77 | #!/bin/bash 78 | read -p "Please input yes or no: " anw 79 | case $anw in 80 | [yY][eE][sS]|[yY]) 81 | echo yes 82 | ;; 83 | [nN][oO]|[nN]) 84 | echo no 85 | ;; 86 | *) 87 | echo false 88 | ;; 89 | esac 90 | ``` 91 | 92 | ## 3、循环 93 | 94 | ### 3.1 、for 95 | 96 | ```bash 97 | # 语法一 98 | for name in 列表 ;do 99 | 循环体 100 | done 101 | 102 | # 语法二 103 | for (( exp1; exp2; exp3 )) ;do 104 | 循环体 105 | done 106 | ``` 107 | 108 | demo: 109 | 110 | ```bash 111 | #求出(1+2+...+n)的总和 112 | #!/bin/bash 113 | sum=0 114 | read -p "Please input a positive integer: " num 115 | if [[ $num =~ [^0-9] ]] ;then 116 | echo "input error" 117 | elif [[ $num -eq 0 ]] ;then 118 | echo "input error" 119 | else 120 | # 使用sed形成一个数组 121 | # `seq 1 $num` 表示一个1到$num 的连续数组 122 | for i in `seq 1 $num` ;do 123 | # 加减乘除需要这样写,否则是拼接 124 | sum=$[$sum+$i] 125 | done 126 | echo $sum 127 | fi 128 | ``` 129 | 130 | 如果不想用sed,可以这样写: 131 | 132 | ```bash 133 | #求出(1+2+...+n)的总和 134 | #!/bin/bash 135 | sum=0 136 | read -p "Please input a positive integer: " num 137 | if [[ $num =~ [^0-9] ]] ;then 138 | echo "input error" 139 | elif [[ $num -eq 0 ]] ;then 140 | echo "input error" 141 | else 142 | for (( i=0; i<$num; i++ ));do 143 | sum=$[$sum+$i] 144 | done 145 | echo $sum 146 | fi 147 | ``` 148 | 149 | ### 3.2、while 150 | 151 | ```bash 152 | while 循环控制条件 ;do 153 | 循环 154 | done 155 | ``` 156 | 157 | demo: 158 | 159 | ```bash 160 | # 100以内所有正奇数之和 161 | #!/bin/bash 162 | sum=0 163 | i=1 164 | # -le 小于 165 | while [ $i -le 100 ] ;do 166 | # -ne 不等于 167 | if [ $[$i%2] -ne 0 ];then 168 | let sum+=i 169 | let i++ 170 | else 171 | let i++ 172 | fi 173 | done 174 | echo "sum is $sum" 175 | ``` 176 | 177 | 178 | 179 | 循环也支持控制语法: 180 | 181 | - continue 182 | - break 183 | - shift 184 | 185 | 186 | 187 | ## 4、shift 188 | 189 | shift可以用来向左移动位置参数。 190 | 191 | 但是在了解shift命令时,需要知道一些特殊的值: 192 | 193 | ```bash 194 | Shell的名字 $0 195 | 第一个参数 $1 196 | 第二个参数 $2 197 | 第n个参数 $n 198 | 所有参数 $@ 或 $* 199 | 参数个数 $# 200 | 201 | shift默认是 $1 202 | ``` 203 | 204 | 205 | 206 | demo: 207 | 208 | ```bash 209 | #!/bin/bash 210 | while (( $# > 0 )) 211 | do 212 | echo "$*" 213 | shift 214 | done 215 | ``` 216 | 217 | 测试: 218 | 219 | ```bash 220 | [root@VM-8-8-centos ~]# ./shell_shift.sh 9 8 7 6 5 4 3 2 1 221 | 9 8 7 6 5 4 3 2 1 222 | 8 7 6 5 4 3 2 1 223 | 7 6 5 4 3 2 1 224 | 6 5 4 3 2 1 225 | 5 4 3 2 1 226 | 4 3 2 1 227 | 3 2 1 228 | 2 1 229 | 1 230 | ``` 231 | 232 | `$#` 是获取输入的参数个数 233 | 234 | `$*`表示获取整行,然后向左移动位置参数(缩进) 235 | 236 | ## 5、信号 237 | 238 | -------------------------------------------------------------------------------- /docs/articles/Linux/vim快捷键.md: -------------------------------------------------------------------------------- 1 | # 删除复制黏贴 2 | 3 | 在VI命令模式下: 4 | 5 | **y 表示拷贝, d 表示删除,p标识粘贴** 6 | 7 | ## 1、拷贝 8 | 9 | ``` 10 | yw 表示拷贝从当前光标到光标所在单词结尾的内容. 11 | y0 表示拷贝从当前光标到光标所在行首的内容. 12 | y$ 表示拷贝从当前光标到光标所在行尾的内容. 13 | yfa 表示拷贝从当前光标到光标后面的第一个a字符之间的内容. 14 | 15 | yy 表示拷贝光标所在行.8yy 标识拷贝8行:6,10 copy 18 表示从第6行开始的5行(即从第6行到第10行)数据复制到了第18行下面,其中“copy”也可写为“co”或“cop”。---拷贝大量行时使用 16 | ``` 17 | 18 | 19 | 20 | ## 2、删除 21 | 22 | ``` 23 | dw 表示删除从当前光标到光标所在单词结尾的内容. 24 | d0 表示删除从当前光标到光标所在行首的内容. 25 | d$ 表示删除从当前光标到光标所在行尾的内容. 26 | 27 | dd 表示删除光标所在行.6dd 表示删除6行 28 | D 表示删除从当前光标到光标所在行尾的内容.:6,10  delete 表示删除第6行至第10行的数据,其中“delete”可以简写为“d”或“del”等等。---删除大量行时使用 29 | ``` 30 | 31 | ## 3、粘贴 32 | 33 | 删除或者拷贝内容后,直接输入“p”,即可粘贴。 34 | 35 | 如果你要粘贴其他内容,Ctrl+Insert 复制,Shift+Insert 粘贴 即可。 36 | 37 | # 光标 38 | 39 | ``` 40 | h,j,k,l 上,下,左,右 41 | ctrl-e 移动页面 42 | ctrl-f 上翻一页 43 | ctrl-b 下翻一页 44 | ctrl-u 上翻半页 45 | ctrl-d 下翻半页 46 | w 跳到下一个字首,按标点或单词分割 47 | W 跳到下一个字首,长跳,如end-of-line被认为是一个字 48 | e 跳到下一个字尾 49 | E 跳到下一个字尾,长跳 50 | b 跳到上一个字 51 | B 跳到上一个字,长跳 52 | 0 跳至行首,不管有无缩进,就是跳到第0个字符 53 | ^ 跳至行首的第一个字符 54 | $ 跳至行尾 55 | gg 跳至文首 56 | G 调至文尾 57 | 5gg/5G 调至第5行 58 | gd 跳至当前光标所在的变量的声明处 59 | fx 在当前行中找x字符,找到了就跳转至 60 | ; 重复上一个f命令,而不用重复的输入fx 61 | * 查找光标所在处的单词,向下查找 62 | # 查找光标所在处的单词,向上查找 63 | ``` 64 | 65 | 66 | 67 | ## 内容 68 | 69 | ``` 70 | dG 清空文件所有内容(需要先使用 gg 先回到第一行) 71 | 撤销:u 72 | 恢复撤销:Ctrl + r 73 | ``` 74 | 75 | -------------------------------------------------------------------------------- /docs/articles/Linux/八个能提升效率的Linux快捷键.md: -------------------------------------------------------------------------------- 1 | Linux命令相信大家都会,特别是一些基础的命令,比如ls、cd、cat、vi 等等。 2 | 3 | 在和Linux打交道久了之后,你会发现来来去去都是那几个常用的命令。 4 | 5 | 命令虽然用的熟练,但是还不够,Linux还提供了一些快捷键,可以快速提升操作Linux的效率。 6 | 7 | 8 | 9 | ## 1、tap 10 | 11 | 文件、路径 补全。 12 | 13 | tab键是比较常用的一个快捷键,它的作用是**补全文件名或者路径**。 14 | 15 | 只需要输入一个命令,文件名,目录名甚至是命令选项的开头,并敲击 `tab` 键。 它将自动完成你输入的内容,或为你显示全部可能的结果。 16 | 17 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210315111106323.png) 18 | 19 | ## 2、Ctrl+l 20 | 21 | 清屏。 22 | 23 | 在不知道这个快捷键的时候之前,我猜大家都是使用`clear` 命令清屏的。 24 | 25 | 现在你可以使用 `Ctrl+L` 清空终端,代替输入 `clear` 26 | 27 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210315111019370.png) 28 | 29 | ## 3、Ctrl + C 30 | 31 | 终止进程。 32 | 33 | 为了在终端上中断命令或进程该按的键。它将立刻终止运行的程序。 34 | 35 | 比如说你在安装、编译 、运行 某个程序,只要你使用`Ctrl + C`,都会立即结束你的程序。 36 | 37 | ## 4、Ctrl+Z 38 | 39 | 将正在运行的程序放到后台执行。 40 | 41 | `Ctrl + C` 会结束进程,如果你不想一直等待进程执行完毕,可以使用`Ctrl+Z`,它会把进程送到后台执行。 42 | 43 | 44 | 45 | ## 5、Ctrl+A / Ctrl+E 46 | 47 | 移动光标到所在行首/尾。 48 | 49 | 假设你在终端输入了一个很长的命令或路径,如: 50 | ```bash 51 | [root@VM-8-8-centos ~]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 52 | ``` 53 | 54 | 但你想要回到它的 **开头或者结尾**, 使用方向键移动光标将花费大量时间,此时 `Ctrl+A`、 `Ctrl+E` 将很方便。 55 | > 注意:Linux终端不支持使用鼠标移动光标到行首。 56 | 57 | 58 | 59 | ## 6、擦除 60 | 61 | 有时候在终端输入了错误的命令,又不想整条命令删除,或者只想删除一部分命令的时候,擦除就很方便了。 62 | 63 | ### Ctrl + U 64 | 65 | 擦除从当前光标位置到**行首**的全部内容。 66 | 67 | ### Ctrl + K 68 | 69 | 擦除从当前光标位置到**行尾**的全部内容。 70 | 71 | ### Ctrl + W 72 | 73 | 擦除从光标位置到**词首**的全部字母。 74 | 75 | > 简单的说就是擦除一个单词。Linux以空格判断一个单词。 76 | 77 | ### Ctrl + Y 78 | 79 | 粘贴 使用 `Ctrl+W`、`Ctrl+U` 和 `Ctrl+K` 快捷键擦除的文本。 80 | 81 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/Linux20210323.gif) 82 | 83 | ## 7、历史命令 84 | 85 | ### Ctrl + P、方向键上 86 | 87 | 历史命令上翻。 88 | 89 | ### Ctrl + N、方向键下 90 | 91 | 历史命令下翻。 92 | 93 | ### Ctrl + R 94 | 95 | 查找历史命令。 96 | 97 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/Linux20210323-1.gif) 98 | 99 | ## 8、复制、粘贴 100 | 101 | Linux不使`用Ctrl+c`、`Ctrl+v` 复制、粘贴,Linux使用的是: 102 | 103 | 复制:`ctrl+insert` 104 | 105 | 粘贴:`shift+insert` 106 | 107 | 目前大部分终端工具都是选中就自动复制,鼠标右击就自动粘贴,像MobaXterm、SecurityCRT 是支持的。 108 | 109 | --- 110 | 111 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210323172610829.png) 112 | 113 | 目前我用的是MobaXterm,MobaXterm是支持选中自动复制,右键自动粘贴。 114 | 115 | 安利一波:[一款好用的终端工具—MobaXterm](https://mp.weixin.qq.com/s/Z3cYlTLLN4cO-FzoTL0pSw) 116 | 117 | -------------------------------------------------------------------------------- /docs/articles/MQ/Kafka的入门.md: -------------------------------------------------------------------------------- 1 | https://www.cnblogs.com/sujing/p/10960832.html 2 | 3 | 4 | 5 | https://blog.csdn.net/suifeng3051/article/details/48053965 -------------------------------------------------------------------------------- /docs/articles/MQ/picture/image-20210416141022742.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/MQ/picture/image-20210416141022742.png -------------------------------------------------------------------------------- /docs/articles/MQ/picture/image-20210416155825505.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/MQ/picture/image-20210416155825505.png -------------------------------------------------------------------------------- /docs/articles/MQ/picture/image-20210416165208028.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/MQ/picture/image-20210416165208028.png -------------------------------------------------------------------------------- /docs/articles/MQ/picture/image-20210930103755270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/MQ/picture/image-20210930103755270.png -------------------------------------------------------------------------------- /docs/articles/MQ/picture/image-20211012091010457.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/MQ/picture/image-20211012091010457.png -------------------------------------------------------------------------------- /docs/articles/Maven/Maven的高级使用.md: -------------------------------------------------------------------------------- 1 | https://yuzhouwan.com/posts/2254/ -------------------------------------------------------------------------------- /docs/articles/Maven/picture/image-2022-03-09-1646811043.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Maven/picture/image-2022-03-09-1646811043.png -------------------------------------------------------------------------------- /docs/articles/Maven/picture/image-2022-03-09-1646817991.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Maven/picture/image-2022-03-09-1646817991.png -------------------------------------------------------------------------------- /docs/articles/Maven/picture/image-20220309150339060.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Maven/picture/image-20220309150339060.png -------------------------------------------------------------------------------- /docs/articles/Maven/使用新版Maven-mvnd.md: -------------------------------------------------------------------------------- 1 | Maven、gradle 作为主流的构建工具,几乎所有的Java项目都使用,但是Maven相对gradle来说,构建还是太慢了。特别是构建十几个子项目的程序。 2 | 3 | 如果要把项目从Maven转换成gradle,成本也是巨大的。 4 | 5 | 但是现在有了 maven-mvnd ,可以使构建变得更快。 6 | 7 | ## 1、maven-mvnd介绍 8 | 9 | `maven-mvnd`是`Apache Maven团队`借鉴了`Gradle`和`Takari`的优点,衍生出来的更快的构建工具,是maven的`强化版`。 10 | 11 | github地址:[https://github.com/apache/maven-mvnd](https://github.com/apache/maven-mvnd) 12 | 13 | maven-mvnd 特性: 14 | 15 | - 嵌入 Maven (所以不需要单独安装 Maven);`maven 过渡到 maven-mvnd`的过程中实现 `无缝切换`!所以不需要再安装maven或进行复杂的配置更改。 16 | - 实际的构建发生在一个长期存在的后台进程中,也就是守护进程。如果没有为构建请求服务的空闲守护进程,则可以并行产生多个守护进程。 17 | - 一个守护进程实例可以处理来自 mvnd 客户机的多个连续请求。 18 | - 使用 GraalVM 构建的本地可执行文件。与传统的 JVM 相比,它启动更快,使用的内存更少。 19 | 20 | 这种架构带来的优势有: 21 | 22 | - 运行实际构建的 JVM 不需要为每个构建重新启动,节省时间。 23 | 24 | - JVM 中的实时(JIT)编译器生成的本机代码也保留了下来。与 Maven 相比,JIT 编译花费的时间更少。在重复构建过程中,JIT 优化的代码可以立即使用。这不仅适用于来自 Maven 插件和 Maven Core 的代码,也适用于来自 JDK 本身的所有代码。 25 | 26 | 27 | 28 | ## 2、使用步骤 29 | 30 | ### 2.1、下载 31 | 32 | 下载:[https://github.com/mvndaemon/mvnd/releases](https://github.com/mvndaemon/mvnd/releases) 33 | 34 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20220309150339060.png) 35 | 36 | 我这里是windows,下载 `mvnd-0.7.1-windows-amd64.zip` 版本即可。 37 | 38 | ### 2.2、安装 39 | 40 | 直接解压。 41 | 42 | 然后配置环境变量:将 bin 目录添加到 PATH 43 | 44 | ### 2.3、测试 45 | 46 | 打开CMD终端,输入 `mvnd -v` 47 | 48 | 可以看到如下信息表示安装成功: 49 | 50 | ```shell 51 | C:\Users\HaC> mvnd -v 52 | mvnd native client 0.7.1-windows-amd64 (97c587c11383a67b5bd0ff8388bd94c694b91c1e) 53 | Terminal: org.jline.terminal.impl.jansi.win.JansiWinSysTerminal 54 | Apache Maven 3.8.3 (ff8e977a158738155dc465c6a97ffaf31982d739) 55 | Maven home: E:\apache-mvnd-0.7.1-windows-amd64\mvn 56 | Java version: 1.8.0_131, vendor: Oracle Corporation, runtime: E:\JDK1.8\jre 57 | Default locale: zh_CN, platform encoding: GBK 58 | OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" 59 | ``` 60 | 61 | 可以看到 mvnd 集成了 Maven 3.8.3 版本。 62 | 63 | ### 2.4、使用 64 | 65 | 在使用上和Maven一样,参数也一致。 66 | 67 | Maven 使用 `mvn clean package` ;使用Maven-mvnd 只需要变成 `mvnd clean package` 即可,其他同理。 68 | 69 | ### 2.5、配置修改 70 | 71 | 为了最小程度的兼容原来的Maven,可以使用原来的 `setting.xml` 72 | 73 | 打开 Maven-mvnd 安装目录下 的 `/conf/mvnd.properties` 文件,修改: 74 | 75 | ```properties 76 | maven.settings=E://apache-maven-3.5.4-bin//apache-maven-3.5.4//conf//settings.xml 77 | ``` 78 | 79 | (注意是 `//`) 80 | 81 | ## 3、打包对比 82 | 83 | 由于 mvnd-0.7.1 版本使用了Maven 3.8.3版本,我这里同样使用Maven 3.8.3进行对比。 84 | 85 | 命令: 86 | 87 | ```shell 88 | # maven 打包命令 89 | mvn clean package -Dmaven.test.skip=true 90 | # mvnd 打包命令 91 | mvnd clean package -Dmaven.test.skip=true 92 | ``` 93 | 94 | 电脑配置: 95 | 96 | CPU:Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz 3.60 GHz 97 | 98 | 内存:16GB 99 | 100 | 结果如下: 101 | 102 | - 13个子项目 103 | 104 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-2022-03-09-1646811043.png) 105 | 106 | 可以看到 **mvnd 打包的总时间比 mvn 快了不少**,因为 mvnd 使用了CPU的多核心,可以看到每个子模块打包的时间都差不多,所以在单核的机器,就不要尝试使用 mvnd 了。 107 | 108 | - 19个子项目 109 | 110 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-2022-03-09-1646817991.png) 111 | 112 | 呈现子项目越多,相对速度更快的趋势。 113 | 114 | 115 | 116 | 总的来说,如果项目模块很多,可以尝试使用 mvnd 进行辅助打包,比如 测试、生产,可以节省很多时间; 117 | 118 | 开发则可以继续使用 mvn ,毕竟 IDEA 无法集成 mvnd。 119 | 120 | -------------------------------------------------------------------------------- /docs/articles/Nginx/Nginx核心原理.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/Nginx核心原理.md -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210429101548741.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210429101548741.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210429101604508.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210429101604508.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512170525988.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512170525988.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512170646794.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512170646794.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512171043631.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512171043631.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512173151815.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512173151815.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512173244062.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512173244062.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512173300494.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512173300494.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512173409606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512173409606.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210512173450424.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210512173450424.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210518164046719.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210518164046719.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210518164206239.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210518164206239.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210518164842720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210518164842720.png -------------------------------------------------------------------------------- /docs/articles/Nginx/picture/image-20210518165524708.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Nginx/picture/image-20210518165524708.png -------------------------------------------------------------------------------- /docs/articles/Nginx/推荐一款Nginx可视化操作工具.md: -------------------------------------------------------------------------------- 1 | 有时候发现 Nginx 在修改的时候十分麻烦,对我这种使用vim不习惯的菜鸟来说,每次都是把conf文件复制到本地,修改完成后再上传上去,十分耗费时间。 2 | 3 | 4 | 5 | 闲逛GitHub的时候竟然发现了一个好东西 6 | 7 | [https://github.com/onlyGuo/nginx-gui](https://github.com/onlyGuo/nginx-gui) 8 | 9 | 这是个可视化Nginx管理面板,先试用一波。 10 | 11 | 12 | 13 | ## 1、nginx-gui 14 | 15 | 看了一下,GitHub上面作者很久没有维护了,作者说他正在996..... 16 | 17 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512170525988.png) 18 | 19 | 20 | 21 | 这是个springbooot项目: 22 | 23 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512170646794.png) 24 | 25 | 26 | 27 | ## 2、部署 28 | 29 | 先把包下载下来,选择下载版本。 30 | 31 | 下载地址:[https://github.com/onlyGuo/nginx-gui/releases](https://github.com/onlyGuo/nginx-gui/releases) 32 | 33 | 我这里是部署在Linux上,所以选择的是第一个: 34 | 35 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512171043631.png) 36 | 37 | 38 | 39 | 上传到服务器的某个目录 40 | 41 | **解压:** 42 | 43 | ```bash 44 | unzip Nginx-GUI-For-Linux_X64_v1.6 .zip 45 | ``` 46 | 47 | **修改配置文件:** 48 | 49 | ```bash 50 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# vi conf/conf.properties 51 | ``` 52 | 53 | **修改你的Nginx配置路径和配置路径:** 54 | 55 | ```properties 56 | nginx.path = /usr/local/nginx 57 | nginx.config = /usr/local/nginx/conf/nginx.conf 58 | account.admin = admin 59 | 60 | ``` 61 | 62 | 默认账户/密码都是 `admin` 63 | 64 | **赋予执行权限:** 65 | 66 | ```bash 67 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# ls 68 | bin data lib shutdown.bat startup.bat 69 | conf include logs shutdown.sh startup.sh 70 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# chmod 777 startup.sh shutdown.sh 71 | ``` 72 | 73 | **启动:** 74 | 75 | ```bash 76 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# ./startup.sh 77 | . 78 | Nginx GUI Service Running ... 79 | ./startup.sh: line 18: /var/www/web/Nginx-GUI-For-Linux_X64_v1.6/lib/bin/java_vms_nginx_gui: Permission denied 80 | Nginx GUI Service Shutdown ! 81 | 82 | ``` 83 | 84 | 看了一下报错 `/var/www/web/Nginx-GUI-For-Linux_X64_v1.6/lib/bin/java_vms_nginx_gui: Permission denied` 85 | 86 | 这个文件权限不够,赋权: 87 | 88 | ```bash 89 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# chmod 777 /var/www/web/Nginx-GUI-For-Linux_X64_v1.6/lib/bin/java_vms_nginx_gui 90 | [root@VM-8-8-centos Nginx-GUI-For-Linux_X64_v1.6]# ./startup.sh 91 | . 92 | Nginx GUI Service Running ... 93 | _ _ _ _____ _ _ _____ 94 | | \ | | (_) / ____| | | | | |_ _| 95 | | \| | __ _ _ _ __ __ __ | | __ | | | | | | 96 | | . ` | / _` | | | | '_ \ \ \/ / | | |_ | | | | | | | 97 | | |\ | | (_| | | | | | | | > < | |__| | | |__| | _| |_ 98 | |_| \_| \__, | |_| |_| |_| /_/\_\ \_____| \____/ |_____| 99 | __/ | 100 | |___/ 101 | 102 | ``` 103 | 104 | 再启动就可以了。 105 | 106 | 107 | 108 | ## 3、访问 109 | 110 | 默认端口是 `8889` ,云服务器记得开放防火墙。 111 | 112 | 访问即可: 113 | 114 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512173151815.png) 115 | 116 | 117 | 118 | 首页: 119 | 120 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512173244062.png) 121 | 122 | 配置: 123 | 124 | 这里会读取你的配置,而且支持在线修改,热加载模式,这个功能十分好用。 125 | 126 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512173409606.png) 127 | 128 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210512173450424.png) 129 | 130 | 还有其他一些功能,比如说监听、规则管理、负载均衡设置等等,但是看了一下有bug,不过我只需要在线修改 `nginx.conf` 就可以了。 131 | 132 | 总的来说,这个工具值得试一下。 -------------------------------------------------------------------------------- /docs/articles/Redis/Redis之缓存击穿、穿透、雪崩.md: -------------------------------------------------------------------------------- 1 | > 数据获取的流程,一般是前端请求,后台先从缓存中取数据,缓存取不到则去数据库中取,数据库取到了则返回给前端,然后更新缓存,如果数据库取不到则返回空数据给前端 2 | 3 | 流程图: 4 | 5 | ![ ](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20200608113313177.png) 6 | 7 | 8 | 9 | 假如缓存的数据没有,后台则会一直请求数据库,对数据库造成压力,如果是请求量大或者恶意请求则会导致数据库崩溃,我们一般称为缓存穿透、缓存击穿、缓存雪崩。 10 | 11 | ## 1、缓存穿透 12 | 13 | 描述:缓存穿透是指**缓存和数据库中都没有的数据**,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大(不存在的数据)。这时的用户很可能是攻击者,攻击会导致数据库压力过大。 14 | 15 | ![缓存穿透](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20201028233114175.png) 16 | 17 | 解决: 18 | 19 | 1. 接口层增加校验,如用户鉴权校验,id做基础校验,比如 id<=0的直接拦截; 20 | 2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,直接返回空值。缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。 21 | 3. 利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试。 22 | 4. 异步更新。直接返回一个空值,然后启动一个线程去数据库读数据,更新缓存,比如项目启动前先加载缓存。 23 | 5. **最常见**的则是采用**布隆过滤器**,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。 24 | 25 | ## 2、缓存击穿 26 | 27 | 描述: 缓存击穿是指**缓存中没有但数据库中有的数据**,当一个key非常热点(类似于爆款),在不停的扛着大并发,大并发集中对这一个点进行访问;当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。 28 | 29 | ![缓存击穿](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20201028233133015.png) 30 | 31 | 解决: 32 | 33 | 1. 设置热点数据永远不过期。 34 | 35 | 2. 加互斥锁。 36 | 37 | 如图: 38 | 39 | ![ ](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/20180919143214879.png) 40 | 41 | 如果缓存中有数据,则直接返回,如果没有,则第一个进入的线程先去查询数据库,并加上锁,其他线程则等待,这样就能防止去数据库查重复数据、重复更新缓存了。 42 | 43 | ## 3、缓存雪崩 44 | 45 | 缓存雪崩是指**缓存中数据大批量到过期时间**,大批量数据同一时间过期,导致请求量全部请求到数据库,造成数据库宕机。 46 | 47 | ![缓存雪崩](https://images-1253198264.cos.ap-guangzhou.myqcloud.com/image-20201028233209257.png) 48 | 49 | 解决: 50 | 51 | 1. 给缓存失效时间,加上一个随机值,避免大量缓存集体失效。 52 | 2. 双缓存:缓存A和B,比如A的失效时间是20分钟,B不失效。比如从A中没读到,就去B中读,然后异步起一个线程同步到A。 53 | 54 | 55 | 56 | 关于互斥锁,可以看看下面这个例子: 57 | 58 | 1. **Redis** 59 | 60 | 如果是使用Redis,可以使用Redis的`SETNX`,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。 61 | 62 | ```java 63 | public String get(key) { 64 | String value = redis.get(key); 65 | if (value == null) { //代表缓存值过期 66 | //设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load db 67 | if (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功 68 | value = db.get(key); 69 | redis.set(key, value, expire_secs); 70 | redis.del(key_mutex); 71 | } else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可 72 | sleep(50); 73 | get(key); //重试 74 | } 75 | } else { 76 | return value; 77 | } 78 | } 79 | ``` 80 | 81 | 2. **memcache** 82 | 83 | ```java 84 | if (memcache.get(key) == null) { 85 | // 3 min timeout to avoid mutex holder crash 86 | if (memcache.add(key_mutex, 3 * 60 * 1000) == true) { 87 | value = db.get(key); 88 | memcache.set(key, value); 89 | memcache.delete(key_mutex); 90 | } else { 91 | sleep(50); 92 | retry(); 93 | } 94 | } 95 | ``` 96 | 97 | 98 | 99 | ## 4、缓存预热 100 | 101 | 缓存预热就是系统上线后,后者系统在重启的时候,将相关的缓存数据直接加载到Redis。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据。 102 | 103 | 104 | 105 | 解决: 106 | 107 | 1. 上线时加个接口,手动触发加载缓存,或者定时刷新缓存。 108 | 2. 数据量不大,可以在项目启动的时候自动进行加载。 109 | 110 | ​ 111 | 112 | --- 113 | 114 | 115 | 116 | 参考: 117 | 118 | - https://www.iteye.com/blog/carlosfu-2269687 119 | 120 | - https://mp.weixin.qq.com/s/LOCLXG_mzBVQeFrtM8srmA 121 | 122 | 123 | 124 | **求点赞👍** **求关注❤️** **求分享💬** -------------------------------------------------------------------------------- /docs/articles/Redis/Redis分布式事务锁.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/Redis分布式事务锁.vsdx -------------------------------------------------------------------------------- /docs/articles/Redis/Redis的使用规范有哪些?.md: -------------------------------------------------------------------------------- 1 | ## 使用规范 2 | 3 | #### 冷热数据区分 4 | 5 | 虽然 Redis支持持久化,但将所有数据存储在 Redis 中,成本非常昂贵。建议将热数据 (如 QPS超过 5k) 的数据加载到 Redis 中。低频数据可存储在 Mysql、 ElasticSearch中。 6 | 7 | #### 业务数据分离 8 | 9 | 不要将不相关的数据业务都放到一个 Redis中。一方面避免业务相互影响,另一方面避免单实例膨胀,并能在故障时降低影响面,快速恢复。 10 | 11 | #### 消息大小限制 12 | 13 | 由于 Redis 是单线程服务,消息过大会阻塞并拖慢其他操作。保持消息内容在 1KB 以下是个好的习惯。严禁超过 50KB 的单条记录。消息过大还会引起网络带宽的高占用,持久化到磁盘时的 IO 问题。 14 | 15 | #### 连接数限制 16 | 17 | 连接的频繁创建和销毁,会浪费大量的系统资源,极限情况会造成宿主机当机。请确保使用了正确的 Redis 客户端连接池配置。 18 | 19 | #### 缓存 Key 设置失效时间 20 | 21 | 作为缓存使用的 Key,必须要设置失效时间。失效时间并不是越长越好,请根据业务性质进行设置。注意,失效时间的单位有的是秒,有的是毫秒,这个很多同学不注意容易搞错。 22 | 23 | #### 缓存不能有中间态 24 | 25 | 缓存应该仅作缓存用,去掉后业务逻辑不应发生改变,万不可切入到业务里。 26 | 27 | - 缓存的高可用会影响业务; 28 | - 产生深耦合会发生无法预料的效果; 29 | - 会对维护行产生肤效果。 30 | 31 | #### 扩展方式首选客户端 hash 32 | 33 | 如果应用太小就别考虑了,如单 redis 集群并不能为你的数据服务,不要着急扩大你的 redis 集群(包括 M/S 和 Cluster),集群越大,在状态同步和持久化方面的性能越差。优先使用客户端 hash 进行集群拆分。如:根据用户 id 分 10 个集群,用户尾号为 0 的落在第一个集群。 34 | 35 | ## 操作限制 36 | 37 | #### 严禁使用 Keys 38 | 39 | Keys 命令效率极低,属于 O(N)操作,会阻塞其他正常命令,在 cluster 上,会是灾难性的操作。严禁使用,DBA 应该 rename 此命令,从根源禁用。 40 | 41 | #### 严禁使用 Flush 42 | 43 | flush 命令会清空所有数据,属于高危操作。严禁使用,DBA 应该 rename 此命令,从根源禁用,仅 DBA 可操作。 44 | 45 | #### 严禁作为消息队列使用 46 | 47 | 如没有非常特殊的需求,严禁将 Redis 当作消息队列使用。Redis 当作消息队列使用,会有容量、网络、效率、功能方面的多种问题。如需要消息队列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。 48 | 49 | #### 严禁不设置范围的批量操作 50 | 51 | redis 那么快,慢查询除了网络延迟,就属于这些批量操作函数。大多数线上问题都是由于这些函数引起。 52 | 53 | 1、[zset] 严禁对 zset 的不设范围操作 54 | 55 | ZRANGE、 ZRANGEBYSCORE等多个操作 ZSET 的函数,严禁使用 ZRANGE myzset 0 -1 等这种不设置范围的操作。请指定范围,如 ZRANGE myzset 0 100。如不确定长度,可使用 ZCARD 判断长度 56 | 57 | 2、[hash] 严禁对大数据量 Key 使用 HGETALL 58 | 59 | HGETALL会取出相关 HASH 的所有数据,如果数据条数过大,同样会引起阻塞,请确保业务可控。如不确定长度,可使用 HLEN 先判断长度 60 | 61 | 3、[key] Redis Cluster 集群的 mget 操作 62 | 63 | Redis Cluster 的 MGET 操作,会到各分片取数据聚合,相比传统的 M/S架构,性能会下降很多,请提前压测和评估 64 | 65 | 4、[其他] 严禁使用 sunion, sinter, sdiff等一些聚合操作 66 | 67 | #### 禁用 select 函数 68 | 69 | select函数用来切换 database,对于使用方来说,这是很容易发生问题的地方,cluster 模式也不支持多个 database,且没有任何收益,禁用。 70 | 71 | #### 禁用事务 72 | 73 | redis 本身已经很快了,如无大的必要,建议捕获异常进行回滚,不要使用事务函数,很少有人这么干。 74 | 75 | #### 禁用 lua 脚本扩展 76 | 77 | lua 脚本虽然能做很多看起来很 cool 的事情,但它就像是 SQL 的存储过程,会引入性能和一些难以维护的问题,禁用。 78 | 79 | #### 禁止长时间 monitor 80 | 81 | monitor函数可以快速看到当前 redis 正在执行的数据流,但是当心,高峰期长时间阻塞在 monitor 命令上,会严重影响 redis 的性能。此命令不禁止使用,但使用一定要特别特别注意。 82 | 83 | ## 3、 规范 84 | 85 | ### 1、key命名规范 86 | 87 | Redis 的 Key 一定要规范,这样在遇到问题时,能够进行方便的定位。Redis 属于无 scheme 的 KV 数据库,所以,我们靠约定来建立其 scheme 语义。其好处: 88 | 89 | 1、能够根据某类 key 进行数据清理 90 | 91 | 2、能够根据某类 key 进行数据更新 92 | 93 | 3、能够方面了解到某类 key 的归属方和应用场景 94 | 95 | 4、为统一化、平台化做准备,减少技术变更 96 | 97 | 一般,一个 key 需要带以下维度:业务、key 用途、变量等,各个维度使用 `:` 进行分隔,以下是几个 key 的实例: 98 | 99 | > user:sex 用户的性别 100 | > 101 | > user:10002232:msg:achi 用户发言数量排行榜 102 | 103 | ### 2、善用hash 104 | 105 | 比如说你要存放一个用户的属性,可能会: 106 | 107 | ```shell 108 | foo:first_name 109 | foo:last_name 110 | foo:address 111 | ``` 112 | 113 | 其实可以使用一个对象存放,比如说hashSet,使用一个key就可以了 114 | 115 | ```shell 116 | 127.0.0.1:6379> HSET foo first_name "Joe" 117 | (integer) 1 118 | 127.0.0.1:6379> HSET foo last_name "Engel" 119 | (integer) 1 120 | 127.0.0.1:6379> HSET foo address "1 Fanatical Pl" 121 | (integer) 1 122 | 127.0.0.1:6379> HGETALL foo 123 | 1) "first_name" 124 | 2) "Joe" 125 | 3) "last_name" 126 | 4) "Engel" 127 | 5) "address" 128 | 6) "1 Fanatical Pl" 129 | 127.0.0.1:6379> HGET foo first_name 130 | "Joe" 131 | ``` -------------------------------------------------------------------------------- /docs/articles/Redis/Redis的删除策略和内存淘汰机制.md: -------------------------------------------------------------------------------- 1 | Redis的key可以设置过期时间,那是否意味着时间一到就会马上被删除呢? 2 | 3 | Redis的数据存储大小是有限的,假如内存不足Redis有什么应对策略呢? 4 | 5 | 本篇文章将介绍一下Redis的过期策略和内存淘汰机制。 6 | 7 | ## 1、redis的过期策略 8 | 9 | redis的key过期删除策略有以下三种: 10 | 11 | #### 1.定时删除 12 | 13 | 在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 14 | **优点:** 15 | 保证内存被尽快释放 16 | **缺点:** 17 | 1)若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key。 18 | 2)定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重 19 | 20 | #### 2.惰性删除 21 | 22 | key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。 23 | **优点:** 24 | 删除操作只发生在从数据库取出key的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的,而且此时的删除是已经到了非做不可的地步. 25 | **缺点:** 26 | 若大量的key在超出超时时间后,很久一段时间内,都没有被获取过,那么可能发生内存泄露(无用的垃圾占用了大量的内存) 27 | 28 | #### 3.定期删除 29 | 30 | 如果当前库中没有一个key设置了过期时间,直接执行下一个库的遍历,随机获取一个设置了过期时间的key,检查该key是否过期,如果过期,删除key,判断定期删除操作是否已经达到指定时长,若已经达到,直接退出定期删除。(默认每个库检测20个key) 31 | **优点:** 32 | 1)通过限制删除操作的时长和频率,来减少删除操作对CPU时间的占用--处理"定时删除"的缺点 33 | 2)定期删除过期key--处理"惰性删除"的缺点 34 | **缺点:** 35 | 1)在内存友好方面,不如"定时删除" 36 | 2)在CPU时间友好方面,不如"惰性删除" 37 | 38 | Redis采用的删除策略是:**定期删除+惰性删除** ,这种方法是十分高效。 39 | 40 | 41 | 42 | ## 2、内存淘汰机制 43 | 44 | Redis有过期策略,假如你的Redis只能存1G的数据,你一个请求写入2G,而你也没有及时请求key,那么惰性删除就不生效了,Redis占用内存就会越来越高。 45 | 46 | Redis可以设置内存大小: 47 | 48 | ``` 49 | # maxmemory 50 | # 设置Redis最大占用内存大小为100 51 | maxmemory 100mb 52 | ``` 53 | 54 | 超过了这个内存大小,就会触发**内存淘汰机制** 55 | 56 | 至于为什么一定要设置这个大小,可以看一下官方: 57 | 58 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210325144733549.png) 59 | 60 | > 如果不设置,Redis将消耗掉系统所有的可用内存 61 | 62 | Redis有一个默认 **内存淘汰机制**: 63 | 64 | ``` 65 | # maxmemory-policy noeviction 66 | ``` 67 | 68 | `maxmemory-policy`一共有8个值,当内存不足时: 69 | 70 | 1)noeviction: 不删除,直接返回报错信息。 71 | 2)allkeys-lru:移除最久未使用(使用频率最少)使用的key。**推荐使用这种。** 72 | 3)volatile-lru:在设置了过期时间的key中,移除最久未使用的key。 73 | 4)allkeys-random:随机移除某个key。 74 | 5)volatile-random:在设置了过期时间的key中,随机移除某个key。 75 | 6)volatile-ttl: 在设置了过期时间的key中,移除准备过期的key。 76 | 7)allkeys-lfu:移除最近最少使用的key。 77 | 8)volatile-lfu:在设置了过期时间的key中,移除最近最少使用的key。 78 | 79 | 查看内存淘汰机制: 80 | 81 | ```bash 82 | localhost:0>config get maxmemory-policy 83 | 1) "maxmemory-policy" 84 | 2) "noeviction" 85 | ``` 86 | 87 | >LRU和LFU的区别: 88 | > 89 | >LRU是最近最少使用页面置换算法(Least Recently Used),也就是首先淘汰最长时间未被使用的页面! 90 | > 91 | >这个主要针对的是使用时间 92 | > 93 | >比如有数据 1,1,1,2,2,3 94 | >此时缓存中已有(1,2) 95 | >当3加入的时候,得把前面的1淘汰,变成(3,2) 96 | > 97 | > 98 | > 99 | >LFU是最近最不常用页面置换算法(Least Frequently Used),也就是淘汰一定时期内被访问次数最少的页! 100 | > 101 | >这个主要针对的是使用频率 102 | > 103 | >比如有数据 1,1,1,2,2,3 104 | >缓存中有(1(3次),2(2次)) 105 | >当3加入的时候,得把后面的2淘汰,变成(1(3次),3(1次)) 106 | 107 | 108 | 109 | **引申:** 110 | 111 | 假如我的key没有设置expire,即没有设置过期时间。那么 volatile-lru、volatile-random、volatile-ttl 就无法执行了,和 noeviction 就一样了。 112 | 113 | -------------------------------------------------------------------------------- /docs/articles/Redis/picture/20180919143214879.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/20180919143214879.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20200608113313177.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20200608113313177.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201019180304613.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201019180304613.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201019180406853.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201019180406853.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201019180436917.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201019180436917.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201019180647650.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201019180647650.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020143140251.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020143140251.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020174334487.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020174334487.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020174358161.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020174358161.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020174428480.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020174428480.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020174536968.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020174536968.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175113982.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175113982.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175141910.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175141910.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175235437.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175235437.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175254479.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175254479.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175418983.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175418983.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175636010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175636010.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020175927806.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020175927806.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020180003725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020180003725.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020180107177.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020180107177.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201020180120705.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201020180120705.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201027154237836.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201027154237836.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201027155614967.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201027155614967.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201027170452172.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201027170452172.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201028231527081.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201028231527081.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201028233114175.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201028233114175.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201028233133015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201028233133015.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20201028233209257.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20201028233209257.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222101300888.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222101300888.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222103537364.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222103537364.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222125022614.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222125022614.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222125222306.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222125222306.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222141751272.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222141751272.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222142550808.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222142550808.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/image-20210222144222171.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/image-20210222144222171.png -------------------------------------------------------------------------------- /docs/articles/Redis/picture/redis-desk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/picture/redis-desk.png -------------------------------------------------------------------------------- /docs/articles/Redis/缓存穿透、击穿、雪崩.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/Redis/缓存穿透、击穿、雪崩.vsdx -------------------------------------------------------------------------------- /docs/articles/其他/GitHub超详细的编程学习路线.md: -------------------------------------------------------------------------------- 1 | github地址:https://github.com/kamranahmedse/developer-roadmap/tree/master/translations/chinese 2 | 3 | 总体路线: 4 | ![](https://img-blog.csdnimg.cn/img_convert/8830e9d1239fe053e75d4cbf204f9955.png) 5 | -------------------------------------------------------------------------------- /docs/articles/其他/Java后端知识掌握的一些常用图.md: -------------------------------------------------------------------------------- 1 | ## 絮 2 | 3 | 最近在整理一些笔记,顺便复习一下这些知识,发现以前画的图片挺多的,分享一下。 4 | 5 | 6 | 7 | ## 1、三次握手和四次挥手 8 | 9 | 10 | 11 | ## 2、Https原理 12 | 13 | -------------------------------------------------------------------------------- /docs/articles/其他/Java快速学习路线图.md: -------------------------------------------------------------------------------- 1 | JavaSE 2 | 3 | MySQL 4 | 5 | -------------------------------------------------------------------------------- /docs/articles/其他/picture/clipboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/clipboard.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210321212351006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210321212351006.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324110419325.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324110419325.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324110808775.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324110808775.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324111718270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324111718270.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324113606571.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324113606571.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324123258096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324123258096.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324170431606.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324170431606.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324171119960.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324171119960.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324171138846.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324171138846.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324171649086.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324171649086.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324172320145.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324172320145.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324173113836.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324173113836.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324175522413.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324175522413.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324175938340.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324175938340.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324180526332.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324180526332.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324180925820.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324180925820.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324181238602.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324181238602.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210324181457767.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210324181457767.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234016737.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234016737.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234144662.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234144662.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234303187.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234303187.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234406955.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234406955.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234622169.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234622169.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210325234918307.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210325234918307.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210326000050881.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210326000050881.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210326000807549.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210326000807549.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210326001030514.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210326001030514.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210507111759609.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210507111759609.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210604110816912.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210604110816912.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210604110841217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210604110841217.png -------------------------------------------------------------------------------- /docs/articles/其他/picture/image-20210604110851885.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/其他/picture/image-20210604110851885.png -------------------------------------------------------------------------------- /docs/articles/其他/一些学习的网站推荐.md: -------------------------------------------------------------------------------- 1 | 1、牛客网 2 | 3 | 牛客网有很多个部分,建议到自己面试的模块就行刷题,比如说SQL的,牛客网都有提供在线编程平台: 4 | 5 | https://www.nowcoder.com/ta/sql 6 | 7 | ![](F:\笔记\PureJavaCoderRoad(Java基础教程)\docs\articles\其他\picture\image-20210324175522413.png) -------------------------------------------------------------------------------- /docs/articles/其他/一些有趣的博客和网站.md: -------------------------------------------------------------------------------- 1 | 命名: 2 | 3 | https://unbug.github.io/codelf/ 4 | 5 | ![](picture\image-20210321212351006.png) -------------------------------------------------------------------------------- /docs/articles/其他/自学Java的建议.md: -------------------------------------------------------------------------------- 1 | 我是个非科班出身的程序员,毕业于一所不知名的普通本科学校。 2 | 3 | 从大三开始自学Java,历时半年,在大三的暑假,终于找到了一份实习,随后辗转四份工作,终于到了某小厂。 4 | 5 | 6 | 7 | 大一、大二的时候我觉得离毕业还很遥远,虽然说是一个和计算机有一点点沾边的专业的管理学专业, 却不知道毕业能做什么。 8 | 9 | 大三下学期的时候才开窍。于是我开始学习Java,记得第一个视频看的是马士兵的 30 天Java入门视频,现在应该更新了好几个版本了,应该是尚硅谷的。 10 | 11 | 虽然年代久远,但是讲的还是挺不错的,我清晰的记得一共 100 集,30天看完的。 12 | 13 | 当时还要上课,记得讲的是JavaWeb,JSP、SSM都接触了一点,但是就是听不懂。 14 | 15 | 学完Java基础后,开始看SSM框架,也是看的尚硅谷的视频。 16 | 17 | 前前后后大概三个月吧,然后开始做项目了,Github找的XXX管理系统,拿下来后就慢慢改,这样面试就可以吹项目经验了。 18 | 19 | 写好简历后,记得当时是六月份,还没考完试,就开始投简历了。 20 | 21 | 开始是精挑细选的投,还会开公司详情、要求。基本上投了20个岗位,一个回复也没有,后来索性海投了,就是一键投递。 22 | 23 | 像智联招聘、前程无忧、boss、拉勾、实习僧这些都一起投了。 24 | 25 | 那时候的boss和拉勾并没有现在做的这么好,实习岗都是很少职位的(可能是入驻的公司少吧~) 26 | 27 | 因为开始没把 28 | 29 | 大概一周后,终于有一个公司邀请我面试了,但是是个前端职位。(可能是当时把前端的职位也海投了) 30 | 31 | 既然有面试了,就去试试吧。 32 | 33 | 那是我第一次面试,是一家创业的小公司,只有七八个人,面试官就是老板,自我介绍完之后就开始问一些其他问题,没有涉及任何技术问题,最后他问我有没有作品,我说没有,然后他叫我回去做个前端作品,一周后再来。 34 | 35 | 36 | 37 | 其实我对前端是一窍不通有的,只会一些简单的HTML和CSS,为此我这一周又重新学了前端。回去后我开始简单的做了个页面。 38 | 39 | 我觉得Java的岗位不好找,于是这时候我就开始学习前端了。 40 | 41 | 前端、Java一起投。 42 | 43 | 一周后,做了一个我都觉得丑的前端页面出来,毫无疑问,面试没过,但这老板说你可以考虑一下过来实习,但是我办法给你薪资。 44 | 45 | 我考虑了一下,就放弃了。 46 | 47 | 接下来就是暑假了,开始了我的漫长面试历程。 48 | 49 | 炎炎夏日, 50 | 51 | 终于在八月份的中旬,找到了第一份Java实习。 52 | 53 | 54 | 55 | ## 1、基本功 56 | 57 | ### 1、Java基础 58 | 59 | 准确来说是JavaSE, 《Java小白之路》其实就是JavaSE的核心部分,针对快速入门到找工作的教程。 60 | 61 | JavaSE还有 JDK 的使用、源码理解、API等等,这块知识非常庞杂也非常重要, 以至于我现在工作了很多年,也需要不断学习。 62 | 63 | 我以前看的是《Java核心技术》,这本书太庞大了,不适宜新手看。 64 | 65 | 如果要推荐的话,《Head First Java》是一本不错的书。 66 | 67 | 有时间再看看马士兵的Java视频,淘宝十几块钱就有,B站、网上可能不全。 68 | 69 | ### 2、Java进阶 70 | 71 | 这部分包含有 Java的IO、反射、多线程、泛型、JVM 等。 72 | 73 | 新手入门,大部分会卡在这部分,我当初也是,如果你觉得难,可以先简单过一遍,等你工作了再回来系统的学习。 74 | 75 | > 这部分内容一般在公司是不会用到的。 76 | 77 | 《深入理解Java虚拟机》 78 | 79 | 《并发编程实践》 80 | 81 | 这两本书不错。 82 | 83 | ## 2、地基 84 | 85 | ### 1、操作系统 86 | 87 | 操作系统不需要理解太深,但需要知道。 88 | 89 | 这部分主要还是Linux的使用 90 | 91 | ### 2、计算机网络 92 | 93 | HTTP、TCP/IP 协议、网络的七层模型 94 | 95 | ### 3、数据结构和算法 96 | 97 | 98 | 99 | ## 3、框架 100 | 101 | Spring 和 Mybatis -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/Git的使用.md: -------------------------------------------------------------------------------- 1 | Git是一个版本管理工具,你想想看,如果一个项目有多个人开发,如何保证协作的过程中代码是正确的、是同步的呢? 2 | 3 | 这就是需要用到Git了。 4 | 5 | ## GitHub和Git的关系与区别 6 | 7 | > 很多初学者分混淆了GitHub和Git的关系,误认为Git等同于GitHub,其实这两个根本不是一个东西。 8 | 9 | Git是一个命令行工具,一个分布式版本控制系统,类似的工具还有SVN,它可以控制你的文件提交、回调,是一个版本管理工具。 10 | 11 | GitHub是一个代码托管网站,背后使用Git作为版本管理工具(而非svn)。主要服务是将你的项目代码托管到云服务器上,而非存储在自己本地硬盘上。类似的网站还有gitlab.com、gitee.com(国内) 12 | 13 | ## Git教程 14 | 15 | 下面提到一些Git的教程,我个人觉得十分不错,推荐给大家,无论是对新手还是工作几年的开发人员来说,都十分友好: 16 | 17 | - [Git教程-廖雪峰](https://www.liaoxuefeng.com/wiki/896043488029600/) 18 | 19 | 廖大yyds,最受欢迎的git使用教程之一 20 | 21 | - [learnGitBranching](https://github.com/pcottle/learnGitBranching) 22 | 通过可视化动画效果来帮助开发人员理解Git命令 23 | 24 | - [《Git 官方文档教程》](https://git-scm.com/book/zh/v2) 25 | 26 | - [《Pro Git》](https://www.progit.cn/) 27 | 28 | 29 | 30 | ## Github教程 31 | 32 | - [github漫游指南](https://github.com/phodal/github) 33 | 34 | github的使用教程,可以快速看看 35 | 36 | - [学会在Github精准搜索项目](github使用教程\学会在Github精准搜索项目.md) 37 | 38 | 39 | 40 | --- 41 | 42 | **Github和Git不是同一个东西。**新手可能会混淆,除此还有SVN、Gitlab ,我来简单说明一下。 43 | 44 | 45 | 46 | Git、SVN 都是版本管理工具,这是两个不同的工具,好比微信和电话,都可以用来通信,但是场景不一样。 47 | 48 | 红框这个就是Git的快捷方式,下面这个则是SVN的快捷方式: 49 | 50 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210511094124483.png) 51 | 52 | - Git管理的对象是仓库,SVN管理的对象是文件。 所以Git时候用来管理代码,SVN适合用来管理文件(比如可以用来搭建一个仓库管理需求文档、API文档、培训文件什么的) 53 | - 既然不是一个东西,命令也稍有区别。 54 | 55 | 56 | 57 | 而 Github、Gitee、GitLab 则是可视化的Git仓库,好比打电话,华为有华为的打电话界面(GitHub),小米有小米的打电话界面(GitLab),但是底层都是一样的通讯协议(Git)。 58 | 59 | 目前全球最大的同性交友平台——GitHub,是免费的,这里汇聚了世界各地的开发者,作为开发,大家很有必要去掌握GitHub的使用。 60 | 61 | GitLab一般是公司内部自己使用,使用GitLab,可以很简单的就搭建一个仓库,公司内部的开发人员就可以使用它了。 62 | 63 | 64 | 65 | **我一般会使用GitHub做什么:** 66 | 67 | - **收集资源、教程、项目** 68 | 69 | 我一般都是在GitHub搜索一些教程,比如python、lambda8使用等等,但是GitHub的仓库如此多,要学会过滤,所以新手入门,要养成搜索的好习惯,建议看看 [学会在Github精准搜索项目](github使用教程\学会在Github精准搜索项目.md) 70 | 71 | - **代码仓库** 72 | 73 | 这个不用说了,我自己平时的代码都是同步到GitHub的,比如说LeetCode的刷题、一些常用的类等等。 74 | 75 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img-20210401/image-20210511100824802.png) 76 | 77 | - **文件、笔记同步** 78 | 79 | GitHub不适合大文件同步(因为网络慢~),比如目前,你现在看到的这些文章,我都是放在GitHub的。 80 | 81 | - **图床** 82 | 83 | 有时候写笔记,会涉及很多图片,那这些图片也可以存放到GitHub,比如说上面这张。可以配合很多工具,把图片上传到自己的仓库,然后获取到URL,就可以在任何地方使用了,而且免费。 84 | 85 | - **GitHubPage** 86 | 87 | GitHub即是一个仓库,其实它也是一个静态服务器,我们可以把自己的`.html` 文件放在仓库,利用GitHub提供的GitHubPage功能,就可以生成一个自己的博客了。 88 | 89 | 比如说你现在看到的《Java小白之路》,其中就是使用GitHubPage和GiteePage,但是详细的搭建,可以看我后续一些文章。 90 | 91 | -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311101702647.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311101702647.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311101815088.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311101815088.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311103140903.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311103140903.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311104108118.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311104108118.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311111008688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311111008688.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311141028741-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311141028741-1.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311141251744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311141251744.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311143225194.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311143225194.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/picture/image-20210311143651096.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/github使用教程/picture/image-20210311143651096.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/github使用教程/学会在Github精准搜索项目.md: -------------------------------------------------------------------------------- 1 | 相信很多小伙伴都会“使用”Github,Github作为汇集全球最多程序员的网站,上面有许多开源的项目。 2 | 3 | 平时需要找项目、找文档,特别是在找实战项目都时候,要怎么高效地使用Github呢? 4 | 5 | 本篇文章就来介绍一下如何精准的搜索项目。 6 | 7 | ## 1、Github的项目由什么组成? 8 | 9 | 要搜索项目,就要先了解一下一个项目有什么组成。 10 | 11 | - Name:即仓库的名称 12 | 13 | - About:项目简单说明,项目的归类,项目的官网 14 | 15 | - Readme:这是项目的详细说明,一般包括项目的使用说明、开源协议 16 | 17 | - Contributors :作者 18 | 19 | - 源码:项目的代码 20 | 21 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311141251744.png) 22 | 23 | 除此之外,还有`star`数、`fork`数、开源协议、release发布版本,以及以下一些操作供用户使用: 24 | 25 | ``` 26 | watch:会持续收到项目的动态 27 | fork:复制某个项目到自己的仓库 28 | star:可以理解为点赞 29 | clone:将项目下载到本地 30 | follow:关注你感兴趣的作者,会收到他们的动态 31 | ``` 32 | 33 | 34 | 35 | ## 2、如何搜索? 36 | 37 | 搜索嘛,很简单,左上角键入你需要搜索的关键字就行,就像用百度一样。 38 | 39 | 假如要搜索 **vue** ,在 Github 的左上角键入关键字 **vue**,回车即可出现很多与vue有关的项目,但是项目非常多,这样的筛选是十分耗费精力的。 40 | 41 | ![搜索 vue](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311101815088.png) 42 | 43 | 但是Github 的搜索引擎就像百度一样,百度的搜索有很多技巧,比如说 `site:rain.baimuxym.cn Java`,表示只在 网站 rain.baimuxym.cn 搜索 **Java** 内容。 44 | 45 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311103140903.png) 46 | 47 | 48 | 49 | 废话少说,下面奉上Github 的搜索小技巧。 50 | 51 | ## 3、使用Github 精准搜索 52 | 53 | ### 1、in:name 条件 54 | 55 | 根据名字查找,只会显示**仓库名称**包含该name的项目 56 | 57 | ``` 58 | in:name springbootLogback 59 | ``` 60 | 61 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311111008688.png) 62 | 63 | ### 2、in:readme 条件 64 | 65 | 根据**readme**文件包含的关键字进行过滤 66 | 67 | ``` 68 | in:readme springbootLogback 69 | ``` 70 | 71 | ### 3、in:description 条件 72 | 73 | 根据项目描述过滤,也就是 **About** 的内容 74 | 75 | ``` 76 | in:description "A magical vue admin" 77 | ``` 78 | 79 | ### 4、language:条件 80 | 81 | 根据**语言**过滤 82 | 83 | ``` 84 | in:description springboot language:Java 85 | ``` 86 | 87 | 比如说搜索**毕设** 88 | 89 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311143651096.png) 90 | 91 | ### 5、pushed: 条件 92 | 93 | 根据**推送时间**过滤 94 | 95 | ``` 96 | in:description springboot language:Java puished:>2020-04-03 97 | ``` 98 | 99 | ### 6、stars: 条件 100 | 101 | 根据**点赞数**来过滤 102 | 103 | ``` 104 | in:description "A magical vue admin" stars:>1000 105 | ``` 106 | 107 | ### 7、awesome 关键字 108 | 109 | awesome 开头的系列,一般是用来收集学习、工具、书籍类相关的项目 110 | 111 | 如: 112 | 113 | ``` 114 | awesome python 115 | awesome go 116 | awesome linux 117 | ``` 118 | 119 | ![python资源](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311141028741-1.png) 120 | 121 | 122 | 123 | ## 4、源码查看插件推荐 124 | 125 | 除此之外,搜索结果显示项目后,我们需要点击查看项目的时候,项目有很多文件,而且Github 加载比较慢,当我们需要查看源码的时候,是件很麻烦的事情。 126 | 127 | 这里推荐一个Chrome插件:**Octotree** 128 | 129 | > 下载地址:https://github.com/buunguyen/octotree 130 | 131 | 安装完之后,访问Github 会在左边出现一个树形: 132 | 133 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/img/image-20210311143225194.png) 134 | 135 | 点击你需要的文件,Github 就会在右边预览,很便捷。 -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210312101356615.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210312101356615.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210407154548005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210407154548005.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210511094124483.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210511094124483.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210511100824802.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210511100824802.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824101138022.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824101138022.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824103325691.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824103325691.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824112216025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824112216025.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824112452610.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824112452610.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824113514128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824113514128.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824113643717.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824113643717.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824114429643.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824114429643.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824114540025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824114540025.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/picture/image-20210824135124607.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/开发辅助工具/picture/image-20210824135124607.png -------------------------------------------------------------------------------- /docs/articles/开发辅助工具/我常用的开发工具.md: -------------------------------------------------------------------------------- 1 | ## 1、IDE(集成开发环境) 2 | 3 | - JetBrains IDEA 4 | 5 | 写Java用的 6 | 7 | - JetBrains pyCharms 8 | 9 | 写python用的 10 | 11 | 12 | 13 | ## 2、笔记 14 | 15 | 16 | 17 | - 有道云笔记 18 | 19 | 20 | 21 | - Typora 22 | 23 | 24 | 25 | ## 3、一些客户端 26 | 27 | - MySQL 28 | 29 | Navicat、MysqlWorkBranch 30 | 31 | - Redis 32 | 33 | RedisDesktop、anotherRedisDeskTop 34 | 35 | - -------------------------------------------------------------------------------- /docs/articles/异常处理/3、自定义异常.md: -------------------------------------------------------------------------------- 1 | ## 自定义异常 2 | 3 | 在业务代码中,有时候需要自定义异常,异常的返回结果可以根据业务进行调整。 4 | 5 | 自定义异常的时候,尽量使用JDK已定义的异常类型,比如以下常见的异常类: 6 | 7 | ```java 8 | Exception 9 | ├─ RuntimeException 10 | │ ├─ NullPointerException 11 | │ ├─ IndexOutOfBoundsException 12 | │ ├─ SecurityException 13 | │ └─ IllegalArgumentException 14 | │ └─ NumberFormatException 15 | ├─ IOException 16 | │ ├─ UnsupportedCharsetException 17 | │ ├─ FileNotFoundException 18 | │ └─ SocketException 19 | ├─ ParseException 20 | ├─ GeneralSecurityException 21 | ├─ SQLException 22 | └─ TimeoutException 23 | ``` 24 | 25 | 26 | 27 | eg: 28 | 29 | 五菱宏光厂商为了能快速为用户定位更换轮胎的错误,于是加入了错误码,通过错误码就能立即知道错误原因了。 30 | 31 | 对于代码实现就是自定义了一个`ChangeWeelException` 异常类,继承于`RuntimeException`。 32 | 33 | ```java 34 | class ChangeWeelException extends RuntimeException { 35 | private int errorCode; 36 | private String errorMessage; 37 | 38 | ChangeWeelException(int errorCode, String errorMessage) { 39 | this.errorCode = errorCode; //自定义构造函数,加入错误码字段 40 | this.errorMessage = errorMessage; 41 | } 42 | public int getErrorCode() { 43 | return errorCode; 44 | } 45 | public String getErrorMessage() { 46 | return errorMessage; 47 | } 48 | } 49 | 50 | public class WuLingHongGuang { 51 | private String[] weels = {"左1", "左2", "后1", "后2", "备胎1"}; 52 | 53 | void changeWeel(int index, String weelName) throws ChangeWeelException { //throws 关键字,表示方法可能会抛出异常 54 | if (index > weels.length) { 55 | throw new ChangeWeelException(50001, "ERROR!!!轮胎安装位置错误了!"); //throw 关键字,直接抛出异常 56 | } else { 57 | weels[index] = weelName; 58 | } 59 | } 60 | } 61 | 62 | class HaC { 63 | public static void main(String[] args) { 64 | WuLingHongGuang wuLingHongGuang = new WuLingHongGuang(); 65 | try { 66 | wuLingHongGuang.changeWeel(10, "备胎2"); //捕获异常 67 | System.out.println("更换成功"); //报错并不会执行 68 | } catch (ChangeWeelException e) { 69 | e.printStackTrace(); 70 | System.out.println("错误码:" + e.getErrorCode()); 71 | System.out.println("错误提示:" + e.getErrorMessage()); 72 | } finally { 73 | System.out.println("更换完毕..."); 74 | } 75 | } 76 | } 77 | ``` 78 | 79 | 输出: 80 | 81 | ``` 82 | com.hac.异常.ChangeWeelException 83 | at com.hac.异常.WuLingHongGuang.changeWeel(WuLingHongGuang.java:33) 84 | at com.hac.异常.HaC.main(WuLingHongGuang.java:49) 85 | 错误码:50001 86 | 错误提示:ERROR!!!轮胎安装位置错误了! 87 | 更换完毕... 88 | ``` 89 | 90 | ## 断言 91 | 92 | 另外还有个知识点就是**断言**。(了解即可) 93 | 94 | > 断言:也就是所谓的assertion,是jdk1.4后加入的新功能。 95 | 96 | 它主要使用在代码开发和测试时期,用于对某些关键数据的判断,如果这个关键数据不是你程序所预期的数据,程序就提出警告或退出。 97 | 98 | 当项目正式发布后(上线),可以取消断言部分的代码。java中使用`assert`作为断言的一个关键字,这就可以看出java对断言还是很重视的,因为如果不是很重要的话,直接开发个类就可以了,没必要新定义一个关键字。 99 | 100 | **语法1:** 101 | 102 | ```java 103 | assert expression; //expression代表一个布尔类型的表达式,如果为真,就继续正常运行,如果为假,程序退出 104 | ``` 105 | 106 | **语法2:** 107 | 108 | ```java 109 | assert expression1 : expression2; 110 | //expression1是一个布尔表达式,expression2是一个基本类型或者Object类型, 111 | //如果expression1为真,则程序忽略expression2继续运行;如果expression1为假,则运行expression2,然后退出程序。 112 | ``` 113 | 114 | 应用举例1: 115 | 116 | ```java 117 | public class AssertionDemo { 118 | //这个成员变量的值可以变,但最终必须还是回到原值5 119 | static int i = 5; 120 | public static void main(String[] args) { 121 | assert i==6; 122 | System.out.println("如果断言正常,我就被打印"); 123 | } 124 | } 125 | ``` 126 | 127 | 输出: 128 | 129 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20210425230218025.png) 130 | 131 | ## 总结: 132 | 133 | 在自定义异常的时候,一般都是从`RuntimeException`派生出子异常,在自定义异常的时候,可以根据业务定义多种构造方法。 134 | 135 | 但是在实际的业务中,`e.printStackTrace();`可能会抛出很长的一段错误日志,这样会欲盖弥彰,如何打印错误日志,也是开发人员需要考虑。 136 | 137 | 在日志框架中,我们还可以使用Log4j、Sl4j 这些第三方API 库,而不是使用`System.out.println()`打印。 138 | 139 | 140 | 141 | 总结这三节有关异常的知识点: 142 | 143 | ![](https://cdn.jsdelivr.net/gh/DogerRain/image@main/Home/image-20210425225606460.png) -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210115150112189.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210115150112189.png -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210115150402927.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210115150402927.png -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210115172917862.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210115172917862.png -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210118112833111.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210118112833111.png -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210425225606460.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210425225606460.png -------------------------------------------------------------------------------- /docs/articles/异常处理/picture/image-20210425230218025.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/异常处理/picture/image-20210425230218025.png -------------------------------------------------------------------------------- /docs/articles/数据库/MongoDB.md: -------------------------------------------------------------------------------- 1 | 我们此前接触的MySQL、Oracle 都是 关系型数据库(Relational Database) 2 | 3 | NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。 4 | 5 | 比如 MongoDB、Redis。 6 | 7 | -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/2243690-531c8fbb6b2b55c4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/2243690-531c8fbb6b2b55c4.webp -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/2243690-e20ffe8f48bfcfbc.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/2243690-e20ffe8f48bfcfbc.webp -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA-1617777970741: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9UZEdMYVNVNjc1Z3dCYXdabTRBdEtieVVVcUVIUnFDS28xaFBvYTg0QTR0RlhFUDVkVTk5R0hpYkhONVh3THNGcDF3UE1mM1Fab1pxWFI1SUY4UFJpYlZ3LzY0MA-1617777970741 -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407104618787.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407104618787.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407141642981.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407141642981.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407142845688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407142845688.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407143725029.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407143725029.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407144637998.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407144637998.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/picture/image-20210407145025409.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/picture/image-20210407145025409.png -------------------------------------------------------------------------------- /docs/articles/数据结构与算法/常见的算法.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/数据结构与算法/常见的算法.md -------------------------------------------------------------------------------- /docs/articles/架构/DevOps.md: -------------------------------------------------------------------------------- 1 | 参考:https://mp.weixin.qq.com/s/yPeRriDT-miiLoJdY-aY8Q -------------------------------------------------------------------------------- /docs/articles/架构/picture/image-20220302135109186.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/架构/picture/image-20220302135109186.png -------------------------------------------------------------------------------- /docs/articles/架构/高可用架构技术之无状态服务md: -------------------------------------------------------------------------------- 1 | 参考:https://cloud.tencent.com/developer/article/1800504 2 | 3 | 4 | 5 | 常用 6 | 7 | ![](F:\笔记\PureJavaCoderRoad(Java基础教程)\docs\articles\架构\picture\image-20220302135109186.png) -------------------------------------------------------------------------------- /docs/articles/面向对象/2、静态字段和静态方法.md: -------------------------------------------------------------------------------- 1 | ## static关键字 2 | 3 | 在类中,static 可以修饰变量和方法。 4 | 5 | static修饰的变量称为静态成员变量,也称为类变量。 6 | 7 | static修饰的方法称为静态方法,也称为类方法。 8 | 9 | static修饰的代码块称为静态代码块,也称为static块。 10 | 11 | eg: 12 | 13 | ```java 14 | public class HelloCoder { 15 | static String name = "HaC"; //静态变量 16 | 17 | static //静态代码块 18 | { 19 | System.out.println(name); 20 | } 21 | 22 | //静态方法 23 | public static void printName(){ 24 | System.out.println(name); 25 | } 26 | } 27 | ``` 28 | 29 | static的生命周期和类相同,所以说,static和对象没什么关系,和类有关系。 30 | 31 | 32 | 33 | ## static的用途 34 | 35 | 一句话描述就是:在没有创建对象的情况下调用方法或者变量。 36 | 37 | ### static变量 38 | 39 | 静态变量被所有对象共享,在内存中只有一个副本,在类初次加载的时候才会初始化。 40 | 41 | 非静态变量是只有在对象创建的时候才能操作。 42 | 43 | > static成员变量初始化顺序按照定义的顺序来进行初始化 44 | 45 | ### static方法 46 | 47 | static方法也是属于类,不依赖对象,所以static方法是没有`this`(this表示本实例对象) ,虽然对象也能访问static方法。 48 | 49 | > 因为没有`this`,所以静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法和静态成员变量。 50 | 51 | 毕竟普通方法是属于对象的,你静态方法是属于类的,类是优先比对象加载的,类调用对象的东西,对象还没加载,这就会有问题,所以**静态方法中不能访问非静态成员方法和非静态成员变量**,反过来就可以。 52 | 53 | 静态方法可以直接通过 `类名.静态方法` 直接访问。 54 | 55 | 56 | 57 | ### static块 58 | 59 | static块的作用是为了在Java程序执行前优先执行,提升程序的性能。 60 | 61 | > 静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。 62 | > 在类初次被加载时,会按照静态初始化块的顺序来执行每个块,**并且只会执行一次**。 63 | 64 | 65 | 66 | > 切记:static是不允许用来修饰局部变量 67 | > 68 | > 为什么呢? 69 | > 70 | > 因为static是表示全局的,共同使用的;你局部变量只是给局部方法使用的。记住这是Java规定的就行。 71 | 72 | 73 | 74 | eg: 75 | 76 | ```java 77 | public class HelloCoder { 78 | static String name = "HaC"; //静态变量 79 | 80 | static //静态代码块 81 | { 82 | System.out.println(name); 83 | } 84 | 85 | //静态方法 86 | public static void printName() { 87 | System.out.println(name); 88 | // test(); //报错,静态方法不能调用非静态方法 89 | } 90 | 91 | public void test() { //平台方法 92 | printName(); //非静态方法可以调用静态方法 93 | // static int age = 1; //报错,static是不允许用来修饰局部变量 94 | } 95 | 96 | public static void main(String[] args) { //main方法也是一个静态方法 97 | HelloCoder helloCoder = new HelloCoder(); 98 | helloCoder.printName(); //也可以使用对象访问静态方法 99 | 100 | HelloCoder.printName(); //建议使用这种方法访问 101 | } 102 | } 103 | ``` 104 | 105 | 以上在类加载的时候,首先会执行静态代码块,执行`System.out.println(name);` 106 | 107 | 输出: 108 | 109 | ``` 110 | HaC 111 | HaC 112 | HaC 113 | ``` 114 | 115 | 116 | 117 | 118 | 119 | ## 类加载的顺序 120 | 121 | 上一章节中学了继承。是先执行父类的构造方法,在执行子类的构造方法。 122 | 123 | 那如果引入static代码块、普通代码块呢? 124 | 125 | eg: 126 | 127 | ```java 128 | class HelloA { 129 | public HelloA() { 130 | System.out.println("A init"); 131 | } 132 | 133 | { 134 | System.out.println("I’m A class"); 135 | } 136 | 137 | static { 138 | System.out.println("static A"); 139 | } 140 | } 141 | 142 | class HelloB extends HelloA { 143 | static { 144 | System.out.println("static B"); 145 | } 146 | 147 | public HelloB() { 148 | System.out.println("B init"); 149 | } 150 | 151 | { 152 | System.out.println("I’m B class"); 153 | } 154 | 155 | public static void main(String[] args) { 156 | new HelloB(); 157 | } 158 | } 159 | ``` 160 | 161 | 输出: 162 | 163 | >static A 164 | >static B 165 | >I’m A class 166 | >A init 167 | >I’m B class 168 | >B init 169 | 170 | 171 | 172 | Java在执行的时候,是有顺序的,在 `new Object()` 的时候,会执行构造方法,但是在子类、父类都有构造方法的时候,还有静态方法的时候,它的执行顺序是这样的: 173 | 174 | 1. 父类的静态代码块 175 | 2. 子类的静态代码块 176 | 3. 父类的普通代码块 177 | 4. **父类的构造方法** 178 | 5. 子类的普通代码块 179 | 6. **子类的构造方法** 180 | 181 | > static 和对象无关,类加载,static就加载,那肯定是优先执行static的。 182 | > 183 | > 进入main方法,new 对象 时 发现继承父类,优先执行父类,发现父类还有代码块,优先执行代码块 184 | > 185 | > 等到分配了内存,再去执行构造方法。 186 | > 187 | > 最后回到子类。 -------------------------------------------------------------------------------- /docs/articles/面向对象/4、重载和重写.md: -------------------------------------------------------------------------------- 1 | 结合以上两个章节的内容,总结一下**重载**(`overload`) 和 **重写**(`override`)的区别。 2 | 3 | 重载和重写都是多态的实现方式。 4 | 5 | 多态有两种: 6 | 7 | - **编译时多态** 8 | 9 | 也就是所谓的重载,根据参数,选择执行不同的方法体。 10 | 11 | - **运行时多态** 12 | 13 | 也就是所谓的重写。 14 | 15 | 16 | 17 | ## 重载 18 | 19 | eg: 20 | 21 | ```java 22 | public class Car { 23 | private String carName; 24 | 25 | public Car(String carName) { 26 | this.carName = carName; 27 | } 28 | 29 | public void printCarName() { 30 | System.out.println("车的名字:" + this.carName); 31 | } 32 | 33 | protected void printCarName(int carAge) { 34 | System.out.println("车的名字:" + this.carName + ",车龄:" + carAge); 35 | } 36 | 37 | protected String printCarName(int carAge, int kilometre) { 38 | System.out.println("车的名字:" + this.carName + ",车龄:" + carAge + ",公里数:" + kilometre); 39 | return ""; 40 | } 41 | } 42 | 43 | class HaC { 44 | public static void main(String[] args) { 45 | Car car = new Car("AE86"); 46 | car.printCarName(); 47 | car.printCarName(3); 48 | car.printCarName(3, 100000); 49 | } 50 | } 51 | ``` 52 | 53 | 输出: 54 | 55 | ``` 56 | 车的名字:AE86 57 | 车的名字:AE86,车龄:3 58 | 车的名字:AE86,车龄:3,公里数:100000 59 | ``` 60 | 61 | `printCarName()`就是重载了,有三种不同的参数列表。 62 | 63 | **重载规则:** 64 | 65 | - 被重载的方法必须改变参数列表(参数个数或类型不一样); 66 | - 被重载的方法可以改变返回类型; 67 | - 被重载的方法可以改变访问修饰符; 68 | - 被重载的方法可以声明新的或更广的检查异常; 69 | 70 | > 无法以返回值类型作为重载函数的区分标准! 71 | 72 | 73 | 74 | ## 重写 75 | 76 | 重写是子类对父类的允许访问的方法的实现过程进行重新编写。 77 | 78 | 重写必须建立在**继承**基础上,返回值和形参都不能改变。 79 | 80 | eg: 81 | 82 | ```java 83 | public class Car { 84 | void drive() { 85 | System.out.println("开车"); 86 | } 87 | } 88 | 89 | class WuLingHongGuang extends Car { 90 | @Override 91 | void drive() { 92 | System.out.println("开五菱宏光"); 93 | } 94 | } 95 | ``` 96 | 97 | 98 | 99 | 子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。 100 | 101 | 子类可使用`super`关键字,该关键字引用了当前类的父类。 102 | 103 | **重写规则:** 104 | 105 | - 参数列表与被重写方法的参数列表必须完全相同 106 | - 子类函数的访问修饰权限不能少于父类,例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected 107 | - 声明为 `final` 的方法不能被重写,声明为 `static` 的方法不能被重写,但是能够被再次声明 108 | - 构造方法不能被重写 109 | - 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。 110 | 111 | -------------------------------------------------------------------------------- /docs/articles/面向对象/5、多态.md: -------------------------------------------------------------------------------- 1 | 多态在Java中是一个很重要的思想。 2 | 3 | 多态是指同一个行为表现出不同的形式。在Java中的理解就是调用一个方法,但是可以有不同的功能。 4 | 5 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210112164950977.png) 6 | 7 | 8 | 9 | ### 运行时多态存在的三个必要条件 10 | 11 | - **继承** 12 | 13 | `class WuLingHongGuang extends Car` 14 | 15 | - **重写** 16 | 17 | `@Overide`,方法覆盖 18 | 19 | - **父类引用指向子类对象** 20 | 21 | `Car wuLingHongGuangCar = new WuLingHongGuang();` 22 | 23 | 24 | 25 | eg: 26 | 27 | 以前我总是平平无奇地开车,并不知道开的是什么车,有一天哈C我一夜暴富,买了三辆车。 28 | 29 | 为了知道我在开什么车,我就写了三个类,抽取了共同的方法,只要我开车的时候,传入实例化的车辆就知道开什么车了: 30 | 31 | ```java 32 | public class Car { 33 | void drive() { 34 | System.out.println("平平无奇地开车"); 35 | } 36 | } 37 | 38 | class WuLingHongGuang extends Car { //继承 39 | @Override 40 | void drive() { //重写 41 | System.out.println("我在开五菱宏光"); 42 | } 43 | } 44 | 45 | class BaoMa extends Car { 46 | @Override 47 | void drive() { 48 | System.out.println("我在开宝马"); 49 | } 50 | } 51 | 52 | class AoDi extends Car { 53 | @Override 54 | void drive() { 55 | System.out.println("我在开奥迪"); 56 | } 57 | } 58 | 59 | class Test { 60 | public static void main(String[] args) { 61 | Car car = new WuLingHongGuang(); //父类引用指向子类对象 62 | car.drive(); 63 | 64 | Car car1 = new BaoMa(); 65 | car1.drive(); 66 | 67 | Car car2 = new AoDi(); 68 | car2.drive(); 69 | } 70 | } 71 | ``` 72 | 73 | 输出: 74 | 75 | ``` 76 | 我在开五菱宏光 77 | 我在开宝马 78 | 我在开奥迪 79 | ``` 80 | 81 | Java的实例方法调用是基于**运行时**的实际类型的动态调用,而非变量的声明类型。 82 | 83 | 小伙伴可能很容易就知道下面这个`dirve()`调用的是子类的方法: 84 | 85 | ```java 86 | Car car = new WuLingHongGuang(); 87 | car.drive(); 88 | ``` 89 | 90 | 但是Java是不知道的,它是在运行的时候才知道,又称为**运行时多态** 91 | 92 | 93 | 94 | 假如有一天,哈C我又买了很多辆车,车太多了,开不过来了,于是我雇了一个司机,让他帮我开车: 95 | 96 | ```java 97 | public class Car { 98 | void drive() { 99 | System.out.println("平平无奇地开车"); 100 | } 101 | } 102 | 103 | class WuLingHongGuang extends Car { 104 | @Override 105 | void drive() { 106 | System.out.println("我在开五菱宏光"); 107 | } 108 | } 109 | 110 | class BaoMa extends Car { 111 | @Override 112 | void drive() { 113 | System.out.println("我在开宝马"); 114 | } 115 | } 116 | 117 | class AoDi extends Car { 118 | @Override 119 | void drive() { 120 | System.out.println("我在开奥迪"); 121 | } 122 | } 123 | 124 | // class 其他车 extends Car {} 125 | 126 | class Driver { 127 | void driveCar(Car car) { 128 | car.drive(); //司机开车 129 | } 130 | } 131 | 132 | class Test { 133 | public static void main(String[] args) { 134 | WuLingHongGuang wuLingHongGuang = new WuLingHongGuang(); 135 | new Driver().driveCar(wuLingHongGuang); //帮我开五菱宏光 136 | } 137 | } 138 | ``` 139 | 140 | 这个时候,`car.drive();`司机在刚开始是不知道开什么车的,他只知道是一个`Car`,因为我们是无法知道传入的参数实际类型究竟是`Car`,还是Car的子类`WuLingHongGuang`、`BaoMa`、`AoDi`。 141 | 142 | 143 | 144 | 他可能是 开宝马、奥迪,也可能是简单地开车。 145 | 146 | 147 | 148 | 需要在传入的时候告诉司机开五菱宏光才知道: 149 | 150 | ```java 151 | WuLingHongGuang wuLingHongGuang = new WuLingHongGuang(); 152 | new Driver().driveCar(wuLingHongGuang); //帮我开五菱宏光 153 | ``` 154 | 155 | > 所以多态,针对某个类型的方法调用,其真正执行的方法取决于**运行时期实际类型的方法**。 156 | 157 | 简单的说,你需要执行什么方法(开什么车),车辆实例化 `new` 的时候去调用方法就好了。 158 | 159 | 160 | 161 | 还有就是我每次买了新车,只需要新增车辆的类,我是**不需要修改原有的类**,这就**增强了代码的可扩展性**。 -------------------------------------------------------------------------------- /docs/articles/面向对象/6、抽象类.md: -------------------------------------------------------------------------------- 1 | 在面向对象中,所有的对象都是通过类来实例化出来的。 2 | 3 | 但是并不是所有的类,都可以用来实例化一个对象的。 4 | 5 | 这就是 **抽像类**。 6 | 7 | 8 | 9 | ## 抽象类 10 | 11 | 语法: 12 | 13 | ```java 14 | abstract class{ 15 | private String name; //可以有自己的普通变量 16 | default void testAmethod() {//可以有自己的普通方法 17 | } 18 | abstract method(); //抽象方法一定是 ; 结尾,没有{}方法体 19 | 20 | } 21 | ``` 22 | 23 | > abstract 关键字表示抽象类 24 | 25 | 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 26 | 27 | > 既然是抽象类,它描述的内容都是抽象的,而对象是具体的,自然而然就无法实例化了。 28 | 29 | 由于抽象类不能实例化对象,所以抽象类**必须被继承**,才能被使用,这就是抽象类的意义,在上一个例子中: 30 | 31 | ```java 32 | public class Car { 33 | void drive() { 34 | System.out.println("平平无奇地开车"); 35 | } 36 | } 37 | 38 | class WuLingHongGuang extends Car { 39 | @Override 40 | void drive() { 41 | System.out.println("我在开五菱宏光"); 42 | } 43 | } 44 | ``` 45 | 46 | 基本上不会使用 47 | 48 | ```java 49 | Car car = new Car(); 50 | car.drive(); //平平无奇地开车 51 | ``` 52 | 53 | 这种方法去使用`Car`类。 54 | 55 | 那我就无须写这个方法了: 56 | 57 | ```java 58 | void drive() { 59 | System.out.println("平平无奇地开车"); 60 | } 61 | ``` 62 | 反正也没什么类要调用。 63 | 64 | 哈C我在考驾照前,根本不懂车是怎么开的, 驾校的车是台桑塔纳,教练和我说开车要先系安全带、然启动、拉手刹,巴拉巴拉一大堆,最后才能开车。 65 | 66 | ```java 67 | public class Car { 68 | void drive() { 69 | System.out.println("系安全带"); 70 | System.out.println("启动"); 71 | System.out.println("拉手刹"); 72 | //TODO 73 | System.out.println("平平无奇地开车"); 74 | } 75 | } 76 | ``` 77 | 78 | 79 | 80 | 我暴富的那一天,我买回来的宝马,它没有拉杆手刹,因为它有电子档位,我也不需要盯着后视镜倒车,因为它有自动泊车功能。 81 | 82 | 这和教练说的不太一样,他说的太具体了,我的宝马不是这样的,教练欺骗了我..... 83 | 84 | 我现在只需要它是可以 开(`drive()`) 就可以了,剩下的步骤我自己研究我的宝马就可以了~ 85 | 86 | 87 | 88 | 我们可以使用抽象类来处理`Car`: 89 | 90 | ```java 91 | public abstract class Car { 92 | abstract void drive(); 93 | } 94 | 95 | class BaoMa extends Car { 96 | @Override 97 | void drive() { 98 | System.out.println("系安全带"); 99 | System.out.println("启动"); 100 | System.out.println("我在开宝马"); 101 | } 102 | } 103 | class Test{ 104 | public static void main(String[] args) { 105 | // Car car = new Car(); //不能实例化,会报错 106 | BaoMa baoMa = new BaoMa(); 107 | baoMa.drive(); 108 | } 109 | } 110 | ``` 111 | 112 | > 这样 抽象类只需要告诉子类定义的方法,你只需要按照我的方法去重写就可以了,具体实现什么功能、怎么做,留给子类自己实现。 113 | 114 | 115 | 116 | ## 总结 117 | 118 | **抽象类特点:** 119 | 120 | 1. 抽象类是抽象的,不是具体的,所以抽象类不能被实例化。但是它仍然具有类的功能,成员变量、成员方法和构造方法的访问方式和普通类一样,也可以实现接口、继承类。 121 | 122 | 2. 由于抽象类不能实例化对象,所以抽象类必须被继承,除非该子类也是抽象类。(不然抽象就没意思了)。所以,类的声明、方法体 就不能使用`final`去修饰,final表示不可继承和修改,但是变量可以使用final修饰。(static 表示常量,final 表示不可改变,而抽象方法是一定要被重写的) 123 | 124 | 3. 如果一个类包含抽象方法,那么该类必须是抽象类。(但是抽象类可以有非抽象方法)。 125 | 126 | 4. 抽象类中的抽象方法的访问类型可以是public,protected、默认类型。 127 | 128 | 5. 构造方法不能声明为抽象方法。 129 | 130 | 131 | 132 | eg: 133 | 134 | ```java 135 | public abstract class Employee extends Person implements People{ 136 | { 137 | public final String a ="1"; 138 | 139 | static { 140 | System.out.println("我是抽象类的static代码块"); 141 | } 142 | 143 | public static void test(){ 144 | System.out.println("我是抽象类的static方法"); 145 | } 146 | 147 | public abstract void abstrartMethod(); 148 | 149 | public void abstrartMethod2() { 150 | System.out.println("抽象类也可以拥有非抽象方法"); 151 | } 152 | } 153 | ``` 154 | 155 | -------------------------------------------------------------------------------- /docs/articles/面向对象/9、枚举.md: -------------------------------------------------------------------------------- 1 | ## 枚举(enum) 2 | 3 | Java 枚举是一个特殊的类,它可以用来表示**一组常量**。 4 | 5 | 枚举使用`enum`表示 6 | 7 | 语法: 8 | 9 | ```java 10 | public enum Season { 11 | SPRING, AUTUMN, SUMMER, WINTER 12 | } 13 | ``` 14 | 15 | 枚举类`Season` 表示两个季节的常量。 16 | 17 | 使用枚举: 18 | 19 | ```java 20 | class Test{ 21 | public static void main(String[] args) { 22 | Season season = Season.SPRING; 23 | System.out.println(season); 24 | } 25 | } 26 | ``` 27 | 28 | 输出: 29 | 30 | ``` 31 | SPRING 32 | ``` 33 | 34 | 可以看到枚举的使用 是 `Season season = Season.SPRING;`,而不是 `new` 35 | 36 | --- 37 | 38 | 之前说到static也可以表示一个常态变量: 39 | 40 | ``` 41 | public class Season { 42 | public static final String = "SPRING"; 43 | } 44 | ``` 45 | 46 | 那枚举和static变量有什么区别呢? 47 | 48 | 枚举类编译后默认为final class,而且枚举常量不会占用对象的存储空间,编译后全都是常量,枚举表示了在定义好的集合里匹配。 49 | 50 | 而且还有一个好处: 51 | 52 | eg: 53 | 54 | ```java 55 | public enum Season { 56 | SPRING(1, "春天"), SUMMER(3, "夏天"), AUTUMN(5, "秋天"), WINTER(9, "冬天"); 57 | 58 | private int index; 59 | private String name; 60 | Season(int index, String name) { 61 | this.index = index; 62 | this.name = name; 63 | } 64 | } 65 | ``` 66 | 67 | 枚举类可以绑定多个值,还可以有构造方法。 68 | 69 | 有点像我们平时创建一般实体类,就是不能实例化这个枚举类。 70 | 71 | 72 | 73 | #### 枚举类的API: 74 | 75 | - values() 返回枚举类中所有的值。 76 | - ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。 77 | - valueOf()方法返回指定字符串值的枚举常量。 78 | 79 | 80 | 81 | eg: 82 | 83 | ```java 84 | public enum Season { 85 | SPRING(1, "春天"), SUMMER(3, "夏天"), AUTUMN(5, "秋天"), WINTER(9, "冬天"); 86 | 87 | private int index; 88 | private String name; 89 | 90 | Season(int index, String name) { 91 | this.index = index; 92 | this.name = name; 93 | } 94 | 95 | 96 | public int getIndex() { 97 | return index; 98 | } 99 | 100 | public String getName() { 101 | return name; 102 | } 103 | 104 | @Override 105 | public String toString() { 106 | return "索引:" + getIndex() + ",值:" + getName(); 107 | } 108 | } 109 | 110 | class Test { 111 | public static void main(String[] args) { 112 | for (Season season : Season.values()) { 113 | System.out.println(season); 114 | } 115 | System.out.println("------------------"); 116 | System.out.println(Season.valueOf("WINTER")); 117 | } 118 | } 119 | ``` 120 | 121 | 输出: 122 | 123 | ``` 124 | 索引:1,值:春天 125 | 索引:3,值:夏天 126 | 索引:5,值:秋天 127 | 索引:9,值:冬天 128 | ------------------ 129 | 索引:9,值:冬天 130 | ``` 131 | 132 | `System.out.println(season);` 默认省略了`toString()`方法,其实就是`System.out.println(season.toString());` 133 | 134 | 枚举也是类,所有的父类都是`Object`,`toString()` 是`Object`的API,这里重写了`toString()`方法,所以会调用子类的方法。 -------------------------------------------------------------------------------- /docs/articles/面向对象/Head-Java对象的理解.md: -------------------------------------------------------------------------------- 1 | Java是一种面向对象的编程语言。 2 | 3 | 面向对象是一种思想,一种概念。 4 | 5 | > 在面向对象中,把某一类事物所共同的属性和行为抽象出来,这样就形成了一个类,而类的一个实例就叫做对象。 6 | 7 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/l) 8 | 9 | ## 对象和对象的引用 10 | 11 | 既然对象是类的一个实例,我们只要建了一个类,我们就可以把它当做一个对象去使用,去引用这个对象。 12 | 13 | 语法: 14 | 15 | ```java 16 | A a1 = new A; 17 | A a2 = new A; 18 | ``` 19 | 20 | `A`表示一个对象,`a1` 是引用,`new A` 就是对象,`a1` 就指向了 `new A` 的这个对象。 21 | 22 | 类的一个实例就可以叫做对象,同样,`a2`也是一个引用 23 | 24 | > a 1、a2 所存放的是一个地址,指向**各自** new A 的对象,但它们的地址是不一样的。 25 | 26 | ![](https://blog-1253198264.cos.ap-guangzhou.myqcloud.com/image-20210111101815188.png) 27 | 28 | 29 | 30 | 既然有了对象,那就可以和这个对象进行互动了。 31 | 32 | ```java 33 | A a1 = new A; //new 一个 对象A 34 | a1.name ="HaC"; //把对象的名字赋值 35 | a1.givingGift("MBP笔记本") //送对象礼物 36 | ``` 37 | 38 | 39 | 40 | 所以说,a1 就是一个指向对象的引用了,掌握了a1,就掌握了对象。 41 | 42 | ### 面向对象的基本概念: 43 | 44 | - 类 45 | - 实例 46 | - 变量 47 | - 方法 48 | 49 | 类、变量、方法 此前就已经介绍过了,对象是类的实例,拥有了对象,就拥有了类的所有。 50 | 51 | 但是并不是拥有了所有,因为还有 **访问修饰符** 52 | 53 | ### 访问修饰符: 54 | 55 | | 修饰词 | 本类 | 同一个包的类 | 继承类 | 其他类 | 56 | | ------------------- | ---- | ------------ | ------ | ------ | 57 | | public | √ | √ | √ | √ | 58 | | protected | √ | √ | √ | × | 59 | | default(无,默认) | √ | √ | × | × | 60 | | private | √ | × | × | × | 61 | 62 | 63 | 64 | 不同的修饰符有不同的访问限制,假如A类存在私有private的方法、变量,则在B类 中指向 `A a1 = new A`,那么 a1 是无法访问这些变量和方法的,它是私有的。 65 | 66 | 67 | 68 | ### 面向对象三大特性: 69 | 70 | - **封装** 71 | 72 | - **继承** 73 | 74 | - **多态** 75 | 76 | 可以说,面向对象的核心就是由这三大特性构成的,在Java的世界里,你可以理解为**万物皆对象**。 77 | 78 | > 所有的对象父类都是Object类 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /docs/articles/面向对象/picture/image-20210115123015487.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/面向对象/picture/image-20210115123015487.png -------------------------------------------------------------------------------- /docs/articles/面向对象/picture/image-2021011512304995811.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/面向对象/picture/image-2021011512304995811.png -------------------------------------------------------------------------------- /docs/articles/面向对象/picture/image-20210115123544141.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/articles/面向对象/picture/image-20210115123544141.png -------------------------------------------------------------------------------- /docs/js/docsify-copy-code.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * docsify-copy-code 3 | * v2.1.1 4 | * https://github.com/jperasmus/docsify-copy-code 5 | * (c) 2017-2020 JP Erasmus 6 | * MIT license 7 | */ 8 | !function(){"use strict";function s(o){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o})(o)}!function(o,e){void 0===e&&(e={});var t=e.insertAt;if(o&&"undefined"!=typeof document){var n=document.head||document.getElementsByTagName("head")[0],c=document.createElement("style");c.type="text/css","top"===t&&n.firstChild?n.insertBefore(c,n.firstChild):n.appendChild(c),c.styleSheet?c.styleSheet.cssText=o:c.appendChild(document.createTextNode(o))}}(".docsify-copy-code-button,.docsify-copy-code-button span{cursor:pointer;transition:all .25s ease}.docsify-copy-code-button{position:absolute;z-index:1;top:0;right:0;overflow:visible;padding:.65em .8em;border:0;border-radius:0;outline:0;font-size:1em;background:grey;background:var(--theme-color,grey);color:#fff;opacity:0}.docsify-copy-code-button span{border-radius:3px;background:inherit;pointer-events:none}.docsify-copy-code-button .error,.docsify-copy-code-button .success{position:absolute;z-index:-100;top:50%;right:0;padding:.5em .65em;font-size:.825em;opacity:0;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.docsify-copy-code-button.error .error,.docsify-copy-code-button.success .success{right:100%;opacity:1;-webkit-transform:translate(-115%,-50%);transform:translate(-115%,-50%)}.docsify-copy-code-button:focus,pre:hover .docsify-copy-code-button{opacity:1}"),document.querySelector('link[href*="docsify-copy-code"]')&&console.warn("[Deprecation] Link to external docsify-copy-code stylesheet is no longer necessary."),window.DocsifyCopyCodePlugin={init:function(){return function(o,e){o.ready(function(){console.warn("[Deprecation] Manually initializing docsify-copy-code using window.DocsifyCopyCodePlugin.init() is no longer necessary.")})}}},window.$docsify=window.$docsify||{},window.$docsify.plugins=[function(o,r){o.doneEach(function(){var o=Array.apply(null,document.querySelectorAll("pre[data-lang]")),c={buttonText:"Copy to clipboard",errorText:"Error",successText:"Copied"};r.config.copyCode&&Object.keys(c).forEach(function(t){var n=r.config.copyCode[t];"string"==typeof n?c[t]=n:"object"===s(n)&&Object.keys(n).some(function(o){var e=-1',''.concat(c.buttonText,""),''.concat(c.errorText,""),''.concat(c.successText,""),""].join("");o.forEach(function(o){o.insertAdjacentHTML("beforeend",e)})}),o.mounted(function(){document.querySelector(".content").addEventListener("click",function(o){if(o.target.classList.contains("docsify-copy-code-button")){var e="BUTTON"===o.target.tagName?o.target:o.target.parentNode,t=document.createRange(),n=e.parentNode.querySelector("code"),c=window.getSelection();t.selectNode(n),c.removeAllRanges(),c.addRange(t);try{document.execCommand("copy")&&(e.classList.add("success"),setTimeout(function(){e.classList.remove("success")},1e3))}catch(o){console.error("docsify-copy-code: ".concat(o)),e.classList.add("error"),setTimeout(function(){e.classList.remove("error")},1e3)}"function"==typeof(c=window.getSelection()).removeRange?c.removeRange(t):"function"==typeof c.removeAllRanges&&c.removeAllRanges()}})})}].concat(window.$docsify.plugins||[])}(); 9 | //# sourceMappingURL=docsify-copy-code.min.js.map 10 | -------------------------------------------------------------------------------- /docs/picture/20210311-HelloCoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/picture/20210311-HelloCoder.png -------------------------------------------------------------------------------- /docs/picture/HelloCoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/docs/picture/HelloCoder.png -------------------------------------------------------------------------------- /思维导图/.java文件.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/思维导图/.java文件.xmind -------------------------------------------------------------------------------- /思维导图/20210131Java学习路线公众号HelloCoder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/思维导图/20210131Java学习路线公众号HelloCoder.png -------------------------------------------------------------------------------- /思维导图/值传递和引用传递.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/思维导图/值传递和引用传递.vsdx -------------------------------------------------------------------------------- /思维导图/异常.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DogerRain/PureJavaCoderRoad/442b3afe46c31739aa5bd28901939d68cf597421/思维导图/异常.xmind --------------------------------------------------------------------------------