├── .nojekyll ├── 09~实践案例 └── README.md ├── 03~工程实践 ├── 模块化 │ └── README.md ├── 编码规约 │ ├── 常用规约 │ │ ├── 安全规约.md │ │ ├── 异常与日志规约.md │ │ ├── 性能规约.md │ │ ├── 测试规约.md │ │ └── 代码规约.md │ ├── .DS_Store │ ├── README.md │ └── P3C │ │ └── README.md ├── 界面编程 │ ├── JavaFX │ │ └── README.md │ └── .DS_Store ├── HTTP 库 │ ├── Apache HTTP │ │ └── README.md │ ├── OkHttp │ │ └── README.md │ └── README.md ├── 第三方库 │ ├── Guava │ │ └── 集合类 │ │ │ ├── README.md │ │ │ └── EvictingQueue.md │ ├── Apache Common │ │ └── README.md │ └── .DS_Store ├── 构建工具 │ ├── Gradle │ │ ├── 03.插件 │ │ │ └── 插件.md │ │ ├── README.md │ │ └── 01~快速开始 │ │ │ └── 安装配置.md │ ├── .DS_Store │ └── Maven │ │ ├── 依赖冲突 │ │ └── README.md │ │ └── README.md └── .DS_Store ├── INTRODUCTION.md ├── 01~语法基础 ├── 07~类与对象 │ ├── 对象 │ │ └── this.md │ ├── 类结构 │ │ └── Struct.md │ ├── 元编程 │ │ ├── README.md │ │ ├── 反射与注解 │ │ │ └── 反射.md │ │ └── OGNL.md │ ├── .DS_Store │ └── 泛型 │ │ └── README.md ├── 10~异常处理 │ └── 失败重试.md ├── 01~快速开始 │ ├── README.md │ └── 开发环境 │ │ ├── Jetbrains Idea.md │ │ └── README.md ├── 03~变量操作 │ └── README.md ├── 09~文件 IO │ ├── 文件处理 │ │ └── README.md │ ├── .DS_Store │ ├── 第三方工具 │ │ └── FileUtils.md │ └── README.md ├── .DS_Store ├── 08~函数式编程 │ ├── .DS_Store │ ├── Stream API │ │ └── 异常处理.md │ └── Lambda │ │ └── README.md ├── README.md └── 06~流程控制 │ └── README.md ├── 06~JVM 与性能优化 ├── 01.1~垃圾回收 │ ├── G1 │ │ └── README.md │ ├── 基本概念 │ │ ├── GC 算法 │ │ │ ├── 分代算法.md │ │ │ ├── 增量算法.md │ │ │ └── 并发算法.md │ │ └── README.md │ ├── ZGC │ │ └── README.md │ ├── CMS │ │ └── README.md │ └── .DS_Store ├── 01.0~内存管理 │ ├── 01~内存结构 │ │ ├── 05~直接内存.md │ │ └── 01~程序计数器.md │ ├── .DS_Store │ ├── 03~内存溢出与泄漏 │ │ └── README.md │ └── 02~内存分配 │ │ └── README.md ├── 03~性能调优 │ ├── README.md │ ├── 调试工具 │ │ ├── JProfiler │ │ │ └── README.md │ │ ├── Arthas │ │ │ ├── 热更新.md │ │ │ ├── README.md │ │ │ └── 99~参考资料 │ │ │ │ └── 2021~【死磕JVM】用 Arthas 排查 JVM 内存.md │ │ ├── 内置工具 │ │ │ └── README.md │ │ └── README.md │ └── .DS_Store ├── .DS_Store ├── 99~参考资料 │ ├── Java 生产环境下性能监控与调优详解 │ │ ├── codes │ │ │ └── monitor-tuning-master │ │ │ │ ├── src │ │ │ │ ├── main │ │ │ │ │ ├── resources │ │ │ │ │ │ └── application.properties │ │ │ │ │ └── java │ │ │ │ │ │ └── cn │ │ │ │ │ │ └── mrcode │ │ │ │ │ │ └── stady │ │ │ │ │ │ └── monitor_tuning │ │ │ │ │ │ ├── MonitorTuningApplication.java │ │ │ │ │ │ ├── chapter4 │ │ │ │ │ │ └── PrintJinfo.java │ │ │ │ │ │ └── chapter2 │ │ │ │ │ │ └── User.java │ │ │ │ └── test │ │ │ │ │ └── java │ │ │ │ │ └── cn │ │ │ │ │ └── mrcode │ │ │ │ │ └── stady │ │ │ │ │ └── monitor_tuning │ │ │ │ │ └── MonitorTuningApplicationTests.java │ │ │ │ ├── settings.gradle │ │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ │ ├── resttest │ │ │ │ ├── chapter2 │ │ │ │ │ └── generated-requests.http │ │ │ │ └── chapter4 │ │ │ │ │ └── generated-requests.http │ │ │ │ └── .gitignore │ │ └── README.md │ ├── .DS_Store │ └── 2016~《深入理解 Java 虚拟机》 │ │ ├── .DS_Store │ │ ├── 01~Java 内存管理机制 │ │ └── .DS_Store │ │ ├── 04~Java 程序运行优化 │ │ └── .DS_Store │ │ ├── 02~Java 虚拟机程序执行 │ │ └── .DS_Store │ │ └── 03~虚拟机性能监控及故障处理 │ │ └── .DS_Store ├── 04~运行时 │ └── AOP │ │ └── README.md ├── 02~程序编译 │ ├── README.md │ └── JIT │ │ └── README.md ├── 02~类与加载器 │ ├── 类加载流程.md │ └── README.md ├── 10~JDK │ ├── README.md │ └── OpenJDK.md └── README.md ├── 02~核心类库 ├── 05~空处理 │ └── README.md ├── 10~集合类型 │ ├── Queue │ │ └── README.md │ ├── Map │ │ └── HashTable │ │ │ └── README.md │ └── List │ │ └── README.md ├── 03~时间与日期 │ └── README.md ├── 20~序列化 │ └── Json │ │ └── FastJson │ │ └── README.md ├── 01~数值类型 │ └── 随机数.md ├── 04~数组 │ └── README.md ├── 04~类型系统 │ ├── 引用类型.md │ └── README.md ├── 21~Object Mapping │ └── README.md └── README.md ├── 10~方言 ├── 10~Scala │ ├── 函数 │ │ └── README.md │ ├── 数据结构 │ │ └── README.md │ ├── .DS_Store │ ├── 类与对象 │ │ └── README.md │ └── README.md └── 20~Clojure │ └── README.link ├── 00~Java 简史 └── 版本特性 │ ├── Java 10 │ └── Java 10.md │ ├── Java 15 │ └── Java 15.md │ └── Java 21 │ └── 99~参考资料 │ └── 2023~Java 21: The Nice, The Meh, and the ... Momentous.md ├── 04~并发编程 ├── README.link └── .DS_Store ├── .DS_Store ├── 99~参考资料 ├── .DS_Store ├── 《Think in Java》 │ ├── .DS_Store │ ├── 07~多态性 │ │ ├── 7-1.gif │ │ ├── 7-2.gif │ │ ├── 7-3.gif │ │ ├── 7-4.gif │ │ ├── 7-5.gif │ │ ├── 7-6.gif │ │ ├── 7-7.gif │ │ ├── 7-8.gif │ │ ├── 7-9.gif │ │ ├── 7-10.gif │ │ ├── 7.10 练习.md │ │ ├── 7.9 总结.md │ │ └── README.md │ ├── 01~对象入门 │ │ ├── 1-1.gif │ │ ├── 1-2.gif │ │ ├── 1.10 永久性.md │ │ └── 1.4 方案的重复使用.md │ ├── 08~对象的容纳 │ │ ├── 8-1.gif │ │ ├── README.md │ │ └── 8.6 通用集合库.md │ ├── 16~设计范式 │ │ ├── 16-1.gif │ │ ├── 16-2.gif │ │ ├── 16-3.gif │ │ ├── 16-4.gif │ │ ├── 16.10 练习.md │ │ └── README.md │ ├── 11~运行期类型鉴定 │ │ ├── 11-1.gif │ │ ├── README.md │ │ └── 11.5 练习.md │ ├── 17~项目 │ │ ├── README.md │ │ ├── 17.4 总结.md │ │ └── 17.5 练习.md │ ├── 03~控制程序流程 │ │ ├── 3.3 总结.md │ │ ├── README.md │ │ └── 3.4 练习.md │ ├── 02~一切都是对象 │ │ ├── 2.10 总结.md │ │ ├── 2.11 练习.md │ │ ├── README.md │ │ └── 2.9 编码样式.md │ ├── 09~异常差错控制 │ │ ├── 9.9 总结.md │ │ └── 9.10 练习.md │ ├── 06~类再生 │ │ ├── 6.11 练习.md │ │ ├── 6.10 总结.md │ │ ├── README.md │ │ └── 6.6 累积开发.md │ ├── 04~初始化和清除 │ │ ├── README.md │ │ ├── 4.7 练习.md │ │ └── 4.6 总结.md │ ├── 15~网络编程 │ │ ├── 15.9 总结.md │ │ ├── README.md │ │ └── 15.10 练习.md │ ├── .gitignore │ ├── 05~隐藏实施过程 │ │ └── 5.6 练习.md │ ├── 12~传递和返回对象 │ │ └── README.md │ ├── 14~多线程 │ │ └── README.md │ └── README.md ├── 2022~阿里巴巴~《Java 开发手册》~黄山版.pdf ├── 2021~极客时间~《Java 业务开发常见错误 100 例》 │ ├── codes │ │ ├── mysql-init │ │ │ └── init.sql │ │ ├── src │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── geekbang │ │ │ │ │ └── time │ │ │ │ │ └── commonmistakes │ │ │ │ │ ├── oom │ │ │ │ │ ├── impropermaxheadersize │ │ │ │ │ │ ├── good.properties │ │ │ │ │ │ ├── bad.properties │ │ │ │ │ │ └── CommonMistakesApplicationBad.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── usernameautocomplete │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── UserDTO.java │ │ │ │ │ ├── groovyoom │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── weakhashmapoom │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── concurrenttool │ │ │ │ │ ├── threadlocal │ │ │ │ │ │ ├── tomcat.properties │ │ │ │ │ │ ├── Jietu20200710-113641.jpg │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── copyonwritelistmisuse │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── concurrenthashmapmisuse │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── concurrenthashmapperformance │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── connectionpool │ │ │ │ │ ├── datasource │ │ │ │ │ │ ├── bad.properties │ │ │ │ │ │ ├── good.properties │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── User.java │ │ │ │ │ │ ├── CommonMistakesApplicationBad.java │ │ │ │ │ │ └── CommonMistakesApplicationGood.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── twotimeoutconfig │ │ │ │ │ │ ├── hikari.properties │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ └── User.java │ │ │ │ │ ├── jedis │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── httpclient │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── httpinvoke │ │ │ │ │ ├── feignandribbontimout │ │ │ │ │ │ ├── default.properties │ │ │ │ │ │ ├── ribbon.properties │ │ │ │ │ │ ├── feign.properties │ │ │ │ │ │ ├── Client.java │ │ │ │ │ │ └── AutoConfig.java │ │ │ │ │ ├── feignpermethodtimeout │ │ │ │ │ │ ├── default.properties │ │ │ │ │ │ ├── AutoConfig.java │ │ │ │ │ │ └── Client.java │ │ │ │ │ ├── ribbonretry │ │ │ │ │ │ ├── default-ribbon.properties │ │ │ │ │ │ ├── noretry-ribbon.properties │ │ │ │ │ │ ├── AutoConfig.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── routelimit │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── clientreadtimeout │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── serialization │ │ │ │ │ ├── jsonignoreproperties │ │ │ │ │ │ ├── jackson.properties │ │ │ │ │ │ ├── UserWrong.java │ │ │ │ │ │ └── UserRight.java │ │ │ │ │ ├── enumusedinapi │ │ │ │ │ │ └── jackson.properties │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── mybatisjson │ │ │ │ │ │ ├── Info.java │ │ │ │ │ │ ├── JsonTestMapper.java │ │ │ │ │ │ ├── InfoListTypeHandler.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── serialversionissue │ │ │ │ │ │ ├── User.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── redistemplate │ │ │ │ │ │ └── User.java │ │ │ │ │ └── deserializationconstructor │ │ │ │ │ │ ├── APIResultWrong.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── springpart2 │ │ │ │ │ ├── aopfeign │ │ │ │ │ │ ├── feign.properties │ │ │ │ │ │ ├── feign │ │ │ │ │ │ │ ├── Client.java │ │ │ │ │ │ │ └── ClientWithUrl.java │ │ │ │ │ │ ├── Config.java │ │ │ │ │ │ ├── WrongAspect.java │ │ │ │ │ │ ├── Wrong2Aspect.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── readme.md │ │ │ │ │ └── custompropertysource │ │ │ │ │ │ └── db.properties │ │ │ │ │ ├── apidesign │ │ │ │ │ ├── apiresponse │ │ │ │ │ │ ├── config.properties │ │ │ │ │ │ ├── APIResponse.java │ │ │ │ │ │ ├── OrderInfo.java │ │ │ │ │ │ ├── NoAPIResponse.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── apiasyncsyncmode │ │ │ │ │ │ ├── UploadRequest.java │ │ │ │ │ │ ├── AsyncUploadRequest.java │ │ │ │ │ │ ├── SyncUploadRequest.java │ │ │ │ │ │ ├── AsyncUploadResponse.java │ │ │ │ │ │ ├── UploadResponse.java │ │ │ │ │ │ ├── SyncUploadResponse.java │ │ │ │ │ │ ├── SyncQueryUploadTaskRequest.java │ │ │ │ │ │ ├── SyncQueryUploadTaskResponse.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── apiversion │ │ │ │ │ │ └── APIVersion.java │ │ │ │ │ └── headerapiversion │ │ │ │ │ │ └── APIVersion.java │ │ │ │ │ ├── dataandcode │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── sqlinject │ │ │ │ │ │ ├── UserData.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── xss │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ └── User.java │ │ │ │ │ └── codeinject │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── sensitivedata │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── storeidcard │ │ │ │ │ │ ├── CipherResult.java │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── CipherRepository.java │ │ │ │ │ │ ├── CipherData.java │ │ │ │ │ │ └── UserData.java │ │ │ │ │ └── storepassword │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── UserData.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── lock │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── lockandtransaction │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── lockscope │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── Data.java │ │ │ │ │ ├── deadlock │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── lockgranularity │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── springpart1 │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── beansingletonandorder │ │ │ │ │ │ ├── TestA.java │ │ │ │ │ │ ├── TestB.java │ │ │ │ │ │ ├── TestD.java │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── TestC.java │ │ │ │ │ └── aopmetrics │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ ├── TestController.java │ │ │ │ │ │ └── UserEntity.java │ │ │ │ │ ├── logging │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── placeholder │ │ │ │ │ │ ├── log4j2api_to_slf4j_to_logack.jpg │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── mdc │ │ │ │ │ │ ├── LoggingController.java │ │ │ │ │ │ └── logback.xml │ │ │ │ │ ├── async │ │ │ │ │ │ ├── MySlowAppender.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── duplicate │ │ │ │ │ │ ├── loggerright1.xml │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ ├── loggerwrong.xml │ │ │ │ │ │ └── LoggingController.java │ │ │ │ │ ├── nullvalue │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── pojonull │ │ │ │ │ │ ├── UserDto.java │ │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ │ ├── UserEntityRepository.java │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── User.java │ │ │ │ │ ├── dbnull │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── User.java │ │ │ │ │ └── avoidnullpointerexception │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── redundantcode │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── reflection │ │ │ │ │ │ ├── right │ │ │ │ │ │ │ ├── AbstractAPI.java │ │ │ │ │ │ │ ├── BankAPI.java │ │ │ │ │ │ │ ├── BankAPIField.java │ │ │ │ │ │ │ ├── PayAPI.java │ │ │ │ │ │ │ └── CreateUserAPI.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── templatemethod │ │ │ │ │ │ ├── Item.java │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── Cart.java │ │ │ │ │ └── beancopy │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── asyncprocess │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── deadletter │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── Consts.java │ │ │ │ │ ├── fanoutvswork │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── rabbitmqdlx │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── compensation │ │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ │ └── User.java │ │ │ │ │ ├── productionready │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── metrics │ │ │ │ │ │ ├── influxdb.properties │ │ │ │ │ │ ├── Consts.java │ │ │ │ │ │ └── Order.java │ │ │ │ │ ├── info │ │ │ │ │ │ ├── actuator.properties │ │ │ │ │ │ └── User.java │ │ │ │ │ └── health │ │ │ │ │ │ ├── actuator.properties │ │ │ │ │ │ └── User.java │ │ │ │ │ ├── datetime │ │ │ │ │ ├── readme.md │ │ │ │ │ └── mysql │ │ │ │ │ │ ├── test.sql │ │ │ │ │ │ └── TimeRepository.java │ │ │ │ │ ├── securitylastdefense │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── preventduplicatepay │ │ │ │ │ │ ├── PayChannel.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── prventcouponfarming │ │ │ │ │ │ ├── Coupon.java │ │ │ │ │ │ ├── CouponBatch.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── preventsmshijack │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── troubleshootingtools │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── arthas │ │ │ │ │ │ └── User.java │ │ │ │ │ └── mat │ │ │ │ │ │ └── FooService.java │ │ │ │ │ ├── clientdata │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── trustclientcalculation │ │ │ │ │ │ ├── Db.java │ │ │ │ │ │ ├── CreateOrderRequest.java │ │ │ │ │ │ ├── Item.java │ │ │ │ │ │ ├── Order.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── trustclientuserid │ │ │ │ │ │ └── LoginRequired.java │ │ │ │ │ ├── trustclientparameter │ │ │ │ │ │ ├── Country.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── trustclientip │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── collection │ │ │ │ │ └── readme.md │ │ │ │ │ ├── java8 │ │ │ │ │ ├── StreamTrace.jpg │ │ │ │ │ ├── completablefuture │ │ │ │ │ │ ├── User.java │ │ │ │ │ │ └── Merchant.java │ │ │ │ │ ├── readme.md │ │ │ │ │ └── OrderItem.java │ │ │ │ │ ├── nosqluse │ │ │ │ │ ├── esvsmyql │ │ │ │ │ │ ├── es.properties │ │ │ │ │ │ ├── NewsMySQLRepository.java │ │ │ │ │ │ └── NewsESRepository.java │ │ │ │ │ └── readme.md │ │ │ │ │ ├── sqlindex │ │ │ │ │ ├── coveringindex.jpg │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── notuseindex.sql │ │ │ │ │ ├── init.sql │ │ │ │ │ ├── optimizer_trace.sql │ │ │ │ │ └── indexcost.sql │ │ │ │ │ ├── io │ │ │ │ │ └── readme.md │ │ │ │ │ ├── numeralcalculations │ │ │ │ │ └── readme.md │ │ │ │ │ ├── cachedesign │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── cacheinvalid │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── cacheconcurrent │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── cachepenetration │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── advancedfeatures │ │ │ │ │ ├── readme.md │ │ │ │ │ └── annotationinheritance │ │ │ │ │ │ └── MyAnnotation.java │ │ │ │ │ ├── threadpool │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── threadpooloom │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── threadpoolreuse │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── threadpoolmixuse │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── equals │ │ │ │ │ ├── differentclassloaderequals │ │ │ │ │ │ └── Point.java │ │ │ │ │ ├── intandstringequal │ │ │ │ │ │ ├── OrderQuery.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── compareto │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── lombokequals │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── equalitymethod │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── exception │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── stacktrace │ │ │ │ │ │ └── MyPerformanceException.java │ │ │ │ │ ├── handleexception │ │ │ │ │ │ ├── APIResponse.java │ │ │ │ │ │ ├── BusinessException.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── predefinedexception │ │ │ │ │ │ ├── Exceptions.java │ │ │ │ │ │ ├── BusinessException.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── finallyissue │ │ │ │ │ │ ├── TestResource.java │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── threadpoolandexception │ │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ └── transaction │ │ │ │ │ ├── nested │ │ │ │ │ ├── UserData.java │ │ │ │ │ └── UserDataMapper.java │ │ │ │ │ ├── readme.md │ │ │ │ │ ├── programmingtransaction │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ │ ├── transactionpropagation │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ ├── CommonMistakesApplication.java │ │ │ │ │ └── UserEntity.java │ │ │ │ │ ├── transactionproxyfailed │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ └── UserEntity.java │ │ │ │ │ └── transactionrollbackfailed │ │ │ │ │ ├── UserRepository.java │ │ │ │ │ └── CommonMistakesApplication.java │ │ │ │ ├── resources │ │ │ │ ├── .news.csv │ │ │ │ ├── .DS_Store │ │ │ │ └── templates │ │ │ │ │ ├── xss.html │ │ │ │ │ └── index.html │ │ │ │ └── .DS_Store │ │ └── .gitignore │ ├── Java 业务开发常见错误 100 例.xmind │ └── README.md └── 《On Java 8》 │ └── Appendix-Benefits-and-Costs-of-Static-Type-Checking.md ├── 05~设计模式 ├── 99~参考资料 │ └── 景彬~Java 23 种设计模式全归纳 │ │ └── README.md └── README.md └── .gitattributes /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /09~实践案例/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/模块化/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/编码规约/常用规约/安全规约.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/编码规约/常用规约/异常与日志规约.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/编码规约/常用规约/性能规约.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/编码规约/常用规约/测试规约.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /INTRODUCTION.md: -------------------------------------------------------------------------------- 1 | # 本篇导读 2 | -------------------------------------------------------------------------------- /03~工程实践/界面编程/JavaFX/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/对象/this.md: -------------------------------------------------------------------------------- 1 | # this 2 | -------------------------------------------------------------------------------- /01~语法基础/10~异常处理/失败重试.md: -------------------------------------------------------------------------------- 1 | # 失败重试 2 | -------------------------------------------------------------------------------- /03~工程实践/HTTP 库/Apache HTTP/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/G1/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /01~语法基础/01~快速开始/README.md: -------------------------------------------------------------------------------- 1 | # Java 快速开始 2 | -------------------------------------------------------------------------------- /01~语法基础/03~变量操作/README.md: -------------------------------------------------------------------------------- 1 | # Java 变量 2 | -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/类结构/Struct.md: -------------------------------------------------------------------------------- 1 | # Struct 2 | -------------------------------------------------------------------------------- /01~语法基础/09~文件 IO/文件处理/README.md: -------------------------------------------------------------------------------- 1 | # 文件系统 2 | -------------------------------------------------------------------------------- /02~核心类库/05~空处理/README.md: -------------------------------------------------------------------------------- 1 | # Java 中空类型及处理 2 | -------------------------------------------------------------------------------- /02~核心类库/10~集合类型/Queue/README.md: -------------------------------------------------------------------------------- 1 | # Queue 2 | -------------------------------------------------------------------------------- /03~工程实践/第三方库/Guava/集合类/README.md: -------------------------------------------------------------------------------- 1 | # 集合类 2 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.0~内存管理/01~内存结构/05~直接内存.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/基本概念/GC 算法/分代算法.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/基本概念/GC 算法/增量算法.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/基本概念/GC 算法/并发算法.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /10~方言/10~Scala/函数/README.md: -------------------------------------------------------------------------------- 1 | # Scala 函数 2 | -------------------------------------------------------------------------------- /10~方言/10~Scala/数据结构/README.md: -------------------------------------------------------------------------------- 1 | # 数据结构 2 | -------------------------------------------------------------------------------- /00~Java 简史/版本特性/Java 10/Java 10.md: -------------------------------------------------------------------------------- 1 | # Java 10 2 | -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/元编程/README.md: -------------------------------------------------------------------------------- 1 | # Java 元编程 2 | -------------------------------------------------------------------------------- /02~核心类库/03~时间与日期/README.md: -------------------------------------------------------------------------------- 1 | # Java 中时间与日期 2 | -------------------------------------------------------------------------------- /03~工程实践/HTTP 库/OkHttp/README.md: -------------------------------------------------------------------------------- 1 | # OkHttp 2 | -------------------------------------------------------------------------------- /03~工程实践/HTTP 库/README.md: -------------------------------------------------------------------------------- 1 | # 基于 HTTP 的网络请求 2 | -------------------------------------------------------------------------------- /03~工程实践/构建工具/Gradle/03.插件/插件.md: -------------------------------------------------------------------------------- 1 | # Gradle 插件 2 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/ZGC/README.md: -------------------------------------------------------------------------------- 1 | # ZGC 2 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/README.md: -------------------------------------------------------------------------------- 1 | # Java 性能调优 2 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/JProfiler/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /03~工程实践/第三方库/Apache Common/README.md: -------------------------------------------------------------------------------- 1 | # Apache Common 2 | -------------------------------------------------------------------------------- /03~工程实践/编码规约/常用规约/代码规约.md: -------------------------------------------------------------------------------- 1 | # 代码规约 2 | 3 | # 浮点类型处理 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/CMS/README.md: -------------------------------------------------------------------------------- 1 | # CMS 2 | 3 | # CMS 的工作阶段 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/Arthas/热更新.md: -------------------------------------------------------------------------------- 1 | # 热更新 2 | 3 | # Links 4 | -------------------------------------------------------------------------------- /04~并发编程/README.link: -------------------------------------------------------------------------------- 1 | https://github.com/wx-chevalier/Java-Concurrent-Notes -------------------------------------------------------------------------------- /10~方言/20~Clojure/README.link: -------------------------------------------------------------------------------- 1 | https://github.com/wx-chevalier/Clojure-Notes 2 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/.DS_Store -------------------------------------------------------------------------------- /02~核心类库/20~序列化/Json/FastJson/README.md: -------------------------------------------------------------------------------- 1 | # FastJson 2 | 3 | FastJson 上由阿里的一位工程师开发并开源的。 4 | -------------------------------------------------------------------------------- /01~语法基础/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/01~语法基础/.DS_Store -------------------------------------------------------------------------------- /03~工程实践/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/03~工程实践/.DS_Store -------------------------------------------------------------------------------- /04~并发编程/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/04~并发编程/.DS_Store -------------------------------------------------------------------------------- /99~参考资料/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/.DS_Store -------------------------------------------------------------------------------- /03~工程实践/构建工具/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/03~工程实践/构建工具/.DS_Store -------------------------------------------------------------------------------- /03~工程实践/界面编程/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/03~工程实践/界面编程/.DS_Store -------------------------------------------------------------------------------- /03~工程实践/第三方库/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/03~工程实践/第三方库/.DS_Store -------------------------------------------------------------------------------- /03~工程实践/编码规约/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/03~工程实践/编码规约/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/.DS_Store -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/01~语法基础/07~类与对象/.DS_Store -------------------------------------------------------------------------------- /01~语法基础/08~函数式编程/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/01~语法基础/08~函数式编程/.DS_Store -------------------------------------------------------------------------------- /01~语法基础/09~文件 IO/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/01~语法基础/09~文件 IO/.DS_Store -------------------------------------------------------------------------------- /02~核心类库/01~数值类型/随机数.md: -------------------------------------------------------------------------------- 1 | # 随机数 2 | 3 | # Links 4 | 5 | - https://mp.weixin.qq.com/s/AMhKbZwVolPjS0Yu02ZF4w 6 | -------------------------------------------------------------------------------- /10~方言/10~Scala/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/10~方言/10~Scala/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/03~性能调优/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/.DS_Store -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/元编程/反射与注解/反射.md: -------------------------------------------------------------------------------- 1 | # 反射 2 | 3 | # Links 4 | 5 | - https://www.zhihu.com/question/24304289/answer/694344906 6 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.0~内存管理/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/01.0~内存管理/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/01.1~垃圾回收/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'monitor-tuning' 2 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/.DS_Store -------------------------------------------------------------------------------- /05~设计模式/99~参考资料/景彬~Java 23 种设计模式全归纳/README.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://github.com/youlookwhat/DesignPattern) 2 | 3 | # Java 23 种设计模式全归纳 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/Arthas/README.md: -------------------------------------------------------------------------------- 1 | # Arthas 2 | 3 | # Links 4 | 5 | - https://mp.weixin.qq.com/s/V2FqWVajSbeheuge7DQB8A 6 | -------------------------------------------------------------------------------- /99~参考资料/2022~阿里巴巴~《Java 开发手册》~黄山版.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2022~阿里巴巴~《Java 开发手册》~黄山版.pdf -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-1.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-2.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-3.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-4.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-5.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-6.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-7.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-8.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-9.gif -------------------------------------------------------------------------------- /00~Java 简史/版本特性/Java 15/Java 15.md: -------------------------------------------------------------------------------- 1 | # Java 15 特性 2 | 3 | # Links 4 | 5 | - https://mp.weixin.qq.com/s/DLkIZhoGd3TNrSpdJn2rLg 超详细 Java 15 新功能介绍 -------------------------------------------------------------------------------- /03~工程实践/构建工具/Maven/依赖冲突/README.md: -------------------------------------------------------------------------------- 1 | # Java 依赖冲突解决 2 | 3 | # Links 4 | 5 | - https://mp.weixin.qq.com/s/0G5kLzz8Mtwf2hchB8ba7A Java依赖冲突高效解决之道 -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/01~对象入门/1-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/01~对象入门/1-1.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/01~对象入门/1-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/01~对象入门/1-2.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7-10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/07~多态性/7-10.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/08~对象的容纳/8-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/08~对象的容纳/8-1.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/16-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/16~设计范式/16-1.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/16-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/16~设计范式/16-2.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/16-3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/16~设计范式/16-3.gif -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/16-4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/16~设计范式/16-4.gif -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/README.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://zq99299.github.io/note-book2/monitor-tuning/) 2 | 3 | # Java 生产环境下性能监控与调优详解 4 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/11~运行期类型鉴定/11-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/《Think in Java》/11~运行期类型鉴定/11-1.gif -------------------------------------------------------------------------------- /03~工程实践/编码规约/README.md: -------------------------------------------------------------------------------- 1 | # Java 编码规约 2 | 3 | 编码规约的目的,一是为了提供团队协作的效率,统一团队内标准,提升沟通效率和研发效能;二是为了提升系统整体质量,防患于未然,降低故障率。编程规约从包含的知识点上,主要是对于常见的易错点进行归纳与再次强调。 4 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.xmind filter=lfs diff=lfs merge=lfs -text 2 | *.zip filter=lfs diff=lfs merge=lfs -text 3 | *.pdf filter=lfs diff=lfs merge=lfs -text 4 | -------------------------------------------------------------------------------- /00~Java 简史/版本特性/Java 21/99~参考资料/2023~Java 21: The Nice, The Meh, and the ... Momentous.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://horstmann.com/unblog/2023-09-19/index.html) 2 | -------------------------------------------------------------------------------- /02~核心类库/10~集合类型/Map/HashTable/README.md: -------------------------------------------------------------------------------- 1 | # HashTable 2 | 3 | # Links 4 | 5 | - https://blog.csdn.net/justloveyou_/article/details/72862373 彻头彻尾理解 HashTable 6 | -------------------------------------------------------------------------------- /03~工程实践/第三方库/Guava/集合类/EvictingQueue.md: -------------------------------------------------------------------------------- 1 | # EvictingQueue 2 | 3 | # Links 4 | 5 | - https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue 6 | -------------------------------------------------------------------------------- /05~设计模式/README.md: -------------------------------------------------------------------------------- 1 | # Java 2 | 3 | 本篇是面向对象的设计模式的 Java 版本代码实现的配套介绍文档,其主要内容合并到了《[DesignPattern-Notes](https://github.com/wx-chevalier/DesignPattern-Notes?q=)》。 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/.DS_Store -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/mysql-init/init.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE IF NOT EXISTS common_mistakes DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/impropermaxheadersize/good.properties: -------------------------------------------------------------------------------- 1 | server.tomcat.max-threads=400 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/threadlocal/tomcat.properties: -------------------------------------------------------------------------------- 1 | server.tomcat.max-threads=10 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/resources/.news.csv: -------------------------------------------------------------------------------- 1 | https://github.com/JosephZhu1983/java-common-mistakes/raw/master/src/main/resources/news.csv -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/17~项目/README.md: -------------------------------------------------------------------------------- 1 | # 第 17 章 项目 2 | 3 | 本章包含了一系列项目,它们都以本书介绍的内容为基础,并对早期的章节进行了一定程度的扩充。 4 | 5 | 与以前经历过的项目相比,这儿的大多数项目都明显要复杂得多,它们充分演示了新技术以及类库的运用。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/bad.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.hikari.register-mbeans=true -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/03~控制程序流程/3.3 总结.md: -------------------------------------------------------------------------------- 1 | # 3.3 总结 2 | 3 | 本章总结了大多数程序设计语言都具有的基本特性:计算、运算符优先顺序、类型转换以及选择和循环等等。现在,我们作好了相应的准备,可继续向面向对象的程序设计领域迈进。在下一章里,我们将讨论对象的初始化与清除问题,再后面则讲述隐藏的基本实现方法。 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/04~运行时/AOP/README.md: -------------------------------------------------------------------------------- 1 | # AOP Dynamic Tracing 2 | 3 | Quasar 是基于字节码 Instrumentation 技术的栈实现,需要使用者手工标注哪些方法是在协程中使用的,无疑会增加开发难度。此外,在 Quasar 的协程中无法使用第三方库,除非对于第三方库的所有类的方法都进行一遍审查和标注。 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/01~Java 内存管理机制/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/01~Java 内存管理机制/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/04~Java 程序运行优化/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/04~Java 程序运行优化/.DS_Store -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/Java 业务开发常见错误 100 例.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/Java 业务开发常见错误 100 例.xmind -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/.DS_Store -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignandribbontimout/default.properties: -------------------------------------------------------------------------------- 1 | clientsdk.ribbon.listOfServers=localhost:45679 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignpermethodtimeout/default.properties: -------------------------------------------------------------------------------- 1 | clientsdk.ribbon.listOfServers=localhost:45678 -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/02~Java 虚拟机程序执行/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/02~Java 虚拟机程序执行/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/03~虚拟机性能监控及故障处理/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/2016~《深入理解 Java 虚拟机》/03~虚拟机性能监控及故障处理/.DS_Store -------------------------------------------------------------------------------- /06~JVM 与性能优化/02~程序编译/README.md: -------------------------------------------------------------------------------- 1 | # Java 程序编译 2 | 3 | ![编译过程](https://s2.ax1x.com/2020/02/04/1DZdKK.png) 4 | 5 | ![虚拟机执行](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/item/20230417213515.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/ribbonretry/default-ribbon.properties: -------------------------------------------------------------------------------- 1 | SmsClient.ribbon.listOfServers=localhost:45679,localhost:45678 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/impropermaxheadersize/bad.properties: -------------------------------------------------------------------------------- 1 | server.max-http-header-size=10000000 2 | server.tomcat.max-threads=400 -------------------------------------------------------------------------------- /03~工程实践/编码规约/P3C/README.md: -------------------------------------------------------------------------------- 1 | # 阿里云 Java 开发手册 2 | 3 | # Links 4 | 5 | - https://github.com/alibaba/p3c/blob/master/Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E5%B5%A9%E5%B1%B1%E7%89%88%EF%BC%89.pdf 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/jsonignoreproperties/jackson.properties: -------------------------------------------------------------------------------- 1 | #spring.jackson.serialization.write_enums_using_index=true -------------------------------------------------------------------------------- /02~核心类库/04~数组/README.md: -------------------------------------------------------------------------------- 1 | # Java 数组 2 | 3 | 数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同。Java 语言中提供的数组是用来存储固定大小的同类型元素。 4 | 5 | 你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 `number0,number1,....,number99`。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/resources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/resources/.DS_Store -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/feign.properties: -------------------------------------------------------------------------------- 1 | client.ribbon.listOfServers=localhost:45678 2 | #spring.aop.proxy-target-class=false -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/config.properties: -------------------------------------------------------------------------------- 1 | spring.mvc.throw-exception-if-no-handler-found=true 2 | spring.resources.add-mappings=false -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/enumusedinapi/jackson.properties: -------------------------------------------------------------------------------- 1 | spring.jackson.deserialization.read_unknown_enum_values_using_default_value=true -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/readme.md: -------------------------------------------------------------------------------- 1 | ## 数据和代码:数据就是数据,代码就是代码 2 | - SQL注入能干的事情比你想象的多:sqlinject 3 | - 小心动态执行代码时代码注入漏洞:codeinject 4 | - XSS必须全方位严防死堵:xss -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/readme.md: -------------------------------------------------------------------------------- 1 | ## 敏感数据:如何正确保存和传输敏感数据? 2 | - 应该怎样保存用户密码呢?:storepassword 3 | - 应该怎么保存姓名和身份证呢?:storeidcard 4 | - 用一张图说清楚HTTPS:N/A -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/16.10 练习.md: -------------------------------------------------------------------------------- 1 | # 16.10 练习 2 | 3 | (1) 将 SingletonPattern.java 作为起点,创建一个类,用它管理自己固定数量的对象。 4 | 5 | (2) 为 TrashVisitor.java 添加一个名为 Plastic(塑料)的类。 6 | 7 | (3) 为 DynaTrash.java 同样添加一个 Plastic(塑料)类。 8 | -------------------------------------------------------------------------------- /01~语法基础/08~函数式编程/Stream API/异常处理.md: -------------------------------------------------------------------------------- 1 | # 异常处理 2 | 3 | 可以在 lambda 中做一个简单的 try-catch 并将异常包装成一个 RuntimeException: 4 | 5 | ```java 6 | 7 | ``` 8 | 9 | # Links 10 | 11 | - https://mp.weixin.qq.com/s/Acd2PKQK3fkXHcjJduNPNQ 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/good.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.hikari.maximum-pool-size=50 2 | spring.datasource.hikari.register-mbeans=true -------------------------------------------------------------------------------- /01~语法基础/01~快速开始/开发环境/Jetbrains Idea.md: -------------------------------------------------------------------------------- 1 | # IDEA 2 | 3 | # Links 4 | 5 | - https://mp.weixin.qq.com/s/_jqWd9YQBmIzyrqL4Mum4Q?from=groupmessage&isappinstalled=0 6 | - https://zhuanlan.zhihu.com/p/393258908 IntelliJ idea 高效使用教程,一劳永逸! 7 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/Arthas/99~参考资料/2021~【死磕JVM】用 Arthas 排查 JVM 内存.md: -------------------------------------------------------------------------------- 1 | > DocId: Yj0mm8ER6dIfKQ 2 | 3 | ```md 4 | !!WIP!! 5 | 原文地址: https://www.cnblogs.com/mingyueyy/p/14764322.html 6 | ``` 7 | 8 | # 【死磕 JVM】用 Arthas 排查 JVM 内存 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/readme.md: -------------------------------------------------------------------------------- 1 | ## 代码加锁:不要让“锁”事成为烦心事 2 | - 加锁前要清楚锁和被保护的对象是不是一个层面的:lockscope 3 | - 加锁要考虑锁的粒度和场景问题:lockgranularity 4 | - 多把锁要小心死锁问题:deadlock 5 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/readme.md: -------------------------------------------------------------------------------- 1 | ## Spring框架:IoC和AOP是扩展的核心 2 | - 单例的Bean如何注入Prototype的Bean?:beansingletonandorder 3 | - 监控切面因为顺序问题导致Spring事务失效:aopmetrics -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/README.md: -------------------------------------------------------------------------------- 1 | > [原文地址](https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/Java%20%E4%B8%9A%E5%8A%A1%E5%BC%80%E5%8F%91%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF%20100%20%E4%BE%8B) 2 | 3 | # Java 业务开发常见错误 100 例 4 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/readme.md: -------------------------------------------------------------------------------- 1 | ## 日志:日志记录真没你想象的那么简单 2 | - 为什么我的日志会重复记录?:duplicate 3 | - 使用异步日志改善性能的坑:async 4 | - 使用日志占位符就不需要进行日志级别判断了:placeholder 5 | -(补充)MDC:mdc 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/readme.md: -------------------------------------------------------------------------------- 1 | ## 空值处理:分不清楚的null和恼人的空指针 2 | - 修复和定位恼人的空指针问题:avoidnullpointerexception 3 | - POJO中属性的null到底代表了什么?:pojonull 4 | - 小心数据库NULL字段的三个坑:dbnull 5 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/readme.md: -------------------------------------------------------------------------------- 1 | ## 代码重复:搞定代码重复的三个绝招 2 | - 利用工厂模式+模板方法模式,消除if...else和重复代码:templatemethod 3 | - 利用注解+反射消除重复代码:reflection 4 | - 利用属性拷贝工具消除重复代码:beancopy 5 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/03~控制程序流程/README.md: -------------------------------------------------------------------------------- 1 | # 第 3 章 控制程序流程 2 | 3 | “就象任何有感知的生物一样,程序必须能操纵自己的世界,在执行过程中作出判断与选择。” 4 | 5 | 在 Java 里,我们利用运算符操纵对象和数据,并用执行控制语句作出选择。Java 是建立在 C++基础上的,所以对 C 和 C++程序员来说,对 Java 这方面的大多数语句和运算符都应是非常熟悉的。当然,Java 也进行了自己的一些改进与简化工作。 6 | -------------------------------------------------------------------------------- /02~核心类库/04~类型系统/引用类型.md: -------------------------------------------------------------------------------- 1 | # 引用类型 2 | 3 | 在 Java 中,引用类型的变量非常类似于 C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。对象、数组都是引用数据类型,所有引用类型的默认值都是 null;一个引用变量可以用来引用任何与之兼容的类型。 4 | 5 | 例子:Site site = new Site("Runoob")。 6 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/readme.md: -------------------------------------------------------------------------------- 1 | ## 异步处理好用,但非常容易用错 2 | - 异步处理需要消息补偿闭环:compensation 3 | - 注意消息模式是广播还是工作队列:fanoutvswork 4 | - 别让死信堵塞了消息队列:deadletter 5 | - (补充)使用RMQ的DLX实现延迟重试:rabbitmqdlx -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/readme.md: -------------------------------------------------------------------------------- 1 | ## 连接池:别让连接池帮了倒忙 2 | - 注意鉴别客户端SDK是否基于连接池:jedis 3 | - 使用连接池务必确保复用:httpclient 4 | - 连接池的配置不是一成不变的:datasource 5 | - (补充)三种连接池如何设置两种『连接超时』:twotimeoutconfig -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/readme.md: -------------------------------------------------------------------------------- 1 | ## 业务代码写完,就意味着生产就绪了? 2 | - 准备工作:配置Spring Boot Actuator:N/A 3 | - 健康检测需要触达关键组件:health 4 | - 对外暴露应用内部重要组件的状态:info 5 | - 指标Metrics是快速定位问题的“金钥匙”:metrics -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/datetime/readme.md: -------------------------------------------------------------------------------- 1 | ## 用好Java 8的日期时间类,少踩一些“老三样”的坑 2 | - 初始化日期时间:newdate 3 | - “恼人”的时区问题:timezone 4 | - 日期时间格式化和解析:dateformat 5 | - 日期时间的计算:calc 6 | - (补充)一个奇怪的问题:mysteryproblem 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/ribbonretry/noretry-ribbon.properties: -------------------------------------------------------------------------------- 1 | SmsClient.ribbon.listOfServers=localhost:45679,localhost:45678 2 | ribbon.MaxAutoRetriesNextServer=0 3 | ribbon.MaxAutoRetries=0 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/right/AbstractAPI.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection.right; 2 | 3 | public abstract class AbstractAPI { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/readme.md: -------------------------------------------------------------------------------- 1 | ## 安全兜底:涉及钱时,必须考虑防刷、限量和防重 2 | - 开放的平台资源使用需要考虑防刷:preventsmshijack 3 | - 虚拟资产并不能凭空产生无限使用:prventcouponfarming 4 | - 钱的进出一定要和订单挂钩并且实现幂等:preventduplicatepay -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/troubleshootingtools/readme.md: -------------------------------------------------------------------------------- 1 | ## 分析定位Java问题,一定要用好这些工具 2 | - 使用JDK自带工具查看JVM情况:jdktool 3 | - 使用Wireshark分析SQL批量插入慢的问题:wireshark 4 | - 使用MAT分析OOM问题:mat 5 | - 使用Arthas分析高CPU问题:arthas -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/02~一切都是对象/2.10 总结.md: -------------------------------------------------------------------------------- 1 | # 2.10 总结 2 | 3 | 通过本章的学习,大家已接触了足够多的 Java 编程知识,已知道如何自行编写一个简单的程序。此外,对语言的总体情况以及一些基本思想也有了一定程度的认识。然而,本章所有例子的模式都是单线形式的“这样做,再那样做,然后再做另一些事情”。如果想让程序作出一项选择,又该如何设计呢?例如,“假如这样做的结果是红色,就那样做;如果不是,就做另一些事情”。对于这种基本的编程方法,下一章会详细说明在 Java 里是如何实现的。 4 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignandribbontimout/ribbon.properties: -------------------------------------------------------------------------------- 1 | ribbon.ReadTimeout=4000 2 | ribbon.ConnectTimeout=4000 3 | #clientsdk.ribbon.ReadTimeout=5000 4 | #clientsdk.ribbon.ConnectTimeout=5000 5 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/readme.md: -------------------------------------------------------------------------------- 1 | ## 接口设计:系统间对话的语言,一定要统一 2 | - 接口的响应要明确表示接口的处理结果:apiresposne 3 | - 要考虑接口变迁的版本控制策略:apiversion 4 | - 接口处理方式要明确同步还是异步:apiasyncsyncmode 5 | - (补充)请求头路由API版本的例子:headerapiversion 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/readme.md: -------------------------------------------------------------------------------- 1 | ## 数据源头:任何客户端的东西都不可信任 2 | - 客户端的计算不可信:trustclientcalculation 3 | - 客户端提交的参数需要校验:trustclientparameter 4 | - 不能信任请求头里的任何内容:trustclientip 5 | - 用户标识不能从客户端获取:trustclientuserid -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/troubleshootingtools/arthas/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.troubleshootingtools.arthas; 2 | 3 | public class User { 4 | 5 | public static int ADMIN_ID = 0; 6 | } 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/collection/readme.md: -------------------------------------------------------------------------------- 1 | ## 集合类:坑满地的List列表操作 2 | - 使用Arrays.asList把数据转换为List的三个坑:aslist 3 | - 使用List.subList进行切片操作居然会导致OOM:sublist 4 | - 一定要让合适的数据结构做合适的事情:listvsmap、linkedlist 5 | - 思考题:listremove 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/StreamTrace.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/StreamTrace.jpg -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nosqluse/esvsmyql/es.properties: -------------------------------------------------------------------------------- 1 | spring.data.elasticsearch.repositories.enabled=true 2 | spring.data.jpa.repositories.enabled=true 3 | logging.level.org.springframework.data.elasticsearch.core=DEBUG -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/metrics/influxdb.properties: -------------------------------------------------------------------------------- 1 | management.metrics.export.influx.enabled=true 2 | management.metrics.export.influx.uri=http://localhost:8086 3 | management.metrics.export.influx.step=1S -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/03~控制程序流程/3.4 练习.md: -------------------------------------------------------------------------------- 1 | # 3.4 练习 2 | 3 | (1) 写一个程序,打印出 1 到 100 间的整数。 4 | 5 | (2) 修改练习(1),在值为 47 时用一个 break 退出程序。亦可换成 return 试试。 6 | 7 | (3) 创建一个 switch 语句,为每一种 case 都显示一条消息。并将 switch 置入一个 for 循环里,令其尝试每一种 case。在每个 case 后面都放置一个 break,并对其进行测试。然后,删除 break,看看会有什么情况出现。 8 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/02~类与加载器/类加载流程.md: -------------------------------------------------------------------------------- 1 | # ClassLoading 2 | 3 | Java 类从被虚拟机加载开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7 个阶段;其中验证、准备和解析又统称为连接(Linking)阶段。 4 | 5 | ![类的生命周期](https://s2.ax1x.com/2019/11/01/KbBK2V.png) 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/readme.md: -------------------------------------------------------------------------------- 1 | ## Spring框架:帮我们做了很多工作也带来了复杂度 2 | 3 | - Feign AOP切不到的诡异案例:aopfeign 4 | - Spring程序配置的优先级问题:propertysource 5 | - (补充)替换配置属性中占位符的例子:custompropertysource 6 | - (补充)Spring扩展点:extensionpoint 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/coveringindex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/coveringindex.jpg -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/readme.md: -------------------------------------------------------------------------------- 1 | ## 数据库索引:索引不是万能药 2 | - InnoDB是如何存储数据的?:N/A 3 | - 聚簇索引和二级索引:N/A 4 | - 考虑额外创建二级索引的代价:init.sql + indexcost.sql 5 | - 不是所有针对索引列的查询都能用上索引:notuseindex.sql 6 | - 数据库基于成本决定是否走索引:optimizer_trace.sql -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/custompropertysource/db.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.url=%%MYSQL.URL%%&rewriteBatchedStatements=true 2 | spring.datasource.username=%%MYSQL.USERNAME%% 3 | spring.datasource.password=%%MYSQL.PASSWORD%% -------------------------------------------------------------------------------- /10~方言/10~Scala/类与对象/README.md: -------------------------------------------------------------------------------- 1 | # 类与对象 2 | 3 | ## 继承 4 | 5 | ## Self-Types 6 | 7 | ## Trait 8 | 9 | # Links 10 | 11 | - [What is the difference between self-types and trait subclasses?](http://stackoverflow.com/questions/1990948/what-is-the-difference-between-self-types-and-trait-subclasses) 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/io/readme.md: -------------------------------------------------------------------------------- 1 | ## 文件IO:实现高效正确的文件读写并非易事 2 | - 文件读写需要确保字符编码一致:badencodingissue 3 | - 使用Files类静态方法进行文件操作注意释放文件句柄:filestreamoperationneedclose 4 | - 注意读写文件要考虑设置缓冲区:filebufferperformance 5 | - (补充)File和Path:deleteonshutdown 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/numeralcalculations/readme.md: -------------------------------------------------------------------------------- 1 | ## 数值计算:注意精度、舍入和溢出问题 2 | - “危险”的Double:dangerousdouble 3 | - 考虑浮点数舍入和格式化的方式:rounding 4 | - 用equals做判等,就一定是对的吗?:equals 5 | - 小心数值溢出问题:overflowissue 6 | - (补充)不是所有的除0都会出异常:dividebyzero 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/readme.md: -------------------------------------------------------------------------------- 1 | ## 别以为“自动挡”就不可能出现OOM 2 | - 太多份相同的对象导致OOM:usernameautocomplete 3 | - 使用WeakHashMap不等于不会OOM:weakhashmapoom 4 | - Tomcat参数配置不合理导致OOM:impropermaxheadersize 5 | - (补充)OOM的类型:oomtype 6 | - (补充)安全点的例子:safepoint 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/readme.md: -------------------------------------------------------------------------------- 1 | ## 序列化:一来一回,你还是原来的你吗? 2 | - 序列化和反序列化需要确保算法一致:redistemplate 3 | - 注意Jackson JSON反序列化对额外字段的处理:jsonignoreproperties 4 | - 反序列化时要小心类的构造方法:deserializationconstructor 5 | - 枚举作为API接口参数或返回值的两个大坑:enumusedinapi -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/UploadRequest.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UploadRequest { 7 | private byte[] file; 8 | } 9 | -------------------------------------------------------------------------------- /02~核心类库/21~Object Mapping/README.md: -------------------------------------------------------------------------------- 1 | # Object Mapping 2 | 3 | Object mapping 的技术分类: 4 | 5 | - 运行期 反射调用 set/get 或者是直接对成员变量赋值 。该方式通过 invoke 执行赋值,实现时一般会采用 beanutil, Javassist 等开源库。这类的代表:Dozer,ModelMaper 6 | 7 | - 编译期 动态生成 set/get 代码的 class 文件 ,在运行时直接调用该 class 文件。该方式实际上扔会存在 set/get 代码,只是不需要自己写了。这类的代表:MapStruct,Selma,Orika 8 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/resttest/chapter2/generated-requests.http: -------------------------------------------------------------------------------- 1 | ### 堆内存溢出 2 | GET http://localhost:8080/heap 3 | 4 | ### 非堆内存溢出 5 | GET http://localhost:8080/nonheap 6 | 7 | ### 死循环 8 | GET http://localhost:8080/loop 9 | 10 | ### 死锁 11 | GET http://localhost:8080/deadlock -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/AsyncUploadRequest.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class AsyncUploadRequest { 7 | private byte[] file; 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/SyncUploadRequest.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SyncUploadRequest { 7 | private byte[] file; 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/cachedesign/readme.md: -------------------------------------------------------------------------------- 1 | ## 缓存设计:缓存可以锦上添花也可以落井下石 2 | 3 | - 不要把Redis当作数据库:N/A 4 | - 注意缓存雪崩问题:cacheinvalid 5 | - 注意缓存击穿问题:cacheconcurrent 6 | - 注意缓存穿透问题:cachepenetration 7 | - 注意缓存数据同步策略:N/A 8 | - (补充)小心RedisTemplate的事务功能:redistransaction 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/jsonignoreproperties/UserWrong.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.jsonignoreproperties; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UserWrong { 7 | private String name; 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/11~运行期类型鉴定/README.md: -------------------------------------------------------------------------------- 1 | # 第 11 章 运行期类型鉴定 2 | 3 | 运行期类型鉴定(RTTI)的概念初看非常简单——手上只有基础类型的一个指针时,利用它判断一个对象的正确类型。 4 | 然而,对 RTTI 的需要暴露出了面向对象设计许多有趣(而且经常是令人困惑的)的问题,并把程序的构造问题正式摆上了桌面。 5 | 本章将讨论如何利用 Java 在运行期间查找对象和类信息。这主要采取两种形式:一种是“传统”RTTI,它假定我们已在编译和运行期拥有所有类型;另一种是 Java1.1 特有的“反射”机制,利用它可在运行期独立查找类信息。首先讨论“传统”的 RTTI,再讨论反射问题。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/advancedfeatures/readme.md: -------------------------------------------------------------------------------- 1 | ## 当反射、注解和泛型遇到OOP时,会有哪些坑? 2 | - 反射调用方法不是以传参决定重载:reflectionissue 3 | - 泛型经过类型擦除多出桥接方法的坑:genericandinheritance 4 | - 注解可以继承吗?:annotationinheritance 5 | - (补充)内部类的例子:innerclass 6 | - (补充)Java反射的膨胀机制:reflectioninternal 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/AsyncUploadResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class AsyncUploadResponse { 7 | private String taskId; 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/info/actuator.properties: -------------------------------------------------------------------------------- 1 | management.server.port=45679 2 | management.endpoints.web.exposure.include=* 3 | management.endpoint.health.show-details=always 4 | management.endpoints.web.base-path=/admin 5 | spring.jmx.enabled=true -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/threadpool/readme.md: -------------------------------------------------------------------------------- 1 | ## 线程池:业务代码最常用也最容易犯错的组件 2 | - 线程池的声明需要手动进行:threadpooloom 3 | - 线程池线程管理策略详解:threadpooloom 4 | - 务必确认清楚线程池本身是不是复用的:threadpoolreuse 5 | - 需要仔细斟酌线程池的混用策略:threadpoolmixuse 6 | - (补充)异步执行多个子任务等待所有任务结果汇总处理的例子:multiasynctasks 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientcalculation/Db.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientcalculation; 2 | 3 | public class Db { 4 | 5 | public static Item getItem(long itemId) { 6 | return new Item(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/differentclassloaderequals/Point.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.differentclassloaderequals; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Point { 7 | private int x = 1; 8 | private int y = 2; 9 | } -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/intandstringequal/OrderQuery.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.intandstringequal; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class OrderQuery { 7 | private Integer status; 8 | private String name; 9 | } -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/readme.md: -------------------------------------------------------------------------------- 1 | ## 异常处理:别让自己在出问题的时候变为瞎子 2 | - 捕获和处理异常容易犯的错:handleexception 3 | - 小心finally中的异常:finallyissue 4 | - 千万别把异常定义为静态变量:predefinedexception 5 | - 提交线程池的任务出了异常会怎么样?:threadpoolandexception 6 | - (补充)需要注意JVM针对异常性能优化导致栈信息丢失的坑:stacktrace 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/mybatisjson/Info.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.mybatisjson; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class Info { 7 | private String name; 8 | private String phone; 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/twotimeoutconfig/hikari.properties: -------------------------------------------------------------------------------- 1 | spring.datasource.hikari.connection-timeout=10000 2 | spring.datasource.url=jdbc:mysql://localhost:6657/common_mistakes?connectTimeout=5000&characterEncoding=UTF-8&useSSL=false&rewriteBatchedStatements=true -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignandribbontimout/feign.properties: -------------------------------------------------------------------------------- 1 | feign.client.config.default.readTimeout=3000 2 | feign.client.config.default.connectTimeout=3000 3 | #feign.client.config.clientsdk.readTimeout=2000 4 | #feign.client.config.clientsdk.connectTimeout=2000 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/threadlocal/Jietu20200710-113641.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/threadlocal/Jietu20200710-113641.jpg -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/readme.md: -------------------------------------------------------------------------------- 1 | ## HTTP调用:你考虑到超时、重试、并发了吗? 2 | - 配置连接超时和读取超时参数的学问:clientreadtimeout 3 | - Feign和Ribbon配合使用,你知道怎么配置超时吗?:feignandribbontimeout 4 | - 你是否知道Ribbon会自动重试请求呢:ribbonretry 5 | - 并发限制了爬虫的抓取能力:routelimit 6 | - (补充)Feign方法级别设置超时的例子:feignpermethodtimeout -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/placeholder/log4j2api_to_slf4j_to_logack.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wx-chevalier/Java-Notes/master/99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/placeholder/log4j2api_to_slf4j_to_logack.jpg -------------------------------------------------------------------------------- /01~语法基础/README.md: -------------------------------------------------------------------------------- 1 | # Java 语法基础 2 | 3 | Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 面向对象程序设计语言和 Java 平台的总称。由 James Gosling 和同事们共同研发,并在 1995 年正式推出。Java 分为三个体系: 4 | 5 | - JavaSE(J2SE)(Java2 Platform Standard Edition,java 平台标准版) 6 | - JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java 平台企业版) 7 | - JavaME(J2ME)(Java 2 Platform Micro Edition,java 平台微型版)。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storeidcard/CipherResult.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storeidcard; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class CipherResult { 7 | private Long id; 8 | private String cipherText; 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/nested/UserData.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.nested; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UserData { 7 | private Long id; 8 | private String name; 9 | private String source; 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/09~异常差错控制/9.9 总结.md: -------------------------------------------------------------------------------- 1 | # 9.9 总结 2 | 3 | 通过先进的错误纠正与恢复机制,我们可以有效地增强代码的健壮程度。对我们编写的每个程序来说,错误恢复都属于一个基本的考虑目标。它在 Java 中显得尤为重要,因为该语言的一个目标就是创建不同的程序组件,以便其他用户(客户程序员)使用。为构建一套健壮的系统,每个组件都必须非常健壮。 4 | 5 | 在 Java 里,异常控制的目的是使用尽可能精简的代码创建大型、可靠的应用程序,同时排除程序里那些不能控制的错误。 6 | 7 | 异常的概念很难掌握。但只有很好地运用它,才可使自己的项目立即获得显著的收益。Java 强迫遵守异常所有方面的问题,所以无论库设计者还是客户程序员,都能够连续一致地使用它。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/sqlinject/UserData.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.dataandcode.sqlinject; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UserData { 7 | private Long id; 8 | private String name; 9 | private String password; 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/completablefuture/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.java8.completablefuture; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Builder 8 | public class User { 9 | private Long id; 10 | private Boolean vip; 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/readme.md: -------------------------------------------------------------------------------- 1 | ## 判等问题:程序里如何确定你就是你? 2 | - 注意equals和==的区别:intandstringequal 3 | - 实现一个equals没有这么简单:equalitymethod 4 | - hashCode和equals要配对实现:equalitymethod 5 | - 注意compareTo和equals的逻辑一致性:compareto 6 | - 小心Lombok生成代码的“坑”:lombokequals 7 | -(补充)不同类加载器加载相同类的坑:differentclassloaderequals 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/UploadResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class UploadResponse { 7 | private String downloadUrl; 8 | private String thumbnailDownloadUrl; 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientcalculation/CreateOrderRequest.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientcalculation; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class CreateOrderRequest { 7 | private long itemId; 8 | private int quantity; 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/SyncUploadResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class SyncUploadResponse { 7 | private String downloadUrl; 8 | private String thumbnailDownloadUrl; 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/health/actuator.properties: -------------------------------------------------------------------------------- 1 | spring.mvc.throw-exception-if-no-handler-found=true 2 | management.server.port=45679 3 | management.endpoints.web.exposure.include=* 4 | management.endpoint.health.show-details=always 5 | management.endpoints.web.base-path=/admin 6 | spring.jmx.enabled=true 7 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/readme.md: -------------------------------------------------------------------------------- 1 | ## 20%的业务代码的Spring声明式事务,可能都没处理正确 2 | 3 | - 小心Spring的事务可能没有生效:transactionproxyfailed 4 | - 事务即便生效也不一定能回滚:transactionrollbackfailed 5 | - 请确认事务传播配置是否符合自己的业务逻辑:transactionpropagation 6 | - (补充)使用MyBatis配合Propagation.NESTED事务传播模式的例子:nested 7 | - (补充)编程式事务:programmatictransaction 8 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/06~类再生/6.11 练习.md: -------------------------------------------------------------------------------- 1 | # 6.11 练习 2 | 3 | (1) 用默认构造器(空自变量列表)创建两个类:A 和 B,令它们自己声明自己。从 A 继承一个名为 C 的新类,并在 C 内创建一个成员 B。不要为 C 创建一个构造器。创建类 C 的一个对象,并观察结果。 4 | 5 | (2) 修改练习 1,使 A 和 B 都有含有自变量的构造器,则不是采用默认构造器。为 C 写一个构造器,并在 C 的构造器中执行所有初始化工作。 6 | 7 | (3) 使用文件 Cartoon.java,将 Cartoon 类的构造器代码变成注释内容标注出去。解释会发生什么事情。 8 | 9 | (4) 使用文件 Chess.java,将 Chess 类的构造器代码作为注释标注出去。同样解释会发生什么。 10 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7.10 练习.md: -------------------------------------------------------------------------------- 1 | # 7.10 练习 2 | 3 | (1) 创建 Rodent(啮齿动物):Mouse(老鼠),Gerbil(鼹鼠),Hamster(大颊鼠)等的一个继承分级结构。在基础类中,提供适用于所有 Rodent 的方法,并在衍生类中覆盖它们,从而根据不同类型的 Rodent 采取不同的行动。创建一个 Rodent 数组,在其中填充不同类型的 Rodent,然后调用自己的基础类方法,看看会有什么情况发生。 4 | 5 | (2) 修改练习 1,使 Rodent 成为一个接口。 6 | 7 | (3) 改正 WindError.java 中的问题。 8 | 9 | (4) 在 GreenhouseControls.java 中,添加 Event 内部类,使其能打开和关闭风扇。 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/completablefuture/Merchant.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.java8.completablefuture; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | 6 | @Data 7 | @Builder 8 | public class Merchant { 9 | private Long id; 10 | private Integer averageWaitMinutes; 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientcalculation/Item.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientcalculation; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | @Data 8 | public class Item { 9 | private long itemId; 10 | private BigDecimal itemPrice; 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/datetime/mysql/test.sql: -------------------------------------------------------------------------------- 1 | show variables like '%time_zone%'; 2 | create table datedemo 3 | ( 4 | mydatetime datetime, 5 | mytimestamp timestamp 6 | ); 7 | insert into datedemo values (now(), now()); 8 | select * from datedemo; 9 | SET TIME_ZONE = "america/new_york"; 10 | select * from datedemo; 11 | 12 | -------------------------------------------------------------------------------- /03~工程实践/构建工具/Maven/README.md: -------------------------------------------------------------------------------- 1 | ![Maven 题图](https://s2.ax1x.com/2019/12/17/QIXaxP.png) 2 | 3 | # Maven 4 | 5 | Maven 是功能强大的构建工具能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们只需要输入简单的命令(如 `mvn clean install`),Maven 就会帮我们处理繁琐的任务;它最大化的消除了构建的重复,抽象了构建生命周期,并且为绝大部分的构建任务提供了已实现的插件。比如说测试,我们只需要遵循 Maven 的约定编写好测试用例,当我们运行构建的时候,这些测试便会自动运行。除此之外,Maven 能帮助我们标准化构建过程。在 Maven 之前,十个项目可能有十种构建方式,但通过 Maven,所有项目的构建命令都是简单一致的。有利于促进项目团队的标准化。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/APIResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiresponse; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class APIResponse { 7 | private boolean success; 8 | private T data; 9 | private int code; 10 | private String message; 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/readme.md: -------------------------------------------------------------------------------- 1 | ## 使用了并发工具类库,线程安全就高枕无忧了吗? 2 | - 没有意识到线程重用导致用户信息错乱的Bug:threadlocal 3 | - 使用了线程安全的并发工具,并不代表解决了所有线程安全问题:concurrenthashmapmisuse 4 | - 没有充分了解并发工具的特性,从而无法发挥其威力:concurrenthashmapperformance 5 | - 没有认清并发工具的使用场景,因而导致性能问题:copyonwritelistmisuse 6 | - (补充)putIfAbsent vs computeIfAbsent的一些特性比对:ciavspia 7 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/10~JDK/README.md: -------------------------------------------------------------------------------- 1 | # JDK 2 | 3 | # Dalvik vs JVM 4 | 5 | Android 中使用的 Dalvik 虚拟机与 JVM 的区别在于,Java 虚拟机基于栈,基于栈的机器必须使用指令来载入和操作栈上数据,所需指令更多更多。而 dalvik 虚拟机是基于寄存器的:Java 虚拟机运行的是 java 字节码,Java 类会被编译成一个或多个字节码.class 文件,打包到.jar 文件中,Java 虚拟机从相应的.class 文件和.jar 文件中获取相应的字节码。Dalvik 和 Java 之间的另外一大区别就是运行环境 Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例。 6 | 7 | ![Dalvik 字节码与 JVM 字节码对比](https://s1.ax1x.com/2020/11/07/B4oCkT.png) 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/xss/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.dataandcode.xss; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/pojonull/UserDto.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.pojonull; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.Optional; 6 | 7 | @Data 8 | public class UserDto { 9 | private Long id; 10 | private Optional name; 11 | private Optional age; 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/metrics/Consts.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.productionready.metrics; 2 | 3 | public class Consts { 4 | public static final String QUEUE = "createOrder"; 5 | public static final String EXCHANGE = "createOrder"; 6 | public static final String ROUTING_KEY = "createOrder"; 7 | } 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/xss/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.dataandcode.xss; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.Id; 7 | 8 | @Entity 9 | @Data 10 | public class User { 11 | @Id 12 | private Long id; 13 | private String name; 14 | } 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/pojonull/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.pojonull; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/11~运行期类型鉴定/11.5 练习.md: -------------------------------------------------------------------------------- 1 | # 11.5 练习 2 | 3 | (1) 写一个方法,向它传递一个对象,循环打印出对象层次结构中的所有类。 4 | 5 | (2) 在 ToyTest.java 中,将 Toy 的默认构造器标记成注释信息,解释随之发生的事情。 6 | 7 | (3) 新建一种类型的集合,令其使用一个 Vector。捕获置入其中的第一个对象的类型,然后从那时起只允许用户插入那种类型的对 8 | 象。 9 | 10 | (4) 写一个程序,判断一个 Char 数组属于基本数据类型,还是一个真正的对象。 11 | 12 | (5) 根据本章的说明,实现 clearSpitValve()。 13 | 14 | (6) 实现本章介绍的 rotate(Shape)方法,令其检查是否已经旋转了一个圆(若已旋转,就不再执行旋转操作)。 15 | -------------------------------------------------------------------------------- /02~核心类库/04~类型系统/README.md: -------------------------------------------------------------------------------- 1 | # Java 数据类型 2 | 3 | 变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。 4 | 5 | ![代码到内存](https://s2.ax1x.com/2020/02/04/1DmG11.png) 6 | 7 | Java 中有两种类型,原始类型(Primitive Type)会被直接映射到 CPU 的基础类型,引用类型(Reference Type)则指向了内存中的对象。 8 | 9 | - 原始类型:boolean,char,byte,short,int,long,float,double。 10 | 11 | - 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double。 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/preventduplicatepay/PayChannel.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.preventduplicatepay; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public class PayChannel { 6 | 7 | public static void pay(String orderId, String account, BigDecimal amount) { 8 | 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/04~初始化和清除/README.md: -------------------------------------------------------------------------------- 1 | # 第 4 章 初始化和清除 2 | 3 | “随着计算机的进步,‘不安全’的程序设计已成为造成编程代价高昂的罪魁祸首之一。” 4 | 5 | “初始化”和“清除”是这些安全问题的其中两个。许多 C 程序的错误都是由于程序员忘记初始化一个变量造成的。对于现成的库,若用户不知道如何初始化库的一个组件,就往往会出现这一类的错误。清除是另一个特殊的问题,因为用完一个元素后,由于不再关心,所以很容易把它忘记。这样一来,那个元素占用的资源会一直保留下去,极易产生资源(主要是内存)用尽的后果。 6 | 7 | C++为我们引入了“构造器”的概念。这是一种特殊的方法,在一个对象创建之后自动调用。Java 也沿用了这个概念,但新增了自己的“垃圾收集器”,能在资源不再需要的时候自动释放它们。本章将讨论初始化和清除的问题,以及 Java 如何提供它们的支持。 8 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/17~项目/17.4 总结.md: -------------------------------------------------------------------------------- 1 | # 17.4 总结 2 | 3 | 通过本章的学习,大家知道运用 Java 可做到一些较复杂的事情。通过这些例子亦可看出,尽管 Java 必定有自己的局限,但受那些局限影响的主要是性能(比如写好文字处理程序后,会发现 C++的版本要快得多——这部分是由于 IO 库做得不完善造成的;而在你读到本书的时候,情况也许已发生了变化。但 Java 的局限也仅此而已,它在语言表达方面的能力是无以伦比的。利用 Java,几乎可以表达出我们想得到的任何事情。而与此同时,Java 在表达的方便性和易读性上,也做足了功夫。所以在使用 Java 时,一般不会陷入其他语言常见的那种复杂境地。使用那些语言时,会感觉它们象一个爱唠叨的老太婆,哪有 Java 那样清纯、简练!而且通过 Java 1.2 的 JFC/Swing 库,AWT 的表达能力和易用性甚至又得到了进一步的增强。 4 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/datetime/mysql/TimeRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.datetime.mysql; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | 7 | @Repository 8 | public interface TimeRepository extends JpaRepository { 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/stacktrace/MyPerformanceException.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.stacktrace; 2 | 3 | public class MyPerformanceException extends RuntimeException { 4 | 5 | public MyPerformanceException(String message, boolean performance) { 6 | super(message, null, false, performance); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/mybatisjson/JsonTestMapper.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.mybatisjson; 2 | 3 | 4 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 5 | import org.apache.ibatis.annotations.Mapper; 6 | 7 | @Mapper 8 | public interface JsonTestMapper extends BaseMapper { 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.datasource; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/pojonull/UserEntityRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.pojonull; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserEntityRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/usernameautocomplete/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.usernameautocomplete; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | 7 | @Repository 8 | public interface UserRepository extends JpaRepository { 9 | } -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/metrics/Order.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.productionready.metrics; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class Order implements Serializable { 9 | private Long id; 10 | private Long userId; 11 | private Long merchantId; 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storeidcard/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storeidcard; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/02~一切都是对象/2.11 练习.md: -------------------------------------------------------------------------------- 1 | # 2.11 练习 2 | 3 | (1) 参照本章的第一个例子,创建一个“Hello,World”程序,在屏幕上简单地显示这句话。注意在自己的类里只需一个方法(“main”方法会在程序启动时执行)。记住要把它设为 static 形式,并置入自变量列表——即使根本不会用到这个列表。用 javac 编译这个程序,再用 java 运行它。 4 | 5 | (2) 写一个程序,打印出从命令行获取的三个自变量。 6 | 7 | (3) 找出 Property.java 第二个版本的代码,这是一个简单的注释文档示例。请对文件执行 javadoc,并在自己的 Web 浏览器里观看结果。 8 | 9 | (4) 以练习(1)的程序为基础,向其中加入注释文档。利用 javadoc,将这个注释文档提取为一个 HTML 文件,并用 Web 浏览器观看。 10 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/src/test/java/cn/mrcode/stady/monitor_tuning/MonitorTuningApplicationTests.java: -------------------------------------------------------------------------------- 1 | package cn.mrcode.stady.monitor_tuning; 2 | 3 | import org.junit.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | //@SpringBootTest 7 | class MonitorTuningApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/SyncQueryUploadTaskRequest.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Data 7 | @RequiredArgsConstructor 8 | public class SyncQueryUploadTaskRequest { 9 | private final String taskId; 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storepassword/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storepassword; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/15~网络编程/15.9 总结.md: -------------------------------------------------------------------------------- 1 | # 15.9 总结 2 | 3 | 由于篇幅所限,还有其他许多涉及连网的概念没有介绍给大家。Java 也为 URL 提供了相当全面的支持,包括为因特网上不同类型的客户提供协议控制器等等。 4 | 5 | 除此以外,一种正在逐步流行的技术叫作 Servlet Server。它是一种因特网服务器应用,通过 Java 控制客户请求,而非使用以前那种速度很慢、且相当麻烦的 CGI(通用网关接口)协议。这意味着为了在服务器那一端提供服务,我们可以用 Java 编程,不必使用自己不熟悉的其他语言。由于 Java 具有优秀的移植能力,所以不必关心具体容纳这个服务器是什么平台。 6 | 7 | 所有这些以及其他特性都在《Java Network Programming》一书中得到了详细讲述。该书由 Elliotte Rusty Harold 编著,O'Reilly 于 1997 年出版。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/twotimeoutconfig/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.twotimeoutconfig; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface UserRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storeidcard/CipherRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storeidcard; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface CipherRepository extends JpaRepository { 8 | } 9 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientuserid/LoginRequired.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientuserid; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target(ElementType.PARAMETER) 7 | @Documented 8 | public @interface LoginRequired { 9 | String sessionKey() default "currentUser"; 10 | } -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/readme.md: -------------------------------------------------------------------------------- 1 | ## 带你吃透课程中Java 8的那些重要知识点 2 | - Lambda表达式:LambdaTest 3 | - 使用Java8简化代码:CoolStreamTest、CoolOptionalTest 4 | - 并行流:ParallelTest 5 | - Stream操作详解:GenerateStreamTest、StreamDetailTest 6 | 7 | 使用IDEA的StreamTrace功能调试CoolStreamTest.stream的截图,参考[这里](https://www.jetbrains.com/help/idea/analyze-java-stream-operations.html): 8 | 9 | ![](StreamTrace.jpg) -------------------------------------------------------------------------------- /06~JVM 与性能优化/README.md: -------------------------------------------------------------------------------- 1 | # JVM 架构机制与性能调优 2 | 3 | ![JVM Class 文件从解析到执行](https://s1.ax1x.com/2020/11/07/B44OUS.png) 4 | 5 | ![JVM 体系结构](https://ngte-superbed.oss-cn-beijing.aliyuncs.com/item/20231009140150.png) 6 | 7 | # Links 8 | 9 | - https://www.zhihu.com/question/20097631/answer/676214307 10 | 11 | - https://cubox.pro/c/rV8hab 这些不可不知的 JVM 知识,我都用思维导图整理好了 偏总结性质 12 | 13 | - https://mp.weixin.qq.com/s/mQErApHnlacTgdbtJV2y9w 据说看完这篇 JVM 要一小时 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/info/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.productionready.info; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class User { 11 | private long userId; 12 | private String userName; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/jsonignoreproperties/UserRight.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.jsonignoreproperties; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 4 | import lombok.Data; 5 | 6 | 7 | @Data 8 | @JsonIgnoreProperties(ignoreUnknown = true) 9 | public class UserRight { 10 | private String name; 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/advancedfeatures/annotationinheritance/MyAnnotation.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.advancedfeatures.annotationinheritance; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Target({ElementType.METHOD, ElementType.TYPE}) 6 | @Retention(RetentionPolicy.RUNTIME) 7 | @Inherited 8 | public @interface MyAnnotation { 9 | String value(); 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/productionready/health/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.productionready.health; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class User { 11 | private long userId; 12 | private String userName; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/notuseindex.sql: -------------------------------------------------------------------------------- 1 | explain select * from person where NAME like '%name123' LIMIT 100 2 | explain select * from person where NAME like 'name123%' LIMIT 100 3 | 4 | 5 | explain select * from person where SCORE>45678 6 | explain select * from person where SCORE>45678 and NAME like 'NAME45%' 7 | 8 | 9 | explain select * from person where length(NAME)=7 10 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/.gitignore: -------------------------------------------------------------------------------- 1 | # Node rules: 2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 3 | .grunt 4 | 5 | ## Dependency directory 6 | ## Commenting this out is preferred by some people, see 7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git 8 | node_modules 9 | 10 | # Book build output 11 | _book 12 | 13 | # eBook build output 14 | *.epub 15 | *.mobi 16 | *.pdf 17 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/04~初始化和清除/4.7 练习.md: -------------------------------------------------------------------------------- 1 | # 4.7 练习 2 | 3 | (1) 用默认构造器创建一个类(没有自变量),用它打印一条消息。创建属于这个类的一个对象。 4 | 5 | (2) 在练习 1 的基础上增加一个重载的构造器,令其采用一个 String 自变量,并随同自己的消息打印出来。 6 | 7 | (3) 以练习 2 创建的类为基础上,创建属于它的对象指针的一个数组,但不要实际创建对象并分配到数组里。运行程 8 | 序时,注意是否打印出来自构造器调用的初始化消息。 9 | 10 | (4) 创建同指针数组联系起来的对象,最终完成练习 3。 11 | 12 | (5) 用自变量“before”,“after”和“none”运行程序,试验 Garbage.java。重复这个操作,观察是否从输出中看出了一些固定的模式。改变代码,使 System.runFinalization()在 System.gc()之前调用,再观察结果。 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/OrderInfo.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiresponse; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class OrderInfo { 11 | private String status; 12 | private long orderId; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/01~对象入门/1.10 永久性.md: -------------------------------------------------------------------------------- 1 | # 1.10 永久性 2 | 3 | 创建一个对象后,只要我们需要,它就会一直存在下去。但在程序结束运行时,对象的“生存期”也会宣告结束。尽管这一现象表面上非常合理,但深入追究就会发现,假如在程序停止运行以后,对象也能继续存在,并能保留它的全部信息,那么在某些情况下将是一件非常有价值的事情。下次启动程序时,对象仍然在那里,里面保留的信息仍然是程序上一次运行时的那些信息。当然,可以将信息写入一个文件或者数据库,从而达到相同的效果。但尽管可将所有东西都看作一个对象,如果能将对象声明成“永久性”,并令其为我们照看其他所有细节,无疑也是一件相当方便的事情。 4 | 5 | Java 1.1 提供了对“有限永久性”的支持,这意味着我们可将对象简单地保存到磁盘上,以后任何时间都可取回。之所以称它为“有限”的,是由于我们仍然需要明确发出调用,进行对象的保存和取回工作。这些工作不能自动进行。在 Java 未来的版本中,对“永久性”的支持有望更加全面。 6 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/02~一切都是对象/README.md: -------------------------------------------------------------------------------- 1 | # 第 2 章 一切都是对象 2 | 3 | “尽管以 C++为基础,但 Java 是一种更纯粹的面向对象程序设计语言”。 4 | 5 | 无论 C++还是 Java 都属于杂合语言。但在 Java 中,设计者觉得这种杂合并不象在 C++里那么重要。杂合语言允许采用多种编程风格;之所以说 C++是一种杂合语言,是因为它支持与 C 语言的向后兼容能力。由于 C++是 C 的一个超集,所以包含的许多特性都是后者不具备的,这些特性使 C++在某些地方显得过于复杂。 6 | 7 | Java 语言首先便假定了我们只希望进行面向对象的程序设计。也就是说,正式用它设计之前,必须先将自己的思想转入一个面向对象的世界(除非早已习惯了这个世界的思维方式)。只有做好这个准备工作,与其他 OOP 语言相比,才能体会到 Java 的易学易用。在本章,我们将探讨 Java 程序的基本组件,并体会为什么说 Java 乃至 Java 程序内的一切都是对象。 8 | -------------------------------------------------------------------------------- /02~核心类库/README.md: -------------------------------------------------------------------------------- 1 | > 本节侧重于 Java 内置数据结构的解析,如果想了解更多数据结构与算法的设计请参阅《[Algorithm-Notes](https://github.com/wx-chevalier/Algorithm-Notes?q=)》 2 | 3 | # Java 数据结构 4 | 5 | 首先要说明的是,Java 是一种强类型语言。事实上,Java 的安全性和健壮性部分来自于这个事实。让我们来看看这意味着什么。首先,每个变量都有一个类型,每个表达式都有一个类型,而且每个类型都是严格定义的。其次,所有的赋值,无论是显式的还是通过方法调用中的参数传递,都会检查类型的兼容性。不存在像某些语言那样自动强制或转换冲突类型的情况。Java 编译器会检查所有的表达式和参数,以确保类型是兼容的。任何类型不匹配都是错误,在编译器完成编译类之前必须加以纠正。 6 | 7 | # Links 8 | 9 | - https://www.baeldung.com/java-collections 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientparameter/Country.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientparameter; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | class Country { 11 | private int id; 12 | private String name; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/handleexception/APIResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.handleexception; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class APIResponse { 9 | private boolean success; 10 | private T data; 11 | private int code; 12 | private String message; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/right/BankAPI.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection.right; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target(ElementType.TYPE) 7 | @Documented 8 | @Inherited 9 | public @interface BankAPI { 10 | String desc() default ""; 11 | 12 | String url() default ""; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/feign/Client.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign.feign; 2 | 3 | import org.springframework.cloud.openfeign.FeignClient; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | 6 | @FeignClient(name = "client") 7 | public interface Client { 8 | @GetMapping("/feignaop/server") 9 | String api(); 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientcalculation/Order.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientcalculation; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | @Data 8 | public class Order { 9 | private long itemId; 10 | private BigDecimal itemPrice; 11 | private int quantity; 12 | private BigDecimal itemTotalPrice; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/prventcouponfarming/Coupon.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.prventcouponfarming; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | import java.math.BigDecimal; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | public class Coupon { 11 | private long userId; 12 | private BigDecimal amount; 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/serialversionissue/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.serialversionissue; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | 7 | @Data 8 | public class User implements Serializable { 9 | private static final long serialVersionUID = 6634621353121349665L; 10 | private String name; 11 | private int age; 12 | } -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/17~项目/17.5 练习.md: -------------------------------------------------------------------------------- 1 | # 17.5 练习 2 | 3 | (1) (稍微有些难度)改写 FieldOBeasts.java,使它的状态能够保持固定。加上一些按钮,允许用户保存和恢复不同的状态文件,并从它们断掉的地方开始继续运行。请先参考第 10 章的 CADState.java,再决定具体怎样做。 4 | 5 | (2) (大作业)以 FieldOBeasts.java 作为起点,构造一个自动化交通仿真系统。 6 | 7 | (3) (大作业)以 ClassScanner.java 作为起点,构造一个特殊的工具,用它找出那些虽然定义但从未用过的方法和字段。 8 | 9 | (4) (大作业)利用 JDBC,构造一个联络管理程序。让这个程序以一个平面文件数据库为基础,其中包含了名字、地址、电话号码、E-mail 地址等联系资料。应该能向数据库里方便地加入新名字。键入要查找的名字时,请采用在第 15 章的 VLookup.java 里介绍过的那种名字自动填充技术。 10 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/02~程序编译/JIT/README.md: -------------------------------------------------------------------------------- 1 | # JIT 2 | 3 | JIT 是 Just-In-Time Compiliation 的缩写,中文为即时编译。就是 Java 在运行过程中,如果有些动态极度频繁的被执行或者不被执行,就会被自动编译成机器码,跳过其中的部分环节。Java 源码通过编译器转为平台无关的字节码(Bytecode)或 Java class 文件。在启动 Java 应用程序后,JVM 会在运行时加载编译后的类并通过 Java 解释器执行适当的语义计算。当开启 JIT 时,JVM 会分析 Java 应用程序的函数调用并且(达到内部一些阀值后)编译字节码为本地更高效的机器码,编译出的原生机器码被存储在非堆内存的代码缓存中。 4 | 5 | JIT 流程通常为最繁忙的函数调用提供更高的优先级。一旦函数调用被转为机器码,JVM 会直接执行而不是解释执行,上述过程会在程序运行过程中不断提高性能。通过这种方法,Hotspot 虚拟机将权衡下面两种时间消耗:将字节码编译成本地代码需要的额外时间和解释执行字节码消耗更多的时间。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/predefinedexception/Exceptions.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.predefinedexception; 2 | 3 | public class Exceptions { 4 | 5 | public static BusinessException ORDEREXISTS = new BusinessException("订单已经存在", 3001); 6 | 7 | public static BusinessException orderExists() { 8 | return new BusinessException("订单已经存在", 3001); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.0~内存管理/03~内存溢出与泄漏/README.md: -------------------------------------------------------------------------------- 1 | # JVM 内存泄漏 2 | 3 | 尽管 JVM 提供了自动内存管理的机制,试图降低程序员的开发门槛,确实也实现了这一目标,在日常开发中,我们一般都不需要关心对象的内存释放。JVM 大部分都是使用 trace 算法来判断一个对象是否该被回收,那么 JVM 只能回收那些从 GC roots 不可达的对象。如果我们在使用某些大的对象、集合对象或者一些三方包里的资源,忘记及时释放资源的话,还是会造成 JVM 的内存泄漏或内存浪费的问题。 4 | 5 | - 内存溢出:就是你要求分配的 Java 虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。 6 | 7 | - 内存泄漏:是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/beansingletonandorder/TestA.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.beansingletonandorder; 2 | 3 | import lombok.Getter; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Component 8 | public class TestA { 9 | @Autowired 10 | @Getter 11 | private TestB testB; 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/beansingletonandorder/TestB.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.beansingletonandorder; 2 | 3 | import lombok.Getter; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Component 8 | public class TestB { 9 | @Autowired 10 | @Getter 11 | private TestA testA; 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/Config.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign; 2 | 3 | import org.springframework.cloud.openfeign.EnableFeignClients; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @EnableFeignClients(basePackages = "org.geekbang.time.commonmistakes.springpart2.aopfeign.feign") 8 | public class Config { 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignandribbontimout/Client.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.feignandribbontimout; 2 | 3 | import org.springframework.cloud.openfeign.FeignClient; 4 | import org.springframework.web.bind.annotation.PostMapping; 5 | 6 | @FeignClient(name = "clientsdk") 7 | public interface Client { 8 | @PostMapping("/feignandribbon/server") 9 | void server(); 10 | } 11 | -------------------------------------------------------------------------------- /02~核心类库/10~集合类型/List/README.md: -------------------------------------------------------------------------------- 1 | # Java 中 List 的使用 2 | 3 | 这里简单对其重复的方法做点简单的区分。 4 | 5 | - offer,add 区别:一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。 6 | 7 | - poll,remove 区别:remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似,但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。 8 | 9 | - peek,element 区别:element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时,element() 抛出一个异常,而 peek() 返回 null 10 | -------------------------------------------------------------------------------- /01~语法基础/09~文件 IO/第三方工具/FileUtils.md: -------------------------------------------------------------------------------- 1 | # Apache Commons IO 2 | 3 | ```java 4 | @Test 5 | public void whenAppendToFileUsingFiles_thenCorrect() 6 | throws IOException { 7 | File file = new File(fileName); 8 | FileUtils.writeStringToFile( 9 | file, "Spain\r\n", StandardCharsets.UTF_8, true); 10 | 11 | assertThat(StreamUtils.getStringFromInputStream( 12 | new FileInputStream(fileName))) 13 | .isEqualTo("UK\r\n" + "US\r\n" + "Germany\r\n" + "Spain\r\n"); 14 | } 15 | ``` 16 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.0~内存管理/01~内存结构/01~程序计数器.md: -------------------------------------------------------------------------------- 1 | # 程序计数器 2 | 3 | 这是一块比较小的内存,不在 RAM 上,而是直接划分在 CPU 上的,程序员无法直接操作它,它的作用是:JVM 在解释字节码文件(.class)时,存储当前线程所执行的字节码的行号,只是一种概念模型,各种 JVM 所采用的方式不同,字节码解释器工作时,就是通过改变程序计数器的值来选取下一条要执行的指令,分支、循环、跳转、等基础功能都是依赖此技术区完成的。还有一种情况,就是我们常说的 Java 多线程方面的,多线程就是通过现程轮流切换而达到的,同一时刻,一个内核只能执行一个指令,所以,对于每一个程序来说,必须有一个计数器来记录程序的执行进度,这样,当线程恢复执行的时候,才能从正确的地方开始,所以,每个线程都必须有一个独立的程序计数器,这类计数器为线程私有的内存。如果一个线程正在执行一个 Java 方法,则计数器记录的是字节码的指令的地址,如果执行的一个 Native 方法,则计数器的记录为空,此内存区是唯一一个在 Java 规范中没有任何 OutOfMemoryError 情况的区域。 4 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/ribbonretry/AutoConfig.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.ribbonretry; 2 | 3 | import org.springframework.cloud.openfeign.EnableFeignClients; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | 7 | @Configuration 8 | @EnableFeignClients(basePackages = "org.geekbang.time.commonmistakes.httpinvoke.ribbonretry.feign") 9 | public class AutoConfig { 10 | } 11 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storepassword/UserData.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storepassword; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.Id; 7 | 8 | @Data 9 | @Entity 10 | public class UserData { 11 | @Id 12 | private Long id; 13 | private String name; 14 | private String salt; 15 | private String password; 16 | } 17 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/7.9 总结.md: -------------------------------------------------------------------------------- 1 | # 7.9 总结 2 | 3 | “多态性”意味着“不同的形式”。在面向对象的程序设计中,我们有相同的外观(基础类的通用接口)以及使用那个外观的不同形式:动态绑定或组织的、不同版本的方法。 4 | 5 | 通过这一章的学习,大家已知道假如不利用数据抽象以及继承技术,就不可能理解、甚至去创建多态性的一个例子。多态性是一种不可独立应用的特性(就象一个 switch 语句),只可与其他元素协同使用。我们应将其作为类总体关系的一部分来看待。人们经常混淆 Java 其他的、非面向对象的特性,比如方法重载等,这些特性有时也具有面向对象的某些特征。但不要被愚弄:如果以后没有绑定,就不成其为多态性。 6 | 7 | 为使用多态性乃至面向对象的技术,特别是在自己的程序中,必须将自己的编程视野扩展到不仅包括单独一个类的成员和消息,也要包括类与类之间的一致性以及它们的关系。尽管这要求学习时付出更多的精力,但却是非常值得的,因为只有这样才可真正有效地加快自己的编程速度、更好地组织代码、更容易做出包容面广的程序以及更易对自己的代码进行维护与扩展。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/finallyissue/TestResource.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.finallyissue; 2 | 3 | public class TestResource implements AutoCloseable { 4 | 5 | public void read() throws Exception { 6 | throw new Exception("read error"); 7 | } 8 | 9 | @Override 10 | public void close() throws Exception { 11 | throw new Exception("close error"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/init.sql: -------------------------------------------------------------------------------- 1 | drop table IF EXISTS `person`; 2 | 3 | create TABLE `person` ( 4 | `id` bigint(20) NOT NULL AUTO_INCREMENT, 5 | `name` varchar(255) NOT NULL, 6 | `score` int(11) NOT NULL, 7 | `create_time` timestamp NOT NULL, 8 | PRIMARY KEY (`id`), 9 | KEY `name_score` (`name`,`score`) USING BTREE, 10 | KEY `create_time` (`create_time`) USING BTREE 11 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/SyncQueryUploadTaskResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import lombok.Data; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Data 7 | @RequiredArgsConstructor 8 | public class SyncQueryUploadTaskResponse { 9 | private final String taskId; 10 | private String downloadUrl; 11 | private String thumbnailDownloadUrl; 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/java8/OrderItem.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.java8; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @AllArgsConstructor 9 | @NoArgsConstructor 10 | public class OrderItem { 11 | private Long productId; 12 | private String productName; 13 | private Double productPrice; 14 | private Integer productQuantity; 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/redistemplate/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.redistemplate; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | class User implements Serializable { 13 | private String name; 14 | private int age; 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignandribbontimout/AutoConfig.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.feignandribbontimout; 2 | 3 | import org.springframework.cloud.openfeign.EnableFeignClients; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @EnableFeignClients(basePackages = "org.geekbang.time.commonmistakes.httpinvoke.feignandribbontimout") 8 | public class AutoConfig { 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/right/BankAPIField.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection.right; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Retention(RetentionPolicy.RUNTIME) 6 | @Target(ElementType.FIELD) 7 | @Documented 8 | @Inherited 9 | public @interface BankAPIField { 10 | int order() default -1; 11 | 12 | int length() default -1; 13 | 14 | String type() default ""; 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/feign/ClientWithUrl.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign.feign; 2 | 3 | import org.springframework.cloud.openfeign.FeignClient; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | 6 | @FeignClient(name = "anotherClient", url = "http://localhost:45678") 7 | public interface ClientWithUrl { 8 | @GetMapping("/feignaop/server") 9 | String api(); 10 | } 11 | -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/元编程/OGNL.md: -------------------------------------------------------------------------------- 1 | # OGNL 2 | 3 | OGNL 是 Object-Graph Navigation Language 的缩写,它是一种功能强大的表达式语言(Expression Language,简称为 EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。从语言角度来说:它是一个功能强大的表达式语言,用来获取和设置 java 对象的属性,它旨在提供一个更高抽象度语法来对 java 对象图进行导航。另外,java 中很多可以做的事情,也可以使用 OGNL 来完成,例如:列表映射和选择。对于开发者来说,使用 OGNL,可以用简洁的语法来完成对 java 对象的导航。通常来说:通过一个“路径”来完成对象信息的导航,这个“路径”可以是到 java bean 的某个属性,或者集合中的某个索引的对象,等等,而不是直接使用 get 或者 set 方法来完成。 4 | 5 | # Links 6 | 7 | - https://www.cnblogs.com/renchunxiao/p/3423299.html 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/NoAPIResponse.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiresponse; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD, ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface NoAPIResponse { 11 | } 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/handleexception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.handleexception; 2 | 3 | public class BusinessException extends RuntimeException { 4 | 5 | private int code; 6 | 7 | public BusinessException(String message, int code) { 8 | super(message); 9 | this.code = code; 10 | } 11 | 12 | public int getCode() { 13 | return code; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignpermethodtimeout/AutoConfig.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.feignpermethodtimeout; 2 | 3 | import org.springframework.cloud.openfeign.EnableFeignClients; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @EnableFeignClients(basePackages = "org.geekbang.time.commonmistakes.httpinvoke.feignpermethodtimeout") 8 | public class AutoConfig { 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/lockandtransaction/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.lockandtransaction; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | List findByName(String name); 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/aopmetrics/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.aopmetrics; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | List findByName(String name); 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/optimizer_trace.sql: -------------------------------------------------------------------------------- 1 | explain select * from person where NAME >'name84059' and create_time>'2020-01-24 00:00:00' 2 | explain select * from person where NAME >'name84059' and create_time>'2020-01-24 00:00:00' 3 | 4 | 5 | SET optimizer_trace="enabled=on"; 6 | explain select * from person where NAME >'name84059' and create_time>'2020-01-24 00:00:00'; 7 | select * from information_schema.OPTIMIZER_TRACE; 8 | SET optimizer_trace="enabled=off"; -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/内置工具/README.md: -------------------------------------------------------------------------------- 1 | # 常见内置工具的使用 2 | 3 | ```sh 4 | # 查看堆内对象的分布 Top 50(定位内存泄漏) 5 | $ jmap –histo:live $pid | sort-n -r -k2 | head-n 50 6 | 7 | # 按线程状态统计线程数(加强版) 8 | $ jstack $pid | grep java.lang.Thread.State:|sort|uniq -c | awk '{sum+=$1; split($0,a,":");gsub(/^[ \t]+|[ \t]+$/, "", a[2]);printf "%s: %s\n", a[2], $1}; END {printf "TOTAL: %s",sum}'; 9 | 10 | # 查看最消耗 CPU 的 Top10 线程机器堆栈信息 11 | $ show-busy-java-threads 12 | ``` 13 | 14 | # Links 15 | 16 | - https://mp.weixin.qq.com/s/N1rJkE3HA8mJYdqK4tSMEw 17 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | 30 | ### VS Code ### 31 | .vscode/ 32 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/predefinedexception/BusinessException.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.predefinedexception; 2 | 3 | public class BusinessException extends RuntimeException { 4 | 5 | private int code; 6 | 7 | public BusinessException(String message, int code) { 8 | super(message); 9 | this.code = code; 10 | } 11 | 12 | public int getCode() { 13 | return code; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/02~一切都是对象/2.9 编码样式.md: -------------------------------------------------------------------------------- 1 | # 2.9 编码样式 2 | 3 | 一个非正式的 Java 编程标准是大写一个类名的首字母。若类名由几个单词构成,那么把它们紧靠到一起(也就是说,不要用下划线来分隔名字)。此外,每个嵌入单词的首字母都采用大写形式。例如: 4 | 5 | ```java 6 | class AllTheColorsOfTheRainbow { // ...} 7 | ``` 8 | 9 | 对于其他几乎所有内容:方法、字段(成员变量)以及对象指针名称,可接受的样式与类样式差不多,只是标识符的第一个字母采用小写。例如: 10 | 11 | ```java 12 | class AllTheColorsOfTheRainbow { 13 | int anIntegerRepresentingColors; 14 | void changeTheHueOfTheColor(int newHue) { 15 | // ... 16 | } 17 | // ... 18 | } 19 | ``` 20 | 21 | 当然,要注意用户也必须键入所有这些长名字,而且不能输错。 22 | -------------------------------------------------------------------------------- /03~工程实践/构建工具/Gradle/README.md: -------------------------------------------------------------------------------- 1 | # Gradle 概念、对比与配置 2 | 3 | 在 Grade 中,我们常见的几个关键术语有 Project、Plugin 以及 Task。和 Maven 一样,Gradle 只是提供了构建项目的一个框架,真正起作用的是 Plugin。Gradle 在默认情况下为我们提供了许多常用的 Plugin,其中包括有构建 Java 项目的 Plugin,还有 War,Ear 等。与 Maven 不同的是,Gradle 不提供内建的项目生命周期管理,只是 Java Plugin 向 Project 中添加了许多 Task,这些 Task 依次执行,为我们营造了一种如同 Maven 般项目构建周期。换言之,Project 为 Task 提供了执行上下文,所有的 Plugin 要么向 Project 中添加用于配置的 Property,要么向 Project 中添加不同的 Task。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译 Java 源代码,拷贝文件,打包 Jar 文件,甚至可以是执行一个系统命令或者调用 Ant。另外,一个 Task 可以读取和设置 Project 的 Property 以完成特定的操作。 4 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/resttest/chapter4/generated-requests.http: -------------------------------------------------------------------------------- 1 | ### 方法入参 2 | GET http://localhost:8080/ch4/arg1?name=mrcode 3 | 4 | ### 构造函数 5 | GET http://localhost:8080/ch4/constructor?id=1&name=mrcode 6 | 7 | ### 拦截重载方法1 8 | GET http://localhost:8080/ch4/same1?id=1 9 | 10 | ### 拦截重载方法2 11 | GET http://localhost:8080/ch4/same2?id=1&name=mrcode 12 | 13 | ### 获取异常 14 | GET http://localhost:8080/ch4/exception 15 | 16 | ### 获取复杂类型 17 | GET http://localhost:8080/ch4/arg2?id=1&name=mrcode -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nosqluse/esvsmyql/NewsMySQLRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nosqluse.esvsmyql; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface NewsMySQLRepository extends JpaRepository { 8 | long countByCateidAndContentContainingAndContentContaining(int cateid, String keyword1, String keyword2); 9 | } 10 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/02~类与加载器/README.md: -------------------------------------------------------------------------------- 1 | # 类加载 2 | 3 | JVM 是虚拟机的一种,它的指令集语言是字节码,字节码构成的文件是 class 文件。平常我们写的 Java 文件,需要编译为 class 文件才能交给 JVM 运行。可以这么说:C 语言代码——>二进制文件——>计算机硬件,就相当于 Java 代码——>字节码文件——>JVM。JVM 将指定的 class 文件读取到内存里,并运行该 class 文件里的 Java 程序的过程,就称之为类的加载;反之,将某个 class 文件的运行时数据从 JVM 中移除的过程,就称之为类的卸载。 4 | 5 | class 文件的运行时数据就是 C++对象,也称为 kclass 对象,这些运行时数据在 JDK7 之前是放在永久代(PermGen),JDK8 之后则放在元空间(Metaspace)。 6 | 7 | # Links 8 | 9 | - https://time.geekbang.org/column/article/11523 10 | 11 | - https://zhuanlan.zhihu.com/p/81419563 我竟然不再抗拒 Java 的类加载机制了 12 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/src/main/java/cn/mrcode/stady/monitor_tuning/MonitorTuningApplication.java: -------------------------------------------------------------------------------- 1 | package cn.mrcode.stady.monitor_tuning; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class MonitorTuningApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(MonitorTuningApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiversion/APIVersion.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiversion; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD, ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface APIVersion { 11 | String[] value(); 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/programmingtransaction/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.programmingtransaction; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | List findByName(String name); 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionpropagation/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionpropagation; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | List findByName(String name); 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionproxyfailed/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionproxyfailed; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | List findByName(String name); 12 | } 13 | -------------------------------------------------------------------------------- /01~语法基础/06~流程控制/README.md: -------------------------------------------------------------------------------- 1 | # 流程控制 2 | 3 | # 运算符 4 | 5 | ## 一元运算符 6 | 7 | ### ++ / -- 8 | 9 | ``` 10 | public class Test{ 11 | 12 | public static void main(String args[]){ 13 | int i=0; 14 | i=i++; 15 | i=i++; 16 | System.out.println(i); 17 | 18 | } 19 | } 20 | // 输出结果为 0 21 | ``` 22 | 23 | 整个过程实际上如下所示: 24 | 25 | ``` 26 | int oldValue = i; 27 | i = i + 1; 28 | i = oldValue; 29 | ``` 30 | 31 | # 循环 32 | 33 | ## while 34 | 35 | ## for 36 | 37 | ### for-in 38 | 39 | ### forEach 40 | 41 | # 迭代器 42 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/08~对象的容纳/README.md: -------------------------------------------------------------------------------- 1 | # 第 8 章 对象的容纳 2 | 3 | “如果一个程序只含有数量固定的对象,而且已知它们的存在时间,那么这个程序可以说是相当简单的。” 4 | 5 | 通常,我们的程序需要根据程序运行时才知道的一些标准创建新对象。若非程序正式运行,否则我们根本不知道自己到底需要多少数量的对象,甚至不知道它们的准确类型。为了满足常规编程的需要,我们要求能在任何时候、任何地点创建任意数量的对象。所以不可依赖一个已命名的指针来容纳自己的每一个对象,就象下面这样: 6 | 7 | ```java 8 | MyObject myHandle; 9 | ``` 10 | 11 | 因为根本不知道自己实际需要多少这样的东西。 12 | 13 | 为解决这个非常关键的问题,Java 提供了容纳对象(或者对象的指针)的多种方式。其中内建的类型是数组,我们之前已讨论过它,本章准备加深大家对它的认识。此外,Java 的工具(实用程序)库提供了一些“集合类”(亦称作“容器类”,但该术语已由 AWT 使用,所以这里仍采用“集合”这一称呼)。利用这些集合类,我们可以容纳乃至操纵自己的对象。本章的剩余部分会就此进行详细讨论。 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/mybatisjson/InfoListTypeHandler.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.mybatisjson; 2 | 3 | import com.fasterxml.jackson.core.type.TypeReference; 4 | 5 | import java.util.List; 6 | 7 | public class InfoListTypeHandler extends ListTypeHandler { 8 | 9 | @Override 10 | protected TypeReference> specificType() { 11 | return new TypeReference>() { 12 | }; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/06~类再生/6.10 总结.md: -------------------------------------------------------------------------------- 1 | # 6.10 总结 2 | 3 | 无论继承还是合成,我们都可以在现有类型的基础上创建一个新类型。但在典型情况下,我们通过合成来实现现有类型的“再生”或“重复使用”,将其作为新类型基础实施过程的一部分使用。但如果想实现接口的“再生”,就应使用继承。由于衍生或派生出来的类拥有基础类的接口,所以能够将其“上溯造型”为基础类。对于下一章要讲述的多态性问题,这一点是至关重要的。 4 | 5 | 尽管继承在面向对象的程序设计中得到了特别的强调,但在实际启动一个设计时,最好还是先考虑采用合成技术。只有在特别必要的时候,才应考虑采用继承技术(下一章还会讲到这个问题)。合成显得更加灵活。但是,通过对自己的成员类型应用一些继承技巧,可在运行期准确改变那些成员对象的类型,由此可改变它们的行为。 6 | 7 | 尽管对于快速项目开发来说,通过合成和继承实现的代码再生具有很大的帮助作用。但在允许其他程序员完全依赖它之前,一般都希望能重新设计自己的类结构。我们理想的类结构应该是每个类都有自己特定的用途。它们不能过大(如集成的功能太多,则很难实现它的再生),也不能过小(造成不能由自己使用,或者不能增添新功能)。最终实现的类应该能够方便地再生。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/lockscope/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.lockscope; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/groovyoom/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.groovyoom; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionrollbackfailed/UserRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionrollbackfailed; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | import java.util.List; 7 | 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | 12 | List findByName(String name); 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/compareto/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.compareto; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/deadlock/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.deadlock; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nosqluse/esvsmyql/NewsESRepository.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nosqluse.esvsmyql; 2 | 3 | import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; 4 | import org.springframework.stereotype.Repository; 5 | 6 | @Repository 7 | public interface NewsESRepository extends ElasticsearchRepository { 8 | long countByCateidAndContentContainingAndContentContaining(int cateid, String keyword1, String keyword2); 9 | } 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/dbnull/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.dbnull; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/09~异常差错控制/9.10 练习.md: -------------------------------------------------------------------------------- 1 | # 9.10 练习 2 | 3 | (1) 用 main()创建一个类,令其掷出 try 块内的 Exception 类的一个对象。为 Exception 的构造器赋予一个字串参数。在 catch 从句内捕获异常,并打印出字串参数。添加一个 finally 从句,并打印一条消息,证明自己真正到达那里。 4 | 5 | (2) 用 extends 关键字创建自己的异常类。为这个类写一个构造器,令其采用 String 参数,并随同 String 指针把它保存到对象内。写一个方法,令其打印出保存下来的 String。创建一个 try-catch 从句,练习实际操作新异常。 6 | 7 | (3) 写一个类,并令一个方法掷出在练习 2 中创建的类型的一个异常。试着在没有异常规范的前提下编译它,观察编译器会报告什么。接着添加适当的异常规范。在一个 try-catch 从句中尝试自己的类以及它的异常。 8 | 9 | (4) 在第 5 章,找到调用了 Assert.java 的两个程序,并修改它们,令其掷出自己的异常类型,而不是打印到 System.err。该异常应是扩展了 RuntimeException 的一个内部类。 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/lombokequals/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.lombokequals; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/placeholder/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.placeholder; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/dbnull/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.dbnull; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.IDENTITY; 10 | 11 | @Entity 12 | @Data 13 | public class User { 14 | @Id 15 | @GeneratedValue(strategy = IDENTITY) 16 | private Long id; 17 | private Long score; 18 | } 19 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/pojonull/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.pojonull; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/weakhashmapoom/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.weakhashmapoom; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/beansingletonandorder/TestD.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.beansingletonandorder; 2 | 3 | import lombok.Getter; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Component; 6 | 7 | @Component 8 | public class TestD { 9 | @Getter 10 | private TestC testC; 11 | 12 | @Autowired 13 | public TestD(TestC testC) { 14 | this.testC = testC; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/16~设计范式/README.md: -------------------------------------------------------------------------------- 1 | # 第 16 章 设计范式 2 | 3 | 本章要向大家介绍重要但却并不是那么传统的“范式”(Pattern)程序设计方法。 4 | 5 | 在向面向对象程序设计的演化过程中,或许最重要的一步就是“设计范式”(Design Pattern)的问世。它在由 Gamma,Helm 和 Johnson 编著的《Design Patterns》一书中被定义成一个“里程碑”(该书由 Addison-Wesley 于 1995 年出版,注释 ①)。那本书列出了解决这个问题的 23 种不同的方法。在本章中,我们准备伴随几个例子揭示出设计范式的基本概念。这或许能激起您阅读《Design Pattern》一书的欲望。事实上,那本书现在已成为几乎所有 OOP 程序员都必备的参考书。 6 | 7 | ①:但警告大家:书中的例子是用 C++写的。 8 | 9 | 本章的后一部分包含了展示设计进化过程的一个例子,首先是比较原始的方案,经过逐渐发展和改进,慢慢成为更符合逻辑、更为恰当的设计。该程序(仿真垃圾分类)一直都在进化,可将这种进化作为自己设计方案的一个原型——先为特定的问题提出一个适当的方案,再逐步改善,使其成为解决那类问题一种最灵活的方案。 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/deadletter/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.deadletter; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(CommonMistakesApplication.class, args); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/fanoutvswork/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.fanoutvswork; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(CommonMistakesApplication.class, args); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/rabbitmqdlx/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.rabbitmqdlx; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | public static void main(String[] args) { 9 | SpringApplication.run(CommonMistakesApplication.class, args); 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/jedis/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.jedis; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/equalitymethod/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.equalitymethod; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/finallyissue/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.finallyissue; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/right/PayAPI.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection.right; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | @BankAPI(url = "/bank/pay", desc = "支付接口") 8 | @Data 9 | public class PayAPI extends AbstractAPI { 10 | @BankAPIField(order = 1, type = "N", length = 20) 11 | private long userId; 12 | @BankAPIField(order = 2, type = "M", length = 10) 13 | private BigDecimal amount; 14 | } 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/templatemethod/Item.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.templatemethod; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | 7 | @Data 8 | public class Item { 9 | //商品Id 10 | private long id; 11 | //商品数量 12 | private int quantity; 13 | //商品单价 14 | private BigDecimal price; 15 | //商品优惠 16 | private BigDecimal couponPrice; 17 | //商品运费 18 | private BigDecimal deliveryPrice; 19 | } 20 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/aopmetrics/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.aopmetrics; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/cachedesign/cacheinvalid/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.cachedesign.cacheinvalid; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientip/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientip; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/sqlinject/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.dataandcode.sqlinject; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/equals/intandstringequal/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.equals.intandstringequal; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/lockgranularity/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.lockgranularity; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.0~内存管理/02~内存分配/README.md: -------------------------------------------------------------------------------- 1 | # JVM 内存分配 2 | 3 | 内存的静态分配和动态分配的区别主要是两个:一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。 4 | 5 | 二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有 2 种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由函数 malloc 进行分配。不过栈的动态分配和堆不同,他的动态分配是由编译器进行释放,无需我们手工实现。 6 | 7 | 对于一个进程的内存空间而言,可以在逻辑上分成 3 个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。 8 | 9 | 一般,用 static 修饰的变量,全局变量位于静态数据区。函数调用过程中的参数,返回地址,EBP 和局部变量都采用栈的方式存放。 10 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiasyncsyncmode/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiasyncsyncmode; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/cachedesign/cacheconcurrent/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.cachedesign.cacheconcurrent; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.datasource; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | @Entity 12 | @Data 13 | public class User { 14 | @Id 15 | @GeneratedValue(strategy = AUTO) 16 | private Long id; 17 | private String name; 18 | } 19 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/httpclient/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.httpclient; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/dataandcode/codeinject/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.dataandcode.codeinject; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/handleexception/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.handleexception; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/routelimit/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.routelimit; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | 12 | SpringApplication.run(CommonMistakesApplication.class, args); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/lockandtransaction/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.lockandtransaction; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/usernameautocomplete/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.usernameautocomplete; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/beancopy/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.beancopy; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/threadpool/threadpooloom/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.threadpool.threadpooloom; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/05~隐藏实施过程/5.6 练习.md: -------------------------------------------------------------------------------- 1 | # 5.6 练习 2 | 3 | (1) 用 public、private、protected 以及“友好的”数据成员及方法成员创建一个类。创建属于这个类的一个对象,并观察在试图访问所有类成员时会获得哪种类型的编译器错误提示。注意同一个目录内的类属于“默认”包的一部分。 4 | 5 | (2) 用 protected 数据创建一个类。在相同的文件里创建第二个类,用一个方法操纵第一个类里的 protected 数据。 6 | 7 | (3) 新建一个目录,并编辑自己的 CLASSPATH,以便包括那个新目录。将 P.class 文件复制到自己的新目录,然后改变文件名、P 类以及方法名(亦可考虑添加额外的输出,观察它的运行过程)。在一个不同的目录里创建另一个程序,令其使用自己的新类。 8 | 9 | (4) 在 c05 目录(假定在自己的 CLASSPATH 里)创建下述文件: 10 | 11 | 214 页程序 12 | 13 | 然后在 c05 之外的另一个目录里创建下述文件: 14 | 15 | 214-215 页程序 16 | 17 | 解释编译器为什么会产生一个错误。将 Foreign(外部)类作为 c05 包的一部分改变了什么东西吗? 18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/cachedesign/cachepenetration/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.cachedesign.cachepenetration; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/predefinedexception/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.predefinedexception; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/prventcouponfarming/CouponBatch.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.prventcouponfarming; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | import java.util.concurrent.atomic.AtomicInteger; 7 | 8 | @Data 9 | public class CouponBatch { 10 | private long id; 11 | private AtomicInteger totalCount; 12 | private AtomicInteger remainCount; 13 | private BigDecimal amount; 14 | private String reason; 15 | } 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/mybatisjson/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.mybatisjson; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/threadpool/threadpoolreuse/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.threadpool.threadpoolreuse; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientparameter/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientparameter; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/twotimeoutconfig/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.twotimeoutconfig; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | @Entity 12 | @Data 13 | public class User { 14 | @Id 15 | @GeneratedValue(strategy = AUTO) 16 | private Long id; 17 | private String name; 18 | } 19 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/exception/threadpoolandexception/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.exception.threadpoolandexception; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/clientreadtimeout/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.clientreadtimeout; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/avoidnullpointerexception/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.avoidnullpointerexception; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/templatemethod/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.templatemethod; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storepassword/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storepassword; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/serialversionissue/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.serialversionissue; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/threadpool/threadpoolmixuse/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.threadpool.threadpoolmixuse; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/15~网络编程/README.md: -------------------------------------------------------------------------------- 1 | # 第 15 章 网络编程 2 | 3 | 历史上的网络编程都倾向于困难、复杂,而且极易出错。 4 | 5 | 程序员必须掌握与网络有关的大量细节,有时甚至要对硬件有深刻的认识。一般地,我们需要理解连网协议中不同的“层”(Layer)。而且对于每个连网库,一般都包含了数量众多的函数,分别涉及信息块的连接、打包和拆包;这些块的来回运输;以及握手等等。这是一项令人痛苦的工作。 6 | 7 | 但是,连网本身的概念并不是很难。我们想获得位于其他地方某台机器上的信息,并把它们移到这儿;或者相反。这与读写文件非常相似,只是文件存在于远程机器上,而且远程机器有权决定如何处理我们请求或者发送的数据。 8 | 9 | Java 最出色的一个地方就是它的“无痛苦连网”概念。有关连网的基层细节已被尽可能地提取出去,并隐藏在 JVM 以及 Java 的本机安装系统里进行控制。我们使用的编程模型是一个文件的模型;事实上,网络连接(一个“套接字”)已被封装到系统对象里,所以可象对其他数据流那样采用同样的方法调用。除此以外,在我们处理另一个连网问题——同时控制多个网络连接——的时候,Java 内建的多线程机制也是十分方便的。 10 | 11 | 本章将用一系列易懂的例子解释 Java 的连网支持。 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/clientdata/trustclientcalculation/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.clientdata.trustclientcalculation; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/beansingletonandorder/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.beansingletonandorder; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/deadletter/Consts.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.deadletter; 2 | 3 | public class Consts { 4 | public static final String QUEUE = "test"; 5 | public static final String EXCHANGE = "test"; 6 | public static final String ROUTING_KEY = "test"; 7 | 8 | public static final String DEAD_EXCHANGE = "deadtest"; 9 | public static final String DEAD_QUEUE = "deadtest"; 10 | public static final String DEAD_ROUTING_KEY = "deadtest"; 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/preventsmshijack/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.preventsmshijack; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/deserializationconstructor/APIResultWrong.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.deserializationconstructor; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class APIResultWrong { 7 | private boolean success; 8 | private int code; 9 | 10 | public APIResultWrong() { 11 | } 12 | 13 | public APIResultWrong(int code) { 14 | this.code = code; 15 | if (code == 2000) success = true; 16 | else success = false; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/programmingtransaction/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.programmingtransaction; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionpropagation/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionpropagation; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/resources/templates/xss.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 |
11 |
12 | 13 |
18 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/01.1~垃圾回收/基本概念/README.md: -------------------------------------------------------------------------------- 1 | # 垃圾回收 2 | 3 | 垃圾回收(Garbage Collection,GC)引起大家的关注,是从 1995 年 Java 发布后开始的。事实上,GC 作为计算机科学领域非常热的研究话题之一,最早可以追溯到 1959 年的夏天,起初是用用来简化 Lisp 内存管理的。在接下来 60 余年的时间里,通过 Cheney、Baker 等大师的不断努力,GC 的世界里出现了标记清除、复制、分代、增量回收等一系列 GC 算法,基于这些算法,又出现了种类繁复的垃圾回收器。 4 | 5 | GC 把程序不用的内存空间视为垃圾,(几乎所有的)GC 要做的就只有两件事: 6 | 7 | - 找到内存空间里的垃圾,使其和活对象分开来。 8 | - 回收垃圾对象的内存,使得程序可以重复使用这些内存。 9 | 10 | GC 给我们带来的好处不言而喻,选择 GC 而不是手动释放资源的原因很简单:程序比人更可靠。即便是 C/C++ 这种没有 GC 的语言,也有类似 Boehm GC 这样的第三方库来实现内存的自动管理了。可以毫不夸张地说,GC 已经是现代编程语言的标配。 11 | 12 | # Links 13 | 14 | - https://mp.weixin.qq.com/s/iklfWLmSD4XMAKmFcffp9g 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/copyonwritelistmisuse/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.concurrenttool.copyonwritelistmisuse; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/preventduplicatepay/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.preventduplicatepay; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/securitylastdefense/prventcouponfarming/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.securitylastdefense.prventcouponfarming; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /01~语法基础/01~快速开始/开发环境/README.md: -------------------------------------------------------------------------------- 1 | # Java 开发环境 2 | 3 | # 多版本切换 4 | 5 | ## jenv 6 | 7 | jenv 为我们提供了便捷的 Java 版本切换的功能: 8 | 9 | ```sh 10 | $ brew install jenv 11 | 12 | $ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home/ 13 | $ jenv versions 14 | * system 15 | 1.8 16 | 1.8.0.202-ea 17 | 11.0 18 | 11.0.2 19 | openjdk64-11.0.2 20 | oracle64-1.8.0.202-ea 21 | 22 | $ jenv shell 1.8 23 | $ java -version 24 | java version "1.8.0_202-ea" 25 | Java(TM) SE Runtime Environment (build 1.8.0_202-ea-b03) 26 | Java HotSpot(TM) 64-Bit Server VM (build 25.202-b03, mixed mode) 27 | ``` 28 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/headerapiversion/APIVersion.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.headerapiversion; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.METHOD, ElementType.TYPE}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface APIVersion { 11 | String value(); 12 | 13 | String headerKey() default "X-API-VERSION"; 14 | } 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/concurrenthashmapmisuse/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.concurrenttool.concurrenthashmapmisuse; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/serialization/deserializationconstructor/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.serialization.deserializationconstructor; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(CommonMistakesApplication.class, args); 11 | } 12 | } 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionrollbackfailed/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionrollbackfailed; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/concurrenthashmapperformance/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.concurrenttool.concurrenthashmapperformance; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/aopmetrics/TestController.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.aopmetrics; 2 | 3 | 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RequestMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | @Slf4j 10 | @RequestMapping("test") 11 | @RestController 12 | public class TestController { 13 | @GetMapping 14 | public void test() { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/12~传递和返回对象/README.md: -------------------------------------------------------------------------------- 1 | # 第 12 章 传递和返回对象 2 | 3 | 到目前为止,读者应对对象的“传递”有了一个较为深刻的认识,记住实际传递的只是一个指针。 4 | 5 | 在许多程序设计语言中,我们可用语言的“普通”方式到处传递对象,而且大多数时候都不会遇到问题。但有些时候却不得不采取一些非常做法,使得情况突然变得稍微复杂起来(在 C++中则是变得非常复杂)。Java 亦不例外,我们十分有必要准确认识在对象传递和赋值时所发生的一切。这正是本章的宗旨。 6 | 7 | 若读者是从某些特殊的程序设计环境中转移过来的,那么一般都会问到:“Java 有指针吗?”有些人认为指针的操作很困难,而且十分危险,所以一厢情愿地认为它没有好处。同时由于 Java 有如此好的口碑,所以应该很轻易地免除自己以前编程中的麻烦,其中不可能夹带有指针这样的“危险品”。然而准确地说,Java 是有指针的!事实上,Java 中每个对象(除基本数据类型以外)的标识符都属于指针的一种。但它们的使用受到了严格的限制和防范,不仅编译器对它们有“戒心”,运行期系统也不例外。或者换从另一个角度说,Java 有指针,但没有传统指针的麻烦。我曾一度将这种指针叫做“指针”,但你可以把它想像成“安全指针”。和预备学校为学生提供的安全剪刀类似——除非特别有意,否则不会伤着自己,只不过有时要慢慢来,要习惯一些沉闷的工作。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nosqluse/readme.md: -------------------------------------------------------------------------------- 1 | ## 数据存储:NoSQL与RDBMS如何取长补短、相辅相成? 2 | - 取长补短之 Redis vs MySQL:redisvsmysql 3 | - 取长补短之 InfluxDB vs MySQL:influxdbvsmysql 4 | - 取长补短之 Elasticsearch vs MySQL:esvsmysql 5 | - 结合NoSQL和MySQL应对高并发的复合数据库架构:N/A 6 | 7 | ## 注意,运行esvsmysql之前需要先为ES安装IK分词器 8 | 9 | 步骤如下: 10 | - 进入容器:docker exec -it es01 /bin/bash 11 | - 安装IK分词插件:bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.5.2/elasticsearch-analysis-ik-7.5.2.zip 12 | - 重启容器:docker restart es01 13 | - 把es01替换为es02和es03,重新执行上面三步 -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/beansingletonandorder/TestC.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.beansingletonandorder; 2 | 3 | import lombok.Getter; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Lazy; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class TestC { 10 | @Getter 11 | private TestD testD; 12 | 13 | @Autowired 14 | public TestC(@Lazy TestD testD) { 15 | this.testD = testD; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storeidcard/CipherData.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storeidcard; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | @Data 12 | @Entity 13 | public class CipherData { 14 | @Id 15 | @GeneratedValue(strategy = AUTO) 16 | private Long id; 17 | private String iv;//初始化向量 18 | private String secureKey;//密钥 19 | } 20 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/mdc/LoggingController.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.mdc; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | @Slf4j 9 | @RequestMapping("mdc") 10 | @RestController 11 | public class LoggingController { 12 | 13 | @GetMapping("log") 14 | public void log() { 15 | log.info("info"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /99~参考资料/《On Java 8》/Appendix-Benefits-and-Costs-of-Static-Type-Checking.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 附录:静态语言类型检查 4 | 5 | > 这是一本我多年来撰写的经过编辑过的论文集,论文集试图将静态检查语言和动态语言之间的争论放到一个正确的角度。还有一个前言部分,描述了我最近对这个话题的思考和见解。 6 | 7 | 8 | 9 | ## 前言 10 | 11 | 12 | 13 | ## 静态类型检查和测试 14 | 15 | 16 | 17 | ## 如何提升打字 18 | 19 | 20 | 21 | ## 生产力的成本 22 | 23 | 24 | 25 | ## 静态和动态 26 | 27 | 28 | 29 |
30 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/06~类再生/README.md: -------------------------------------------------------------------------------- 1 | # 第 6 章 类再生 2 | 3 | “Java 引人注目的一项特性是代码的重复使用或者再生。但最具革命意义的是,除代码的复制和修改以外,我们还能做多得多的其他事情。” 4 | 5 | 在象 C 那样的程序化语言里,代码的重复使用早已可行,但效果不是特别显著。与 Java 的其他地方一样,这个方案解决的也是与类有关的问题。我们通过创建新类来重复使用代码,但却用不着重新创建,可以直接使用别人已建好并调试好的现成类。 6 | 7 | 但这样做必须保证不会干扰原有的代码。在这一章里,我们将介绍两个达到这一目标的方法。第一个最简单:在新类里简单地创建原有类的对象。我们把这种方法叫作“合成”,因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。 8 | 9 | 第二种方法则显得稍微有些技巧。它创建一个新类,将其作为现有类的一个“类型”。我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”(Inheritance),涉及的大多数工作都是由编译器完成的。对于面向对象的程序设计,“继承”是最重要的基础概念之一。它对我们下一章要讲述的内容会产生一些额外的影响。 10 | 11 | 对于合成与继承这两种方法,大多数语法和行为都是类似的(因为它们都要根据现有的类型生成新类型)。在本章,我们将深入学习这些代码再生或者重复使用的机制。 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/lock/lockscope/Data.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.lock.lockscope; 2 | 3 | import lombok.Getter; 4 | 5 | class Data { 6 | @Getter 7 | private static int counter = 0; 8 | private static Object locker = new Object(); 9 | 10 | public static int reset() { 11 | counter = 0; 12 | return counter; 13 | } 14 | 15 | public synchronized void wrong() { 16 | counter++; 17 | } 18 | 19 | public void right() { 20 | synchronized (locker) { 21 | counter++; 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/feignpermethodtimeout/Client.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.feignpermethodtimeout; 2 | 3 | import feign.Request; 4 | import org.springframework.cloud.openfeign.FeignClient; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | 7 | @FeignClient(name = "clientsdk") 8 | public interface Client { 9 | @GetMapping("/feignpermethodtimeout/method1") 10 | String method1(Request.Options options); 11 | 12 | @GetMapping("/feignpermethodtimeout/method2") 13 | String method2(Request.Options options); 14 | } 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/async/MySlowAppender.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.async; 2 | 3 | import ch.qos.logback.core.ConsoleAppender; 4 | 5 | import java.util.concurrent.TimeUnit; 6 | 7 | public class MySlowAppender extends ConsoleAppender { 8 | @Override 9 | protected void subAppend(Object event) { 10 | try { 11 | // 模拟慢日志 12 | TimeUnit.MILLISECONDS.sleep(1); 13 | } catch (InterruptedException e) { 14 | e.printStackTrace(); 15 | } 16 | super.subAppend(event); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /01~语法基础/08~函数式编程/Lambda/README.md: -------------------------------------------------------------------------------- 1 | # Lambda 2 | 3 | Lambda 表达式是一个带有参数和函数体的匿名函数,它本身是构造了一个继承自某个函数式接口的子类,所以可以用父类指针指向它。在 Java 中,Lambda 表达式就是闭包;闭包一般指存在自由变量的代码块,它与对象类似,都是用来描述一段代码与其环境的关系。事实上,内部类一直都是闭包,而 Java8 中为闭包赋予了更吸引人的语法。一个 Lambda 表达式包括三个部分:一段代码、参数、自由变量的值,这里的“自由”指的是那些不是参数并且没有在代码中定义的变量。Java 中本质上闭包中是采用的值捕获,即不可以在闭包中使用可变对象。但是它实际上是允许捕获事实上不变量,譬如不可变的 ArrayList,只是指针指向不可变罢了。虽然实现用的是值捕获,但效果看起来跟引用捕获一样;就算以后的 Java 扩展到允许通用的(对可变变量的)引用捕获,也不会跟已有的代码发生不兼容。 4 | 5 | Java 中最常见的闭包的使用如下所示: 6 | 7 | ```java 8 | Runnable task = () -> { 9 | // do something 10 | }; 11 | 12 | Comparator cmp = (s1, s2) -> { 13 | return Integer.compare(s1.length(), s2.length()); 14 | }; 15 | ``` 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/compensation/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.compensation; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.scheduling.annotation.EnableScheduling; 6 | 7 | @SpringBootApplication 8 | @EnableScheduling 9 | public class CommonMistakesApplication { 10 | public static void main(String[] args) { 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sensitivedata/storeidcard/UserData.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.sensitivedata.storeidcard; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.Id; 7 | 8 | @Data 9 | @Entity 10 | public class UserData { 11 | @Id 12 | private Long id; 13 | private String idcard;//脱敏的身份证 14 | private Long idcardCipherId;//身份证加密ID 15 | private String idcardCipherText;//身份证密文 16 | private String name;//脱敏的姓名 17 | private Long nameCipherId;//姓名加密ID 18 | private String nameCipherText;//姓名密文 19 | } 20 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/14~多线程/README.md: -------------------------------------------------------------------------------- 1 | # 第 14 章 多线程 2 | 3 | 利用对象,可将一个程序分割成相互独立的区域。我们通常也需要将一个程序转换成多个独立运行的子任务。 4 | 5 | 象这样的每个子任务都叫作一个“线程”(Thread)。编写程序时,可将每个线程都想象成独立运行,而且都有自己的专用 CPU。一些基础机制实际会为我们自动分割 CPU 的时间。我们通常不必关心这些细节问题,所以多线程的代码编写是相当简便的。 6 | 7 | 这时理解一些定义对以后的学习狠有帮助。“进程”是指一种“自包容”的运行程序,有自己的地址空间。“多任务”操作系统能同时运行多个进程(程序)——但实际是由于 CPU 分时机制的作用,使每个进程都能循环获得自己的 CPU 时间片。但由于轮换速度非常快,使得所有程序好象是在“同时”运行一样。“线程”是进程内部单一的一个顺序控制流。因此,一个进程可能容纳了多个同时执行的线程。 8 | 9 | 多线程的应用范围很广。但在一般情况下,程序的一些部分同特定的事件或资源联系在一起,同时又不想为它而暂停程序其他部分的执行。这样一来,就可考虑创建一个线程,令其与那个事件或资源关联到一起,并让它独立于主程序运行。一个很好的例子便是“Quit”或“退出”按钮——我们并不希望在程序的每一部分代码中都轮询这个按钮,同时又希望该按钮能及时地作出响应(使程序看起来似乎经常都在轮询它)。事实上,多线程最主要的一个用途就是构建一个“反应灵敏”的用户界面。 10 | -------------------------------------------------------------------------------- /01~语法基础/09~文件 IO/README.md: -------------------------------------------------------------------------------- 1 | # Java IO 基础 2 | 3 | Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标;Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。Java 为 IO 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。 4 | 5 | Java 是面向对象的编程语言,对象是对现实实体的抽象表述。所以 Java API 中流(Stream)是对一连串数据的抽象,同时定义了一些操作,write 和 read 等。所以现实实体,只要包含数据和对数据的读写操作都可以表示为流。OutputStream 类和 InputStream 类,是 2 个抽象类,分别对应输出、输入流,所有其它流对象,都是其子类。 比如文件,文件本质是保存在存储设备中的一连串数据,在 Java API 中抽象为 FileOutputStream 类和 FileInputStream 类,文件的读写可以通过对相应流的读写实现的。 6 | 7 | ![IO 类](http://www.runoob.com/wp-content/uploads/2013/12/iostream2xx.png) 8 | 9 | # Links 10 | 11 | - http://tutorials.jenkov.com/java-io/index.html 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 |
9 | 10 | 14 | 15 |
18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/duplicate/loggerright1.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%line] - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/mdc/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | [%X{reqId}] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%line] 6 | [%X{req.userAgent} %X{req.requestURI}] - %msg%n 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/async/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.async; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | System.setProperty("logging.config", "classpath:org/geekbang/time/commonmistakes/logging/async/asyncwrong.xml"); 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/templatemethod/Cart.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.templatemethod; 2 | 3 | import lombok.Data; 4 | 5 | import java.math.BigDecimal; 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | @Data 10 | public class Cart { 11 | //商品清单 12 | private List items = new ArrayList<>(); 13 | //总优惠 14 | private BigDecimal totalDiscount; 15 | //商品总价 16 | private BigDecimal totalItemPrice; 17 | //总运费 18 | private BigDecimal totalDeliveryPrice; 19 | //应付总价 20 | private BigDecimal payPrice; 21 | } 22 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/WrongAspect.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.aspectj.lang.JoinPoint; 5 | import org.aspectj.lang.annotation.Aspect; 6 | import org.aspectj.lang.annotation.Before; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Aspect 10 | @Slf4j 11 | @Component 12 | public class WrongAspect { 13 | @Before("within(feign.Client+)") 14 | public void before(JoinPoint pjp) { 15 | log.info("within(feign.Client+) pjp {}, args:{}", pjp, pjp.getArgs()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/src/main/java/cn/mrcode/stady/monitor_tuning/chapter4/PrintJinfo.java: -------------------------------------------------------------------------------- 1 | package cn.mrcode.stady.monitor_tuning.chapter4; 2 | 3 | 4 | import org.openjdk.btrace.core.BTraceUtils; 5 | import org.openjdk.btrace.core.annotations.BTrace; 6 | 7 | @BTrace 8 | public class PrintJinfo { 9 | static { 10 | BTraceUtils.println("System Properties:"); 11 | BTraceUtils.printProperties(); 12 | BTraceUtils.println("VM Flags:"); 13 | BTraceUtils.printVmArguments(); 14 | BTraceUtils.println("OS Enviroment:"); 15 | BTraceUtils.printEnv(); 16 | BTraceUtils.exit(0); 17 | } 18 | } -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/07~多态性/README.md: -------------------------------------------------------------------------------- 1 | # 第 7 章 多态性 2 | 3 | “对于面向对象的程序设计语言,多态性是第三种最基本的特征(前两种是数据抽象和继承。” 4 | 5 | “多态性”(Polymorphism)从另一个角度将接口从具体的实施细节中分离出来,亦即实现了“是什么”与“怎样做”两个模块的分离。利用多态性的概念,代码的组织以及可读性均能获得改善。此外,还能创建“易于扩展”的程序。无论在项目的创建过程中,还是在需要加入新特性的时候,它们都可以方便地“成长”。 6 | 7 | 通过合并各种特征与行为,封装技术可创建出新的数据类型。通过对具体实施细节的隐藏,可将接口与实施细节分离,使所有细节成为“private”(私有)。这种组织方式使那些有程序化编程背景人感觉颇为舒适。但多态性却涉及对“类型”的分解。通过上一章的学习,大家已知道通过继承可将一个对象当作它自己的类型或者它自己的基础类型对待。这种能力是十分重要的,因为多个类型(从相同的基础类型中衍生出来)可被当作同一种类型对待。而且只需一段代码,即可对所有不同的类型进行同样的处理。利用具有多态性的方法调用,一种类型可将自己与另一种相似的类型区分开,只要它们都是从相同的基础类型中衍生出来的。这种区分是通过各种方法在行为上的差异实现的,可通过基础类实现对那些方法的调用。 8 | 9 | 在这一章中,大家要由浅入深地学习有关多态性的问题(也叫作动态绑定、推迟绑定或者运行期绑定)。同时举一些简单的例子,其中所有无关的部分都已剥除,只保留与多态性有关的代码。 10 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | !gradle/wrapper/gradle-wrapper.jar 5 | !**/src/main/**/build/ 6 | !**/src/test/**/build/ 7 | 8 | ### STS ### 9 | .apt_generated 10 | .classpath 11 | .factorypath 12 | .project 13 | .settings 14 | .springBeans 15 | .sts4-cache 16 | bin/ 17 | !**/src/main/**/bin/ 18 | !**/src/test/**/bin/ 19 | 20 | ### IntelliJ IDEA ### 21 | .idea 22 | *.iws 23 | *.iml 24 | *.ipr 25 | out/ 26 | !**/src/main/**/out/ 27 | !**/src/test/**/out/ 28 | 29 | ### NetBeans ### 30 | /nbproject/private/ 31 | /nbbuild/ 32 | /dist/ 33 | /nbdist/ 34 | /.nb-gradle/ 35 | 36 | ### VS Code ### 37 | .vscode/ 38 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/06~类再生/6.6 累积开发.md: -------------------------------------------------------------------------------- 1 | # 6.6 累积开发 2 | 3 | 继承的一个好处是它支持“累积开发”,允许我们引入新的代码,同时不会为现有代码造成错误。这样可将新错误隔离到新代码里。通过从一个现成的、功能性的类继承,同时增添成员新的数据成员及方法(并重新定义现有方法),我们可保持现有代码原封不动(另外有人也许仍在使用它),不会为其引入自己的编程错误。一旦出现错误,就知道它肯定是由于自己的新代码造成的。这样一来,与修改现有代码的主体相比,改正错误所需的时间和精力就可以少很多。 4 | 5 | 类的隔离效果非常好,这是许多程序员事先没有预料到的。甚至不需要方法的源代码来实现代码的再生。最多只需要导入一个包(这对于继承和合并都是成立的)。 6 | 7 | ```java 8 | 大家要记住这样一个重点:程序开发是一个不断递增或者累积的过程,就象人们学习知识一样。当然可根据要求进行尽可能多的分析,但在一个项目的设计之初,谁都不可能提前获知所有的答案。如果能将自己的项目看作一个有机的、能不断进步的生物,从而不断地发展和改进它,就有望获得更大的成功以及更直接的反馈。 9 | 10 | 尽管继承是一种非常有用的技术,但在某些情况下,特别是在项目稳定下来以后,仍然需要从新的角度考察自己的类结构,将其收缩成一个更灵活的结构。请记住,继承是对一种特殊关系的表达,意味着“这个新类属于那个旧类的一种类型”。我们的程序不应纠缠于一些细树末节,而应着眼于创建和操作各种类型的对象,用它们表达出来自“问题空间”的一个模型。 11 | ``` 12 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/asyncprocess/compensation/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.asyncprocess.compensation; 2 | 3 | import lombok.Data; 4 | 5 | import java.io.Serializable; 6 | import java.time.LocalDateTime; 7 | import java.util.UUID; 8 | import java.util.concurrent.atomic.AtomicLong; 9 | 10 | @Data 11 | public class User implements Serializable { 12 | private static AtomicLong atomicLonng = new AtomicLong(); 13 | private Long id = atomicLonng.incrementAndGet(); 14 | private String name = UUID.randomUUID().toString(); 15 | private LocalDateTime registerTime = LocalDateTime.now(); 16 | } 17 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/duplicate/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.duplicate; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class CommonMistakesApplication { 8 | 9 | public static void main(String[] args) { 10 | System.setProperty("logging.config", "classpath:org/geekbang/time/commonmistakes/logging/duplicate/multiplelevelsfilter.xml"); 11 | SpringApplication.run(CommonMistakesApplication.class, args); 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/README.md: -------------------------------------------------------------------------------- 1 | ## Thinking in Java \(Java 编程思想\) 2 | 3 | 本书来自网络,[http://woquanke.com](http://woquanke.com) 整理成电子书,支持 PDF,ePub,Mobi 格式,方便大家下载阅读。 4 | 5 | 阅读地址:[https://woquanke.com/books/java](https://woquanke.com/books/java) 6 | 7 | 下载地址:[https://www.gitbook.com/book/quanke/think-in-java/](https://www.gitbook.com/book/quanke/think-in-java/) 8 | 9 | github 地址:[https://github.com/quanke/think-in-java](https://github.com/quanke/think-in-java) 10 | 11 | 编辑:[http://woquanke.com](http://woquanke.com) 12 | 13 | 第 13 章没有编辑,觉得没有意义,Java 的 GUI 先在应用少,有时间在编辑好。。。 14 | 15 | 编辑整理辛苦,还望大神们点一下 star ,抚平我虚荣的心 16 | 17 | 更多请关注我的微信公众号: 18 | 19 | ![](/assets/qrcode_for_gh_26893aa0a4ea_258.jpg) 20 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/99~参考资料/Java 生产环境下性能监控与调优详解/codes/monitor-tuning-master/src/main/java/cn/mrcode/stady/monitor_tuning/chapter2/User.java: -------------------------------------------------------------------------------- 1 | package cn.mrcode.stady.monitor_tuning.chapter2; 2 | 3 | public class User { 4 | private int id; 5 | private String name; 6 | 7 | public User(int id, String name) { 8 | this.id = id; 9 | this.name = name; 10 | } 11 | 12 | public int getId() { 13 | return id; 14 | } 15 | 16 | public void setId(int id) { 17 | this.id = id; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public void setName(String name) { 25 | this.name = name; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/troubleshootingtools/mat/FooService.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.troubleshootingtools.mat; 2 | 3 | import org.springframework.stereotype.Component; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | import java.util.stream.Collectors; 8 | import java.util.stream.IntStream; 9 | 10 | @Component 11 | public class FooService { 12 | List data = new ArrayList<>(); 13 | 14 | public void oom() { 15 | data.add(IntStream.rangeClosed(1, 10_000) 16 | .mapToObj(__ -> "a") 17 | .collect(Collectors.joining(""))); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/nullvalue/pojonull/User.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.nullvalue.pojonull; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | import java.util.Date; 9 | 10 | import static javax.persistence.GenerationType.IDENTITY; 11 | 12 | @Data 13 | @Entity 14 | public class User { 15 | @Id 16 | @GeneratedValue(strategy = IDENTITY) 17 | private Long id; 18 | private String name; 19 | private String nickname; 20 | private Integer age; 21 | private Date createDate = new Date(); 22 | } 23 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/Wrong2Aspect.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.aspectj.lang.JoinPoint; 5 | import org.aspectj.lang.annotation.Aspect; 6 | import org.aspectj.lang.annotation.Before; 7 | 8 | @Aspect 9 | @Slf4j 10 | //@Component 11 | public class Wrong2Aspect { 12 | 13 | @Before("@within(org.springframework.cloud.openfeign.FeignClient)") 14 | public void before(JoinPoint pjp) { 15 | log.info("@within(org.springframework.cloud.openfeign.FeignClient) pjp {}, args:{}", pjp, pjp.getArgs()); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/sqlindex/indexcost.sql: -------------------------------------------------------------------------------- 1 | create DEFINER=`root`@`%` PROCEDURE `insert_person`() 2 | begin 3 | declare c_id integer default 1; 4 | while c_id<=100000 do 5 | insert into person values(c_id, concat('name',c_id), c_id+100, date_sub(NOW(), interval c_id second)); 6 | -- 需要注意,因为使用的是now(),所以对于后续的例子,使用文中的SQL你需要自己调整条件,否则可能看不到文中的效果 7 | set c_id=c_id+1; 8 | end while; 9 | end 10 | 11 | select DATA_LENGTH, INDEX_LENGTH from information_schema.TABLES where TABLE_NAME='person'; 12 | 13 | explain select * from person where NAME='name1'; 14 | 15 | explain select NAME,SCORE from person where NAME='name1'; 16 | -------------------------------------------------------------------------------- /01~语法基础/07~类与对象/泛型/README.md: -------------------------------------------------------------------------------- 1 | # Java 泛型 2 | 3 | 泛型即是把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型,Java 泛型设计原则是只要在编译时期没有出现警告,那么运行时期就不会出现 ClassCastException 异常。泛型常见的相关术语有: 4 | 5 | - `ArrayList`中的**E 称为类型参数变量** 6 | - `ArrayList`中的**Integer 称为实际类型参数** 7 | - **整个称为 ArrayList泛型类型** 8 | - **整个 ArrayList称为参数化的类型 ParameterizedType** 9 | 10 | 早期 Java 是使用 Object 来代表任意类型的,但是向下转型有强转的问题,这样程序就不太安全。在没有泛型的时候,Collection、Map 集合对元素的类型是没有任何限制的。本来我的 Collection 集合装载的是全部的 Dog 对象,但是外边把 Cat 对象存储到集合中,是没有任何语法错误的。把对象扔进集合中,集合是不知道元素的类型是什么的,仅仅知道是 Object。因此在 `get()` 的时候,返回的是 Object;外边获取该对象,还需要强制转换。 11 | 12 | 在引入了泛型之后,代码更加简洁,程序更加健壮,可读性和稳定性也得到了极大的提升。 13 | 14 | # Links 15 | 16 | — https://blog.csdn.net/s10461/article/details/53941091 17 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/apidesign/apiresponse/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.apidesign.apiresponse; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | Utils.loadPropertySource(CommonMistakesApplication.class, "config.properties"); 12 | SpringApplication.run(CommonMistakesApplication.class, args); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart2/aopfeign/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart2.aopfeign; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplication { 9 | 10 | public static void main(String[] args) { 11 | Utils.loadPropertySource(CommonMistakesApplication.class, "feign.properties"); 12 | SpringApplication.run(CommonMistakesApplication.class, args); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/08~对象的容纳/8.6 通用集合库.md: -------------------------------------------------------------------------------- 1 | # 8.6 通用集合库 2 | 3 | 通过本章的学习,大家已知道标准 Java 库提供了一些特别有用的集合,但距完整意义的集合尚远。除此之外,象排序这样的算法根本没有提供支持。C++出色的一个地方就是它的库,特别是“标准模板库”(STL)提供了一套相当完整的集合,以及许多象排序和检索这样的算法,可以非常方便地对那些集合进行操作。有感这一现状,并以这个模型为基础,ObjectSpace 公司设计了 Java 版本的“通用集合库”(从前叫作“Java 通用库”,即 JGL;但 JGL 这个缩写形式侵犯了 Sun 公司的版权——尽管本书仍然沿用这个简称)。这个库尽可能遵照 STL 的设计(照顾到两种语言间的差异)。JGL 实现了许多功能,可满足对一个集合库的大多数常规需求,它与 C++的模板机制非常相似。JGL 包括相互链接起来的列表、设置、队列、映射、堆栈、序列以及迭代器,它们的功能比 Enumeration(枚举)强多了。同时提供了一套完整的算法,如检索和排序等。在某些方面,ObjectSpace 的设计也显得比 Sun 的库设计方案“智能”一些。举个例子来说,JGL 集合中的方法不会进入 final 状态,所以很容易继承和改写那些方法。 4 | 5 | JGL 已包括到一些厂商发行的 Java 套件中,而且 ObjectSpace 公司自己也允许所有用户免费使用 JGL,包括商业性的使用。详细情况和软件下载可访问 http://www.ObjectSpace.com 。与 JGL 配套提供的联机文档做得非常好,可作为自己的一个绝佳起点使用。 6 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/15~网络编程/15.10 练习.md: -------------------------------------------------------------------------------- 1 | # 15.10 练习 2 | 3 | (1) 编译和运行本章中的 JabberServer 和 JabberClient 程序。接着编辑一下程序,删去为输入和输出设计的所有缓冲机制,然后再次编译和运行,观察一下结果。 4 | 5 | (2) 创建一个服务器,用它请求用户输入密码,然后打开一个文件,并将文件通过网络连接传送出去。创建一个同该服务器连接的客户,为其分配适当的密码,然后捕获和保存文件。在自己的机器上用 localhost(通过调用 InetAddress.getByName(null)生成本地 IP 地址 127.0.0.1)测试这两个程序。 6 | 7 | (3) 修改练习 2 中的程序,令其用多线程机制对多个客户进行控制。 8 | 9 | (4) 修改 JabberClient,禁止输出刷新,并观察结果。 10 | 11 | (5) 以 ShowHTML.java 为基础,创建一个程序片,令其成为对自己 Web 站点的特定部分进行密码保护的大门。 12 | 13 | (6) (可能有些难度)创建一对客户/服务器程序,利用数据报(Datagram)将一个文件从一台机器传到另一台(参见本章数据报小节末尾的叙述)。 14 | 15 | (7) (可能有些难度)对 VLookup.java 程序作一番修改,使我们能点击得到的结果名字,然后程序会自动取得那个名字,并把它复制到剪贴板(以便我们方便地粘贴到自己的 E-mail)。可能要回过头去研究一下 IO 数据流的那一章,回忆该如何使用 Java 1.1 剪贴板。 16 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/03~性能调优/调试工具/README.md: -------------------------------------------------------------------------------- 1 | # 线上调试 2 | 3 | ![Java 性能监控工具](https://s2.ax1x.com/2019/11/19/MgdMHP.png) 4 | 5 | 线上调试的典型场景譬如: 6 | 7 | - 程序在稳定运行了,可是实现的功能点了没反应。 8 | - 为了修复 Bug 而上线的新版本,上线后发现 Bug 依然在,却想不通哪里有问题? 9 | - 想到可能出现问题的地方,却发现那里没打日志,没法在运行中看到问题,只能加了日志输出重新打包——部署——上线 10 | - 程序功能正常了,可是为啥响应时间这么慢,在哪里出现了问题? 11 | - 程序不但稳定运行,而且功能完美,但跑了几天或者几周过后,发现响应速度变慢了,是不是内存泄漏了? 12 | 13 | 如果瓶颈点在应用层和系统层均呈现出多变量分布,建议此时使用 JProfiler 等工具对应用进行 Profiling,获取应用的综合性能信息(注:Profiling 指的是在应用运行时,通过事件(Event-based)、统计抽样(Sampling Statistical)或植入附加指令(Byte-Code instrumentation)等方法,收集应用运行时的信息,来研究应用行为的动态分析方法)。譬如,可以对 CPU 进行抽样统计,结合各种符号表信息,得到一段时间内应用内的代码热点。 14 | 15 | # Links 16 | 17 | - https://mp.weixin.qq.com/s/t7G1tSrNJ603nIpgzMY2uw 这几款 JVM 故障诊断处理工具 你还不会? 18 | -------------------------------------------------------------------------------- /06~JVM 与性能优化/10~JDK/OpenJDK.md: -------------------------------------------------------------------------------- 1 | # Open JDK 2 | 3 | Oracle JDK 与 Open JDK 在程序上是非常接近的,两者共用了大量相同的代码,所以我们编译的 OpenJDK,基本上可以认为性能、功能和执行逻辑上都和官方的 Oracle JDK 是一致的。 4 | 5 | OpenJDK 是 Sun 在 2006 年末把 Java 开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如 IcedTea、UltraViolet 都是从 OpenJDK 源码衍生出的发行版。但如果仅从“开源”字面意义(开放可阅读的源码)上看,其实 Sun 自 JDK 1.5 之 后就开始以 Java Research License(JRL)的形式公布过 Java 源码,主要用于研究人员阅读(JRL 许可证的开放源码至 JDK 1.6 Update 23 为止)。把这些 JRL 许可证形式的 Sun/OracleJDK 源码和对应版本的 OpenJDK 源码进行比较,发现除了文件头的版权注释之外,其余代码 基本上都是相同的,只有字体渲染部分存在一点差异,Oracle JDK 采用了商业实现,而 OpenJDK 使用的是开源的 FreeType。当然,“相同”是建立在两者共有的组件基础上的,Oracle JDK 中还会存在一些 Open JDK 没有的、商用闭源的功能,例如从 JRockit 移植改造而来的 Java Flight Recorder。预计以后 JRockit 的 MissionControl 移植到 HotSpot 之后,也会以 Oracle JDK 专有、闭源的形式提供。 6 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/duplicate/loggerwrong.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] [%logger{40}:%line] - %msg%n 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/redundantcode/reflection/right/CreateUserAPI.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.redundantcode.reflection.right; 2 | 3 | import lombok.Data; 4 | 5 | @BankAPI(url = "/bank/createUser", desc = "创建用户接口") 6 | @Data 7 | public class CreateUserAPI extends AbstractAPI { 8 | @BankAPIField(order = 1, type = "S", length = 10) 9 | private String name; 10 | @BankAPIField(order = 2, type = "S", length = 18) 11 | private String identity; 12 | @BankAPIField(order = 4, type = "S", length = 11) 13 | private String mobile; 14 | @BankAPIField(order = 3, type = "N", length = 5) 15 | private int age; 16 | } 17 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/springpart1/aopmetrics/UserEntity.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.springpart1.aopmetrics; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | 12 | @Entity 13 | @Data 14 | public class UserEntity { 15 | @Id 16 | @GeneratedValue(strategy = AUTO) 17 | private Long id; 18 | private String name; 19 | 20 | public UserEntity() { 21 | } 22 | 23 | public UserEntity(String name) { 24 | this.name = name; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/usernameautocomplete/UserDTO.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.usernameautocomplete; 2 | 3 | import lombok.Data; 4 | import lombok.EqualsAndHashCode; 5 | 6 | import java.util.stream.Collectors; 7 | import java.util.stream.IntStream; 8 | 9 | @Data 10 | public class UserDTO { 11 | private String name; 12 | @EqualsAndHashCode.Exclude 13 | private String payload; 14 | 15 | public UserDTO(String name) { 16 | this.name = name; 17 | this.payload = IntStream.rangeClosed(1, 10_000) 18 | .mapToObj(__ -> "a") 19 | .collect(Collectors.joining("")); 20 | } 21 | } -------------------------------------------------------------------------------- /10~方言/10~Scala/README.md: -------------------------------------------------------------------------------- 1 | # Scala 2 | 3 | Scala 是运行在 Java 虚拟机 (Java Virtual Machine)之上,轻松实现和丰富的 Java 类库互联互通。它既支持面向对象的编程方式,又支持函数式编程。它写出的程序像动态语言一样简洁,但事实上它确是严格意义上的静态语言。 4 | 5 | - 面向对象特性:Scala 是一种纯面向对象的语言,每一个值都是对象。对象的数据类型以及行为由类和特征(Trait)描述。类抽象机制的扩展有两种途径。一种途径是子类继承,另一种途径是灵活的混入(Mixin)机制。这两种途径能避免多重继承的种种问题。 6 | 7 | - 函数式编程:Scala 也是一种函数式语言,其函数也能当成值来使用。Scala 提供了轻量级的语法用以定义匿名函数,支持高阶函数,允许嵌套多层函数,并支持柯里化。Scala 的 Case Class 及其内置的模式匹配相当于函数式编程语言中常用的代数类型(Algebraic Type)。 8 | 9 | - 静态类型:Scala 是具备类型系统,通过编译时的检查,保证代码的安全性和一致性。 10 | 11 | - 良好并发机制:Scala 把 Erlang 风格的基于 actor 的并发带进了 JVM。开发者可以利用 Scala 的 actor 模型在 JVM 上设计具伸缩性的并发应用程序,它会自动获得多核心处理器带来的优势,而不必依照复杂的 Java 线程模型来编写程序。 12 | 13 | # Links 14 | 15 | - https://blog.csdn.net/yuan_xw/article/details/49796183 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/CommonMistakesApplicationBad.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.datasource; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplicationBad { 9 | 10 | public static void main(String[] args) { 11 | Utils.loadPropertySource(CommonMistakesApplicationBad.class, "bad.properties"); 12 | SpringApplication.run(CommonMistakesApplicationBad.class, args); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/oom/impropermaxheadersize/CommonMistakesApplicationBad.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.oom.impropermaxheadersize; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | 8 | @SpringBootApplication 9 | public class CommonMistakesApplicationBad { 10 | public static void main(String[] args) { 11 | Utils.loadPropertySource(CommonMistakesApplicationBad.class, "bad.properties"); 12 | SpringApplication.run(CommonMistakesApplicationBad.class, args); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/nested/UserDataMapper.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.nested; 2 | 3 | 4 | import org.apache.ibatis.annotations.Insert; 5 | import org.apache.ibatis.annotations.Mapper; 6 | import org.apache.ibatis.annotations.Param; 7 | import org.apache.ibatis.annotations.Select; 8 | 9 | @Mapper 10 | public interface UserDataMapper { 11 | @Insert("insert into userdata(name,source)values(#{name},#{source})") 12 | void insert(@Param("name") String name, @Param("source") String source); 13 | 14 | @Select("select count(*) from userdata where name=#{name}") 15 | int count(@Param("name") String name); 16 | } 17 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/01~对象入门/1.4 方案的重复使用.md: -------------------------------------------------------------------------------- 1 | # 1.4 方案的重复使用 2 | 3 | 创建并测试好一个类后,它应(从理想的角度)代表一个有用的代码单位。但并不象许多人希望的那样,这种重复使用的能力并不容易实现;它要求较多的经验以及洞察力,这样才能设计出一个好的方案,才有可能重复使用。 4 | 5 | 许多人认为代码或设计方案的重复使用是面向对象的程序设计提供的最伟大的一种杠杆。 6 | 7 | 为重复使用一个类,最简单的办法是仅直接使用那个类的对象。但同时也能将那个类的一个对象置入一个新类。我们把这叫作“创建一个成员对象”。新类可由任意数量和类型的其他对象构成。无论如何,只要新类达到了设计要求即可。这个概念叫作“组织”——在现有类的基础上组织一个新类。有时,我们也将组织称作“包含”关系,比如“一辆车包含了一个变速箱”。 8 | 9 | 对象的组织具有极大的灵活性。新类的“成员对象”通常设为“私有”(Private),使用这个类的客户程序员不能访问它们。这样一来,我们可在不干扰客户代码的前提下,从容地修改那些成员。也可以在“运行期”更改成员,这进一步增大了灵活性。后面要讲到的“继承”并不具备这种灵活性,因为编译器必须对通过继承创建的类加以限制。 10 | 11 | 由于继承的重要性,所以在面向对象的程序设计中,它经常被重点强调。作为新加入这一领域的程序员,或许早已先入为主地认为“继承应当随处可见”。沿这种思路产生的设计将是非常笨拙的,会大大增加程序的复杂程度。相反,新建类的时候,首先应考虑“组织”对象;这样做显得更加简单和灵活。利用对象的组织,我们的设计可保持清爽。一旦需要用到继承,就会明显意识到这一点。 12 | -------------------------------------------------------------------------------- /03~工程实践/构建工具/Gradle/01~快速开始/安装配置.md: -------------------------------------------------------------------------------- 1 | # Gradle 快速开始 2 | 3 | # 安装与配置 4 | 5 | ## 手动安装 6 | 7 | 首先,先 download 最新版本的 gradle,网址如下:[download](http://www.gradle.org/get-started)。然后将下载下来的 zip 包放在你要安装的路径上,我安装在 8 | 9 | ``` 10 | /usr/local/bin; 11 | ``` 12 | 13 | 然后打开电脑上的.bash_profile 文件,输入以下命令: 14 | 15 | ``` 16 | GRADLE_HOME=/usr/local/bin/gradle-1.8; 17 | export GRADLE_HOME 18 | export PATH=$PATH:$GRADLE_HOME/bin 19 | ``` 20 | 21 | 然后再在 console 上输入以下命令: 22 | 23 | ```sh 24 | $ source ~/.bash_profile 25 | ``` 26 | 27 | 这样就安装成功啦,可以通过以下命令来查看是否安装成功。 28 | 29 | ``` 30 | gradle -version 31 | ``` 32 | 33 | 如果提示没有 gradle 命令,则有可能是: 34 | 35 | - GRADLE_HOME 路径可能不对; 36 | 37 | - 没有执行 source ~/.bash_profile 38 | 39 | ## 使用 sdkman 安装 40 | 41 | # 常用命令 42 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/concurrenttool/threadlocal/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.concurrenttool.threadlocal; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | 8 | @SpringBootApplication 9 | public class CommonMistakesApplication { 10 | 11 | public static void main(String[] args) { 12 | Utils.loadPropertySource(CommonMistakesApplication.class, "tomcat.properties"); 13 | 14 | SpringApplication.run(CommonMistakesApplication.class, args); 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/httpinvoke/ribbonretry/CommonMistakesApplication.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.httpinvoke.ribbonretry; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | 8 | @SpringBootApplication 9 | public class CommonMistakesApplication { 10 | 11 | public static void main(String[] args) { 12 | 13 | Utils.loadPropertySource(CommonMistakesApplication.class,"default-ribbon.properties"); 14 | SpringApplication.run(CommonMistakesApplication.class, args); 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/logging/duplicate/LoggingController.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.logging.duplicate; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | @Slf4j 9 | @RequestMapping("logging") 10 | @RestController 11 | public class LoggingController { 12 | 13 | @GetMapping("log") 14 | public void log() { 15 | log.debug("debug"); 16 | log.info("info"); 17 | log.warn("warn"); 18 | log.error("error"); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /99~参考资料/《Think in Java》/04~初始化和清除/4.6 总结.md: -------------------------------------------------------------------------------- 1 | # 4.6 总结 2 | 3 | 作为初始化的一种具体操作形式,构造器应使大家明确感受到在语言中进行初始化的重要性。与 C++的程序设计一样,判断一个程序效率如何,关键是看是否由于变量的初始化不正确而造成了严重的编程错误(臭虫)。这些形式的错误很难发现,而且类似的问题也适用于不正确的清除或收尾工作。由于构造器使我们能保证正确的初始化和清除(若没有正确的构造器调用,编译器不允许对象创建),所以能获得完全的控制权和安全性。 4 | 5 | 在 C++中,与“构建”相反的“破坏”(Destruction)工作也是相当重要的,因为用 new 创建的对象必须明确地清除。在 Java 中,垃圾收集器会自动为所有对象释放内存,所以 Java 中等价的清除方法并不是经常都需要用到的。如果不需要类似于构造器的行为,Java 的垃圾收集器可以极大简化编程工作,而且在内存的管理过程中增加更大的安全性。有些垃圾收集器甚至能清除其他资源,比如图形和文件指针等。然而,垃圾收集器确实也增加了运行期的开销。但这种开销到底造成了多大的影响却是很难看出的,因为到目前为止,Java 解释器的总体运行速度仍然是比较慢的。随着这一情况的改观,我们应该能判断出垃圾收集器的开销是否使 Java 不适合做一些特定的工作(其中一个问题是垃圾收集器不可预测的性质)。 6 | 7 | 由于所有对象都肯定能获得正确的构建,所以同这儿讲述的情况相比,构造器实际做的事情还要多得多。特别地,当我们通过“创作”或“继承”生成新类的时候,对构建的保证仍然有效,而且需要一些附加的语法来提供对它的支持。大家将在以后的章节里详细了解创作、继承以及它们对构造器造成的影响。 8 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/connectionpool/datasource/CommonMistakesApplicationGood.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.connectionpool.datasource; 2 | 3 | import org.geekbang.time.commonmistakes.common.Utils; 4 | import org.springframework.boot.SpringApplication; 5 | import org.springframework.boot.autoconfigure.SpringBootApplication; 6 | 7 | @SpringBootApplication 8 | public class CommonMistakesApplicationGood { 9 | 10 | public static void main(String[] args) { 11 | 12 | Utils.loadPropertySource(CommonMistakesApplicationGood.class, "good.properties"); 13 | SpringApplication.run(CommonMistakesApplicationGood.class, args); 14 | } 15 | } 16 | 17 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionpropagation/UserEntity.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionpropagation; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | 12 | @Entity 13 | @Data 14 | public class UserEntity { 15 | @Id 16 | @GeneratedValue(strategy = AUTO) 17 | private Long id; 18 | private String name; 19 | 20 | public UserEntity() { 21 | } 22 | 23 | public UserEntity(String name) { 24 | this.name = name; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /99~参考资料/2021~极客时间~《Java 业务开发常见错误 100 例》/codes/src/main/java/org/geekbang/time/commonmistakes/transaction/transactionproxyfailed/UserEntity.java: -------------------------------------------------------------------------------- 1 | package org.geekbang.time.commonmistakes.transaction.transactionproxyfailed; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.Entity; 6 | import javax.persistence.GeneratedValue; 7 | import javax.persistence.Id; 8 | 9 | import static javax.persistence.GenerationType.AUTO; 10 | 11 | 12 | @Entity 13 | @Data 14 | public class UserEntity { 15 | @Id 16 | @GeneratedValue(strategy = AUTO) 17 | private Long id; 18 | private String name; 19 | 20 | public UserEntity() { 21 | } 22 | 23 | public UserEntity(String name) { 24 | this.name = name; 25 | } 26 | } 27 | --------------------------------------------------------------------------------