Showing preview only (6,199K chars total). Download the full file or copy to clipboard to get everything.
Repository: Snailclimb/JavaGuide
Branch: main
Commit: eaaa61dc0f36
Files: 378
Total size: 3.4 MB
Directory structure:
gitextract_shn9zbhp/
├── .gitattributes
├── .github/
│ └── workflows/
│ └── test.yml
├── .gitignore
├── .husky/
│ └── pre-commit
├── .markdownlint-cli2.mjs
├── .nojekyll
├── .prettierignore
├── LICENSE
├── README.md
├── README_EN.md
├── TRANSLATION_TOOLS.md
├── TranslateRepo.java
├── docs/
│ ├── .vuepress/
│ │ ├── client.ts
│ │ ├── components/
│ │ │ ├── LayoutToggle.vue
│ │ │ └── unlock/
│ │ │ ├── GlobalUnlock.vue
│ │ │ └── UnlockContent.vue
│ │ ├── config.ts
│ │ ├── features/
│ │ │ └── unlock/
│ │ │ ├── config.ts
│ │ │ └── heights.ts
│ │ ├── navbar.ts
│ │ ├── public/
│ │ │ └── robots.txt
│ │ ├── shims-vue.d.ts
│ │ ├── sidebar/
│ │ │ ├── about-the-author.ts
│ │ │ ├── ai.ts
│ │ │ ├── books.ts
│ │ │ ├── constants.ts
│ │ │ ├── high-quality-technical-articles.ts
│ │ │ ├── index.ts
│ │ │ ├── open-source-project.ts
│ │ │ └── zhuanlan.ts
│ │ ├── styles/
│ │ │ ├── config.scss
│ │ │ ├── index.scss
│ │ │ └── palette.scss
│ │ └── theme.ts
│ ├── README.md
│ ├── about-the-author/
│ │ ├── README.md
│ │ ├── deprecated-java-technologies.md
│ │ ├── dog-that-copies-other-people-essay.md
│ │ ├── feelings-after-one-month-of-induction-training.md
│ │ ├── feelings-of-half-a-year-from-graduation-to-entry.md
│ │ ├── internet-addiction-teenager.md
│ │ ├── javaguide-100k-star.md
│ │ ├── my-article-was-stolen-and-made-into-video-and-it-became-popular.md
│ │ ├── my-college-life.md
│ │ ├── writing-technology-blog-six-years.md
│ │ └── zhishixingqiu-two-years.md
│ ├── ai/
│ │ ├── README.md
│ │ ├── agent/
│ │ │ ├── agent-basis.md
│ │ │ ├── context-engineering.md
│ │ │ ├── mcp.md
│ │ │ ├── prompt-engineering.md
│ │ │ └── skills.md
│ │ ├── ai-coding/
│ │ │ ├── idea-qoder-plugin.md
│ │ │ └── trae-m2.7.md
│ │ ├── llm-basis/
│ │ │ ├── ai-ide.md
│ │ │ └── llm-operation-mechanism.md
│ │ └── rag/
│ │ ├── rag-basis.md
│ │ └── rag-vector-store.md
│ ├── books/
│ │ ├── README.md
│ │ ├── cs-basics.md
│ │ ├── database.md
│ │ ├── distributed-system.md
│ │ ├── java.md
│ │ ├── search-engine.md
│ │ └── software-quality.md
│ ├── cs-basics/
│ │ ├── algorithms/
│ │ │ ├── 10-classical-sorting-algorithms.md
│ │ │ ├── classical-algorithm-problems-recommendations.md
│ │ │ ├── common-data-structures-leetcode-recommendations.md
│ │ │ ├── linkedlist-algorithm-problems.md
│ │ │ ├── string-algorithm-problems.md
│ │ │ └── the-sword-refers-to-offer.md
│ │ ├── data-structure/
│ │ │ ├── bloom-filter.md
│ │ │ ├── graph.md
│ │ │ ├── heap.md
│ │ │ ├── linear-data-structure.md
│ │ │ ├── pictures/
│ │ │ │ └── 线性数据结构/
│ │ │ │ └── 栈实现浏览器倒退和前进.drawio
│ │ │ ├── red-black-tree.md
│ │ │ └── tree.md
│ │ ├── network/
│ │ │ ├── application-layer-protocol.md
│ │ │ ├── arp.md
│ │ │ ├── computer-network-xiexiren-summary.md
│ │ │ ├── dns.md
│ │ │ ├── http-status-codes.md
│ │ │ ├── http-vs-https.md
│ │ │ ├── http1.0-vs-http1.1.md
│ │ │ ├── nat.md
│ │ │ ├── network-attack-means.md
│ │ │ ├── osi-and-tcp-ip-model.md
│ │ │ ├── other-network-questions.md
│ │ │ ├── other-network-questions2.md
│ │ │ ├── tcp-connection-and-disconnection.md
│ │ │ ├── tcp-reliability-guarantee.md
│ │ │ └── the-whole-process-of-accessing-web-pages.md
│ │ └── operating-system/
│ │ ├── linux-intro.md
│ │ ├── operating-system-basic-questions-01.md
│ │ ├── operating-system-basic-questions-02.md
│ │ └── shell-intro.md
│ ├── database/
│ │ ├── basis.md
│ │ ├── character-set.md
│ │ ├── elasticsearch/
│ │ │ └── elasticsearch-questions-01.md
│ │ ├── mongodb/
│ │ │ ├── mongodb-questions-01.md
│ │ │ └── mongodb-questions-02.md
│ │ ├── mysql/
│ │ │ ├── a-thousand-lines-of-mysql-study-notes.md
│ │ │ ├── how-sql-executed-in-mysql.md
│ │ │ ├── index-invalidation-caused-by-implicit-conversion.md
│ │ │ ├── innodb-implementation-of-mvcc.md
│ │ │ ├── mysql-auto-increment-primary-key-continuous.md
│ │ │ ├── mysql-high-performance-optimization-specification-recommendations.md
│ │ │ ├── mysql-index-invalidation.md
│ │ │ ├── mysql-index.md
│ │ │ ├── mysql-logs.md
│ │ │ ├── mysql-query-cache.md
│ │ │ ├── mysql-query-execution-plan.md
│ │ │ ├── mysql-questions-01.md
│ │ │ ├── some-thoughts-on-database-storage-time.md
│ │ │ └── transaction-isolation-level.md
│ │ ├── nosql.md
│ │ ├── redis/
│ │ │ ├── 3-commonly-used-cache-read-and-write-strategies.md
│ │ │ ├── cache-basics.md
│ │ │ ├── images/
│ │ │ │ ├── aof-rewrite.drawio
│ │ │ │ ├── aof-work-process.drawio
│ │ │ │ ├── hash-shopping-cart.drawio
│ │ │ │ ├── memory-fragmentation.drawio
│ │ │ │ ├── redis-aof-write-log-disc.drawio
│ │ │ │ ├── redis-cache-avalanche.drawio
│ │ │ │ ├── redis-cache-breakdown.drawio
│ │ │ │ ├── redis-cache-penetration.drawio
│ │ │ │ ├── redis-event-handler.drawio
│ │ │ │ ├── redis-list.drawio
│ │ │ │ └── redis4.0-master-slave-replication-replid.drawio
│ │ │ ├── redis-cluster.md
│ │ │ ├── redis-common-blocking-problems-summary.md
│ │ │ ├── redis-data-structures-01.md
│ │ │ ├── redis-data-structures-02.md
│ │ │ ├── redis-delayed-task.md
│ │ │ ├── redis-memory-fragmentation.md
│ │ │ ├── redis-persistence.md
│ │ │ ├── redis-questions-01.md
│ │ │ ├── redis-questions-02.md
│ │ │ ├── redis-skiplist.md
│ │ │ └── redis-stream-mq.md
│ │ └── sql/
│ │ ├── sql-questions-01.md
│ │ ├── sql-questions-02.md
│ │ ├── sql-questions-03.md
│ │ ├── sql-questions-04.md
│ │ ├── sql-questions-05.md
│ │ └── sql-syntax-summary.md
│ ├── distributed-system/
│ │ ├── api-gateway.md
│ │ ├── distributed-configuration-center.md
│ │ ├── distributed-id-design.md
│ │ ├── distributed-id.md
│ │ ├── distributed-lock-implementations.md
│ │ ├── distributed-lock.md
│ │ ├── distributed-process-coordination/
│ │ │ └── zookeeper/
│ │ │ ├── zookeeper-in-action.md
│ │ │ ├── zookeeper-intro.md
│ │ │ └── zookeeper-plus.md
│ │ ├── distributed-transaction.md
│ │ ├── images/
│ │ │ ├── api-gateway/
│ │ │ │ └── api-gateway-overview.drawio
│ │ │ ├── distributed-id/
│ │ │ │ ├── database-number-segment-mode.drawio
│ │ │ │ ├── distributed-id-requirements.drawio
│ │ │ │ ├── id-after-the-sub-table-not-conflict.drawio
│ │ │ │ ├── nosql.drawio
│ │ │ │ └── the-primary-key-of-the-database-increases-automatically.drawio
│ │ │ └── zookeeper/
│ │ │ ├── znode-structure.drawio
│ │ │ └── zookeeper-watcher.drawio
│ │ ├── protocol/
│ │ │ ├── cap-and-base-theorem.md
│ │ │ ├── consistent-hashing.md
│ │ │ ├── gossip-protocol.md
│ │ │ ├── paxos-algorithm.md
│ │ │ ├── raft-algorithm.md
│ │ │ └── zab.md
│ │ ├── rpc/
│ │ │ ├── dubbo.md
│ │ │ ├── http&rpc.md
│ │ │ └── rpc-intro.md
│ │ └── spring-cloud-gateway-questions.md
│ ├── high-availability/
│ │ ├── fallback-and-circuit-breaker.md
│ │ ├── high-availability-system-design.md
│ │ ├── idempotency.md
│ │ ├── limit-request.md
│ │ ├── performance-test.md
│ │ ├── redundancy.md
│ │ └── timeout-and-retry.md
│ ├── high-performance/
│ │ ├── cdn.md
│ │ ├── data-cold-hot-separation.md
│ │ ├── deep-pagination-optimization.md
│ │ ├── images/
│ │ │ └── read-and-write-separation-and-library-subtable/
│ │ │ ├── horizontal-slicing-database.drawio
│ │ │ ├── read-and-write-separation-proxy.drawio
│ │ │ ├── read-and-write-separation.drawio
│ │ │ ├── two-forms-of-sub-table.drawio
│ │ │ └── vertical-slicing-database.drawio
│ │ ├── load-balancing.md
│ │ ├── message-queue/
│ │ │ ├── disruptor-questions.md
│ │ │ ├── kafka-questions-01.md
│ │ │ ├── message-queue.md
│ │ │ ├── rabbitmq-questions.md
│ │ │ └── rocketmq-questions.md
│ │ ├── read-and-write-separation-and-library-subtable.md
│ │ └── sql-optimization.md
│ ├── high-quality-technical-articles/
│ │ ├── README.md
│ │ ├── advanced-programmer/
│ │ │ ├── 20-bad-habits-of-bad-programmers.md
│ │ │ ├── meituan-three-year-summary-lesson-10.md
│ │ │ ├── programmer-quickly-learn-new-technology.md
│ │ │ ├── seven-tips-for-becoming-an-advanced-programmer.md
│ │ │ ├── ten-years-of-dachang-growth-road.md
│ │ │ ├── the-growth-strategy-of-the-technological-giant.md
│ │ │ └── thinking-about-technology-and-business-after-five-years-of-work.md
│ │ ├── interview/
│ │ │ ├── how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology.md
│ │ │ ├── my-personal-experience-in-2021.md
│ │ │ ├── screen-candidates-for-packaging.md
│ │ │ ├── some-secrets-about-alibaba-interview.md
│ │ │ ├── summary-of-spring-recruitment.md
│ │ │ ├── technical-preliminary-preparation.md
│ │ │ ├── the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer.md
│ │ │ └── the-experience-of-get-offer-from-over-20-big-companies.md
│ │ ├── personal-experience/
│ │ │ ├── 8-years-programmer-work-summary.md
│ │ │ ├── four-year-work-in-tencent-summary.md
│ │ │ ├── huawei-od-275-days.md
│ │ │ └── two-years-of-back-end-develop--experience-in-didi-and-toutiao.md
│ │ ├── programmer/
│ │ │ ├── efficient-book-publishing-and-practice-guide.md
│ │ │ ├── high-value-certifications-for-programmers.md
│ │ │ └── how-do-programmers-publish-a-technical-book.md
│ │ └── work/
│ │ ├── 32-tips-improving-career.md
│ │ ├── employee-performance.md
│ │ └── get-into-work-mode-quickly-when-you-join-a-company.md
│ ├── home.md
│ ├── interview-preparation/
│ │ ├── backend-interview-plan.md
│ │ ├── how-to-handle-interview-nerves.md
│ │ ├── internship-experience.md
│ │ ├── interview-experience.md
│ │ ├── java-roadmap.md
│ │ ├── key-points-of-interview.md
│ │ ├── pdf-interview-javaguide.md
│ │ ├── project-experience-guide.md
│ │ ├── resume-guide.md
│ │ ├── self-test-of-common-interview-questions.md
│ │ └── teach-you-how-to-prepare-for-the-interview-hand-in-hand.md
│ ├── java/
│ │ ├── basis/
│ │ │ ├── bigdecimal.md
│ │ │ ├── generics-and-wildcards.md
│ │ │ ├── java-basic-questions-01.md
│ │ │ ├── java-basic-questions-02.md
│ │ │ ├── java-basic-questions-03.md
│ │ │ ├── java-keyword-summary.md
│ │ │ ├── proxy.md
│ │ │ ├── reflection.md
│ │ │ ├── serialization.md
│ │ │ ├── spi.md
│ │ │ ├── syntactic-sugar.md
│ │ │ ├── unsafe.md
│ │ │ └── why-there-only-value-passing-in-java.md
│ │ ├── collection/
│ │ │ ├── arrayblockingqueue-source-code.md
│ │ │ ├── arraylist-source-code.md
│ │ │ ├── concurrent-hash-map-source-code.md
│ │ │ ├── copyonwritearraylist-source-code.md
│ │ │ ├── delayqueue-source-code.md
│ │ │ ├── hashmap-source-code.md
│ │ │ ├── java-collection-precautions-for-use.md
│ │ │ ├── java-collection-questions-01.md
│ │ │ ├── java-collection-questions-02.md
│ │ │ ├── linkedhashmap-source-code.md
│ │ │ ├── linkedlist-source-code.md
│ │ │ └── priorityqueue-source-code.md
│ │ ├── concurrent/
│ │ │ ├── aqs.md
│ │ │ ├── atomic-classes.md
│ │ │ ├── cas.md
│ │ │ ├── completablefuture-intro.md
│ │ │ ├── java-concurrent-collections.md
│ │ │ ├── java-concurrent-questions-01.md
│ │ │ ├── java-concurrent-questions-02.md
│ │ │ ├── java-concurrent-questions-03.md
│ │ │ ├── java-thread-pool-best-practices.md
│ │ │ ├── java-thread-pool-summary.md
│ │ │ ├── jmm.md
│ │ │ ├── optimistic-lock-and-pessimistic-lock.md
│ │ │ ├── reentrantlock.md
│ │ │ ├── threadlocal.md
│ │ │ └── virtual-thread.md
│ │ ├── io/
│ │ │ ├── io-basis.md
│ │ │ ├── io-design-patterns.md
│ │ │ ├── io-model.md
│ │ │ └── nio-basis.md
│ │ ├── jvm/
│ │ │ ├── class-file-structure.md
│ │ │ ├── class-loading-process.md
│ │ │ ├── classloader.md
│ │ │ ├── jdk-monitoring-and-troubleshooting-tools.md
│ │ │ ├── jvm-garbage-collection.md
│ │ │ ├── jvm-in-action.md
│ │ │ ├── jvm-intro.md
│ │ │ ├── jvm-parameters-intro.md
│ │ │ └── memory-area.md
│ │ └── new-features/
│ │ ├── java10.md
│ │ ├── java11.md
│ │ ├── java12-13.md
│ │ ├── java14-15.md
│ │ ├── java16.md
│ │ ├── java17.md
│ │ ├── java18.md
│ │ ├── java19.md
│ │ ├── java20.md
│ │ ├── java21.md
│ │ ├── java22-23.md
│ │ ├── java24.md
│ │ ├── java25.md
│ │ ├── java26.md
│ │ ├── java8-common-new-features.md
│ │ ├── java8-tutorial-translate.md
│ │ └── java9.md
│ ├── javaguide/
│ │ ├── contribution-guideline.md
│ │ ├── faq.md
│ │ ├── history.md
│ │ ├── intro.md
│ │ └── use-suggestion.md
│ ├── open-source-project/
│ │ ├── README.md
│ │ ├── big-data.md
│ │ ├── machine-learning.md
│ │ ├── practical-project.md
│ │ ├── system-design.md
│ │ ├── tool-library.md
│ │ ├── tools.md
│ │ └── tutorial.md
│ ├── snippets/
│ │ ├── article-footer.snippet.md
│ │ ├── article-header.snippet.md
│ │ ├── planet.snippet.md
│ │ ├── planet2.snippet.md
│ │ ├── small-advertisement.snippet.md
│ │ └── yuanma.snippet.md
│ ├── system-design/
│ │ ├── J2EE基础知识.md
│ │ ├── basis/
│ │ │ ├── RESTfulAPI.md
│ │ │ ├── naming.md
│ │ │ ├── pictures/
│ │ │ │ ├── common-design-patterns.drawio
│ │ │ │ └── programming-principles.drawio
│ │ │ ├── refactoring.md
│ │ │ ├── software-engineering.md
│ │ │ └── unit-test.md
│ │ ├── design-pattern.md
│ │ ├── framework/
│ │ │ ├── mybatis/
│ │ │ │ └── mybatis-interview.md
│ │ │ ├── netty.md
│ │ │ └── spring/
│ │ │ ├── Async.md
│ │ │ ├── async.md
│ │ │ ├── images/
│ │ │ │ ├── mvc-mode1.drawio
│ │ │ │ └── mvc-model2.drawio
│ │ │ ├── ioc-and-aop.md
│ │ │ ├── spring-boot-auto-assembly-principles.md
│ │ │ ├── spring-common-annotations.md
│ │ │ ├── spring-design-patterns-summary.md
│ │ │ ├── spring-knowledge-and-questions-summary.md
│ │ │ ├── spring-transaction.md
│ │ │ ├── springboot-knowledge-and-questions-summary.md
│ │ │ └── springboot-source-code.md
│ │ ├── schedule-task.md
│ │ ├── security/
│ │ │ ├── advantages-and-disadvantages-of-jwt.md
│ │ │ ├── basis-of-authority-certification.md
│ │ │ ├── data-desensitization.md
│ │ │ ├── data-validation.md
│ │ │ ├── design-of-authority-system.md
│ │ │ ├── encryption-algorithms.md
│ │ │ ├── jwt-intro.md
│ │ │ ├── sentive-words-filter.md
│ │ │ ├── sso-intro.md
│ │ │ └── why-password-reset-instead-of-retrieval.md
│ │ ├── system-design-questions.md
│ │ └── web-real-time-message-push.md
│ ├── tools/
│ │ ├── docker/
│ │ │ ├── docker-in-action.md
│ │ │ └── docker-intro.md
│ │ ├── git/
│ │ │ ├── git-intro.md
│ │ │ └── github-tips.md
│ │ ├── gradle/
│ │ │ └── gradle-core-concepts.md
│ │ └── maven/
│ │ ├── maven-best-practices.md
│ │ └── maven-core-concepts.md
│ └── zhuanlan/
│ ├── README.md
│ ├── back-end-interview-high-frequency-system-design-and-scenario-questions.md
│ ├── handwritten-rpc-framework.md
│ ├── interview-guide.md
│ ├── java-mian-shi-zhi-bei.md
│ └── source-code-reading.md
├── index.html
├── package.json
├── sw.js
└── translate_repo.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
* text=auto
*.js linguist-language=java
*.css linguist-language=java
*.html linguist-language=java
================================================
FILE: .github/workflows/test.yml
================================================
name: Docs Test
on:
- push
- pull_request
jobs:
test-docs:
name: Test docs
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install pnpm
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- name: Install deps
run: pnpm install --frozen-lockfile
- name: Build test
env:
NODE_OPTIONS: --max_old_space_size=4096
run: pnpm docs:build
================================================
FILE: .gitignore
================================================
node_modules/
# *.drawio
*.drawio.bkp
.DS_Store
# VS Code Config file
.vscode/
# VuePress Cache
**/.vuepress/.cache/
# VuePress Temp
**/.vuepress/.temp/
# VuePress Output
dist/
traversal-folder-replace-string.py
format-markdown.py
.npmrc
package-lock.json
lintmd-config.json
.claude/settings.local.json
================================================
FILE: .husky/pre-commit
================================================
pnpm nano-staged
================================================
FILE: .markdownlint-cli2.mjs
================================================
export default {
config: {
default: true,
MD003: {
style: "atx",
},
MD004: {
style: "dash",
},
MD010: false,
MD013: false,
MD024: {
allow_different_nesting: true,
},
MD035: {
style: "---",
},
MD036: false,
MD040: false,
MD045: false,
MD046: false,
},
ignores: [
"**/node_modules/**",
// markdown import demo
"**/*.snippet.md",
],
};
================================================
FILE: .nojekyll
================================================
================================================
FILE: .prettierignore
================================================
# Vuepress Cache
**/.vuepress/.cache/**
# Vuepress Temp
**/.vuepress/.temp/**
# Vuepress Output
dist/
# Node modules
node_modules/
# pnpm lock file
pnpm-lock.yaml
index.html
sw.js
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
- 推荐在线阅读(体验更好,速度更快):[javaguide.cn](https://javaguide.cn/)
- 面试突击版本(只保留重点,附带精美 PDF 下载):[interview.javaguide.cn](https://interview.javaguide.cn/)
<div align="center">
[](https://github.com/Snailclimb/JavaGuide)
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
<a href="https://trendshift.io/repositories/1319" target="_blank"><img src="https://trendshift.io/api/badge/repositories/1319" alt="Snailclimb%2FJavaGuide | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
> - **大模型实战项目**: [⭐AI 智能面试辅助平台 + RAG 知识库](https://javaguide.cn/zhuanlan/interview-guide.html)(基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 ,非常适合作为学习和简历项目,学习门槛低)。
> - **面试资料补充**:
> - [《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html):四年打磨,和 [JavaGuide 开源版](https://javaguide.cn/)的内容互补,带你从零开始系统准备面试!
> - [《后端面试高频系统设计&场景题》](https://javaguide.cn/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.html):30+ 道高频系统设计和场景面试,助你应对当下中大厂面试趋势。
> - **使用建议** :如果你想要系统准备 Java 后端面试但又不知道如何开始的,可以参考 [Java 后端面试通关计划(后端通用)](https://javaguide.cn/interview-preparation/backend-interview-plan.html)。
> - **求个 Star**:如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star,这是对我最大的鼓励,感谢各位一起同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。
> - **转载须知**:以下所有文章如非文首说明为转载皆为 JavaGuide 原创,转载请在文首注明出处。如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
<!-- #region home -->
## AI 应用开发面试指南
[AI 应用开发面试指南](https://javaguide.cn/ai/)(⭐新增,正在持续更新):专门后端开发准备的 AI 应用开发核心知识,涵盖大模型基础、Agent、RAG、MCP 协议等高频面试考点。
## 面试准备
- [⭐Java 后端面试通关计划(涵盖后端通用体系)](./docs/interview-preparation/backend-interview-plan.md) (一定要看 :+1:)
- [如何高效准备 Java 面试?](./docs/interview-preparation/teach-you-how-to-prepare-for-the-interview-hand-in-hand.md)
- [Java 后端面试重点总结](./docs/interview-preparation/key-points-of-interview.md)
- [Java 学习路线(最新版,4w+ 字)](./docs/interview-preparation/java-roadmap.md)
- [程序员简历编写指南](./docs/interview-preparation/resume-guide.md)
- [项目经验指南](./docs/interview-preparation/project-experience-guide.md)
- [面试太紧张怎么办?](./docs/interview-preparation/how-to-handle-interview-nerves.md)
- [校招没有实习经历怎么办?实习经历怎么写?](./docs/interview-preparation/internship-experience.md)
## Java
### 基础
**知识点/面试题总结** : (必看:+1: ):
- [Java 基础常见知识点&面试题总结(上)](./docs/java/basis/java-basic-questions-01.md)
- [Java 基础常见知识点&面试题总结(中)](./docs/java/basis/java-basic-questions-02.md)
- [Java 基础常见知识点&面试题总结(下)](./docs/java/basis/java-basic-questions-03.md)
**重要知识点详解**:
- [为什么 Java 中只有值传递?](./docs/java/basis/why-there-only-value-passing-in-java.md)
- [Java 序列化详解](./docs/java/basis/serialization.md)
- [泛型&通配符详解](./docs/java/basis/generics-and-wildcards.md)
- [Java 反射机制详解](./docs/java/basis/reflection.md)
- [Java 代理模式详解](./docs/java/basis/proxy.md)
- [BigDecimal 详解](./docs/java/basis/bigdecimal.md)
- [Java 魔法类 Unsafe 详解](./docs/java/basis/unsafe.md)
- [Java SPI 机制详解](./docs/java/basis/spi.md)
- [Java 语法糖详解](./docs/java/basis/syntactic-sugar.md)
### 集合
**知识点/面试题总结**:
- [Java 集合常见知识点&面试题总结(上)](./docs/java/collection/java-collection-questions-01.md) (必看 :+1:)
- [Java 集合常见知识点&面试题总结(下)](./docs/java/collection/java-collection-questions-02.md) (必看 :+1:)
- [Java 容器使用注意事项总结](./docs/java/collection/java-collection-precautions-for-use.md)
**源码分析**:
- [ArrayList 核心源码+扩容机制分析](./docs/java/collection/arraylist-source-code.md)
- [LinkedList 核心源码分析](./docs/java/collection/linkedlist-source-code.md)
- [HashMap 核心源码+底层数据结构分析](./docs/java/collection/hashmap-source-code.md)
- [ConcurrentHashMap 核心源码+底层数据结构分析](./docs/java/collection/concurrent-hash-map-source-code.md)
- [LinkedHashMap 核心源码分析](./docs/java/collection/linkedhashmap-source-code.md)
- [CopyOnWriteArrayList 核心源码分析](./docs/java/collection/copyonwritearraylist-source-code.md)
- [ArrayBlockingQueue 核心源码分析](./docs/java/collection/arrayblockingqueue-source-code.md)
- [PriorityQueue 核心源码分析](./docs/java/collection/priorityqueue-source-code.md)
- [DelayQueue 核心源码分析](./docs/java/collection/delayqueue-source-code.md)
### IO
- [IO 基础知识总结](./docs/java/io/io-basis.md)
- [IO 设计模式总结](./docs/java/io/io-design-patterns.md)
- [IO 模型详解](./docs/java/io/io-model.md)
- [NIO 核心知识总结](./docs/java/io/nio-basis.md)
### 并发
**知识点/面试题总结** : (必看 :+1:)
- [Java 并发常见知识点&面试题总结(上)](./docs/java/concurrent/java-concurrent-questions-01.md)
- [Java 并发常见知识点&面试题总结(中)](./docs/java/concurrent/java-concurrent-questions-02.md)
- [Java 并发常见知识点&面试题总结(下)](./docs/java/concurrent/java-concurrent-questions-03.md)
**重要知识点详解**:
- [乐观锁和悲观锁详解](./docs/java/concurrent/optimistic-lock-and-pessimistic-lock.md)
- [CAS 详解](./docs/java/concurrent/cas.md)
- [JMM(Java 内存模型)详解](./docs/java/concurrent/jmm.md)
- **线程池**:[Java 线程池详解](./docs/java/concurrent/java-thread-pool-summary.md)、[Java 线程池最佳实践](./docs/java/concurrent/java-thread-pool-best-practices.md)
- [ThreadLocal 详解](./docs/java/concurrent/threadlocal.md)
- [Java 并发容器总结](./docs/java/concurrent/java-concurrent-collections.md)
- [Atomic 原子类总结](./docs/java/concurrent/atomic-classes.md)
- [AQS 详解](./docs/java/concurrent/aqs.md)
- [CompletableFuture 详解](./docs/java/concurrent/completablefuture-intro.md)
### JVM (必看 :+1:)
JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) 和周志明老师的[《深入理解 Java 虚拟机(第 3 版)》](https://book.douban.com/subject/34907497/) (强烈建议阅读多遍!)。
- **[Java 内存区域](./docs/java/jvm/memory-area.md)**
- **[JVM 垃圾回收](./docs/java/jvm/jvm-garbage-collection.md)**
- [类文件结构](./docs/java/jvm/class-file-structure.md)
- **[类加载过程](./docs/java/jvm/class-loading-process.md)**
- [类加载器](./docs/java/jvm/classloader.md)
- [【待完成】最重要的 JVM 参数总结(翻译完善了一半)](./docs/java/jvm/jvm-parameters-intro.md)
- [【加餐】大白话带你认识 JVM](./docs/java/jvm/jvm-intro.md)
- [JDK 监控和故障处理工具](./docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md)
### 新特性
- **Java 8**:[Java 8 新特性总结(翻译)](./docs/java/new-features/java8-tutorial-translate.md)、[Java8 常用新特性总结](./docs/java/new-features/java8-common-new-features.md)
- [Java 9 新特性概览](./docs/java/new-features/java9.md)
- [Java 10 新特性概览](./docs/java/new-features/java10.md)
- [Java 11 新特性概览](./docs/java/new-features/java11.md)
- [Java 12 & 13 新特性概览](./docs/java/new-features/java12-13.md)
- [Java 14 & 15 新特性概览](./docs/java/new-features/java14-15.md)
- [Java 16 新特性概览](./docs/java/new-features/java16.md)
- [Java 17 新特性概览](./docs/java/new-features/java17.md)
- [Java 18 新特性概览](./docs/java/new-features/java18.md)
- [Java 19 新特性概览](./docs/java/new-features/java19.md)
- [Java 20 新特性概览](./docs/java/new-features/java20.md)
- [Java 21 新特性概览](./docs/java/new-features/java21.md)
- [Java 22 & 23 新特性概览](./docs/java/new-features/java22-23.md)
- [Java 24 新特性概览](./docs/java/new-features/java24.md)
- [Java 25 新特性概览](./docs/java/new-features/java25.md)
## 计算机基础
### 操作系统
- [操作系统常见知识点&面试题总结(上)](./docs/cs-basics/operating-system/operating-system-basic-questions-01.md)
- [操作系统常见知识点&面试题总结(下)](./docs/cs-basics/operating-system/operating-system-basic-questions-02.md)
- **Linux**:
- [后端程序员必备的 Linux 基础知识总结](./docs/cs-basics/operating-system/linux-intro.md)
- [Shell 编程基础知识总结](./docs/cs-basics/operating-system/shell-intro.md)
### 网络
**知识点/面试题总结**:
- [计算机网络常见知识点&面试题总结(上)](./docs/cs-basics/network/other-network-questions.md)
- [计算机网络常见知识点&面试题总结(下)](./docs/cs-basics/network/other-network-questions2.md)
- [谢希仁老师的《计算机网络》内容总结(补充)](./docs/cs-basics/network/computer-network-xiexiren-summary.md)
**重要知识点详解**:
- [OSI 和 TCP/IP 网络分层模型详解(基础)](./docs/cs-basics/network/osi-and-tcp-ip-model.md)
- [应用层常见协议总结(应用层)](./docs/cs-basics/network/application-layer-protocol.md)
- [HTTP vs HTTPS(应用层)](./docs/cs-basics/network/http-vs-https.md)
- [HTTP 1.0 vs HTTP 1.1(应用层)](./docs/cs-basics/network/http1.0-vs-http1.1.md)
- [HTTP 常见状态码(应用层)](./docs/cs-basics/network/http-status-codes.md)
- [DNS 域名系统详解(应用层)](./docs/cs-basics/network/dns.md)
- [TCP 三次握手和四次挥手(传输层)](./docs/cs-basics/network/tcp-connection-and-disconnection.md)
- [TCP 传输可靠性保障(传输层)](./docs/cs-basics/network/tcp-reliability-guarantee.md)
- [ARP 协议详解(网络层)](./docs/cs-basics/network/arp.md)
- [NAT 协议详解(网络层)](./docs/cs-basics/network/nat.md)
- [网络攻击常见手段总结(安全)](./docs/cs-basics/network/network-attack-means.md)
### 数据结构
**图解数据结构:**
- [线性数据结构 :数组、链表、栈、队列](./docs/cs-basics/data-structure/linear-data-structure.md)
- [图](./docs/cs-basics/data-structure/graph.md)
- [堆](./docs/cs-basics/data-structure/heap.md)
- [树](./docs/cs-basics/data-structure/tree.md):重点关注[红黑树](./docs/cs-basics/data-structure/red-black-tree.md)、B-,B+,B\*树、LSM 树
其他常用数据结构:
- [布隆过滤器](./docs/cs-basics/data-structure/bloom-filter.md)
### 算法
算法这部分内容非常重要,如果你不知道如何学习算法的话,可以看下我写的:
- [算法学习书籍+资源推荐](https://www.zhihu.com/question/323359308/answer/1545320858) 。
- [如何刷 Leetcode?](https://www.zhihu.com/question/31092580/answer/1534887374)
**常见算法问题总结**:
- [几道常见的字符串算法题总结](./docs/cs-basics/algorithms/string-algorithm-problems.md)
- [几道常见的链表算法题总结](./docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
- [剑指 offer 部分编程题](./docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
- [十大经典排序算法](./docs/cs-basics/algorithms/10-classical-sorting-algorithms.md)
另外,[GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algorithms/) 这个网站总结了常见的算法 ,比较全面系统。
## 数据库
### 基础
- [数据库基础知识总结](./docs/database/basis.md)
- [NoSQL 基础知识总结](./docs/database/nosql.md)
- [字符集详解](./docs/database/character-set.md)
- SQL :
- [SQL 语法基础知识总结](./docs/database/sql/sql-syntax-summary.md)
- [SQL 常见面试题总结](./docs/database/sql/sql-questions-01.md)
### MySQL
**知识点/面试题总结:**
- **[MySQL 常见知识点&面试题总结](./docs/database/mysql/mysql-questions-01.md)** (必看 :+1:)
- [MySQL 高性能优化规范建议总结](./docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md)
**重要知识点:**
- [MySQL 索引详解](./docs/database/mysql/mysql-index.md)
- [MySQL 索引失效场景总结](./docs/database/mysql/mysql-index-invalidation.md)
- [MySQL 事务隔离级别图文详解)](./docs/database/mysql/transaction-isolation-level.md)
- [MySQL 三大日志(binlog、redo log 和 undo log)详解](./docs/database/mysql/mysql-logs.md)
- [InnoDB 存储引擎对 MVCC 的实现](./docs/database/mysql/innodb-implementation-of-mvcc.md)
- [SQL 语句在 MySQL 中的执行过程](./docs/database/mysql/how-sql-executed-in-mysql.md)
- [MySQL 查询缓存详解](./docs/database/mysql/mysql-query-cache.md)
- [MySQL 执行计划分析](./docs/database/mysql/mysql-query-execution-plan.md)
- [MySQL 自增主键一定是连续的吗](./docs/database/mysql/mysql-auto-increment-primary-key-continuous.md)
- [MySQL 时间类型数据存储建议](./docs/database/mysql/some-thoughts-on-database-storage-time.md)
- [MySQL 隐式转换造成索引失效](./docs/database/mysql/index-invalidation-caused-by-implicit-conversion.md)
### Redis
**知识点/面试题总结** : (必看:+1: ):
- [Redis 常见知识点&面试题总结(上)](./docs/database/redis/redis-questions-01.md)
- [Redis 常见知识点&面试题总结(下)](./docs/database/redis/redis-questions-02.md)
**重要知识点:**
- [3 种常用的缓存读写策略详解](./docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md)
- [Redis 能做消息队列吗?怎么实现?](./docs/database/redis/redis-stream-mq.md)
- [Redis 5 种基本数据结构详解](./docs/database/redis/redis-data-structures-01.md)
- [Redis 3 种特殊数据结构详解](./docs/database/redis/redis-data-structures-02.md)
- [Redis 持久化机制详解](./docs/database/redis/redis-persistence.md)
- [Redis 内存碎片详解](./docs/database/redis/redis-memory-fragmentation.md)
- [Redis 常见阻塞原因总结](./docs/database/redis/redis-common-blocking-problems-summary.md)
- [Redis 集群详解](./docs/database/redis/redis-cluster.md)
### MongoDB
- [MongoDB 常见知识点&面试题总结(上)](./docs/database/mongodb/mongodb-questions-01.md)
- [MongoDB 常见知识点&面试题总结(下)](./docs/database/mongodb/mongodb-questions-02.md)
## 搜索引擎
[Elasticsearch 常见面试题总结(付费)](./docs/database/elasticsearch/elasticsearch-questions-01.md)

## 开发工具
### Maven
- [Maven 核心概念总结](./docs/tools/maven/maven-core-concepts.md)
- [Maven 最佳实践](./docs/tools/maven/maven-best-practices.md)
### Gradle
[Gradle 核心概念总结](./docs/tools/gradle/gradle-core-concepts.md)(可选,目前国内还是使用 Maven 普遍一些)
### Docker
- [Docker 核心概念总结](./docs/tools/docker/docker-intro.md)
- [Docker 实战](./docs/tools/docker/docker-in-action.md)
### Git
- [Git 核心概念总结](./docs/tools/git/git-intro.md)
- [GitHub 实用小技巧总结](./docs/tools/git/github-tips.md)
## 系统设计
- [⭐系统设计常见面试题总结](./docs/system-design/system-design-questions.md)
- [⭐设计模式常见面试题总结](https://interview.javaguide.cn/system-design/design-pattern.html)
### 基础
- [RestFul API 简明教程](./docs/system-design/basis/RESTfulAPI.md)
- [软件工程简明教程](./docs/system-design/basis/software-engineering.md)
- [代码命名指南](./docs/system-design/basis/naming.md)
- [代码重构指南](./docs/system-design/basis/refactoring.md)
- [单元测试指南](./docs/system-design/basis/unit-test.md)
### 常用框架
#### Spring/SpringBoot (必看 :+1:)
**知识点/面试题总结** :
- [Spring 常见知识点&面试题总结](./docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md)
- [SpringBoot 常见知识点&面试题总结](./docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md)
- [Spring/Spring Boot 常用注解总结](./docs/system-design/framework/spring/spring-common-annotations.md)
- [SpringBoot 入门指南](https://github.com/Snailclimb/springboot-guide)
**重要知识点详解**:
- [IoC & AOP详解(快速搞懂)](./docs/system-design/framework/spring/ioc-and-aop.md)
- [Spring 事务详解](./docs/system-design/framework/spring/spring-transaction.md)
- [Spring 中的设计模式详解](./docs/system-design/framework/spring/spring-design-patterns-summary.md)
- [SpringBoot 自动装配原理详解](./docs/system-design/framework/spring/spring-boot-auto-assembly-principles.md)
#### MyBatis
[MyBatis 常见面试题总结](./docs/system-design/framework/mybatis/mybatis-interview.md)
### 安全
#### 认证授权
- [认证授权基础概念详解](./docs/system-design/security/basis-of-authority-certification.md)
- [JWT 基础概念详解](./docs/system-design/security/jwt-intro.md)
- [JWT 优缺点分析以及常见问题解决方案](./docs/system-design/security/advantages-and-disadvantages-of-jwt.md)
- [SSO 单点登录详解](./docs/system-design/security/sso-intro.md)
- [权限系统设计详解](./docs/system-design/security/design-of-authority-system.md)
#### 数据安全
- [常见加密算法总结](./docs/system-design/security/encryption-algorithms.md)
- [敏感词过滤方案总结](./docs/system-design/security/sentive-words-filter.md)
- [数据脱敏方案总结](./docs/system-design/security/data-desensitization.md)
- [为什么前后端都要做数据校验](./docs/system-design/security/data-validation.md)
- [为什么忘记密码时只能重置,不能告诉你原密码?](./docs/system-design/security/why-password-reset-instead-of-retrieval.md)
### 定时任务
[Java 定时任务详解](./docs/system-design/schedule-task.md)
### Web 实时消息推送
[Web 实时消息推送详解](./docs/system-design/web-real-time-message-push.md)
## 分布式
- [⭐分布式高频面试题](https://interview.javaguide.cn/distributed-system/distributed-system.html)
### 理论&算法&协议
- [CAP 理论和 BASE 理论解读](https://javaguide.cn/distributed-system/protocol/cap-and-base-theorem.html)
- [Paxos 算法解读](https://javaguide.cn/distributed-system/protocol/paxos-algorithm.html)
- [Raft 算法解读](https://javaguide.cn/distributed-system/protocol/raft-algorithm.html)
- [ZAB 协议解读](https://javaguide.cn/distributed-system/protocol/zab.html)
- [Gossip 协议详解](https://javaguide.cn/distributed-system/protocol/gossip-protocol.html)
- [一致性哈希算法详解](https://javaguide.cn/distributed-system/protocol/consistent-hashing.html)
### RPC
- [RPC 基础知识总结](https://javaguide.cn/distributed-system/rpc/rpc-intro.html)
- [Dubbo 常见知识点&面试题总结](https://javaguide.cn/distributed-system/rpc/dubbo.html)
### ZooKeeper
> 这两篇文章可能有内容重合部分,推荐都看一遍。
- [ZooKeeper 相关概念总结(入门)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html)
- [ZooKeeper 相关概念总结(进阶)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.html)
### API 网关
- [API 网关基础知识总结](https://javaguide.cn/distributed-system/api-gateway.html)
- [Spring Cloud Gateway 常见知识点&面试题总结](./docs/distributed-system/spring-cloud-gateway-questions.md)
### 分布式 ID
- [分布式ID介绍&实现方案总结](https://javaguide.cn/distributed-system/distributed-id.html)
- [分布式 ID 设计指南](https://javaguide.cn/distributed-system/distributed-id-design.html)
### 分布式锁
- [分布式锁介绍](https://javaguide.cn/distributed-system/distributed-lock.html)
- [分布式锁常见实现方案总结](https://javaguide.cn/distributed-system/distributed-lock-implementations.html)
### 分布式事务
[分布式事务常见知识点&面试题总结](https://javaguide.cn/distributed-system/distributed-transaction.html)
### 分布式配置中心
[分布式配置中心常见知识点&面试题总结](./docs/distributed-system/distributed-configuration-center.md)
## 高性能
### 数据库优化
- [数据库读写分离和分库分表](./docs/high-performance/read-and-write-separation-and-library-subtable.md)
- [数据冷热分离](./docs/high-performance/data-cold-hot-separation.md)
- [常见 SQL 优化手段总结](./docs/high-performance/sql-optimization.md)
- [深度分页介绍及优化建议](./docs/high-performance/deep-pagination-optimization.md)
### 负载均衡
[负载均衡常见知识点&面试题总结](./docs/high-performance/load-balancing.md)
### CDN
[CDN(内容分发网络)常见知识点&面试题总结](./docs/high-performance/cdn.md)
### 消息队列
- [消息队列基础知识总结](./docs/high-performance/message-queue/message-queue.md)
- [Disruptor 常见知识点&面试题总结](./docs/high-performance/message-queue/disruptor-questions.md)
- [RabbitMQ 常见知识点&面试题总结](./docs/high-performance/message-queue/rabbitmq-questions.md)
- [RocketMQ 常见知识点&面试题总结](./docs/high-performance/message-queue/rocketmq-questions.md)
- [Kafka 常见知识点&面试题总结](./docs/high-performance/message-queue/kafka-questions-01.md)
## 高可用
[高可用系统设计指南](./docs/high-availability/high-availability-system-design.md)
### 冗余设计
[冗余设计详解](./docs/high-availability/redundancy.md)
### 限流
[服务限流详解](./docs/high-availability/limit-request.md)
### 降级&熔断
[降级&熔断详解](./docs/high-availability/fallback-and-circuit-breaker.md)
### 超时&重试
[超时&重试详解](./docs/high-availability/timeout-and-retry.md)
### 集群
相同的服务部署多份,避免单点故障。
### 灾备设计和异地多活
**灾备** = 容灾 + 备份。
- **备份**:将系统所产生的所有重要数据多备份几份。
- **容灾**:在异地建立两个完全相同的系统。当某个地方的系统突然挂掉,整个应用系统可以切换到另一个,这样系统就可以正常提供服务了。
**异地多活** 描述的是将服务部署在异地并且服务同时对外提供服务。和传统的灾备设计的最主要区别在于“多活”,即所有站点都是同时在对外提供服务的。异地多活是为了应对突发状况比如火灾、地震等自然或者人为灾害。
## Star 趋势

## 公众号
如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghao-javaguide.png" alt="JavaGuide 公众号" style="zoom: 43%; display: block; margin: 0 auto;" />
<!-- #endregion home -->
================================================
FILE: README_EN.md
================================================
Recommended to read through online reading platforms for better experience and faster speed! Link: [javaguide.cn](https://javaguide.cn/).
<div align="center">
[](https://github.com/Snailclimb/JavaGuide)
[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
<a href="https://trendshift.io/repositories/1319" target="_blank"><img src="https://trendshift.io/api/badge/repositories/1319" alt="Snailclimb%2FJavaGuide | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a>
</div>
> - **Interview Edition**: Candidates preparing for Java interviews can consider the **[《Java Interview Guide》](./docs/zhuanlan/java-mian-shi-zhi-bei.md)** (high quality, specially designed for interviews, to be used with JavaGuide).
> - **Knowledge Planet**: Exclusive interview mini-books/one-on-one communication/resume modification/exclusive job-seeking guide, welcome to join **[JavaGuide Knowledge Planet](./docs/about-the-author/zhishixingqiu-two-years.md)** (click the link to view the detailed introduction of the planet, make sure you really need it before joining).
> - **Usage Suggestion**: Experienced interviewers always dig into technical issues along the project experience. Definitely do not memorize technical articles! For detailed learning suggestions, please refer to: [JavaGuide Usage Suggestion](./docs/javaguide/use-suggestion.md).
> - **Seek a Star**: If you find the content of JavaGuide helpful, please give a free Star, which is the greatest encouragement to me. Thank you all for walking together and striving together! Github link: [https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide).
> - **Reprint Notice**: All the following articles are original creations of JavaGuide unless stated otherwise at the beginning. Please indicate the source when reprinting. If malicious plagiarism/copying is discovered, legal weapons will be used to safeguard our rights. Let's together maintain a good technical creation environment!
<div align="center">
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />
</div>
<!-- #region home -->
## Project-related
- [Project Introduction](https://javaguide.cn/javaguide/intro.html)
- [Usage Suggestion](https://javaguide.cn/javaguide/use-suggestion.html)
- [Contribution Guide](https://javaguide.cn/javaguide/contribution-guideline.html)
- [FAQ](https://javaguide.cn/javaguide/faq.html)
## Java
### Basics
**Knowledge Points/Interview Questions Summary** : (Must-see:+1:):
- [Summary of Common Java Basics Knowledge Points & Interview Questions (Part 1)](./docs/java/basis/java-basic-questions-01.md)
- [Summary of Common Java Basics Knowledge Points & Interview Questions (Part 2)](./docs/java/basis/java-basic-questions-02.md)
- [Summary of Common Java Basics Knowledge Points & Interview Questions (Part 3)](./docs/java/basis/java-basic-questions-03.md)
**Important Knowledge Points Explanation**:
- [Why is There Only Pass-by-Value in Java?](./docs/java/basis/why-there-only-value-passing-in-java.md)
- [Serialization in Java Explained](./docs/java/basis/serialization.md)
- [Generics & Wildcards Explained](./docs/java/basis/generics-and-wildcards.md)
- [Java Reflection Mechanism Explained](./docs/java/basis/reflection.md)
- [Java Proxy Pattern Explained](./docs/java/basis/proxy.md)
- [BigDecimal Explained](./docs/java/basis/bigdecimal.md)
- [Java Magic Class Unsafe Explained](./docs/java/basis/unsafe.md)
- [Java SPI Mechanism Explained](./docs/java/basis/spi.md)
- [Java Syntactic Sugar Explained](./docs/java/basis/syntactic-sugar.md)
### Collections
**Knowledge Points/Interview Questions Summary**:
- [Summary of Common Java Collection Knowledge Points & Interview Questions (Part 1)](./docs/java/collection/java-collection-questions-01.md) (Must-see :+1:)
- [Summary of Common Java Collection Knowledge Points & Interview Questions (Part 2)](./docs/java/collection/java-collection-questions-02.md) (Must-see :+1:)
- [Summary of Java Container Usage Precautions](./docs/java/collection/java-collection-precautions-for-use.md)
**Source Code Analysis**:
- [ArrayList Core Source Code + Expansion Mechanism Analysis](./docs/java/collection/arraylist-source-code.md)
- [LinkedList Core Source Code Analysis](./docs/java/collection/linkedlist-source-code.md)
- [HashMap Core Source Code + Underlying Data Structure Analysis](./docs/java/collection/hashmap-source-code.md)
# Java Collection & Concurrency Series
## Collection
- [ConcurrentHashMap Core Source Code + Underlying Data Structure Analysis](./docs/java/collection/concurrent-hash-map-source-code.md)
- [LinkedHashMap Core Source Code Analysis](./docs/java/collection/linkedhashmap-source-code.md)
- [CopyOnWriteArrayList Core Source Code Analysis](./docs/java/collection/copyonwritearraylist-source-code.md)
- [ArrayBlockingQueue Core Source Code Analysis](./docs/java/collection/arrayblockingqueue-source-code.md)
- [PriorityQueue Core Source Code Analysis](./docs/java/collection/priorityqueue-source-code.md)
- [DelayQueue Core Source Code Analysis](./docs/java/collection/delayqueue-source-code.md)
### IO
- [IO Basic Knowledge Summary](./docs/java/io/io-basis.md)
- [IO Design Patterns Summary](./docs/java/io/io-design-patterns.md)
- [IO Model Explanation](./docs/java/io/io-model.md)
- [NIO Core Knowledge Summary](./docs/java/io/nio-basis.md)
### Concurrency
**Knowledge Points/Interview Questions Summary** : (Must-read :+1:)
- [Common Java Concurrency Knowledge Points & Interview Questions Summary (Part 1)](./docs/java/concurrent/java-concurrent-questions-01.md)
- [Common Java Concurrency Knowledge Points & Interview Questions Summary (Part 2)](./docs/java/concurrent/java-concurrent-questions-02.md)
- [Common Java Concurrency Knowledge Points & Interview Questions Summary (Part 3)](./docs/java/concurrent/java-concurrent-questions-03.md)
**Important Knowledge Points Explanation**:
- [Optimistic Lock and Pessimistic Lock Explanation](./docs/java/concurrent/optimistic-lock-and-pessimistic-lock.md)
- [CAS Explanation](./docs/java/concurrent/cas.md)
- [JMM (Java Memory Model) Explanation](./docs/java/concurrent/jmm.md)
- **Thread Pool**: [Java Thread Pool Explanation](./docs/java/concurrent/java-thread-pool-summary.md), [Java Thread Pool Best Practices](./docs/java/concurrent/java-thread-pool-best-practices.md)
- [ThreadLocal Explanation](./docs/java/concurrent/threadlocal.md)
- [Java Concurrent Collections Summary](./docs/java/concurrent/java-concurrent-collections.md)
- [Atomic Classes Summary](./docs/java/concurrent/atomic-classes.md)
- [AQS Explanation](./docs/java/concurrent/aqs.md)
- [CompletableFuture Explanation](./docs/java/concurrent/completablefuture-intro.md)
### JVM (Must-read :+1:)
The JVM part mainly refers to the [JVM Specification - Java 8](https://docs.oracle.com/javase/specs/jvms/se8/html/index.html) and Zhong Zhiming's book [《Deep Understanding of Java Virtual Machine (3rd Edition)》](https://book.douban.com/subject/34907497/) (strongly recommend to read it several times!).
- **[Java Memory Area](./docs/java/jvm/memory-area.md)**
- **[JVM Garbage Collection](./docs/java/jvm/jvm-garbage-collection.md)**
- [Class File Structure](./docs/java/jvm/class-file-structure.md)
- **[Class Loading Process](./docs/java/jvm/class-loading-process.md)**
- [Class Loader](./docs/java/jvm/classloader.md)
- [【To Be Completed】Most Important JVM Parameters Summary (Half Translated)](./docs/java/jvm/jvm-parameters-intro.md)
- [【Bonus】Understand JVM in Plain Language](./docs/java/jvm/jvm-intro.md)
- [JDK Monitoring and Troubleshooting Tools](./docs/java/jvm/jdk-monitoring-and-troubleshooting-tools.md)
### New Features
- **Java 8**: [Java 8 New Features Summary (Translated)](./docs/java/new-features/java8-tutorial-translate.md), [Common Java 8 New Features Summary](./docs/java/new-features/java8-common-new-features.md)
- [Java 9 New Features Overview](./docs/java/new-features/java9.md)
- [Java 10 New Features Overview](./docs/java/new-features/java10.md)
- [Java 11 New Features Overview](./docs/java/new-features/java11.md)
- [Java 12 & 13 New Features Overview](./docs/java/new-features/java12-13.md)
- [Java 14 & 15 New Features Overview](./docs/java/new-features/java14-15.md)
- [Java 16 New Features Overview](./docs/java/new-features/java16.md)
- [Java 17 New Features Overview](./docs/java/new-features/java17.md)
- [Java 18 New Features Overview](./docs/java/new-features/java18.md)
- [Java 19 New Features Overview](./docs/java/new-features/java19.md)
- [Java 20 New Features Overview](./docs/java/new-features/java20.md)
# Overview of Java 21, 22, 23, 24, and 25 New Features
## Computer Fundamentals
### Operating Systems
- [Summary of Common Operating System Knowledge Points & Interview Questions (Part 1)](./docs/cs-basics/operating-system/operating-system-basic-questions-01.md)
- [Summary of Common Operating System Knowledge Points & Interview Questions (Part 2)](./docs/cs-basics/operating-system/operating-system-basic-questions-02.md)
- **Linux**:
- [Summary of Essential Linux Basics for Backend Developers](./docs/cs-basics/operating-system/linux-intro.md)
- [Summary of Shell Scripting Basics](./docs/cs-basics/operating-system/shell-intro.md)
### Networking
**Knowledge Points/Interview Questions Summary**:
- [Summary of Common Computer Network Knowledge Points & Interview Questions (Part 1)](./docs/cs-basics/network/other-network-questions.md)
- [Summary of Common Computer Network Knowledge Points & Interview Questions (Part 2)](./docs/cs-basics/network/other-network-questions2.md)
- [Summary of Professor Xie Xiren's "Computer Network" Content (Supplementary)](./docs/cs-basics/network/computer-network-xiexiren-summary.md)
**Important Concept Explanations**:
- [Detailed Explanation of the OSI and TCP/IP Network Layer Models (Basics)](./docs/cs-basics/network/osi-and-tcp-ip-model.md)
- [Summary of Common Application Layer Protocols (Application Layer)](./docs/cs-basics/network/application-layer-protocol.md)
- [HTTP vs HTTPS (Application Layer)](./docs/cs-basics/network/http-vs-https.md)
- [HTTP 1.0 vs HTTP 1.1 (Application Layer)](./docs/cs-basics/network/http1.0-vs-http1.1.md)
- [Common HTTP Status Codes (Application Layer)](./docs/cs-basics/network/http-status-codes.md)
- [Detailed Explanation of the DNS Domain Name System (Application Layer)](./docs/cs-basics/network/dns.md)
- [TCP Three-Way Handshake and Four-Way Termination (Transport Layer)](./docs/cs-basics/network/tcp-connection-and-disconnection.md)
- [TCP Transmission Reliability Guarantee (Transport Layer)](./docs/cs-basics/network/tcp-reliability-guarantee.md)
- [Detailed Explanation of the ARP Protocol (Network Layer)](./docs/cs-basics/network/arp.md)
- [Detailed Explanation of the NAT Protocol (Network Layer)](./docs/cs-basics/network/nat.md)
- [Summary of Common Network Attack Means (Security)](./docs/cs-basics/network/network-attack-means.md)
### Data Structures
**Illustrated Data Structures:**
- [Linear Data Structures: Arrays, Linked Lists, Stacks, Queues](./docs/cs-basics/data-structure/linear-data-structure.md)
- [Graphs](./docs/cs-basics/data-structure/graph.md)
- [Heaps](./docs/cs-basics/data-structure/heap.md)
- [Trees](./docs/cs-basics/data-structure/tree.md): Focus on [Red-Black Trees](./docs/cs-basics/data-structure/red-black-tree.md), B-, B+, B\* Trees, and LSM Trees
Other Commonly Used Data Structures:
- [Bloom Filters](./docs/cs-basics/data-structure/bloom-filter.md)
### Algorithms
The algorithm part is very important. If you don't know how to learn algorithms, you can refer to:
- [Recommended Algorithm Learning Books and Resources](https://www.zhihu.com/question/323359308/answer/1545320858).
- [How to Solve LeetCode Problems?](https://www.zhihu.com/question/31092580/answer/1534887374)
**Summary of Common Algorithm Problems**:
- [Summary of Several Common String Algorithm Problems](./docs/cs-basics/algorithms/string-algorithm-problems.md)
- [Summary of Several Common Linked List Algorithm Problems](./docs/cs-basics/algorithms/linkedlist-algorithm-problems.md)
- [Part of the Coding Questions from the "Sword Refers to Offer"](./docs/cs-basics/algorithms/the-sword-refers-to-offer.md)
- [Ten Classic Sorting Algorithms](./docs/cs-basics/algorithms/10-classical-sorting-algorithms.md)
Additionally, [GeeksforGeeks](https://www.geeksforgeeks.org/fundamentals-of-algorithms/) has a comprehensive summary of common algorithms.
## Database
### Basics
- [Summary of Database Basics](./docs/database/basis.md)
- [Summary of NoSQL Basics](./docs/database/nosql.md)
- [Explanation of Character Sets](./docs/database/character-set.md)
- SQL:
- [Summary of SQL Syntax Basics](./docs/database/sql/sql-syntax-summary.md)
- [Summary of Common SQL Interview Questions](./docs/database/sql/sql-questions-01.md)
### MySQL
**Knowledge Points/Interview Questions Summary:**
# MySQL Common Knowledge Points & Interview Questions Summary (Must-Read :+1:)
- [MySQL Common Knowledge Points & Interview Questions Summary](./docs/database/mysql/mysql-questions-01.md)
- [MySQL High-Performance Optimization Specification Recommendations](./docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md)
**Important Knowledge Points:**
- [MySQL Index Details](./docs/database/mysql/mysql-index.md)
- [Detailed Explanation of MySQL Transaction Isolation Levels (with Pictures)](./docs/database/mysql/transaction-isolation-level.md)
- [Detailed Explanation of MySQL's Three Logs (binlog, redo log, and undo log)](./docs/database/mysql/mysql-logs.md)
- [InnoDB Storage Engine's Implementation of MVCC](./docs/database/mysql/innodb-implementation-of-mvcc.md)
- [How SQL Statements are Executed in MySQL](./docs/database/mysql/how-sql-executed-in-mysql.md)
- [Detailed Explanation of MySQL Query Cache](./docs/database/mysql/mysql-query-cache.md)
- [MySQL Query Execution Plan Analysis](./docs/database/mysql/mysql-query-execution-plan.md)
- [Are MySQL Auto-Increment Primary Keys Always Continuous?](./docs/database/mysql/mysql-auto-increment-primary-key-continuous.md)
- [Suggestions on Storing Time-Related Data in Databases](./docs/database/mysql/some-thoughts-on-database-storage-time.md)
- [Index Invalidation Caused by Implicit Conversion in MySQL](./docs/database/mysql/index-invalidation-caused-by-implicit-conversion.md)
### Redis
**Knowledge Points/Interview Questions Summary** (Must-Read :+1:):
- [Redis Common Knowledge Points & Interview Questions Summary (Part 1)](./docs/database/redis/redis-questions-01.md)
- [Redis Common Knowledge Points & Interview Questions Summary (Part 2)](./docs/database/redis/redis-questions-02.md)
**Important Knowledge Points:**
- [Detailed Explanation of 3 Common Cache Read and Write Strategies](./docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md)
- [Can Redis Be Used as a Message Queue? How to Implement It?](./docs/database/redis/redis-stream-mq.md)
- [Detailed Explanation of Redis' 5 Basic Data Structures](./docs/database/redis/redis-data-structures-01.md)
- [Detailed Explanation of Redis' 3 Special Data Structures](./docs/database/redis/redis-data-structures-02.md)
- [Detailed Explanation of Redis Persistence Mechanism](./docs/database/redis/redis-persistence.md)
- [Detailed Explanation of Redis Memory Fragmentation](./docs/database/redis/redis-memory-fragmentation.md)
- [Summary of Common Causes of Redis Blocking](./docs/database/redis/redis-common-blocking-problems-summary.md)
- [Detailed Explanation of Redis Cluster](./docs/database/redis/redis-cluster.md)
### MongoDB
- [MongoDB Common Knowledge Points & Interview Questions Summary (Part 1)](./docs/database/mongodb/mongodb-questions-01.md)
- [MongoDB Common Knowledge Points & Interview Questions Summary (Part 2)](./docs/database/mongodb/mongodb-questions-02.md)
## Search Engines
[Elasticsearch Common Interview Questions Summary (Paid)](./docs/database/elasticsearch/elasticsearch-questions-01.md)

## Development Tools
### Maven
- [Maven Core Concepts Summary](./docs/tools/maven/maven-core-concepts.md)
- [Maven Best Practices](./docs/tools/maven/maven-best-practices.md)
### Gradle
[Gradle Core Concepts Summary](./docs/tools/gradle/gradle-core-concepts.md) (Optional, Maven is still more widely used in China)
### Docker
- [Docker Core Concepts Summary](./docs/tools/docker/docker-intro.md)
- [Docker in Action](./docs/tools/docker/docker-in-action.md)
### Git
- [Git Core Concepts Summary](./docs/tools/git/git-intro.md)
- [Useful GitHub Tips Summary](./docs/tools/git/github-tips.md)
## System Design
- [Common System Design Interview Questions Summary](./docs/system-design/system-design-questions.md)
- [Common Design Pattern Interview Questions Summary](./docs/system-design/design-pattern.md)
### Basics
- [A Brief Tutorial on RESTful API](./docs/system-design/basis/RESTfulAPI.md)
- [A Brief Tutorial on Software Engineering](./docs/system-design/basis/software-engineering.md)
- [Code Naming Guide](./docs/system-design/basis/naming.md)
- [Code Refactoring Guide](./docs/system-design/basis/refactoring.md)
- [Unit Testing Guide](./docs/system-design/basis/unit-test.md)
### Common Frameworks
#### Spring/SpringBoot (Must-Read :+1:)
**Knowledge Points/Interview Questions Summary**:
- [Summary of Common Spring Knowledge Points and Interview Questions](./docs/system-design/framework/spring/spring-knowledge-and-questions-summary.md)
- [Summary of Common SpringBoot Knowledge Points and Interview Questions](./docs/system-design/framework/spring/springboot-knowledge-and-questions-summary.md)
- [Summary of Common Spring/SpringBoot Annotations](./docs/system-design/framework/spring/spring-common-annotations.md)
- [SpringBoot Beginner's Guide](https://github.com/Snailclimb/springboot-guide)
**Detailed Explanation of Important Knowledge Points**:
- [Detailed Explanation of IoC & AOP (Quick Understanding)](./docs/system-design/framework/spring/ioc-and-aop.md)
- [Detailed Explanation of Spring Transactions](./docs/system-design/framework/spring/spring-transaction.md)
- [Detailed Explanation of Design Patterns in Spring](./docs/system-design/framework/spring/spring-design-patterns-summary.md)
- [Detailed Explanation of SpringBoot Auto-Configuration Principles](./docs/system-design/framework/spring/spring-boot-auto-assembly-principles.md)
#### MyBatis
[Summary of Common MyBatis Interview Questions](./docs/system-design/framework/mybatis/mybatis-interview.md)
### Security
#### Authentication and Authorization
- [Detailed Explanation of Authentication and Authorization Fundamentals](./docs/system-design/security/basis-of-authority-certification.md)
- [Detailed Explanation of JWT Basics](./docs/system-design/security/jwt-intro.md)
- [Analysis of Advantages and Disadvantages of JWT and Common Problem Solutions](./docs/system-design/security/advantages-and-disadvantages-of-jwt.md)
- [Detailed Explanation of SSO (Single Sign-On)](./docs/system-design/security/sso-intro.md)
- [Detailed Explanation of Permission System Design](./docs/system-design/security/design-of-authority-system.md)
#### Data Security
- [Summary of Common Encryption Algorithms](./docs/system-design/security/encryption-algorithms.md)
- [Summary of Sensitive Word Filtering Solutions](./docs/system-design/security/sentive-words-filter.md)
- [Summary of Data Desensitization Solutions](./docs/system-design/security/data-desensitization.md)
- [Why Both Front-end and Back-end Need to Perform Data Validation](./docs/system-design/security/data-validation.md)
### Scheduled Tasks
[Detailed Explanation of Java Scheduled Tasks](./docs/system-design/schedule-task.md)
### Web Real-time Message Pushing
[Detailed Explanation of Web Real-time Message Pushing](./docs/system-design/web-real-time-message-push.md)
## Distributed System
### Theory, Algorithms, and Protocols
- [Interpretation of CAP Theory and BASE Theory](https://javaguide.cn/distributed-system/protocol/cap-and-base-theorem.html)
- [Interpretation of Paxos Algorithm](https://javaguide.cn/distributed-system/protocol/paxos-algorithm.html)
- [Interpretation of Raft Algorithm](https://javaguide.cn/distributed-system/protocol/raft-algorithm.html)
- [Detailed Explanation of Gossip Protocol](https://javaguide.cn/distributed-system/protocol/gossip-protocol.html)
- [Detailed Explanation of Consistent Hashing Algorithm](https://javaguide.cn/distributed-system/protocol/consistent-hashing.html)
### RPC
- [Summary of RPC Basics](https://javaguide.cn/distributed-system/rpc/rpc-intro.html)
- [Summary of Common Dubbo Knowledge Points and Interview Questions](https://javaguide.cn/distributed-system/rpc/dubbo.html)
### ZooKeeper
> These two articles may have some overlapping content, it is recommended to read both.
- [Summary of ZooKeeper Relevant Concepts (Beginner)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.html)
- [Summary of ZooKeeper Relevant Concepts (Advanced)](https://javaguide.cn/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.html)
### API Gateway
- [Summary of API Gateway Basics](https://javaguide.cn/distributed-system/api-gateway.html)
- [Summary of Common Spring Cloud Gateway Knowledge Points and Interview Questions](./docs/distributed-system/spring-cloud-gateway-questions.md)
### Distributed ID
- [Introduction to Distributed ID and Summary of Implementation Solutions](https://javaguide.cn/distributed-system/distributed-id.html)
- [Design Guide for Distributed ID](https://javaguide.cn/distributed-system/distributed-id-design.html)
### Distributed Lock
# Distributed Locks
- [Introduction to Distributed Locks](https://javaguide.cn/distributed-system/distributed-lock.html)
- [Summary of Common Distributed Lock Implementation Solutions](https://javaguide.cn/distributed-system/distributed-lock-implementations.html)
### Distributed Transactions
[Summary of Common Distributed Transaction Knowledge Points and Interview Questions](https://javaguide.cn/distributed-system/distributed-transaction.html)
### Distributed Configuration Center
[Summary of Common Distributed Configuration Center Knowledge Points and Interview Questions](./docs/distributed-system/distributed-configuration-center.md)
## High Performance
### Database Optimization
- [Database Read-Write Separation and Database Sharding](./docs/high-performance/read-and-write-separation-and-library-subtable.md)
- [Data Separation of Cold and Hot Data](./docs/high-performance/data-cold-hot-separation.md)
- [Summary of Common SQL Optimization Methods](./docs/high-performance/sql-optimization.md)
- [Introduction to Deep Pagination and Optimization Suggestions](./docs/high-performance/deep-pagination-optimization.md)
### Load Balancing
[Summary of Common Load Balancing Knowledge Points and Interview Questions](./docs/high-performance/load-balancing.md)
### CDN
[Summary of Common CDN (Content Delivery Network) Knowledge Points and Interview Questions](./docs/high-performance/cdn.md)
### Message Queue
- [Summary of Message Queue Basic Knowledge](./docs/high-performance/message-queue/message-queue.md)
- [Summary of Common Disruptor Knowledge Points and Interview Questions](./docs/high-performance/message-queue/disruptor-questions.md)
- [Summary of Common RabbitMQ Knowledge Points and Interview Questions](./docs/high-performance/message-queue/rabbitmq-questions.md)
- [Summary of Common RocketMQ Knowledge Points and Interview Questions](./docs/high-performance/message-queue/rocketmq-questions.md)
- [Summary of Common Kafka Knowledge Points and Interview Questions](./docs/high-performance/message-queue/kafka-questions-01.md)
## High Availability
[Guide to High Availability System Design](./docs/high-availability/high-availability-system-design.md)
### Redundancy Design
[Detailed Explanation of Redundancy Design](./docs/high-availability/redundancy.md)
### Rate Limiting
[Detailed Explanation of Service Rate Limiting](./docs/high-availability/limit-request.md)
### Fallback & Circuit Breaker
[Detailed Explanation of Fallback & Circuit Breaker](./docs/high-availability/fallback-and-circuit-breaker.md)
### Timeout & Retry
[Detailed Explanation of Timeout & Retry](./docs/high-availability/timeout-and-retry.md)
### Clustering
Deploying multiple instances of the same service to avoid single point of failure.
### Disaster Recovery Design and Active-Active Deployment
**Disaster Recovery** = Disaster Tolerance + Backup.
- **Backup**: Backing up all important data generated by the system multiple times.
- **Disaster Tolerance**: Establishing two completely identical systems in different locations. When the system in one location suddenly fails, the entire application system can be switched to the other one, so that the system can continue to provide services normally.
**Active-Active Deployment** describes deploying services in different locations and simultaneously providing services externally. The main difference from traditional disaster recovery design is the "active-active" nature, i.e., all sites are simultaneously providing external services. Active-active deployment is to cope with unexpected situations such as fires, earthquakes and other natural or man-made disasters.
## Star Trend

## Official Public Account
If you want to stay up-to-date with my latest articles and share my valuable content, you can follow my official public account.

================================================
FILE: TRANSLATION_TOOLS.md
================================================
# Translation Tools for JavaGuide
This repository includes automated translation tools to translate all documentation to multiple languages.
## Available Tools
### 1. Python Version (`translate_repo.py`)
**Requirements:**
```bash
pip install deep-translator
```
**Usage:**
```bash
python3 translate_repo.py
```
**Features:**
- ✅ Uses Google Translate (free, no API key required)
- ✅ Translates all `.md` files in `docs/` folder + `README.md`
- ✅ Preserves directory structure
- ✅ Progress tracking (saves to `.translation_progress.json`)
- ✅ Skips already translated files
- ✅ Rate limiting to avoid API throttling
- ✅ Supports 20 languages
### 2. Java Version (`TranslateRepo.java`)
**Requirements:**
```bash
# Requires Gson library
# Download from: https://repo1.maven.org/maven2/com/google/code/gson/gson/2.10.1/gson-2.10.1.jar
```
**Compile:**
```bash
javac -cp gson-2.10.1.jar TranslateRepo.java
```
**Usage:**
```bash
java -cp .:gson-2.10.1.jar TranslateRepo
```
**Features:**
- ✅ Pure Java implementation
- ✅ Uses Google Translate API (free, no key required)
- ✅ Same functionality as Python version
- ✅ Progress tracking with JSON
- ✅ Supports 20 languages
## Supported Languages
1. English (en)
2. Chinese Simplified (zh)
3. Spanish (es)
4. French (fr)
5. Portuguese (pt)
6. German (de)
7. Japanese (ja)
8. Korean (ko)
9. Russian (ru)
10. Italian (it)
11. Arabic (ar)
12. Hindi (hi)
13. Turkish (tr)
14. Vietnamese (vi)
15. Polish (pl)
16. Dutch (nl)
17. Indonesian (id)
18. Thai (th)
19. Swedish (sv)
20. Greek (el)
## Output Structure
Original:
```
docs/
├── java/
│ └── basics.md
└── ...
README.md
```
After translation to English:
```
docs_en/
├── java/
│ └── basics.en.md
└── ...
README.en.md
```
## How It Works
1. **Scans** all `.md` files in `docs/` folder and `README.md`
2. **Splits** large files into chunks (4000 chars) to respect API limits
3. **Translates** each chunk using Google Translate
4. **Preserves** markdown formatting and code blocks
5. **Saves** to `docs_{lang}/` with `.{lang}.md` suffix
6. **Tracks** progress to resume if interrupted
## Example Workflow
```bash
# 1. Run translation tool
python3 translate_repo.py
# 2. Select language (e.g., 1 for English)
Enter choice (1-20): 1
# 3. Confirm translation
Translate 292 files to English? (y/n): y
# 4. Wait for completion (progress shown for each file)
[1/292] docs/java/basics/java-basic-questions-01.md
→ docs_en/java/basics/java-basic-questions-01.en.md
Chunk 1/3... ✅
Chunk 2/3... ✅
Chunk 3/3... ✅
✅ Translated (5234 → 6891 chars)
# 5. Review and commit
git add docs_en/ README.en.md
git commit -m "Add English translation"
git push
```
## Progress Tracking
The tool saves progress to `.translation_progress.json`:
```json
{
"completed": [
"docs/java/basics/file1.md",
"docs/java/basics/file2.md"
],
"failed": []
}
```
If interrupted, simply run the tool again - it will skip completed files and resume where it left off.
## Performance
- **Speed**: ~1 file per 5-10 seconds (depending on file size)
- **For JavaGuide**: 292 files ≈ 2-3 hours total
- **Rate limiting**: 1 second delay between chunks to avoid throttling
## Notes
- ✅ Free to use (no API key required)
- ✅ Preserves markdown formatting
- ✅ Handles code blocks correctly
- ✅ Skips existing translations
- ⚠️ Review translations for accuracy (automated translation may have errors)
- ⚠️ Large repos may take several hours
## Contributing
After running the translation tool:
1. Review translated files for accuracy
2. Fix any translation errors manually
3. Test that links and formatting work correctly
4. Create a pull request with your translations
## License
These tools are provided as-is for translating JavaGuide documentation.
================================================
FILE: TranslateRepo.java
================================================
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
import java.util.stream.Collectors;
import com.google.gson.*;
/**
* Repository Documentation Translation Tool
*
* Translates all markdown files in docs/ folder to target language.
* Preserves directory structure and saves to docs_{lang}/ folder.
*
* Usage: java TranslateRepo
*/
public class TranslateRepo {
private static final int CHUNK_SIZE = 4000;
private static final String PROGRESS_FILE = ".translation_progress.json";
private static final Map<String, Language> LANGUAGES = new LinkedHashMap<>();
static {
LANGUAGES.put("1", new Language("English", "en", "en"));
LANGUAGES.put("2", new Language("Chinese (Simplified)", "zh-CN", "zh"));
LANGUAGES.put("3", new Language("Spanish", "es", "es"));
LANGUAGES.put("4", new Language("French", "fr", "fr"));
LANGUAGES.put("5", new Language("Portuguese", "pt", "pt"));
LANGUAGES.put("6", new Language("German", "de", "de"));
LANGUAGES.put("7", new Language("Japanese", "ja", "ja"));
LANGUAGES.put("8", new Language("Korean", "ko", "ko"));
LANGUAGES.put("9", new Language("Russian", "ru", "ru"));
LANGUAGES.put("10", new Language("Italian", "it", "it"));
LANGUAGES.put("11", new Language("Arabic", "ar", "ar"));
LANGUAGES.put("12", new Language("Hindi", "hi", "hi"));
LANGUAGES.put("13", new Language("Turkish", "tr", "tr"));
LANGUAGES.put("14", new Language("Vietnamese", "vi", "vi"));
LANGUAGES.put("15", new Language("Polish", "pl", "pl"));
LANGUAGES.put("16", new Language("Dutch", "nl", "nl"));
LANGUAGES.put("17", new Language("Indonesian", "id", "id"));
LANGUAGES.put("18", new Language("Thai", "th", "th"));
LANGUAGES.put("19", new Language("Swedish", "sv", "sv"));
LANGUAGES.put("20", new Language("Greek", "el", "el"));
}
static class Language {
String name;
String code;
String suffix;
Language(String name, String code, String suffix) {
this.name = name;
this.code = code;
this.suffix = suffix;
}
}
static class TranslationProgress {
Set<String> completed = new HashSet<>();
Set<String> failed = new HashSet<>();
}
public static void main(String[] args) {
try {
printHeader();
// Get repository path
Scanner scanner = new Scanner(System.in);
System.out.print("Enter repository path (default: current directory): ");
String repoPathStr = scanner.nextLine().trim();
if (repoPathStr.isEmpty()) {
repoPathStr = ".";
}
Path repoPath = Paths.get(repoPathStr).toAbsolutePath();
if (!Files.exists(repoPath)) {
System.out.println("❌ Repository path does not exist: " + repoPath);
return;
}
System.out.println("📁 Repository: " + repoPath);
System.out.println();
// Select language
Language language = selectLanguage(scanner);
System.out.println("\n✨ Selected: " + language.name);
System.out.println();
// Find markdown files
System.out.println("🔍 Finding markdown files...");
List<Path> mdFiles = findMarkdownFiles(repoPath);
if (mdFiles.isEmpty()) {
System.out.println("❌ No markdown files found in docs/ folder or README.md");
return;
}
System.out.println("📄 Found " + mdFiles.size() + " markdown files");
System.out.println();
// Load progress
TranslationProgress progress = loadProgress(repoPath);
// Filter files
List<Path> filesToTranslate = new ArrayList<>();
for (Path file : mdFiles) {
Path outputPath = getOutputPath(file, repoPath, language.suffix);
if (Files.exists(outputPath)) {
System.out.println("⏭️ Skipping (exists): " + repoPath.relativize(file));
} else if (progress.completed.contains(file.toString())) {
System.out.println("⏭️ Skipping (completed): " + repoPath.relativize(file));
} else {
filesToTranslate.add(file);
}
}
if (filesToTranslate.isEmpty()) {
System.out.println("\n✅ All files already translated!");
return;
}
System.out.println("\n📝 Files to translate: " + filesToTranslate.size());
System.out.println();
// Confirm
System.out.print("Translate " + filesToTranslate.size() + " files to " + language.name + "? (y/n): ");
String confirm = scanner.nextLine().trim().toLowerCase();
if (!confirm.equals("y")) {
System.out.println("❌ Translation cancelled");
return;
}
System.out.println();
System.out.println("=".repeat(70));
System.out.println("Translating to " + language.name + "...");
System.out.println("=".repeat(70));
System.out.println();
// Translate files
int totalInputChars = 0;
int totalOutputChars = 0;
List<String> failedFiles = new ArrayList<>();
for (int i = 0; i < filesToTranslate.size(); i++) {
Path inputPath = filesToTranslate.get(i);
Path relativePath = repoPath.relativize(inputPath);
Path outputPath = getOutputPath(inputPath, repoPath, language.suffix);
System.out.println("[" + (i + 1) + "/" + filesToTranslate.size() + "] " + relativePath);
System.out.println(" → " + repoPath.relativize(outputPath));
try {
int[] chars = translateFile(inputPath, outputPath, language.code);
totalInputChars += chars[0];
totalOutputChars += chars[1];
progress.completed.add(inputPath.toString());
saveProgress(repoPath, progress);
System.out.println(" ✅ Translated (" + chars[0] + " → " + chars[1] + " chars)");
System.out.println();
} catch (Exception e) {
System.out.println(" ❌ Failed: " + e.getMessage());
failedFiles.add(relativePath.toString());
progress.failed.add(inputPath.toString());
saveProgress(repoPath, progress);
System.out.println();
}
}
// Summary
System.out.println("=".repeat(70));
System.out.println("Translation Complete!");
System.out.println("=".repeat(70));
System.out.println("✅ Translated: " + (filesToTranslate.size() - failedFiles.size()) + " files");
System.out.println("📊 Input: " + String.format("%,d", totalInputChars) + " characters");
System.out.println("📊 Output: " + String.format("%,d", totalOutputChars) + " characters");
if (!failedFiles.isEmpty()) {
System.out.println("\n❌ Failed: " + failedFiles.size() + " files");
for (String file : failedFiles) {
System.out.println(" - " + file);
}
}
System.out.println("\n📁 Output directory: docs_" + language.suffix + "/");
System.out.println("📁 README: README." + language.suffix + ".md");
System.out.println();
System.out.println("💡 Next steps:");
System.out.println(" 1. Review translated files in docs_" + language.suffix + "/");
System.out.println(" 2. git add docs_" + language.suffix + "/ README." + language.suffix + ".md");
System.out.println(" 3. git commit -m 'Add " + language.name + " translation'");
System.out.println(" 4. Create PR");
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
e.printStackTrace();
}
}
private static void printHeader() {
System.out.println("=".repeat(70));
System.out.println("Repository Documentation Translation Tool");
System.out.println("=".repeat(70));
System.out.println();
}
private static Language selectLanguage(Scanner scanner) {
System.out.println("=".repeat(70));
System.out.println("Select target language:");
System.out.println("=".repeat(70));
for (Map.Entry<String, Language> entry : LANGUAGES.entrySet()) {
System.out.printf(" %2s. %s%n", entry.getKey(), entry.getValue().name);
}
System.out.println();
while (true) {
System.out.print("Enter choice (1-20): ");
String choice = scanner.nextLine().trim();
if (LANGUAGES.containsKey(choice)) {
return LANGUAGES.get(choice);
}
System.out.println("❌ Invalid choice. Please enter a number between 1-20.");
}
}
private static List<Path> findMarkdownFiles(Path repoPath) throws IOException {
List<Path> files = new ArrayList<>();
// Add README.md
Path readme = repoPath.resolve("README.md");
if (Files.exists(readme)) {
files.add(readme);
}
// Add all .md files in docs/
Path docsPath = repoPath.resolve("docs");
if (Files.exists(docsPath)) {
Files.walk(docsPath)
.filter(p -> p.toString().endsWith(".md"))
.forEach(files::add);
}
Collections.sort(files);
return files;
}
private static Path getOutputPath(Path inputPath, Path repoPath, String langSuffix) {
String fileName = inputPath.getFileName().toString();
// Handle README.md
if (fileName.equals("README.md")) {
return repoPath.resolve("README." + langSuffix + ".md");
}
// Handle docs/ files
Path docsPath = repoPath.resolve("docs");
Path relative = docsPath.relativize(inputPath);
// Change extension: file.md -> file.{lang}.md
String stem = fileName.substring(0, fileName.length() - 3);
String newName = stem + "." + langSuffix + ".md";
return repoPath.resolve("docs_" + langSuffix).resolve(relative.getParent()).resolve(newName);
}
private static int[] translateFile(Path inputPath, Path outputPath, String targetLang) throws IOException {
// Read input
String content = Files.readString(inputPath, StandardCharsets.UTF_8);
int inputChars = content.length();
// Split into chunks
List<String> chunks = splitContent(content, CHUNK_SIZE);
// Translate chunks
StringBuilder translated = new StringBuilder();
for (int i = 0; i < chunks.size(); i++) {
System.out.print(" Chunk " + (i + 1) + "/" + chunks.size() + "... ");
String translatedChunk = translateText(chunks.get(i), targetLang);
translated.append(translatedChunk);
System.out.println("✅");
try {
Thread.sleep(1000); // Rate limiting
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
String translatedContent = translated.toString();
int outputChars = translatedContent.length();
// Create output directory
Files.createDirectories(outputPath.getParent());
// Write output
Files.writeString(outputPath, translatedContent, StandardCharsets.UTF_8);
return new int[]{inputChars, outputChars};
}
private static List<String> splitContent(String content, int chunkSize) {
List<String> chunks = new ArrayList<>();
StringBuilder currentChunk = new StringBuilder();
boolean inCodeBlock = false;
for (String line : content.split("\n")) {
if (line.trim().startsWith("```")) {
inCodeBlock = !inCodeBlock;
}
if (currentChunk.length() + line.length() > chunkSize && !inCodeBlock && currentChunk.length() > 0) {
chunks.add(currentChunk.toString());
currentChunk = new StringBuilder();
}
currentChunk.append(line).append("\n");
}
if (currentChunk.length() > 0) {
chunks.add(currentChunk.toString());
}
return chunks;
}
private static String translateText(String text, String targetLang) throws IOException {
// Use Google Translate API (free, no key required)
String urlStr = "https://translate.googleapis.com/translate_a/single?client=gtx&sl=auto&tl="
+ targetLang + "&dt=t&q=" + URLEncoder.encode(text, StandardCharsets.UTF_8);
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
in.close();
// Parse JSON response
JsonArray jsonArray = JsonParser.parseString(response.toString()).getAsJsonArray();
StringBuilder translated = new StringBuilder();
JsonArray translations = jsonArray.get(0).getAsJsonArray();
for (int i = 0; i < translations.size(); i++) {
JsonArray translation = translations.get(i).getAsJsonArray();
translated.append(translation.get(0).getAsString());
}
return translated.toString();
}
private static TranslationProgress loadProgress(Path repoPath) {
Path progressFile = repoPath.resolve(PROGRESS_FILE);
if (Files.exists(progressFile)) {
try {
String json = Files.readString(progressFile);
Gson gson = new Gson();
return gson.fromJson(json, TranslationProgress.class);
} catch (Exception e) {
// Ignore errors, return new progress
}
}
return new TranslationProgress();
}
private static void saveProgress(Path repoPath, TranslationProgress progress) {
Path progressFile = repoPath.resolve(PROGRESS_FILE);
try {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
String json = gson.toJson(progress);
Files.writeString(progressFile, json);
} catch (Exception e) {
System.err.println("Warning: Could not save progress: " + e.getMessage());
}
}
}
================================================
FILE: docs/.vuepress/client.ts
================================================
import { defineClientConfig } from "vuepress/client";
import { h } from "vue";
import LayoutToggle from "./components/LayoutToggle.vue";
import GlobalUnlock from "./components/unlock/GlobalUnlock.vue";
import UnlockContent from "./components/unlock/UnlockContent.vue";
export default defineClientConfig({
enhance({ app }) {
app.component("UnlockContent", UnlockContent);
},
rootComponents: [() => h(LayoutToggle), () => h(GlobalUnlock)],
});
================================================
FILE: docs/.vuepress/components/LayoutToggle.vue
================================================
<template>
<button
class="layout-toggle-btn"
:class="{ 'is-hidden': isHidden }"
:title="isHidden ? '退出沉浸式阅读' : '沉浸式阅读'"
@click="toggleLayout"
>
<svg
xmlns="http://www.w3.org/2000/svg"
width="16"
height="16"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
>
<path
v-if="!isHidden"
d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"
/>
<path
v-else
d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"
/>
</svg>
<span class="btn-text">{{ isHidden ? "退出沉浸" : "沉浸阅读" }}</span>
</button>
</template>
<script setup lang="ts">
import { ref, onMounted, watch, computed } from "vue";
import { usePageData } from "vuepress/client";
const isHidden = ref(false);
const pageData = usePageData();
const STORAGE_KEY = "javaguide-layout-hidden";
const IMMERSIVE_TITLE = "JavaGuide - 沉浸式阅读中";
// 计算当前页面的原始标题
const originalTitle = computed(() => {
const title = pageData.value.title;
const siteTitle = "JavaGuide";
return title ? `${title} | ${siteTitle}` : siteTitle;
});
const toggleLayout = () => {
isHidden.value = !isHidden.value;
};
// 更新浏览器标题
const updateBrowserTitle = (hidden: boolean) => {
if (typeof document === "undefined") return;
document.title = hidden ? IMMERSIVE_TITLE : originalTitle.value;
};
// 应用隐藏状态
const applyHiddenState = (hidden: boolean) => {
if (typeof document === "undefined") return;
document.documentElement.classList.toggle("layout-hidden", hidden);
updateBrowserTitle(hidden);
};
// 监听沉浸模式状态变化
watch(isHidden, (newVal) => {
applyHiddenState(newVal);
localStorage?.setItem(STORAGE_KEY, String(newVal));
});
// 监听页面切换,更新标题
watch(
() => pageData.value.path,
() => {
if (isHidden.value) {
updateBrowserTitle(true);
}
},
);
onMounted(() => {
const saved = localStorage?.getItem(STORAGE_KEY);
if (saved === "true") {
isHidden.value = true;
applyHiddenState(true);
}
});
</script>
<style lang="scss" scoped>
.layout-toggle-btn {
position: fixed;
right: 20px;
bottom: 150px;
z-index: 999;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
height: 36px;
padding: 0 14px;
font-size: 13px;
color: var(--vp-c-text);
background: var(--vp-c-bg);
border: 1px solid var(--vp-c-border);
border-radius: 18px;
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1);
cursor: pointer;
transition: all 0.3s ease;
white-space: nowrap;
&:hover {
color: var(--vp-c-accent);
border-color: var(--vp-c-accent);
transform: scale(1.02);
}
&.is-hidden {
background: var(--vp-c-accent);
color: #fff;
border-color: var(--vp-c-accent);
}
svg {
width: 16px;
height: 16px;
flex-shrink: 0;
}
.btn-text {
font-weight: 500;
}
}
// 移动端和平板隐藏按钮
@media (max-width: 959px) {
.layout-toggle-btn {
display: none;
}
}
</style>
================================================
FILE: docs/.vuepress/components/unlock/GlobalUnlock.vue
================================================
<template>
<div v-if="isClientReady && isLockedPage && !isUnlocked">
<Teleport v-if="teleportTargetSelector" :to="teleportTargetSelector">
<div class="read-more-anchor">
<div class="read-more-mask" />
<button class="read-more-btn" @click="showDialog = true">
阅读全文
</button>
</div>
</Teleport>
<Teleport to="body">
<transition name="unlock-fade">
<div
v-if="showDialog"
class="unlock-modal-mask"
@click.self="showDialog = false"
>
<div class="unlock-modal">
<div class="unlock-modal-header">
<h3 class="lock-title">人机验证</h3>
<button class="close-btn" @click="showDialog = false">×</button>
</div>
<p class="lock-reason">
为保障正常阅读体验,本站部分内容已开启一次性验证。验证后全站解锁。
</p>
<div class="qr-container">
<img
:src="config.qrCodeUrl"
alt="公众号二维码"
class="qr-image"
/>
<p class="qr-tip">
扫码/微信搜索关注
<span class="highlight">“JavaGuide”</span>
</p>
<p class="qr-tip">回复 <span class="highlight">“验证码”</span></p>
</div>
<div class="input-wrapper">
<input
v-model="inputCode"
type="text"
placeholder="输入验证码"
class="unlock-input"
maxlength="4"
@keyup.enter="handleUnlock"
/>
<button class="unlock-btn" @click="handleUnlock">立即解锁</button>
</div>
<transition name="shake">
<p v-if="showError" class="error-msg">验证码错误,请重试</p>
</transition>
</div>
</div>
</transition>
</Teleport>
</div>
</template>
<script setup lang="ts">
import { computed, nextTick, onMounted, ref, watch } from "vue";
import { usePageData } from "vuepress/client";
import {
PREVIEW_HEIGHT,
unlockConfig as config,
} from "../../features/unlock/config";
const STYLE_ID = "unlock-global-style";
const DATA_ATTR = "data-unlock-target";
const pageData = usePageData();
const isClientReady = ref(false);
const isUnlocked = ref(false);
const inputCode = ref("");
const showError = ref(false);
const showDialog = ref(false);
const teleportTargetSelector = ref<string | null>(null);
const globalUnlockKey = `javaguide_site_unlocked_${config.unlockVersion ?? "v1"}`;
const normalizePath = (path: string) =>
path.replace(/\/$/, "").replace(".html", "").toLowerCase();
const isPathInPrefix = (currentPath: string, prefix: string) => {
return currentPath === prefix || currentPath.startsWith(`${prefix}/`);
};
const isLockedPage = computed(() => {
const currentPath = normalizePath(pageData.value.path);
const byExactPath = Object.keys(config.protectedPaths)
.map((p) => normalizePath(p))
.includes(currentPath);
if (byExactPath) return true;
const prefixes = Object.keys(config.protectedPrefixes ?? {}).map((p) =>
normalizePath(p),
);
return prefixes.some((prefix) => isPathInPrefix(currentPath, prefix));
});
const visibleHeight = computed(() => {
const currentPath = normalizePath(pageData.value.path);
const matchedPath = Object.keys(config.protectedPaths).find(
(p) => normalizePath(p) === currentPath,
);
if (matchedPath) return config.protectedPaths[matchedPath];
const matchedPrefix = Object.keys(config.protectedPrefixes ?? {}).find(
(prefix) => isPathInPrefix(currentPath, normalizePath(prefix)),
);
if (matchedPrefix) return config.protectedPrefixes[matchedPrefix];
return PREVIEW_HEIGHT.LONG;
});
const toPx = (value: string) => {
const px = Number.parseInt(value, 10);
return Number.isFinite(px) ? px : 1000;
};
const readUnlockState = () => {
if (typeof window === "undefined") return;
const persisted = localStorage.getItem(globalUnlockKey) === "true";
isUnlocked.value = config.forceLock ? false : persisted;
};
const findContentEl = (): HTMLElement | null => {
return (
document.getElementById("markdown-content") ??
(document.querySelector(".vp-page-content") as HTMLElement | null) ??
(document.querySelector(".theme-hope-content") as HTMLElement | null)
);
};
const ensureStyleEl = () => {
let styleEl = document.getElementById(STYLE_ID) as HTMLStyleElement | null;
if (!styleEl) {
styleEl = document.createElement("style");
styleEl.id = STYLE_ID;
document.head.appendChild(styleEl);
}
return styleEl;
};
const buildLockCSS = (height: string) => `
[${DATA_ATTR}="true"] {
max-height: ${height} !important;
overflow: hidden !important;
position: relative !important;
}
`;
const applyLockStyle = async () => {
if (typeof document === "undefined" || !isClientReady.value) return;
document.querySelectorAll(`[${DATA_ATTR}]`).forEach((el) => {
el.removeAttribute(DATA_ATTR);
});
teleportTargetSelector.value = null;
const styleEl = ensureStyleEl();
if (!isLockedPage.value || isUnlocked.value) {
styleEl.innerHTML = "";
return;
}
await nextTick();
const contentEl = findContentEl();
if (!contentEl) {
styleEl.innerHTML = "";
return;
}
// 路由切换期间节点可能已卸载,避免 hydration 阶段异常
if (!document.contains(contentEl)) {
styleEl.innerHTML = "";
return;
}
// 内容不够长时不加锁、不展示按钮
if (contentEl.scrollHeight <= toPx(visibleHeight.value)) {
styleEl.innerHTML = "";
return;
}
contentEl.setAttribute(DATA_ATTR, "true");
styleEl.innerHTML = buildLockCSS(visibleHeight.value);
if (!contentEl.id) {
contentEl.id = "unlock-content-root";
}
teleportTargetSelector.value = `#${contentEl.id}`;
};
const handleUnlock = () => {
if (inputCode.value === config.code) {
isUnlocked.value = true;
localStorage.setItem(globalUnlockKey, "true");
showDialog.value = false;
showError.value = false;
applyLockStyle();
return;
}
showError.value = true;
inputCode.value = "";
setTimeout(() => {
showError.value = false;
}, 1800);
};
onMounted(() => {
isClientReady.value = true;
readUnlockState();
nextTick(() => {
applyLockStyle();
// 再补一帧,等主题异步渲染完成
requestAnimationFrame(() => applyLockStyle());
setTimeout(applyLockStyle, 300);
});
});
watch(
() => pageData.value.path,
async () => {
if (!isClientReady.value) return;
readUnlockState();
showDialog.value = false;
await applyLockStyle();
setTimeout(applyLockStyle, 300);
},
);
</script>
<style>
.read-more-anchor {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 190px;
display: flex;
align-items: flex-end;
justify-content: center;
padding-bottom: 24px;
z-index: 10;
pointer-events: none;
}
.read-more-mask {
position: absolute;
inset: 0;
background: linear-gradient(
to bottom,
rgba(255, 255, 255, 0),
var(--bg-color, #fff) 72%
);
pointer-events: none;
}
[data-theme="dark"] .read-more-mask {
background: linear-gradient(
to bottom,
rgba(29, 30, 32, 0),
var(--bg-color, #1d1e20) 72%
);
}
.read-more-btn {
position: relative;
z-index: 11;
pointer-events: auto;
min-width: 132px;
padding: 0.56rem 1.35rem;
border: 1px solid rgba(62, 175, 124, 0.45);
border-radius: 999px;
background: var(--bg-color, #fff);
color: #3eaf7c;
font-weight: 700;
cursor: pointer;
box-shadow: 0 8px 20px rgba(62, 175, 124, 0.16);
transition: all 0.2s ease;
}
.read-more-btn:hover {
transform: translateY(-1px);
box-shadow: 0 10px 24px rgba(62, 175, 124, 0.2);
}
.unlock-modal-mask {
position: fixed;
inset: 0;
z-index: 9999;
background: rgba(15, 23, 42, 0.45);
backdrop-filter: blur(2px);
display: flex;
align-items: center;
justify-content: center;
padding: 16px;
}
.unlock-modal {
width: min(92vw, 500px);
padding: 1.2rem;
border-radius: 14px;
border: 1px solid var(--border-color, #e5e7eb);
background: var(--bg-color, #fff);
box-shadow: 0 10px 36px rgba(0, 0, 0, 0.18);
text-align: center;
}
.unlock-modal-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
margin-bottom: 0.75rem;
}
.close-btn {
width: 28px;
height: 28px;
border: 0;
border-radius: 999px;
background: #f1f5f9;
color: #334155;
font-size: 18px;
line-height: 28px;
cursor: pointer;
flex-shrink: 0;
}
.lock-title {
margin: 0;
font-size: 1.16rem;
}
.lock-reason {
margin: 0 0 1rem;
color: #64748b;
line-height: 1.6;
font-size: 0.9rem;
}
.qr-container {
margin: 0 auto 1rem;
padding: 0.8rem;
max-width: 300px;
border: 1px dashed #3eaf7c;
border-radius: 10px;
background: #f8fafc;
}
.qr-image {
width: 180px;
height: 180px;
}
.qr-tip {
margin: 0.45rem 0 0;
font-size: 0.96rem;
}
.highlight {
color: #3eaf7c;
font-weight: 700;
}
.input-wrapper {
display: flex;
justify-content: center;
gap: 0.55rem;
}
.unlock-input {
width: 125px;
padding: 0.5rem 0.75rem;
border-radius: 8px;
border: 1px solid #d1d5db;
font-size: 1rem;
text-align: center;
outline: none;
}
.unlock-input:focus {
border-color: #3eaf7c;
}
.unlock-btn {
padding: 0.5rem 1rem;
border: 0;
border-radius: 8px;
background: #3eaf7c;
color: #fff;
font-weight: 700;
cursor: pointer;
}
.error-msg {
margin: 0.45rem 0 0;
color: #dc2626;
font-size: 0.85rem;
}
.unlock-fade-enter-active,
.unlock-fade-leave-active {
transition: opacity 0.2s ease;
}
.unlock-fade-enter-from,
.unlock-fade-leave-to {
opacity: 0;
}
.shake-enter-active {
animation: shake 0.45s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
}
@keyframes shake {
10%,
90% {
transform: translate3d(-1px, 0, 0);
}
20%,
80% {
transform: translate3d(2px, 0, 0);
}
30%,
50%,
70% {
transform: translate3d(-3px, 0, 0);
}
40%,
60% {
transform: translate3d(3px, 0, 0);
}
}
@media (max-width: 576px) {
.input-wrapper {
flex-direction: column;
align-items: center;
}
.unlock-input,
.unlock-btn {
width: min(220px, 80vw);
}
}
</style>
================================================
FILE: docs/.vuepress/components/unlock/UnlockContent.vue
================================================
<template>
<div class="unlock-container" :class="{ 'is-locked': !isUnlocked }">
<div class="content-wrapper" :style="contentStyle">
<slot></slot>
<div v-if="!isUnlocked" class="fade-mask"></div>
</div>
<transition name="slide-up">
<div v-if="!isUnlocked" class="unlock-section">
<div class="unlock-header">
<span class="lock-icon">🔒</span>
<h3 class="lock-title">人机验证</h3>
</div>
<p class="lock-reason">
为保障正常阅读体验,本站部分内容已开启一次性验证。验证后全站自动解锁。
</p>
<div class="qr-container">
<img :src="qrCodeUrl" alt="公众号二维码" class="qr-image" />
<p class="qr-tip">
扫码关注公众号,回复 <span class="highlight">“验证码”</span>
</p>
</div>
<div class="input-wrapper">
<input
v-model="inputCode"
type="text"
placeholder="请输入 4 位验证码"
class="unlock-input"
maxlength="4"
@keyup.enter="handleUnlock"
/>
<button class="unlock-btn" @click="handleUnlock">立即解锁</button>
</div>
<transition name="shake">
<p v-if="showError" class="error-msg">验证码错误,请重新输入</p>
</transition>
<p class="lock-footer">感谢你的理解与支持</p>
</div>
</transition>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from "vue";
import { PREVIEW_HEIGHT, unlockConfig } from "../../features/unlock/config";
const props = defineProps({
code: {
type: String,
default: unlockConfig.code,
},
qrCodeUrl: {
type: String,
default: unlockConfig.qrCodeUrl,
},
visibleHeight: {
type: String,
default: PREVIEW_HEIGHT.LONG,
},
});
const isUnlocked = ref(false);
const inputCode = ref("");
const showError = ref(false);
const globalUnlockKey = `javaguide_site_unlocked_${unlockConfig.unlockVersion ?? "v1"}`;
onMounted(() => {
isUnlocked.value = localStorage.getItem(globalUnlockKey) === "true";
});
const contentStyle = computed(() => {
if (isUnlocked.value) return {};
return {
maxHeight: props.visibleHeight,
overflow: "hidden",
position: "relative",
};
});
const handleUnlock = () => {
if (inputCode.value === props.code) {
isUnlocked.value = true;
localStorage.setItem(globalUnlockKey, "true");
showError.value = false;
} else {
showError.value = true;
inputCode.value = "";
setTimeout(() => {
showError.value = false;
}, 2000);
}
};
</script>
<style scoped>
.unlock-container {
position: relative;
margin: 2rem 0;
}
.content-wrapper {
position: relative;
}
.fade-mask {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 160px;
background: linear-gradient(to bottom, transparent, var(--bg-color, #fff));
}
.is-locked {
border: 1px solid var(--border-color, #e5e7eb);
border-radius: 12px;
padding: 1rem;
}
.unlock-section {
padding: 1.4rem 1rem 0.5rem;
text-align: center;
}
.lock-title {
margin: 0.35rem 0 0;
}
.lock-reason {
margin: 0.75rem auto 1rem;
color: #64748b;
line-height: 1.6;
max-width: 560px;
}
.qr-container {
margin: 0 auto 1rem;
padding: 0.85rem;
max-width: 300px;
border: 1px dashed #3eaf7c;
border-radius: 10px;
background: #f8fafc;
}
.qr-image {
width: 140px;
height: 140px;
}
.input-wrapper {
display: flex;
justify-content: center;
gap: 0.55rem;
}
.unlock-input {
width: 125px;
padding: 0.5rem 0.75rem;
border-radius: 8px;
border: 1px solid #d1d5db;
font-size: 1rem;
text-align: center;
}
.unlock-btn {
padding: 0.5rem 1rem;
border: 0;
border-radius: 8px;
background: #3eaf7c;
color: #fff;
font-weight: 700;
cursor: pointer;
}
.highlight {
color: #3eaf7c;
font-weight: 700;
}
.error-msg {
margin: 0.45rem 0 0;
color: #dc2626;
font-size: 0.85rem;
}
.lock-footer {
margin: 0.7rem 0 0;
color: #94a3b8;
font-size: 0.8rem;
}
.slide-up-enter-active,
.slide-up-leave-active {
transition: all 0.35s ease;
}
.slide-up-enter-from,
.slide-up-leave-to {
opacity: 0;
transform: translateY(8px);
}
.shake-enter-active {
animation: shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
}
@keyframes shake {
10%,
90% {
transform: translate3d(-1px, 0, 0);
}
20%,
80% {
transform: translate3d(2px, 0, 0);
}
30%,
50%,
70% {
transform: translate3d(-4px, 0, 0);
}
40%,
60% {
transform: translate3d(4px, 0, 0);
}
}
@media (max-width: 576px) {
.input-wrapper {
flex-direction: column;
align-items: center;
}
.unlock-input,
.unlock-btn {
width: min(220px, 80vw);
}
}
</style>
================================================
FILE: docs/.vuepress/config.ts
================================================
import { viteBundler } from "@vuepress/bundler-vite";
import { defineUserConfig } from "vuepress";
import theme from "./theme.js";
export default defineUserConfig({
dest: "./dist",
title: "JavaGuide",
description:
"JavaGuide 是一份面向后端开发/后端面试的学习与复习指南,覆盖 Java、数据库/MySQL、Redis、分布式、高并发、高可用、系统设计等核心知识。",
lang: "zh-CN",
head: [
// meta
["meta", { name: "robots", content: "all" }],
["meta", { name: "author", content: "Guide" }],
// [
// "meta",
// {
// name: "keywords",
// content:
// "JavaGuide, 后端面试, 后端开发, Java面试, Java基础, 并发编程, JVM, 数据库, MySQL, Redis, Spring, 分布式, 高并发, 高性能, 高可用, 系统设计, 消息队列, 缓存, 计算机网络, Linux",
// },
// ],
// [
// "meta",
// {
// name: "description",
// content:
// "JavaGuide 是一份面向后端开发/后端面试的学习与复习指南,覆盖 Java、数据库/MySQL、Redis、分布式、高并发、高可用、系统设计等核心知识。",
// },
// ],
["meta", { property: "og:site_name", content: "JavaGuide" }],
["meta", { property: "og:type", content: "website" }],
["meta", { property: "og:locale", content: "zh_CN" }],
["meta", { property: "og:url", content: "https://javaguide.cn/" }],
["meta", { name: "apple-mobile-web-app-capable", content: "yes" }],
// 添加百度统计 - 异步加载避免阻塞渲染
[
"script",
{ defer: true },
`var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?5dd2e8c97962d57b7b8fea1737c01743";
hm.async = true;
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();`,
],
],
bundler: viteBundler({
viteOptions: {
css: {
preprocessorOptions: {
scss: {
silenceDeprecations: ["if-function"],
},
},
},
},
}),
theme,
pagePatterns: ["**/*.md", "!**/*.snippet.md", "!.vuepress", "!node_modules"],
shouldPrefetch: false,
shouldPreload: false,
});
================================================
FILE: docs/.vuepress/features/unlock/config.ts
================================================
import { PREVIEW_HEIGHT } from "./heights";
const withDefaultHeight = (
paths: readonly string[],
height: string = PREVIEW_HEIGHT.XL,
): Record<string, string> =>
Object.fromEntries(paths.map((path) => [path, height]));
export const unlockConfig = {
// 版本号变更可强制用户重新验证
unlockVersion: "v1",
// 调试用:设为 true 时无视本地已解锁状态,始终触发限制
forceLock: false,
code: "8888",
// 使用相对路径,图片放在 docs/.vuepress/public/images 下
qrCodeUrl: "/images/qrcode-javaguide.jpg",
// 路径 -> 可见高度(建议使用 PREVIEW_HEIGHT 预设)
protectedPaths: {
...withDefaultHeight([
"/java/jvm/memory-area.html",
"/java/basis/java-basic-questions-02.html",
"/java/collection/java-collection-questions-02.html",
"/cs-basics/network/tcp-connection-and-disconnection.html",
"/cs-basics/network/http-vs-https.html",
"/cs-basics/network/dns.html",
]),
// 如需特殊高度,再单独覆盖
// "/some/page.html": PREVIEW_HEIGHT.MEDIUM,
},
// 目录前缀 -> 可见高度(该目录下所有文章都触发验证)
// 例如 "/java/collection/" 会匹配 "/java/collection/**"
protectedPrefixes: {
...withDefaultHeight(["/database/", "/high-performance/"]),
},
} as const;
export { PREVIEW_HEIGHT };
================================================
FILE: docs/.vuepress/features/unlock/heights.ts
================================================
export const PREVIEW_HEIGHT = {
SHORT: "500px",
MEDIUM: "1000px",
LONG: "1500px",
XL: "2000px",
XXL: "2500px",
} as const;
export type PreviewHeight =
(typeof PREVIEW_HEIGHT)[keyof typeof PREVIEW_HEIGHT];
================================================
FILE: docs/.vuepress/navbar.ts
================================================
import { navbar } from "vuepress-theme-hope";
export default navbar([
{ text: "后端面试", icon: "java", link: "/home.md" },
{ text: "AI面试", icon: "a-MachineLearning", link: "/ai/" },
{ text: "实战项目", icon: "project", link: "/zhuanlan/interview-guide.md" },
{
text: "知识星球",
icon: "planet",
children: [
{
text: "星球介绍",
icon: "about",
link: "/about-the-author/zhishixingqiu-two-years.md",
},
{ text: "星球专属优质专栏", icon: "about", link: "/zhuanlan/" },
{
text: "星球优质主题汇总",
icon: "star",
link: "https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1",
},
],
},
{
text: "推荐阅读",
icon: "book",
children: [
{ text: "开源项目", icon: "github", link: "/open-source-project/" },
{ text: "技术书籍", icon: "book", link: "/books/" },
{
text: "程序人生",
icon: "code",
link: "/high-quality-technical-articles/",
},
],
},
{
text: "网站相关",
icon: "about",
children: [
{ text: "关于作者", icon: "zuozhe", link: "/about-the-author/" },
{
text: "PDF下载",
icon: "pdf",
link: "/interview-preparation/pdf-interview-javaguide.md",
},
{
text: "面试突击",
icon: "pdf",
link: "https://interview.javaguide.cn/home.html",
},
{
text: "更新历史",
icon: "history",
link: "/timeline/",
},
],
},
]);
================================================
FILE: docs/.vuepress/public/robots.txt
================================================
User-agent: *
Allow: /
Sitemap: https://javaguide.cn/sitemap.xml
Host: https://javaguide.cn/
================================================
FILE: docs/.vuepress/shims-vue.d.ts
================================================
declare module "*.vue" {
import type { DefineComponent } from "vue";
const component: DefineComponent<object, object, unknown>;
export default component;
}
================================================
FILE: docs/.vuepress/sidebar/about-the-author.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const aboutTheAuthor = arraySidebar([
{
text: "个人经历",
icon: ICONS.EXPERIENCE,
collapsible: false,
children: [
"internet-addiction-teenager",
"my-college-life",
"javaguide-100k-star",
"feelings-after-one-month-of-induction-training",
"feelings-of-half-a-year-from-graduation-to-entry",
],
},
{
text: "杂谈",
icon: ICONS.CHAT,
collapsible: false,
children: [
"writing-technology-blog-six-years",
"deprecated-java-technologies",
"my-article-was-stolen-and-made-into-video-and-it-became-popular",
"dog-that-copies-other-people-essay",
"zhishixingqiu-two-years",
],
},
]);
================================================
FILE: docs/.vuepress/sidebar/ai.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const ai = arraySidebar([
{
text: "大模型基础",
icon: ICONS.MACHINE_LEARNING,
prefix: "llm-basis/",
children: [
{ text: "万字拆解 LLM 运行机制", link: "llm-operation-mechanism" },
{ text: "AI 编程开放性面试题", link: "ai-ide" },
],
},
{
text: "AI Agent",
icon: ICONS.CHAT,
prefix: "agent/",
children: [
{ text: "一文搞懂 AI Agent 核心概念", link: "agent-basis" },
{ text: "万字详解 Agent Skills", link: "skills" },
{ text: "万字拆解 MCP 协议", link: "mcp" },
],
},
{
text: "RAG",
icon: ICONS.SEARCH,
prefix: "rag/",
children: [
{ text: "万字详解 RAG 基础概念", link: "rag-basis" },
{
text: "万字详解 RAG 向量索引算法和向量数据库",
link: "rag-vector-store",
},
],
},
{
text: "AI 编程实战",
icon: ICONS.CODE,
prefix: "ai-coding/",
children: [
{
text: "IDEA + Qoder 插件多场景实战",
link: "idea-qoder-plugin",
},
{
text: "Trae + MiniMax 多场景实战",
link: "trae-m2.7",
},
],
},
]);
================================================
FILE: docs/.vuepress/sidebar/books.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const books = arraySidebar([
{
text: "计算机基础",
link: "cs-basics",
icon: ICONS.COMPUTER,
},
{
text: "数据库",
link: "database",
icon: ICONS.DATABASE,
},
{
text: "搜索引擎",
link: "search-engine",
icon: ICONS.SEARCH,
},
{
text: "Java",
link: "java",
icon: ICONS.JAVA,
},
{
text: "软件质量",
link: "software-quality",
icon: ICONS.HIGH_AVAILABLE,
},
{
text: "分布式",
link: "distributed-system",
icon: ICONS.DISTRIBUTED,
},
]);
================================================
FILE: docs/.vuepress/sidebar/constants.ts
================================================
/**
* 侧边栏图标常量
* 统一管理所有侧边栏配置中使用的图标
*/
export const ICONS = {
// 基础图标
STAR: "star",
BASIC: "basic",
CODE: "code",
DESIGN: "design",
// 技术领域
JAVA: "java",
COMPUTER: "computer",
DATABASE: "database",
NETWORK: "network",
// 框架和工具
SPRING_BOOT: "bxl-spring-boot",
MYBATIS: "mybatis",
NETTY: "netty",
// 数据库
MYSQL: "mysql",
REDIS: "redis",
ELASTICSEARCH: "elasticsearch",
MONGODB: "mongodb",
SQL: "SQL",
// 开发工具
TOOL: "tool",
MAVEN: "configuration",
GRADLE: "gradle",
GIT: "git",
DOCKER: "docker1",
IDEA: "intellijidea",
// 系统设计
COMPONENT: "component",
CONTAINER: "container",
SECURITY: "security-fill",
// 分布式
DISTRIBUTED: "distributed-network",
GATEWAY: "gateway",
ID: "id",
LOCK: "lock",
TRANSACTION: "transanction",
RPC: "network",
FRAMEWORK: "framework",
// 高性能
PERFORMANCE: "et-performance",
CDN: "cdn",
LOAD_BALANCING: "fuzaijunheng",
MQ: "MQ",
// 高可用
HIGH_AVAILABLE: "highavailable",
// 操作系统
OS: "caozuoxitong",
LINUX: "linux",
VIRTUAL_MACHINE: "virtual_machine",
// 数据结构与算法
DATA_STRUCTURE: "people-network-full",
ALGORITHM: "suanfaku",
// 其他
FEATURED: "featured",
INTERVIEW: "interview",
EXPERIENCE: "experience",
CHAT: "chat",
BOOK: "book",
PROJECT: "project",
LIBRARY: "codelibrary-fill",
MACHINE_LEARNING: "a-MachineLearning",
BIG_DATA: "big-data",
SEARCH: "search",
WORK: "work",
} as const;
/**
* 常用文本常量
*/
export const COMMON_TEXT = {
IMPORTANT_POINTS: "重要知识点",
SOURCE_CODE_ANALYSIS: "源码分析",
} as const;
/**
* 辅助函数:创建重要知识点分组
*/
export const createImportantSection = (children: any[]) => ({
text: COMMON_TEXT.IMPORTANT_POINTS,
icon: ICONS.STAR,
collapsible: true,
children,
});
/**
* 辅助函数:创建源码分析分组
*/
export const createSourceCodeSection = (children: any[]) => ({
text: COMMON_TEXT.SOURCE_CODE_ANALYSIS,
icon: ICONS.STAR,
collapsible: true,
children,
});
================================================
FILE: docs/.vuepress/sidebar/high-quality-technical-articles.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const highQualityTechnicalArticles = arraySidebar([
{
text: "练级攻略",
icon: ICONS.PERFORMANCE,
prefix: "advanced-programmer/",
collapsible: false,
children: [
"programmer-quickly-learn-new-technology",
"the-growth-strategy-of-the-technological-giant",
"ten-years-of-dachang-growth-road",
"meituan-three-year-summary-lesson-10",
"seven-tips-for-becoming-an-advanced-programmer",
"20-bad-habits-of-bad-programmers",
"thinking-about-technology-and-business-after-five-years-of-work",
],
},
{
text: "个人经历",
icon: ICONS.EXPERIENCE,
prefix: "personal-experience/",
collapsible: false,
children: [
"four-year-work-in-tencent-summary",
"two-years-of-back-end-develop--experience-in-didi-and-toutiao",
"8-years-programmer-work-summary",
"huawei-od-275-days",
],
},
{
text: "程序员",
icon: ICONS.CODE,
prefix: "programmer/",
collapsible: false,
children: [
"high-value-certifications-for-programmers",
"how-do-programmers-publish-a-technical-book",
"efficient-book-publishing-and-practice-guide",
],
},
{
text: "面试",
icon: ICONS.INTERVIEW,
prefix: "interview/",
collapsible: true,
children: [
"the-experience-of-get-offer-from-over-20-big-companies",
"the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer",
"technical-preliminary-preparation",
"screen-candidates-for-packaging",
"summary-of-spring-recruitment",
"my-personal-experience-in-2021",
"how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology",
"some-secrets-about-alibaba-interview",
],
},
{
text: "工作",
icon: ICONS.WORK,
prefix: "work/",
collapsible: true,
children: [
"get-into-work-mode-quickly-when-you-join-a-company",
"32-tips-improving-career",
"employee-performance",
],
},
]);
================================================
FILE: docs/.vuepress/sidebar/index.ts
================================================
import { sidebar } from "vuepress-theme-hope";
import { aboutTheAuthor } from "./about-the-author.js";
import { ai } from "./ai.js";
import { books } from "./books.js";
import { highQualityTechnicalArticles } from "./high-quality-technical-articles.js";
import { openSourceProject } from "./open-source-project.js";
import { zhuanlan } from "./zhuanlan.js";
import {
ICONS,
createImportantSection,
createSourceCodeSection,
} from "./constants.js";
export default sidebar({
// 应该把更精确的路径放置在前边
"/ai/": ai,
"/open-source-project/": openSourceProject,
"/books/": books,
"/about-the-author/": aboutTheAuthor,
"/high-quality-technical-articles/": highQualityTechnicalArticles,
"/zhuanlan/": zhuanlan,
// 必须放在最后面
"/": [
{
text: "项目介绍",
icon: ICONS.STAR,
collapsible: true,
prefix: "javaguide/",
children: ["intro", "use-suggestion", "contribution-guideline", "faq"],
},
{
text: "面试准备(必看)",
icon: ICONS.INTERVIEW,
collapsible: true,
prefix: "interview-preparation/",
children: [
"backend-interview-plan",
"teach-you-how-to-prepare-for-the-interview-hand-in-hand",
"resume-guide",
"key-points-of-interview",
"pdf-interview-javaguide",
"java-roadmap",
"project-experience-guide",
"how-to-handle-interview-nerves",
"internship-experience",
],
},
{
text: "Java",
icon: ICONS.JAVA,
collapsible: true,
prefix: "java/",
children: [
{
text: "基础",
prefix: "basis/",
icon: ICONS.BASIC,
children: [
"java-basic-questions-01",
"java-basic-questions-02",
"java-basic-questions-03",
createImportantSection([
"why-there-only-value-passing-in-java",
"serialization",
"generics-and-wildcards",
"reflection",
"proxy",
"bigdecimal",
"unsafe",
"spi",
"syntactic-sugar",
]),
],
},
{
text: "集合",
prefix: "collection/",
icon: ICONS.CONTAINER,
children: [
"java-collection-questions-01",
"java-collection-questions-02",
"java-collection-precautions-for-use",
createSourceCodeSection([
"arraylist-source-code",
"linkedlist-source-code",
"hashmap-source-code",
"concurrent-hash-map-source-code",
"linkedhashmap-source-code",
"copyonwritearraylist-source-code",
"arrayblockingqueue-source-code",
"priorityqueue-source-code",
"delayqueue-source-code",
]),
],
},
{
text: "并发编程",
prefix: "concurrent/",
icon: ICONS.PERFORMANCE,
children: [
"java-concurrent-questions-01",
"java-concurrent-questions-02",
"java-concurrent-questions-03",
createImportantSection([
"optimistic-lock-and-pessimistic-lock",
"cas",
"jmm",
"java-thread-pool-summary",
"java-thread-pool-best-practices",
"java-concurrent-collections",
"aqs",
"atomic-classes",
"threadlocal",
"completablefuture-intro",
"virtual-thread",
]),
],
},
{
text: "IO",
prefix: "io/",
icon: ICONS.CODE,
collapsible: true,
children: ["io-basis", "io-design-patterns", "io-model", "nio-basis"],
},
{
text: "JVM",
prefix: "jvm/",
icon: ICONS.VIRTUAL_MACHINE,
collapsible: true,
children: [
{
text: "JVM常见面试题总结",
link: "https://interview.javaguide.cn/java/java-jvm.html",
},
"memory-area",
"jvm-garbage-collection",
"class-file-structure",
"class-loading-process",
"classloader",
"jvm-parameters-intro",
"jdk-monitoring-and-troubleshooting-tools",
"jvm-in-action",
],
},
{
text: "新特性",
prefix: "new-features/",
icon: ICONS.FEATURED,
collapsible: true,
children: [
"java8-common-new-features",
"java8-tutorial-translate",
"java9",
"java10",
"java11",
"java12-13",
"java14-15",
"java16",
"java17",
"java18",
"java19",
"java20",
"java21",
"java22-23",
"java24",
"java25",
],
},
],
},
{
text: "计算机基础",
icon: ICONS.COMPUTER,
prefix: "cs-basics/",
collapsible: true,
children: [
{
text: "网络",
prefix: "network/",
icon: ICONS.NETWORK,
children: [
"other-network-questions",
"other-network-questions2",
// "computer-network-xiexiren-summary",
createImportantSection([
"osi-and-tcp-ip-model",
"the-whole-process-of-accessing-web-pages",
"application-layer-protocol",
"http-vs-https",
"http1.0-vs-http1.1",
"http-status-codes",
"dns",
"tcp-connection-and-disconnection",
"tcp-reliability-guarantee",
"arp",
"nat",
"network-attack-means",
]),
],
},
{
text: "操作系统",
prefix: "operating-system/",
icon: ICONS.OS,
children: [
"operating-system-basic-questions-01",
"operating-system-basic-questions-02",
{
text: "Linux",
collapsible: true,
icon: ICONS.LINUX,
children: ["linux-intro", "shell-intro"],
},
],
},
{
text: "数据结构",
prefix: "data-structure/",
icon: ICONS.DATA_STRUCTURE,
collapsible: true,
children: [
"linear-data-structure",
"graph",
"heap",
"tree",
"red-black-tree",
"bloom-filter",
],
},
{
text: "算法",
prefix: "algorithms/",
icon: ICONS.ALGORITHM,
collapsible: true,
children: [
"classical-algorithm-problems-recommendations",
"common-data-structures-leetcode-recommendations",
"string-algorithm-problems",
"linkedlist-algorithm-problems",
"the-sword-refers-to-offer",
"10-classical-sorting-algorithms",
],
},
],
},
{
text: "数据库",
icon: ICONS.DATABASE,
prefix: "database/",
collapsible: true,
children: [
{
text: "基础",
icon: ICONS.BASIC,
children: [
"basis",
"nosql",
"character-set",
{
text: "SQL",
icon: ICONS.SQL,
prefix: "sql/",
collapsible: true,
children: [
"sql-syntax-summary",
"sql-questions-01",
"sql-questions-02",
"sql-questions-03",
"sql-questions-04",
"sql-questions-05",
],
},
],
},
{
text: "MySQL",
prefix: "mysql/",
icon: ICONS.MYSQL,
children: [
"mysql-questions-01",
"mysql-high-performance-optimization-specification-recommendations",
createImportantSection([
"mysql-index",
"mysql-index-invalidation",
{
text: "MySQL三大日志详解",
link: "mysql-logs",
},
"transaction-isolation-level",
"innodb-implementation-of-mvcc",
"how-sql-executed-in-mysql",
"mysql-query-cache",
"mysql-query-execution-plan",
"mysql-auto-increment-primary-key-continuous",
"some-thoughts-on-database-storage-time",
"index-invalidation-caused-by-implicit-conversion",
]),
],
},
{
text: "Redis",
prefix: "redis/",
icon: ICONS.REDIS,
children: [
"cache-basics",
"redis-questions-01",
"redis-questions-02",
createImportantSection([
"redis-delayed-task",
"redis-stream-mq",
"3-commonly-used-cache-read-and-write-strategies",
"redis-data-structures-01",
"redis-data-structures-02",
"redis-skiplist",
"redis-persistence",
"redis-memory-fragmentation",
"redis-common-blocking-problems-summary",
"redis-cluster",
]),
],
},
{
text: "Elasticsearch",
prefix: "elasticsearch/",
icon: ICONS.ELASTICSEARCH,
collapsible: true,
children: ["elasticsearch-questions-01"],
},
{
text: "MongoDB",
prefix: "mongodb/",
icon: ICONS.MONGODB,
collapsible: true,
children: ["mongodb-questions-01", "mongodb-questions-02"],
},
],
},
{
text: "开发工具",
icon: ICONS.TOOL,
prefix: "tools/",
collapsible: true,
children: [
{
text: "Maven",
icon: ICONS.MAVEN,
prefix: "maven/",
children: ["maven-core-concepts", "maven-best-practices"],
},
{
text: "Gradle",
icon: ICONS.GRADLE,
prefix: "gradle/",
children: ["gradle-core-concepts"],
},
{
text: "Git",
icon: ICONS.GIT,
prefix: "git/",
children: ["git-intro", "github-tips"],
},
{
text: "Docker",
icon: ICONS.DOCKER,
prefix: "docker/",
children: ["docker-intro", "docker-in-action"],
},
{
text: "IDEA",
icon: ICONS.IDEA,
link: "https://gitee.com/SnailClimb/awesome-idea-tutorial",
},
],
},
{
text: "常用框架",
prefix: "system-design/framework/",
icon: ICONS.COMPONENT,
collapsible: true,
children: [
{
text: "Spring&Spring Boot",
icon: ICONS.SPRING_BOOT,
prefix: "spring/",
children: [
"spring-knowledge-and-questions-summary",
"springboot-knowledge-and-questions-summary",
"spring-common-annotations",
"springboot-source-code",
createImportantSection([
"ioc-and-aop",
"spring-transaction",
"spring-design-patterns-summary",
"spring-boot-auto-assembly-principles",
"async",
]),
],
},
"mybatis/mybatis-interview",
"netty",
],
},
{
text: "系统设计",
icon: ICONS.DESIGN,
prefix: "system-design/",
collapsible: true,
children: [
{
text: "基础知识",
prefix: "basis/",
icon: ICONS.BASIC,
collapsible: true,
children: [
"RESTfulAPI",
"software-engineering",
"naming",
"refactoring",
{
text: "单元测试指南",
link: "unit-test",
},
],
},
{
text: "认证授权",
prefix: "security/",
icon: ICONS.SECURITY,
collapsible: true,
children: [
"basis-of-authority-certification",
"jwt-intro",
"advantages-and-disadvantages-of-jwt",
"sso-intro",
"design-of-authority-system",
],
},
{
text: "数据安全",
prefix: "security/",
icon: ICONS.SECURITY,
collapsible: true,
children: [
"encryption-algorithms",
"sentive-words-filter",
"data-desensitization",
"data-validation",
"why-password-reset-instead-of-retrieval",
],
},
"system-design-questions",
{
text: "⭐设计模式常见面试题总结",
link: "https://interview.javaguide.cn/system-design/design-pattern.html",
},
"schedule-task",
"web-real-time-message-push",
],
},
{
text: "分布式",
icon: ICONS.DISTRIBUTED,
prefix: "distributed-system/",
collapsible: true,
children: [
{
text: "⭐分布式高频面试题",
link: "https://interview.javaguide.cn/distributed-system/distributed-system.html",
},
{
text: "理论&算法&协议",
icon: ICONS.ALGORITHM,
prefix: "protocol/",
collapsible: true,
children: [
"cap-and-base-theorem",
"paxos-algorithm",
"raft-algorithm",
"zab",
"gossip-protocol",
"consistent-hashing",
],
},
{
text: "API网关",
icon: ICONS.GATEWAY,
children: ["api-gateway", "spring-cloud-gateway-questions"],
},
{
text: "分布式ID",
icon: ICONS.ID,
children: ["distributed-id", "distributed-id-design"],
},
{
text: "分布式锁",
icon: ICONS.LOCK,
children: ["distributed-lock", "distributed-lock-implementations"],
},
{
text: "分布式事务",
icon: ICONS.TRANSACTION,
children: ["distributed-transaction"],
},
{
text: "分布式配置中心",
icon: ICONS.MAVEN,
children: ["distributed-configuration-center"],
},
{
text: "RPC",
prefix: "rpc/",
icon: ICONS.RPC,
collapsible: true,
children: ["rpc-intro", "dubbo"],
},
{
text: "ZooKeeper",
prefix: "distributed-process-coordination/zookeeper/",
icon: ICONS.FRAMEWORK,
collapsible: true,
children: ["zookeeper-intro", "zookeeper-plus"],
},
],
},
{
text: "高性能",
icon: ICONS.PERFORMANCE,
prefix: "high-performance/",
collapsible: true,
children: [
{
text: "CDN",
icon: ICONS.CDN,
children: ["cdn"],
},
{
text: "负载均衡",
icon: ICONS.LOAD_BALANCING,
children: ["load-balancing"],
},
{
text: "数据库优化",
icon: ICONS.MYSQL,
children: [
"read-and-write-separation-and-library-subtable",
"data-cold-hot-separation",
"sql-optimization",
"deep-pagination-optimization",
],
},
{
text: "消息队列",
prefix: "message-queue/",
icon: ICONS.MQ,
collapsible: true,
children: [
"message-queue",
"disruptor-questions",
"kafka-questions-01",
"rocketmq-questions",
"rabbitmq-questions",
],
},
],
},
{
text: "高可用",
icon: ICONS.HIGH_AVAILABLE,
prefix: "high-availability/",
collapsible: true,
children: [
"high-availability-system-design",
"idempotency",
"redundancy",
"limit-request",
"fallback-and-circuit-breaker",
"timeout-and-retry",
"performance-test",
],
},
],
});
================================================
FILE: docs/.vuepress/sidebar/open-source-project.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const openSourceProject = arraySidebar([
{
text: "技术教程",
link: "tutorial",
icon: ICONS.BOOK,
},
{
text: "实战项目",
link: "practical-project",
icon: ICONS.PROJECT,
},
{
text: "AI",
link: "machine-learning",
icon: ICONS.MACHINE_LEARNING,
},
{
text: "系统设计",
link: "system-design",
icon: ICONS.DESIGN,
},
{
text: "工具类库",
link: "tool-library",
icon: ICONS.LIBRARY,
},
{
text: "开发工具",
link: "tools",
icon: ICONS.TOOL,
},
{
text: "大数据",
link: "big-data",
icon: ICONS.BIG_DATA,
},
]);
================================================
FILE: docs/.vuepress/sidebar/zhuanlan.ts
================================================
import { arraySidebar } from "vuepress-theme-hope";
import { ICONS } from "./constants.js";
export const zhuanlan = arraySidebar([
{
text: "实战项目教程",
icon: ICONS.PROJECT,
collapsible: false,
children: ["interview-guide", "handwritten-rpc-framework"],
},
{
text: "面试资料",
icon: ICONS.INTERVIEW,
collapsible: false,
children: [
"java-mian-shi-zhi-bei",
"back-end-interview-high-frequency-system-design-and-scenario-questions",
"source-code-reading",
],
},
]);
================================================
FILE: docs/.vuepress/styles/config.scss
================================================
$theme-color: #2980b9;
================================================
FILE: docs/.vuepress/styles/index.scss
================================================
body {
@media (min-width: 1440px) {
font-size: 16px;
}
}
// ============================================
// 沉浸式阅读模式 - 隐藏导航栏、侧边栏和目录
// ============================================
// 过渡动画
.vp-navbar,
.vp-sidebar,
.vp-page,
.theme-container .vp-page {
transition:
transform 0.3s ease,
opacity 0.3s ease,
margin 0.3s ease,
padding 0.3s ease,
width 0.3s ease;
}
// 隐藏布局模式
html.layout-hidden {
// 隐藏顶部导航栏
.vp-navbar {
transform: translateY(-100%) !important;
opacity: 0 !important;
pointer-events: none !important;
}
// 隐藏左侧边栏
.vp-sidebar {
transform: translateX(-100%) !important;
opacity: 0 !important;
pointer-events: none !important;
width: 0 !important;
}
// 隐藏侧边栏切换按钮(小屏幕下的展开按钮)
.toggle-sidebar-wrapper {
display: none !important;
opacity: 0 !important;
pointer-events: none !important;
}
// 隐藏侧边栏遮罩层
.vp-sidebar-mask {
display: none !important;
}
// 侧边栏包装器
.vp-sidebar-wrapper,
.sidebar-wrapper {
width: 0 !important;
min-width: 0 !important;
padding: 0 !important;
margin: 0 !important;
}
// 隐藏右侧目录 (TOC)
.vp-toc-placeholder,
.toc-wrapper,
.vp-toc,
aside.vp-toc,
.toc {
display: none !important;
width: 0 !important;
}
// 主容器调整 - 移除左侧 padding/margin
.theme-container {
padding-left: 0 !important;
padding-right: 0 !important;
.vp-page {
padding-left: 2rem !important;
padding-right: 2rem !important;
padding-top: 1rem !important;
margin-left: 0 !important;
max-width: 100% !important;
width: 100% !important;
}
}
// 主题内容区域调整 - 让内容更宽
.theme-hope-content,
.vp-page-content,
.vp-content {
max-width: 100% !important;
width: 100% !important;
margin: 0 !important;
padding: 1rem 2rem !important;
}
// 页面容器调整
.vp-page-container {
padding-top: 1rem !important;
padding-left: 0 !important;
padding-right: 0 !important;
max-width: 100% !important;
}
// 确保内容区域居中且宽度适中
.theme-container > main {
margin-left: 0 !important;
padding-left: 0 !important;
max-width: 100% !important;
}
// 响应式调整
@media (min-width: 960px) {
.theme-container .vp-page {
margin-left: 0 !important;
padding-left: 3rem !important;
padding-right: 3rem !important;
}
.theme-hope-content,
.vp-page-content,
.vp-content {
max-width: 100% !important;
padding: 1rem 2rem !important;
}
}
@media (min-width: 1440px) {
.theme-container .vp-page {
margin-left: 0 !important;
padding-left: 4rem !important;
padding-right: 4rem !important;
}
.theme-hope-content,
.vp-page-content,
.vp-content {
max-width: 100% !important;
padding: 1rem 3rem !important;
}
}
}
================================================
FILE: docs/.vuepress/styles/palette.scss
================================================
$sidebar-width: 20rem;
$sidebar-mobile-width: 16rem;
$vp-font: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", sans-serif';
$vp-font-heading: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", sans-serif';
================================================
FILE: docs/.vuepress/theme.ts
================================================
import { getDirname, path } from "vuepress/utils";
import { hopeTheme } from "vuepress-theme-hope";
import navbar from "./navbar.js";
import sidebar from "./sidebar/index.js";
const __dirname = getDirname(import.meta.url);
export default hopeTheme({
hostname: "https://javaguide.cn/",
logo: "/logo.png",
favicon: "/favicon.ico",
author: {
name: "Guide",
url: "https://javaguide.cn/article/",
},
repo: "https://github.com/Snailclimb/JavaGuide",
docsDir: "docs",
pure: true,
focus: false,
breadcrumb: false,
navbar,
sidebar,
footer:
'<a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2020015769号-1</a>',
displayFooter: true,
pageInfo: ["Author", "Category", "Tag", "Original", "Word", "ReadingTime"],
blog: {
intro: "/about-the-author/",
medias: {
Zhihu: "https://www.zhihu.com/people/javaguide",
Github: "https://github.com/Snailclimb",
Gitee: "https://gitee.com/SnailClimb",
},
},
markdown: {
align: true,
codeTabs: true,
mermaid: true,
gfm: true,
include: {
resolvePath: (file, cwd) => {
if (file.startsWith("@"))
return path.resolve(
__dirname,
"../snippets",
file.replace("@", "./"),
);
return path.resolve(cwd, file);
},
},
tasklist: true,
},
plugins: {
blog: true,
sitemap: true,
copyright: {
author: "JavaGuide(javaguide.cn)",
license: "MIT",
triggerLength: 100,
maxLength: 700,
canonical: "https://javaguide.cn/",
global: true,
},
feed: {
atom: true,
json: true,
rss: true,
},
icon: {
assets: "//at.alicdn.com/t/c/font_2922463_o9q9dxmps9.css",
},
search: {
isSearchable: (page) => page.path !== "/",
maxSuggestions: 10,
},
},
});
================================================
FILE: docs/README.md
================================================
---
home: true
icon: home
title: JavaGuide(Java 面试 & 后端通用面试指南)
description: JavaGuide 是一份 Java 面试和后端通用面试指南,同时覆盖数据库/MySQL、Redis、分布式、高并发、高可用、系统设计、AI 应用开发等知识,适用于校招/社招复习。
heroImage: /logo.svg
heroText: JavaGuide
tagline: Java 面试 & 后端通用面试指南,覆盖计算机基础、数据库、分布式、高并发、系统设计与 AI 应用开发
head:
- - meta
- name: keywords
content: JavaGuide,Java面试,Java面试指南,Java八股文,后端面试,后端开发,数据库面试,MySQL面试,Redis面试,分布式,高并发,高性能,高可用,系统设计,消息队列,缓存,计算机网络,Linux,AI面试,AI应用开发,Agent,RAG,MCP,LLM,AI编程
- - meta
- property: og:type
content: website
- - meta
- property: og:url
content: https://javaguide.cn/
- - meta
- property: og:image
content: https://javaguide.cn/logo.png
actions:
- text: 开始阅读
link: /home.md
type: primary
- text: 知识星球
link: /about-the-author/zhishixingqiu-two-years.md
type: default
footer: |-
<a href="https://beian.miit.gov.cn/" target="_blank">鄂ICP备2020015769号-1</a> | 主题: <a href="https://theme-hope.vuejs.press/" target="_blank">VuePress Theme Hope</a>
---
## 🔥必看
- [后端面试指南](./home.md)(⭐网站核心):Java 学习&面试指南(Go、Python 后端面试通用,计算机基础面试总结)。
- [AI 应用开发面试指南](./ai/)(⭐新增):深入浅出掌握 AI 应用开发核心知识,涵盖大模型基础、Agent、RAG、MCP 协议等高频面试考点。
- [Java 优质开源项目](./open-source-project/):收集整理了 Gitee/Github 上非常棒的 Java 开源项目集合,按实战项目、系统设计、工具类库等维度做了精细分类,持续更新维护!
- [优质技术书籍推荐](./books/):优质技术书籍推荐合集,涵盖了从计算机基础、数据库、搜索引擎到分布式系统、高可用架构的全方位内容,持续更新维护!
- **面试资料补充**:
- [《Java 面试指北》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html):四年打磨,和 JavaGuide 开源版的内容互补,带你从零开始系统准备后端面试!
- [《后端面试高频系统设计&场景题》](https://javaguide.cn/zhuanlan/back-end-interview-high-frequency-system-design-and-scenario-questions.html):30+ 道高频系统设计和场景面试,助你应对当下中大厂面试趋势。
- **大模型实战项目**: [⭐AI 智能面试辅助平台 + RAG 知识库](https://javaguide.cn/zhuanlan/interview-guide.html)(基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 ,非常适合作为学习和简历项目,学习门槛低)。
## 🌟文章推荐
- **面试准备**: [Java 后端面试通关计划(涵盖后端通用体系)](https://javaguide.cn/interview-preparation/backend-interview-plan.html)(如果你想要系统准备 Java 后端面试但又不知道如何开始的,一定要看这篇)
- **Java 系列**:[Java 学习路线 (最新版,4w + 字)](https://javaguide.cn/interview-preparation/java-roadmap.html)、[Java 基础常见面试题总结](https://javaguide.cn/java/basis/java-basic-questions-01.html)、[Java 集合常见面试题总结](https://javaguide.cn/java/collection/java-collection-questions-01.html)、[JVM 常见面试题总结](https://interview.javaguide.cn/java/java-jvm.html)
- **计算机基础**:[计算机网络常见面试题总结](https://javaguide.cn/cs-basics/network/other-network-questions.html)、[操作系统常见面试题总结](https://javaguide.cn/cs-basics/operating-system/operating-system-basic-questions-01.html)
- **数据库系列**:[MySQL 常见面试题总结](https://javaguide.cn/database/mysql/mysql-questions-01.html)、[Redis 常见面试题总结](https://javaguide.cn/database/redis/redis-questions-01.html)
- **分布式系列**:[分布式高频面试题总结](https://interview.javaguide.cn/distributed-system/distributed-system.html)
- **AI 应用开发**:[万字拆解 LLM 运行机制](https://javaguide.cn/ai/llm-basis/llm-operation-mechanism.html)(深入剖析大模型底层原理)、[万字详解 RAG 基础概念](https://javaguide.cn/ai/rag/rag-basis.html)(企业级 AI 应用核心技术)
## 🚀 PDF 版本 & 面试交流群
- 如果你更喜欢 **PDF**(比如通勤/离线阅读/打印学习),扫描下方二维码,后台回复“**PDF**”即可获取最新版(持续更新,详细介绍见:**[2026 最新后端面试 PDF 资料](./interview-preparation/pdf-interview-javaguide.md)**)。
- 如果你需要加入后端面试交流群,扫描下方二维码,后台回复“**微信**”即可加群。
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghao-javaguide.png" alt="JavaGuide 公众号" style="zoom: 43%; display: block; margin: 0 auto;" />
## 🌐 关于网站
JavaGuide 已经持续维护 6 年多了,累计提交 **6000+** commit ,共有 **620+** 多位贡献者共同参与维护和完善。
网站内容覆盖:
- **后端面试**:Java 基础、集合、并发、JVM、MySQL、Redis、分布式、系统设计等核心知识。
- **AI 应用开发**:大模型(LLM)基础、Agent 智能体、RAG 检索增强生成、MCP 协议等前沿技术。
真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收获再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)。
- [项目介绍](./javaguide/intro.md)(JavaGuide 的诞生)
- [贡献指南](./javaguide/contribution-guideline.md)(期待你的贡献,奖励丰富)
- [常见问题](./javaguide/faq.md)(统一回复大家的一些疑问)
================================================
FILE: docs/about-the-author/README.md
================================================
---
title: 个人介绍 Q&A
description: JavaGuide作者Guide个人介绍,19年本科毕业、大学期间变现20w+实现经济独立、坚持写博客的经历与收获分享。
category: 走近作者
---
<!-- @include: @small-advertisement.snippet.md -->
这篇文章我会通过 Q&A 的形式简单介绍一下我自己。
## 我是什么时候毕业的?
很多老读者应该比较清楚,我是 19 年本科毕业的,刚毕业就去了某家外企“养老”。
我的学校背景是比较差的,高考失利,勉强过了一本线 20 来分,去了荆州的一所很普通的双非一本。不过,还好我没有因为学校而放弃自己,反倒是比身边的同学都要更努力,整个大学还算过的比较充实。
下面这张是当时拍的毕业照(后排最中间的就是我):

## 我坚持写了多久博客?
时间真快啊!我自己是从大二开始写博客的。那时候就是随意地在博客平台上发发自己的学习笔记和自己写的程序。就比如 [谢希仁老师的《计算机网络》内容总结](../cs-basics/network/computer-network-xiexiren-summary.md) 这篇文章就是我在大二学习计算机网络这门课的时候对照着教材总结的。
身边也有很多小伙伴经常问我:“我现在写博客还晚么?”
我觉得哈!如果你想做什么事情,尽量少问迟不迟,多问自己值不值得,只要你觉得有意义,就尽快开始做吧!人生很奇妙,我们每一步的重大决定,都会对自己未来的人生轨迹产生影响。是好还是坏,也只有我们自己知道了!
对我自己来说,坚持写博客这一项决定对我人生轨迹产生的影响是非常正面的!所以,我也推荐大家养成坚持写博客的习惯。
## 我在大学期间赚了多少钱?
在校期间,我还通过办培训班、接私活、技术培训、编程竞赛等方式变现 20w+,成功实现“经济独立”。我用自己赚的钱去了重庆、三亚、恩施、青岛等地旅游,还给家里补贴了很多,减轻了父母的负担。
下面这张是我大一下学期办补习班的时候拍的(离开前的最后一顿饭):

下面这张是我大三去三亚的时候拍的:

其实,我在大学就这么努力地开始赚钱,也主要是因为家庭条件太一般,父母赚钱都太辛苦了!也正是因为我自己迫切地想要减轻父母的负担,所以才会去尝试这么多赚钱的方法。
我发现做咱们程序员这行的,很多人的家庭条件都挺一般的,选择这个行业的很大原因不是因为自己喜欢,而是为了多赚点钱。
如果你也想通过接私活变现的话,可以在我的公众号后台回复“**接私活**”来了解一些我的个人经验分享。
::: center

:::
## 为什么自称 Guide?
可能是因为我的项目名字叫做 JavaGuide , 所以导致有很多人称呼我为 **Guide 哥**。
后面,为了读者更方便称呼,我就将自己的笔名改成了 **Guide**。
我早期写文章用的笔名是 SnailClimb 。很多人不知道这个名字是啥意思,给大家拆解一下就清楚了。SnailClimb=Snail(蜗牛)+Climb(攀登)。我从小就非常喜欢听周杰伦的歌曲,特别是他的《蜗牛》🐌 这首歌曲,另外,当年我高考发挥的算是比较失常,上了大学之后还算是比较“奋青”,所以,我就给自己起的笔名叫做 SnailClimb ,寓意自己要不断向上攀登,嘿嘿 😁

## 后记
凡心所向,素履所往,生如逆旅,一苇以航。
生活本就是有苦有甜。共勉!

================================================
FILE: docs/about-the-author/deprecated-java-technologies.md
================================================
---
title: 已经淘汰的 Java 技术,不要再学了!
description: 已淘汰的Java技术盘点,JSP、Struts、EJB、Java Applets、SOAP等过时技术不建议学习,附现代替代方案推荐。
category: 走近作者
tag:
- 杂谈
---
前几天,我在知乎上随手回答了一个问题:“Java 学到 JSP 就学不下去了,怎么办?”。
出于不想让别人走弯路的心态,我回答说:已经淘汰的技术就不要学了,并顺带列举了一些在 Java 开发领域中已经被淘汰的技术。
## 已经淘汰的 Java 技术
我的回答原内容如下,列举了一些在 Java 开发领域中已经被淘汰的技术:
**JSP**
- **原因**:JSP 已经过时,无法满足现代 Web 开发需求;前后端分离成为主流。
- **替代方案**:模板引擎(如 Thymeleaf、Freemarker)在传统全栈开发中更流行;而在前后端分离架构中,React、Vue、Angular 等现代前端框架已取代 JSP 的角色。
- **注意**:一些国企和央企的老项目可能仍然在使用 JSP,但这种情况越来越少见。
**Struts(尤其是 1.x)**
- **原因**:配置繁琐、开发效率低,且存在严重的安全漏洞(如世界著名的 Apache Struts 2 漏洞)。此外,社区维护不足,生态逐渐萎缩。
- **替代方案**:Spring MVC 和 Spring WebFlux 提供了更简洁的开发体验、更强大的功能以及完善的社区支持,完全取代了 Struts。
**EJB (Enterprise JavaBeans)**
- **原因**:EJB 过于复杂,开发成本高,学习曲线陡峭,在实际项目中逐步被更轻量化的框架取代。
- **替代方案**:Spring/Spring Boot 提供了更加简洁且功能强大的企业级开发解决方案,几乎已经成为 Java 企业开发的事实标准。此外,国产的 Solon 和云原生友好的 Quarkus 等框架也非常不错。
**Java Applets**
- **原因**:现代浏览器(如 Chrome、Firefox、Edge)早已全面移除对 Java Applets 的支持,同时 Applets 存在严重的安全性问题。
- **替代方案**:HTML5、WebAssembly 以及现代 JavaScript 框架(如 React、Vue)可以实现更加安全、高效的交互体验,无需插件支持。
**SOAP / JAX-WS**
- **原因**:SOAP 和 JAX-WS 过于复杂,数据格式冗长(XML),对开发效率和性能不友好。
- **替代方案**:RESTful API 和 RPC 更轻量、高效,是现代微服务架构的首选。
**RMI(Remote Method Invocation)**
- **原因**:RMI 是一种早期的 Java 远程调用技术,但兼容性差、配置繁琐,且性能较差。
- **替代方案**:RESTful API 和 PRC 提供了更简单、高效的远程调用解决方案,完全取代了 RMI。
**Swing / JavaFX**
- **原因**:桌面应用在开发领域的份额大幅减少,Web 和移动端成为主流。Swing 和 JavaFX 的生态不如现代跨平台框架丰富。
- **替代方案**:跨平台桌面开发框架(如 Flutter Desktop、Electron)更具现代化体验。
- **注意**:一些国企和央企的老项目可能仍然在使用 Swing / JavaFX,但这种情况越来越少见。
**Ant**
- **原因**:Ant 是一种基于 XML 配置的构建工具,缺乏易用性,配置繁琐。
- **替代方案**:Maven 和 Gradle 提供了更高效的项目依赖管理和构建功能,成为现代构建工具的首选。
## 杠精言论
没想到,评论区果然出现了一类很常见的杠精:
> “学的不是技术,是思想。那爬也是人类不需要的技术吗?为啥你一生下来得先学会爬?如果基础思想都不会就去学各种框架,到最后只能是只会 CV 的废物!”
<img src="https://oss.javaguide.cn/github/javaguide/about-the-author/prattle/deprecated-java-technologies-zhihu-comments.png" style="zoom:50%;" />
这句话表面上看似有道理,但实际上却暴露了一个人的**无知和偏执**。
**知识越贫乏的人,相信的东西就越绝对**,因为他们从未认真了解过与自己观点相对立的角度,也缺乏对技术发展的全局认识。
举个例子,我刚开始学习 Java 后端开发的时候,完全没什么经验,就随便买了一本书开始看。当时看的是 **《Java Web 整合开发王者归来》** 这本书(梦开始的地方)。
在我上大学那会儿,这本书的很多内容其实已经过时了,比如它花了大量篇幅介绍 JSP、Struts、Hibernate、EJB 和 SVN 等技术。不过,直到现在,我依然非常感谢这本书,带我走进了 Java 后端开发的大门。

这本书一共 **1010** 页,我当时可以说是废寝忘食地学,花了很长时间才把整本书完全“啃”下来。
回头来看,我如果能有意识地避免学习这些已经淘汰的技术,真的可以节省大量时间去学习更加主流和实用的内容。
那么,这些被淘汰的技术有用吗?说句实话,**屁用没有,纯粹浪费时间**。
**既然都要花时间学习,为什么不去学那些更主流、更有实际价值的技术呢?**
现在本身就很卷,不管是 Java 方向还是其他技术方向,要学习的技术都很多。
想要理解所谓的“底层思想”,与其浪费时间在 JSP 这种已经不具备实际应用价值的技术上,不如深入学习一下 Servlet,研究 Spring 的 AOP 和 IoC 原理,从源码角度理解 Spring MVC 的工作机制。
这些内容,不仅能帮助你掌握核心的思想,还能在实际开发中真正派上用场,这难道不比花大量时间在 JSP 上更有意义吗?
## 还有公司在用的技术就要学吗?
我把这篇文章的相关言论发表在我的[公众号](https://mp.weixin.qq.com/s/lf2dXHcrUSU1pn28Ercj0w)之后,又收到另外一类在我看来非常傻叉的言论:
- “虽然 JSP 很老了,但还是得学学,会用就行,因为我们很多老项目还在用。”
- “很多央企和国企的老项目还在用,肯定得学学啊!”
这种观点完全是钻牛角尖!如果按这种逻辑,那你还需要去学 Struts2、SVN、JavaFX 等过时技术,因为它们也还有公司在用。我有一位大学同学毕业后去了武汉的一家国企,写了一年 JavaFX 就受不了跑了。他在之前从来没有接触过 JavaFX,招聘时也没被问过相关问题。
一定不要假设自己要面对的是过时技术栈的项目。你要找工作肯定要用主流技术栈去找,还要尽量找能让自己技术有成长,干着也舒服点。真要是找不到合适的工作,去维护老项目,那都是后话,现学现卖就行了。
**对于初学者来说别人劝了还非要学习淘汰的技术,多少脑子有点不够用,基本可以告别这一行了!**
================================================
FILE: docs/about-the-author/dog-that-copies-other-people-essay.md
================================================
---
title: 抄袭狗,你冬天睡觉脚必冷!!!
description: 原创文章被抄袭的无奈经历,知乎、CSDN多平台盗文现象吐槽,分享如何屏蔽低质量内容和维护原创权益。
category: 走近作者
tag:
- 杂谈
---
抄袭狗真的太烦了。。。
听朋友说我的文章在知乎又被盗了,原封不动地被别人用来引流。

而且!!!这还不是最气的。
这人还在文末注明的原出处还不是我的。。。

也就是说 CSDN 有另外一位抄袭狗盗了我的这篇文章并声明了原创,知乎抄袭狗又原封不动地搬运了这位 CSDN 抄袭狗的文章。
真可谓离谱他妈给离谱开门,离谱到家了。

我打开知乎抄袭狗注明的原出处链接,好家伙,一模一样的内容,还表明了原创。

看了一下 CSDN 这位抄袭狗的文章,好家伙,把我高赞回答搬运了一个遍。。。真是很勤奋了。。。
CSDN 我就不想多说了,就一大型文章垃圾场,都是各种不规范转载,各种收费下载的垃圾资源。这号称国内流量最大的技术网站贼恶心,吃香太难看,能不用就不要用吧!
像我自己平时用 Google 搜索的时候,都是直接屏蔽掉 CSDN 这个站点的。只需要下载一个叫做 Personal Blocklist 的 Chrome 插件,然后将 blog.csdn.net 添加进黑名单就可以了。

我的文章基本被盗完了,关键是我自己发没有什么流量,反而是盗我文章的那些人比我这个原作者流量还大。
这是什么世道,是人性的扭曲还是道德的沦丧?
不过,也没啥,CSDN 这垃圾网站不去发文也无妨。
看看 CSDN 热榜上的文章都是一些什么垃圾,不是各种广告就是一些毫无质量的拼凑文。

当然了,也有极少部分的高质量文章,比如涛哥、二哥、冰河、微观技术等博主的文章。
还有很多视频平台(比如抖音、哔哩哔哩)上面有很多博主直接把别人的原创拿来做个视频,用来引流或者吸粉。
今天提到的这篇被盗的文章曾经就被一个培训机构拿去做成了视频用来引流。

作为个体,咱也没啥办法,只能遇到一个举报一个。。。
================================================
FILE: docs/about-the-author/feelings-after-one-month-of-induction-training.md
================================================
---
title: 入职培训一个月后的感受
description: ThoughtWorks入职培训一个月感受,从Windows切换到Mac的适应、TWU培训内容、Feedback反馈文化等新人入职体验分享。
category: 走近作者
tag:
- 个人经历
---
不知不觉已经入职一个多月了,在入职之前我没有在某个公司实习过或者工作过,所以很多东西刚入职工作的我来说还是比较新颖的。学校到职场的转变,带来了角色的转变,其中的差别因人而异。对我而言,在学校的时候课堂上老师课堂上教的东西,自己会根据自己的兴趣选择性接受,甚至很多课程你不想去上的话,还可以逃掉。到了公司就不一样了,公司要求你会的技能你不得不学,除非你不想干了。在学校的时候大部分人编程的目的都是为了通过考试或者找到一份好工作,真正靠自己兴趣支撑起来的很少,到了工作岗位之后我们编程更多的是因为工作的要求,相比于学校的来说会一般会更有挑战而且压力更大。在学校的时候,我们最重要的就是对自己负责,我们不断学习知识去武装自己,但是到了公司之后我们不光要对自己负责,更要对公司负责,毕竟公司出钱请你过来,不是让你一直 on beach 的。
刚来公司的时候,因为公司要求,我换上了 Mac 电脑。由于之前一直用的是 Windows 系统,所以非常不习惯。刚开始用 Mac 系统的时候笨手笨脚,自己会很明显的感觉自己的编程效率降低了至少 3 成。当时内心还是挺不爽的,心里也总是抱怨为什么不直接用 Windows 系统或者 Linux 系统。不过也挺奇怪,大概一个星期之后,自己就开始慢慢适应使用 Mac 进行编程,甚至非常喜欢。我这里不想对比 Mac 和 Windows 编程体验哪一个更好,我觉得还是因人而异,相同价位的 Mac 的配置相比于 Windows 确实要被甩几条街。不过 Mac 的编程和使用体验确实不错,当然你也可以选择使用 Linux 进行日常开发,相信一定很不错。 另外,Mac 不能玩一些主流网络游戏,对于一些克制不住自己想玩游戏的朋友是一个不错的选择。
不得不说 ThoughtWorks 的培训机制还是很不错的。应届生入职之后一般都会安排培训,与往年不同的是,今年的培训多了中国本地班(TWU-C)。作为本地班的第一期学员,说句心里话还是很不错。8 周的培训,除了工作需要用到的基本技术比如 ES6、SpringBoot 等等之外,还会增加一些新员工基本技能的培训比如如何高效开会、如何给别人正确的提 Feedback、如何对代码进行重构、如何进行 TDD 等等。培训期间不定期的有活动,比如 Weekend Trip、 City Tour、Cake time 等等。最后三周还会有一个实际的模拟项目,这个项目基本和我们正式工作的实际项目差不多,我个人感觉很不错。目前这个项目已经正式完成了一个迭代,我觉得在做项目的过程中,收获最大的不是项目中使用的技术,而是如何进行团队合作、如何正确使用 Git 团队协同开发、一个完成的迭代是什么样子的、做项目的过程中可能遇到那些问题、一个项目运作的完整流程等等。
ThoughtWorks 非常提倡分享、提倡帮助他人成长,这一点在公司的这段时间深有感触。培训期间,我们每个人会有一个 Trainer 负责,Trainer 就是日常带我们上课和做项目的同事,一个 Trainer 大概会负责 5 - 6 个人。Trainer 不定期都会给我们最近表现的 Feedback (反馈) ,我个人觉得这个并不是这是走走形式,Trainer 们都很负责,很多时候都是在下班之后找我们聊天。同事们也都很热心,如果你遇到问题,向别人询问,其他人如果知道的话一般都会毫无保留的告诉你,如果遇到大部分都不懂的问题,甚至会组织一次技术 Session 分享。上周五我在我们小组内进行了一次关于 Feign 远程调用的技术分享,因为 team 里面大家对这部分知识都不太熟悉,但是后面的项目进展大概率会用到这部分知识。我刚好研究了这部分内容,所以就分享给了组内的其他同事,以便于项目更好的进行。
另外,ThoughtWorks 也是一家非常提倡 Feedback (反馈) 文化的公司,反馈是告诉人们我们对他们的表现的看法以及他们应该如何更好地做到这一点。刚开始我并没有太在意,慢慢地自己确实感觉到正确的进行反馈对他人会有很大的帮助。因为人在做很多事情的时候,会很难发现别人很容易看到的一些小问题。就比如一个很有趣的现象一样,假如我们在做项目的时候没有测试这个角色,如果你完成了自己的模块,并且自己对这个模块测试了很多遍,你发现已经没啥问题了。但是,到了实际使用的时候会很大概率出现你之前从来没有注意的问题。解释这个问题的说法是:每个人的视野或多或少都是有盲点的,这与我们的关注点息息相关。对于自己做的东西,很多地方自己测试很多遍都不会发现,但是如果让其他人帮你进行测试的话,就很大可能会发现很多显而易见的问题。

工作之后,平时更新公众号、专栏还有维护 Github 的时间变少了。实际上,很多时候下班回来后,都有自己的时间来干自己的事情,但是自己也总是找工作太累或者时间比较零散的接口来推掉了。到了今天,翻看 Github 突然发现 14 天前别人在 Github 上给我提的 PR 我还没有处理。这一点确实是自己没有做好的地方,没有合理安排好自己的时间。实际上自己有很多想写的东西,后面会慢慢将他们提上日程。工作之后,更加发现下班后的几个小时如何度过确实很重要 ,如果你觉得自己没有完成好自己白天该做的工作的话,下班后你可以继续忙白天没有忙完的工作,如果白天的工作对于你游刃有余的话,下班回来之后,你大可去干自己感兴趣的事情,学习自己感兴趣的技术。做任何事情都要基于自身的基础,切不可好高骛远。
工作之后身边也会有很多厉害的人,多从他人身上学习我觉得是每个职场人都应该做的。这一届和我们一起培训的同事中,有一些技术很厉害的,也有一些技术虽然不是那么厉害,但是组织能力以及团队协作能力特别厉害的。有一个特别厉害的同事,在我们还在学 SpringBoot 各种语法的时候,他自己利用业余时间写了一个简化版的 SpringBoot ,涵盖了 Spring 的一些常用注解比如 `@RestController`、`@Autowried`、`@Pathvairable`、`@RestquestParam`等等(已经联系这位同事,想让他开源一下,后面会第一时间同步到公众号,期待一下吧!)。我觉得这位同事对于编程是真的有兴趣,他好像从初中就开始接触编程了,对于各种底层知识也非常感兴趣,自己写过实现过很多比较底层的东西。他的梦想是在 Github 上造一个 20k Star 以上的轮子。我相信以这位同事的能力一定会达成目标的,在这里祝福这位同事,希望他可以尽快实现这个目标。
这是我入职一个多月之后的个人感受,很多地方都是一带而过,后面我会抽时间分享自己在公司或者业余学到的比较有用的知识给各位,希望看过的人都能有所收获。
================================================
FILE: docs/about-the-author/feelings-of-half-a-year-from-graduation-to-entry.md
================================================
---
title: 从毕业到入职半年的感受
description: 应届生入职半年的工作感受,CRUD业务代码的价值、技术积累靠工作之余、从学校到职场的转变心得分享。
category: 走近作者
tag:
- 个人经历
---
如果大家看过我之前的介绍的话,就会知道我是 19 年毕业的几百万应届毕业生中的一员。这篇文章主要讲了一下我入职大半年的感受,文中有很多自己的主观感受,如果你们有任何不认同的地方都可以直接在评论区说出来,会很尊重其他人的想法。
简单说一下自己的情况吧!我目前是在一家外企,每天的工作和大部分人一样就是做开发。毕业到现在,差不多也算是工作半年多了,也已经过了公司 6 个月的试用期。目前在公司做过两个偏向于业务方向的项目,其中一个正在做。你很难想象我在公司做的两个业务项目的后端都没有涉及到分布式/微服务,没有接触到 Redis、Kafka 等等比较“高大上”的技术在项目中的实际运用。
第一个项目做的是公司的内部项目——员工成长系统。抛去员工成长系统这个名字,实际上这个系统做的就是绩效考核比如你在某个项目组的表现。这个项目的技术是 Spring Boot+ JPA + Spring Security + K8S + Docker + React。第二个目前正在做的是一个集成游戏 (cocos)、Web 管理端 (Spring Boot + Vue) 和小程序 (Taro) 项目。
是的,我在工作中的大部分时间都和 CRUD 有关,每天也会写前端页面。之前我认识的一个朋友 ,他听说我做的项目中大部分内容都是写业务代码之后就非常纳闷,他觉得单纯写业务代码得不到提升?what?你一个应届生,连业务代码都写不好你给我说这个!所以,**我就很纳闷不知道为什么现在很多连业务代码都写不好的人为什么人听到 CRUD 就会反感?至少我觉得在我工作这段时间我的代码质量得到了提升、定位问题的能力有了很大的改进、对于业务有了更深的认识,自己也可以独立完成一些前端的开发了。**
其实,我个人觉得能把业务代码写好也没那么容易,抱怨自己天天做 CRUD 工作之前,看看自己 CRUD 的代码写好没。再换句话说,单纯写 CRUD 的过程中你搞懂了哪些你常用的注解或者类吗?这就像一个只会 `@Service`、`@Autowired`、`@RestController`等等最简单的注解的人说我已经掌握了 Spring Boot 一样。
不知道什么时候开始大家都会觉得有实际使用 Redis、MQ 的经验就很牛逼了,这可能和当前的面试环境有关系。你需要和别人有差异,你想进大厂的话,好像就必须要这些技术比较在行,好吧,没有好像,自信点来说对于大部分求职者这些技术都是默认你必备的了。
**实话实说,我在大学的时候就陷入过这个“伪命题”中**。在大学的时候,我大二因为加入了一个学校的偏技术方向的校媒才接触到 Java ,当时我们学习 Java 的目的就是开发一个校园通。 大二的时候,编程相当于才入门水平的我才接触 Java,花了一段时间才掌握 Java 基础。然后,就开始学习安卓开发。
到了大三上学期,我才真正确定要走 Java 后台的方向,找 Java 后台的开发工作。学习了 3 个月左右的 WEB 开发基础之后,我就开始学习分布式方面内容比如 Redis、Dubbo 这些。我当时是通过看书 + 视频 + 博客的方式学习的,自学过程中通过看视频自己做过两个完整的项目,一个普通的业务系统,一个是分布式的系统。**我当时以为自己做完之后就很牛逼了,我觉得普通的 CRUD 工作已经不符合我当前的水平了。哈哈!现在看来,当时的我过于哈皮!**
这不!到了大三暑假跟着老师一起做项目的时候就出问题了。大三的时候,我们跟着老师做的是一个绩效考核系统,业务复杂程度中等。这个项目的技术用的是:SSM + Shiro + JSP。当时,做这个项目的时候我遇到各种问题,各种我以为我会写的代码都不会写了,甚至我写一个简单的 CRUD 都要花费好几天的时间。所以,那时候我都是边复习边学习边写代码。虽然很累,但是,那时候学到了很多,也让我在技术面前变得更加踏实。我觉得这“**这个项目已经没有维护的可能性**”这句话是我对我过的这个项目最大的否定了。
技术千变万化,掌握最核心的才是王道。我们前几年可能还在用 Spring 基于传统的 XML 开发,现在几乎大家都会用 Spring Boot 这个开发利器来提升开发速度,再比如几年前我们使用消息队列可能还在用 ActiveMQ,到今天几乎都没有人用它了,现在比较常用的就是 Rocket MQ、Kafka 。技术更新换代这么快的今天,你是无法把每一个框架/工具都学习一遍的。
**很多初学者上来就想通过做项目学习,特别是在公司,我觉得这个是不太可取的。** 如果的 Java 基础或者 Spring Boot 基础不好的话,建议自己先提前学习一下之后再开始看视频或者通过其他方式做项目。 **还有一点就是,我不知道为什么大家都会说边跟着项目边学习做的话效果最好,我觉得这个要加一个前提是你对这门技术有基本的了解或者说你对编程有了一定的了解。**
**划重点!!!在自己基础没打牢的情况下,单纯跟着视频做一点用没有。你会发现你看完视频之后,让你自己写代码的时候又不会写了。**
不知道其他公司的程序员是怎么样的?我感觉技术积累很大程度在乎平时,单纯依靠工作绝大部分情况只会加快自己做需求的熟练度,当然,写多了之后或多或少也会提升你对代码质量的认识(前提是你有这个意识)。
工作之余,我会利用业余时间来学习自己想学的东西。工作中的例子就是我刚进公司的第一个项目用到了 Spring Security + JWT ,因为当时自己对于这个技术不太了解,然后就在工作之外大概花了一周的时间学习写了一个 Demo 分享了出来,GitHub 地址:<https://github.com/Snailclimb/spring-security-jwt-guide> 。以次为契机,我还分享了
- [《一问带你区分清楚 Authentication、Authorization 以及 Cookie、Session、Token》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485626&idx=1&sn=3247aa9000693dd692de8a04ccffeec1&chksm=cea24771f9d5ce675ea0203633a95b68bfe412dc6a9d05f22d221161147b76161d1b470d54b3&token=684071313&lang=zh_CN&scene=21#wechat_redirect)
- [JWT 身份认证优缺点分析以及常见问题解决方案](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485655&idx=1&sn=583eeeb081ea21a8ec6347c72aa223d6&chksm=cea2471cf9d5ce0aa135f2fb9aa32d98ebb3338292beaccc1aae43d1178b16c0125eb4139ca4&token=1737409938&lang=zh_CN#rd)
另外一个最近的例子是因为肺炎疫情在家的这段时间,自学了 Kafka,并且正在准备写一系列的入门文章,目前已经完成了:
1. 大白话 Kafka 入门;
2. Kafka 安装和基本功能体验;
3. Spring Boot 整合 Kafka 发送和接受消息;
4. Spring Boot 整合 Kafka 发送和接受消息的一些事务、错误消息处理等等。
还没完成的:
1. Kafka 高级特性比如工作流程、Kafka 为什么快等等的分析;
2. 源码阅读分析;
3. ……
**所以,我觉得技术的积累和沉淀很大程度在乎工作之外的时间(大佬和一些本身就特别厉害的除外)。**
**未来还有很长的路要走,即使再有精力也学不完你想学的所有技术,适当取舍、适当妥协,适当娱乐。**
================================================
FILE: docs/about-the-author/internet-addiction-teenager.md
================================================
---
title: 我曾经也是网瘾少年
description: 从网瘾少年到程序员的成长经历,初中沉迷游戏、高中觉醒奋起直追、高考失眠的真实故事,分享如何克服网瘾专注学习。
category: 走近作者
tag:
- 个人经历
---
> 这篇文章写于 2021 年高考前夕。
聊到高考,无数人都似乎有很多话说。今天就假借高考的名义,简单来聊聊我的高中求学经历吧!
说实话,我自己的高中求学经历真的还不算平淡,甚至有点魔幻,所以还是有很多话想要说的。
这篇文章大概会从我的初中一直介绍到高中,每一部分我都不会花太多篇幅,就简单聊聊吧!
**以下所有内容皆是事实,没有任何夸大的地方,稍微有一点点魔幻。**
## 刚开始接触电脑
最开始接触电脑是在我刚上五年级的时候,那时候家里没电脑,刚开始上网都是在黑网吧玩的。
黑网吧大概就是下面这样式儿的,一个没有窗户的房间里放了很多台老式电脑,非常拥挤。

在黑网吧上网的经历也是一波三折,经常会遇到警察来检查或者碰到大孩子骚扰。在黑网吧上网的一年多中,我一共两次碰到警察来检查,主要是看有没有未成年人(当时黑网吧里几乎全是未成年人),实际感觉像是要问黑网吧老板要点好处。碰到大孩子骚扰的次数就比较多,大孩子经常抢我电脑,还威胁我把身上所有的钱给他们。我当时一个人也比较怂,被打了几次之后,就尽量避开大孩子来玩的时间去黑网吧,身上也只带很少的钱。小时候的性格就比较独立,在外遇到事情我一般也不会给家里人说(因为说了也没什么用,家人给我的安全感很少)。
我现在已经记不太清当时是被我哥还是我姐带进网吧的,好像是我姐。
起初的时候,自己就是玩玩流行蝴蝶剑、单机摩托之类的单机游戏。但是,也没有到沉迷的地步,只是觉得这东西确实挺好玩的,一玩就可以玩一下午,恋恋不舍。

## 小学毕业后开始有网瘾
开始有网瘾是在小学毕业的时候,在我玩了一款叫做 **QQ 飞车** 的游戏之后(好像是六年级末就开始玩了)。我艹,当时真的被这游戏吸引了。**每天上课都幻想自己坐在车里面飘逸,没错,当时就觉得秋名山车神就是我啦!**
我当时技术还是挺不错的,整个网吧玩这个游戏的貌似还没有可以打败我的(我们当时经常会开放切磋)。
QQ 飞车这款戏当时还挺火的,很多 90 后的小伙伴应该比较熟悉。
我记得,那时候上网还不要身份证,10 元办一张网卡就行了,网费也是一元一小时。我就经常不吃早饭,攒钱用来上网。只要口袋里有钱,我都会和我的小伙伴奔跑到网吧一起玩 QQ 飞车。青回啊!
> 说到这,我情不自禁地打开自己的 Windows 电脑,下载了 Wegame ,然后下载了 QQ 飞车。
到了初二的时候,就没玩 QQ 飞车了。我的等级也永久定格在了 **120** 级,这个等级在当时那个升级难的一匹的年代,算的上非常高的等级了。

## 初二网瘾爆发
网瘾爆发是在上了初中之后。初二的时候,最为猖狂,自己当时真的是太痴迷于 **穿越火线** 这款游戏了,比 QQ 飞车还要更痴迷一些。每天上课都在想像自己拿起枪横扫地方阵营的场景,心完全不在学习上。
我经常每天早上起早去玩别人包夜留下的机子,毕竟那时候上学也没什么钱嘛!我几乎每个周五晚上都会趁家人睡着之后,偷偷跑出去通宵。整个初二我通宵了无数次,我的眼睛就是这样近视的。
有网瘾真的很可怕,为了上网什么都敢做。当时我家住在顶楼的隔热层,我每次晚上偷偷出去上网,为了不被家里人发现,要从我的房间的窗户爬出去,穿过几栋楼,经过几间无人居住的顶楼隔热层之后再下楼。现在想想,还是比较危险的。而且,我天生比较怕黑。当时为了上网,每次穿过这么多没人居住的顶层隔热层都没怕过。你让我现在再去,我都不敢,实在是佩服当年的自己的啊!

周五晚上通宵完之后,我会睡到中午,然后下午继续去网吧玩。到了周日,基本都是直接从早上 8 点玩到晚上 9 点 10 点。那时候精力是真旺盛,真的完全不会感觉比较累,反而乐在其中。
我的最终军衔停留在了两个钻石,玩过的小伙伴应该清楚这在当时要玩多少把(现在升级比较简单)。

ps: 回坑 CF 快一年了,目前的军衔是到了两颗星中校 3 了。
那时候成绩挺差的。这样说吧!我当时在很普通的一个县级市的高中,全年级有 500 来人,我基本都是在 280 名左右。而且,整个初二我都没有学物理,上物理课就睡觉,考试就交白卷。
为什么对物理这么抵触呢?这是因为开学不久的一次物理课,物理老师误会我在上课吃东西还狡辩,扇了我一巴掌。那时候心里一直记仇到大学,想着以后自己早晚有时间把这个物理老师暴打一顿。
## 初三开启学习模式
初三上学期的时候突然觉悟,像是开窍了一样,当时就突然意识到自己马上就要升高中了,要开始好好搞搞学习了。
诶,其实也不算是开窍,主要还是为了让自己能在家附近上学,这样上网容易一些。因为当时我家就在我们当地的二中附近,附近有特别特别多的网吧,上网特别特别容易,加上我又能走读。
像我初中在的那个学校,年级前 80 的话基本才有可能考得上二中。经过努力,初三上学期的第一次月考,我直接从 280 多名进步到了年级 50 多名,有机会考入二中。当时还因为进步太大,被当作 **进步之星** 在讲台上给整个年级做演讲,分享经验。这也是我第一次在这么多人面前讲话,挺紧张的,但是挺爽的,在暗恋对象面前赚足了面子。
其实在初三的时候,我的网瘾还是很大。不过,我去玩游戏的前提都是自己把所有任务做完,并且上课听讲也相对比较认真的听。
初三那会,我通宵的次数变少了一些,但会经常晚上趁着家人睡觉了,偷偷跑出去玩到凌晨 2 点多回来。
当时,我们当地的高中有一个政策是每个学校的成绩比较优秀的学生可以参加 **高中提前招生考试** ,只要考上了就不用参加中考了。我当时也有幸参加了这次考试并成功进入了我们当地的二中。
在我参加高中提前考试前的一个晚上,我半夜 12 点趁着妈妈睡着,跑去了网吧玩 CF 到凌晨 3 点多回来。就那一次我被抓了现行,到家之后发现妈妈就坐在客厅等我,训斥一顿后,我就保证以后不再晚上偷偷跑出去了。
> 这里要说明一点:我的智商我自己有自知之明的,属于比较普通的水平吧!前进很大的主要原因是自己基础还行,特别是英语和物理。英语是因为自己喜欢,加上小学就学了很多初中的英语课程。物理的话就很奇怪,虽然初二也不怎么听物理课,也不会物理,但是到了初三之后自己就突然开窍了。真的!我现在都感觉很奇怪。然后,到了高中之后,我的英语和物理依然是我最好的两门课。大学的兼职,我出去做家教都是教的高中物理。
## 高中从小班掉到平行班

由于参加了高中提前招生考试,我提前 4 个月就来到了高中,进入了小班,开始学习高中的课程。
上了高中的之后,我上课就偷偷看小说,神印王座、斗罗大陆、斗破苍穹很多小说都是当时看的。中午和晚上回家之后,就在家里玩几把 DNF。当时家里也买了电脑,姥爷给买的,是对自己顺利进入二中的奖励。到我卸载 DNF 的时候,已经练了 4 个满级的号,两个接近满级的号。
当时我的空间专门有一个相册里面放的全是 DNF 的一些照片和截图,无比痴迷于练级和刷图。
在高中待了不到一个月,我上体育课的时候不小心把腿摔断了,这也是我第一次感受到骨头断裂的头疼,实在是太难受了!
于是,我就开始休学养病。直到高中正式开学一个月之后,我才去上学,也没有参加军训。
由于我耽误了几个月的课程,因此没办法再进入小班,只能转到奥赛班。到了奥赛班之后,我继续把时间和经历都投入在游戏和小说上,于是我的成绩在奥赛班快接近倒数了。等到高二分班的时候,我成功被踢出奥赛班来到了最普通的平行班。
**我成功把自己从学校最好的小班玩到奥赛班,然后再到平行班。有点魔幻吧!**
## 高二开始奋起直追
高中觉悟是在高二下学期的时候,当时是真的觉悟了,就突然觉得游戏不香了,觉得 DNF 也不好玩了,什么杀怪打装备不过是虚无,练了再多满级的 DNF 账号也屁用没有,没钱都是浮云。
我妈妈当时还很诧异,还奇怪地问我:“怎么不玩游戏了?”(我妈属于不怎么管我玩游戏的,她觉得这东西还是要靠自觉)。
于是,我便开始牟足劲学习,每天都沉迷学习无法自拔(豪不夸张),乐在其中。虽然晚自习上完回到家已经差不多 11 点了,但也并不感觉累,反而感觉很快乐,很充实。
**我的付出也很快得到了回报,我顺利返回了奥赛班。** 当时,理科平行班大概有 7 个,每次考试都是平行班之间会单独排一个名次,小班和奥赛班不和我们一起排名次。后面的话,自己基本每次都能在平行班得第一,并且很多时候都是领先第二名 30 来分。由于成绩还算亮眼,高三上学期快结束的时候,我就向年级主任申请去了奥赛班。
## 高考前的失眠
> **失败之后,不要抱怨外界因素,自始至终实际都是自己的问题,自己不够强大!** 然后,高考前的失眠也是我自己问题,要怪只能怪自己,别的没有任何接口。
我的高考经历其实还蛮坎坷的,毫不夸张的说,高考那今天可能是我到现在为止,经历的最难熬的时候,特别是在晚上。
我在高考那几天晚上都经历了失眠,想睡都睡不着那种痛苦想必很多人或许都体验过。
其实我在之前是从来没有过失眠的经历的。高考前夕,因为害怕自己睡不着,所以,我提前让妈妈去买了几瓶老师推荐的安神补脑液。我到现在还记得这个安神补脑液是敖东牌的。

高考那几天的失眠,我觉得可能和我喝了老师推荐的安神补脑液有关系,又或者是我自己太过于紧张了。因为那几天睡觉总会感觉有很多蚂蚁在身上爬一样,身上还起了一些小痘痘(有点像是过敏)。
这里要格外说明一点,避免引起误导:**睡不着本身就是自身的问题,上述言论并没有责怪这个补脑液的意思。** 另外, 这款安神补脑液我去各个平台都查了一下,发现大家对他的评价都挺好,和我们老师当时推荐的理由差不多。如果大家需要改善睡眠的话,可以咨询相关医生之后尝试一下。
高考也确实没发挥好,整个人在考场都是懵的状态。高考成绩出来之后,比我自己预估的还低了几十分,最后只上了一个双非一本。不过,好在专业选的好,吃了一些计算机专业的红利,大学期间也挺努力的。
## 大学生活
大学生活过的还是挺丰富的,我会偶尔通宵敲代码,也会偶尔半夜发疯跑出去和同学一起走走古城墙、去网吧锤一夜的 LOL。
大学生活专门写过一篇文章介绍:[害,毕业三年了!](./my-college-life.md) 。
## 总结
整个初中我都属于有点网瘾少年的状态,不过初三的时候稍微克制一些。到了高二下学期的时候,自己才对游戏真的没有那么沉迷了。
对游戏不那么沉迷,也是因为自己意识到游戏终究只是消遣,学习才是当时最重要的事情。而且,我的游戏技术又不厉害,又不能靠游戏吃饭,什么打怪升级到最后不过是电脑中的二进制数据罢了!
**这玩意必须你自己意识到,不然,单纯靠父母监督真的很难改变!如果心不在学习上面的话,那同时是不可能学好的!**
我真的很反对父母过于干涉孩子的生活,强烈谴责很多父母把自己孩子的网瘾归咎于网络游戏,把自己孩子的暴力归咎于影视媒体。
**时刻把自己的孩子保护起来不是一件靠谱的事情,他终究要独自面对越来越多的诱惑。到了大学,很多被父母保护太好的孩子就直接废了。他们没有独立意识,没有抗拒诱惑的定力!**
================================================
FILE: docs/about-the-author/javaguide-100k-star.md
================================================
---
title: JavaGuide 开源项目 100K Star 了!
description: JavaGuide开源项目达成100K Star里程碑,从2018年创建到突破十万星标的复盘总结,分享开源维护心得与未来规划。
category: 走近作者
tag:
- 个人经历
---
2021-03-21,晚上 12 点,肝完了我正在做的一个项目的前端的某块功能,我随手打开了[我的 GitHub 主页](https://github.com/Snailclimb)。
好家伙!几天没注意,[JavaGuide](https://github.com/Snailclimb/JavaGuide) 这个项目直接上了 100K star。

其实,这个真没啥好嘚瑟的。因为,教程类的含金量其实是比较低的,Star 数量比较多主要也是因为受众面比较广,大家觉得不错,点个 star 就相当于收藏了。很多特别优秀的框架,star 数量可能只有几 K。所以,单纯看 star 数量没啥意思,就当看个笑话吧!

维护这个项目的过程中,也被某些人 diss 过:“md 项目,没啥含金量,给国人丢脸!”。
对于说这类话的人,我觉得对我没啥影响,就持续完善,把 JavaGuide 做的更好吧!其实,国外的很多项目也是纯 MD 啊!就比如外国的朋友发起的 awesome 系列、求职面试系列。无需多说,行动自证!凎!
开源非常重要的一点就是协作。如果你开源了一个项目之后,就不再维护,别人给你提交 issue/pr,你都不处理,那开源也没啥意义了!
我的公号的小伙伴都是通过这个项目关注我的,趁着午休,简单复盘一下,也算是对关注这个项目的小伙伴负责。
我在大三开始准备秋招面试的时候,创建了 JavaGuide 这个项目,**2018-05-07** 这一天我提交了**第 1 个 commit**。
到今天(2021-03-23)为止,这个仓库已经累计有 **2933** 次 commit,累计有 **207** 位朋友参与到了项目中来。

累计有 **511** 个 **issue** 和 **575** 个 **PR**。所有的 PR 都已经被处理,仅有 15 个左右的 issue 我还未抽出时间处理。

其实,相比于 star 数量,你看看仓库的 issue 和 PR 更能说明你的项目是否有价值。
那些到处骗 star 甚至是 刷 star 的行为,我就不多说了,有点丢人。人家觉得你的项目还不错,能提供价值,自然就给你点 star 了。
**未来几年,我还是会持续完善 JavaGuide。**
**希望自己以后能开源一些有价值的轮子吧!继续加油!**
================================================
FILE: docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md
================================================
---
title: 某培训机构盗我文章做成视频还上了B站热门
description: 原创文章被培训机构盗用制作成B站视频的维权经历,揭露培训机构剽窃原创引流的套路,呼吁尊重原创内容。
category: 走近作者
tag:
- 杂谈
---
时间回到 2021-02-25,我在刷哔哩哔哩的时候发现,哔哩哔哩某 UP 主(某培训机构),擅自将我在知乎的一个回答做成了视频。
原滋原味啊!我艹。甚至,连我开头的自我调侃还加上了!真的牛皮!
你盗我原创,视频你用心做好点也行啊!至少也可以让这么优质的内容得到传播嘛!
结果,好家伙,视频做的像坨屎一样,配音也贼违和!
麻烦这个培训机构看到这篇文章之后可以考虑换一个人做类似恶心的事情哈!这人完全没脑子啊!




我随便找了一个视频看,发现也还是盗用别人的原创。


其他的视频就不用多看了,是否还是剽窃别人的原创,原封不动地做成视频,大家心里应该有数。
他们这样做的目的就是一个:**引流到自己的 QQ 群,然后忽悠你买课程。**
我并不认为是这完全都是培训机构的问题。培训机构的员工为了流量而做这种恶心的事情,也导致了现在这种事情被越来越频繁地发生。
所以,你会发现,哔哩哔哩和知乎上有越来越多培训机构的小号,到处剽窃原创,盗发。
我身边很多原创号主的文章都经常被某些培训机构盗发。
有时候真的会比较生气,毕竟你自己辛辛苦苦的原创,别人复制粘贴一下就白嫖了!
但是,我相信,这种靠剽窃别人原创来吸引流量的行为,终究只是跳梁小丑的行为罢了!
只有那些用心输出内容的创作者,才能走的更远,更安稳!
后来,我在我的公众号上发了一篇名为[《好家伙!某培训机构盗我文章做成视频还上了热门》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247500005&idx=1&sn=7351e22619654492d3cf567bff9d87f0&chksm=cea18f2ef9d606384e0265b9318e004646c03b8a69f2801698d2f9e0e6bdfec0a1185ac3ab17&token=2146952532&lang=zh_CN&scene=21#wechat_redirect) 的文章,吐槽自己的原创被某机构白嫖。
谁能想到,培训机构的人竟然找人来让我删文章了!讲真,这俩人是真的奇葩啊!


还让我格局大点?我去你丫的!明明就是我的原创,你自己不删,反而找人联系我删除!有脑子不?
其实,我这人是比较好说话的,现实生活中脾气也是出了名的好(前提是没有触犯到我的原则的情况)。
搞笑的是!他们在让我删文的同时,他们 B 站盗发的视频还都在,还在继续为他们引流。


如果他们把账号注销了,我或许还能考虑放一手。但是,文章是肯定不会删的。
现在,看后续情况吧!我随时可以动用法律来维护自己的权益,只是看我想不想,毕竟也挺麻烦对吧!
大家不用担心,这都是小事,我女朋友就是学法律的,国内的某法学双一流学校。
咱不怕事!凎!!!
================================================
FILE: docs/about-the-author/my-college-life.md
================================================
---
title: 害,毕业三年了!
description: 双非一本程序员的大学四年,从参加社团活动到办补习班赚钱、确定Java后端方向、创建JavaGuide、最终拿到ThoughtWorks offer的真实经历。
category: 走近作者
star: 1
tag:
- 个人经历
---
> 关于初高中的生活,可以看 2020 年我写的 [我曾经也是网瘾少年](./internet-addiction-teenager.md) 这篇文章。
2019 年 6 月份毕业,距今已经过去了 3 年。趁着高考以及应届生毕业之际,简单聊聊自己的大学生活。
下面是正文。
我本科毕业于荆州校区的长江大学,一所不起眼的双非一本。
在这里度过的四年大学生活还是过的挺开心的,直到现在,我依然非常怀念!
在学校的这几年的生活,总体来说,还算是比较丰富多彩的。我会偶尔通宵敲代码,也会偶尔半夜发疯跑出去和同学一起走走古城墙、去网吧锤一夜的 LOL。
写下这篇杂文,记录自己逝去的大学生活!希望未来继续砥砺前行,不忘初心!
## 大一
大一那会,我没有把精力放在学习编程上,大部分时间都在参加课外活动。
或许是因为来到了一座新鲜的城市,对周围的一切都充满了兴趣。又或许是因为当时的我还比较懵懂,也没有任何学习方向。
这一年,我和班里的一群新同学去逛了荆州的很多地方比如荆州博物馆、长江大桥、张居正故居、关帝庙。

即使如此,我当时还是对未来充满了希望,憧憬着工作之后的生活。
我还记得当时我们 6 个室友那会一起聊天的时候,其他 5 个室友都觉得说未来找工作能找一个 6k 的就很不错了。我当时就说:“怎么得至少也要 8k 吧!”。他们无言,觉得我的想法太天真。
其实,我当时内心想的是至少是月薪 1w 起步,只是不太好意思直接说出来。
我不爱出风头,性格有点内向。刚上大学那会,内心还是有一点不自信,干什么事情都畏畏缩缩,还是迫切希望改变自己的!
于是,凭借着一腔热血,我尝试了很多我之前从未尝试过的事情:**露营**、**户外烧烤**、**公交车演讲**、**环跑古城墙**、**徒步旅行**、**异地求生**、**圣诞节卖苹果**、**元旦晚会演出**...。
下面这些都是我和社团的小伙伴利用课外时间自己做的,在圣诞节那周基本都卖完了。我记得,为了能够多卖一些,我们还挨个去每一个寝室推销了一遍。

我还参加了大一元旦晚会,不过,那次演出我还是没放开,说实话,感觉没有表现出应该有的那味。

经过这次演出之后,我发现我是真的没有表演的天赋,很僵硬。并且,这种僵硬呆板是自己付出努力之后也没办法改变的。
下图是某一次社团聚餐,我喝的有点小醉之后,被朋友拍下的。

那时候,还经常和和社团的几位小伙伴一起去夜走荆州古城墙。

不知道社团的大家现在过得怎么样呢?
虽然这些经历对于我未来的工作和发展其实没有任何帮助,但却让我的大学生活更加完整,经历了更多有趣的事情,有了更多可以回忆的经历。
我的室友们都窝在寝室玩游戏、玩手机的时候,我很庆幸自己做了这些事情。
个人感觉,大一的时候参加一些不错的社团活动,认识一些志同道合的朋友还是很不错的!
**参加课外活动之余,CS 专业的小伙伴,尽量早一点养成一个好的编程习惯,学好一门编程语言,然后平时没事就刷刷算法题。**
### 办补习班
大一暑假的时候,我作为负责人,在孝感的小乡镇上办过 5 个补习班(本来是 7 个,后来砍掉了 2 个) 。
从租房子、租借桌椅再到招生基本都是从零开始做的。
每个周末我都会从荆州坐车跑到孝感,在各个县城之间来回跑。绝大部分时候,只有我一个人,偶尔也会有几个社团的小伙伴陪我一起。

记忆犹新,那一年孝感也是闹洪水,还挺严重的。

有一次我差点回不去学校参加期末考试。虽然没有备考,但是也没有挂过任何一门课,甚至很多科目考的还不错。不过,这还是对我绩点产生了比较大的影响,导致我后面没有机会拿到奖学金。

这次比较赶时间,所以就坐的是火车回学校。在火车上竟然还和别人撞箱子了!

当时去小乡镇上的时候,自己最差的时候住过 15 元的旅馆。真的是 15 元,你没看错。就那种老旧民房的小破屋,没有独卫,床上用品也很不卫生,还不能洗澡。
下面这个还是我住过最豪华的一个,因为当时坐客车去了孝感之后,突然下大雨,我就在车站附近找了一个相对便宜点的。

为了以更低的价钱租到房子,我经常和房东砍价砍的面红耳赤。
说句心里话,这些都是我不太愿意去做的事情,我本身属于比较爱面子而且不那么自信的人。
当时,我需要在各个乡镇来回跑,每天就直接顶着太阳晒 。每次吃饭都特别香,随便炒个蔬菜都能吃几碗米饭。
我本身是比较挑食的,这次经历让我真正体会到人饿了之后吃嘛嘛香!
我一个人给 6 个老师加上 10 来个学生和房东们一家做了一个多月的饭,我的厨艺也因此得到了很大的锻炼。

这些学生有小学的,也有初中的,都比较听话。有很多还是留守儿童,爸爸妈妈在外打工,跟着爷爷奶奶一起生活。
加上我的话,我们一共有 4 位老师,我主要讲的是初中和高中的物理课。
学生们都挺听话,没有出现和我们几个老师闹过矛盾。只有两个调皮的小学生被我训斥之后,怀恨在心,写下了一些让我忍俊不禁的话!哈哈哈哈!太可爱了!

离开之前的前一天的晚上,我和老师们商量请一些近点的同学们来吃饭。我们一大早就出去买菜了,下图是做成后的成品。虽然是比较简单的一顿饭,但我们吃的特别香。

那天晚上还有几个家长专门跑过来看我做饭,家长们说他们的孩子非常喜欢我做的饭,哈哈哈!我表面淡然说自己做的不好,实则内心暗暗自喜,就很“闷骚”的一个人,哈哈哈!
不知道这些学生们,现在怎么样呢?怀念啊!
培训班结束,我回家之后,我爸妈都以为我是逃荒回来的。
### 自己赚钱去孤儿院
大一尾声的时候,还做了一件非常有意义的事情。我和我的朋友们去了一次孤儿院(荆州私立孤儿教养院)。这个孤儿院曾经还被多家电视台报道过,目前也被百度百科收录。

孤儿院的孩子们,大多是一些无父无母或者本身有一些疾病被父母遗弃的孩子。
去之前,我们买了很多小孩子的玩具、文具、零食这些东西。这些钱的来源也比较有意义,都是我和社团的一些小伙伴自己去外面兼职赚的一些钱。

勿以善小而不为!引用《爱的风险》这首歌的一句歌词:“只要人人都献出一点爱,世界将变成美好的人间” 。
我想看看这个孤儿院的现状,于是在网上有搜了一下,看到了去年 1 月份荆州新闻网的一份报道。

孤儿教养院创办 33 年来,累计收养孤儿 85 人,其中有 5 人参军入伍报效祖国,20 人上大学,有的早已参加工作并成家立业。
叔叔也慢慢老了,白发越来越多。有点心酸,想哭,希望有机会再回去看看您!一定会的!

### 徒步旅行
大一那会还有一件让我印象非常深刻的事情——徒步旅行。
我和一群社团的小伙伴,徒步走了接近 45 公里。我们从学校的西校区,徒步走到了枝江那边的一个沙滩。

是真的全程步行,这还是我第一次走这么远。
走到目的地的时候,我的双腿已经不听使唤,脚底被磨了很多水泡。
我们在沙滩上露营,烧烤,唱歌跳舞,一直到第二天早上才踏上回学校的路程。

## 大二
到了大二,我开始把自己的重点转移到编程知识的学习上。
不过,我遇到一个让我比较纠结的问题:社团里玩的最好的几个朋友为了能让社团能继续延续下去,希望我和他们一起来继续带这个团队。
但是,我当时已经规划好了自己大二要做的事情,真的想把精力都放在编程学习上,想要好好沉淀一下自己的技术。
迫于无奈,我最终还是妥协,选择了和朋友一起带社团。毕竟,遇到几个真心的朋友属实不易!
### 带社团
带社团确实需要花费很多业余时间,除了每周要从东校区打车到西校区带着他们跑步之外,我们还需要经常带着他们组织一些活动。
比如我们一起去了长江边上烧烤露营。

再比如我们一起去环跑了古城墙。

大学那会,我还是非常热爱运动的!

大二那会,我就已经环跑了 3 次古城墙。

### 加入长大在线
在大二的时候,我还加入了学校党委宣传部下的组织——长大在线。这是一个比较偏技术性质的组织,主要负责帮学校做做网站、APP 啥的。
在百度上,还能搜索到长大在线的词条。

莫名其妙还被发了一个记者证,哈哈哈!

我选的是安卓组,然后我就开始了学习安卓开发的旅程。
刚加入这个组织的时候,我连 HTML、CSS、JS、Java、Linux 这些名词都不知道啥意思。
再到后面,我留下来当了副站长,继续为组织服务了大半年多。

### 第一次参加比赛
那会也比较喜欢去参加一些学校的比赛,也获得过一些不错的名次,让我印象最深的是一次 PPT 大赛,这也是我第一次参加学校的比赛。
参加比赛之前,自己也是一个 PPT 小白,苦心学了一周多之后,我的一个作品竟然顺利获得了第一名。

也正是因为这次比赛,我免费拥有了自己的第一个机械键盘,这个键盘陪我度过了后面的大学生活。
### 确定技术方向
在大二上学期末,我最终确定了自己以后要走的技术方向是走 Java 后端。于是,我就开始制定学习计划,开始了自己的 Java 后端领域的打怪升级之路。
每次忙到很晚,一个人走在校园的时候还是很爽的!非常喜欢这种安静的感觉。

当时身体素质真好,熬夜之后第二天照常起来上课学习。现在熬个夜,后面两天直接就废了!
到了大三,我基本把 Java 后端领域一些必备的技术都给过了一遍,还用自己学的东西做了两个实战项目。
由于缺少正确的人指导,我当时学的时候也走了很多弯路,浪费了不少时间(我很羡慕大家能有我,就很厚脸皮!)。
那个时候还贼自恋,没事就喜欢自拍一张。

国庆节的时候也不回家,继续在学校刷 Java 视频和书籍。
我记得那次国庆节的时候效率还是非常高的,学习起来也特别有动力。

## 大三
整个大三,我依然没有周末,基本没有什么娱乐时间。绝大部分时间都是一个人在寝室默默学习,平时偶尔也会去图书馆和办公室。
虽然室友经常会玩游戏和看剧什么的,但是我对我并没有什么影响。一个人戴上耳机之后,世界仿佛都是自己的。
和很多大佬可能不太一样,比起图书馆和办公室,我在寝室的学习效率更高一些。
### JavaGuide 诞生
我的开源项目 JavaGuide 和公众号都是这一年启动的。

目前的话,JavaGuide 也已经 100k star ,我的公众号也已经有 15w+ 的关注。

### 接私活赚钱
一些机遇也让我这一年也接了一些私活赚钱。为了能够顺利交付,偶尔也会熬夜。当时的心态是即使熬夜也还是很开心、充实。每次想到自己通过技术赚到了钱,就会非常有动力。
我也曾写过文章分享过接私活的经历:[唠唠嗑!大学那会接私活赚了 3w+](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247499539&idx=1&sn=ff153f9bd98bb3109b1f14e58ed9a785&chksm=cea1b0d8f9d639cee4744f845042df6b1fc319f4383b87eba76a944c2648c81a51c28d25e3b6&token=2114015135&lang=zh_CN#rd) 。
不过,我接的几个私活也是比较杂的,并不太适合作为简历上的项目经历。
于是,为了能让简历上的项目经历看着更好看一些,我自己也找了两个项目做。一个是我跟着视频一起做的,是一个商城类型的项目。另外一个是自己根据自己的想法做的,是一个视频网站类型的项目。
商城类型的项目大概的架构图如下(没有找到当时自己画的原图):

那会商城项目貌似也已经烂大街了,用的人比较多。为了让自己的商城项目更有竞争力,对照着视频教程做完之后,我加入了很多自己的元素比如更换消息队列 ActiveMQ 为 Kafka、增加二级缓存。
在暑假的时候,还和同学老师一起做了一个员工绩效管理的企业真实项目。这个项目和我刚进公司做的项目,非常非常相似,不过公司做得可能更高级点 ,代码质量也要更高一些。实在是太巧了!
我记得当时自己独立做项目的时候,遇到了很多问题。**就很多时候,你看书很容易就明白的东西,等到你实践的时候,总是会遇到一些小问题。我一般都是通过 Google 搜索解决的,用好搜索引擎真的能解决自己 99% 的问题。**
### 参加软件设计大赛
大三这一年也有遗憾吧!我和几位志同道合的朋友一起参加过一个软件设计大赛,我们花了接近两个月做的系统顺利进入了复赛。
不过,我后面因为自己个人觉得再花时间做这个系统学不到什么东西还浪费时间就直接退出了。然后,整个团队就散了。
其实,先来回头看也是可以学到东西的,自己当时的心态有点飘了吧,心态有一些好高骛远。
现在想来,还是挺对不起那些一起奋斗到深夜的小伙伴。
人生就是这样,一生很长,任何时候你回头看过去的自己,肯定都会有让自己后悔的事情。
### 放弃读研
当时,我也有纠结过是否读研,毕竟学校确实一般,读个研确实能够镀点金,提升一下学历。
不过,我最终还是放弃了读研。当时比较自信,心里就觉得自己不需要读研也能够找到好工作。
### 实习
大三还找了一家离学校不远的公司实习,一位老学长创办的。不过,说实话哈,总体实习体验很差,没有学到什么东西不说,还耽误了自己很多已经计划好的事情。
我记得当时这个公司很多项目还是在用 JSP,用的技术很老。如果是老项目还好,我看几个月前启动的项目也还是用的 JSP,就很离谱。。。
当时真的很难受,而且一来就想着让你上手干活,活还贼多,干不完还想让你免费加班。。。
当时也没办法,因为荆州实在是找不到其他公司可以让你实习,你又没办法跑到其他城市去实习。这也是放弃选择一二线城市的学校带来的问题吧!
## 大四
### 开始找工作
找实习找工作时候,才知道大学所在的城市的重要性。
由于,我的学校在荆州,而且本身学校就很一般,因此,基本没有什么比较好的企业来招人。
当时,唯一一个还算可以的就是苏宁,不过,我遇到的那个苏宁的 HR 还挺恶心的,第一轮面试的时候就开始压薪资了,问我能不能加班。然后,我也就对苏宁没有了想法。
秋招我犯了一个比较严重的问题,那就是投递简历开始的太晚。我是把学校的项目差不多做完之后,才开始在网上投递简历。这个时候,暑假差不多已经结束了,秋招基本已经尾声了。
可能也和学校环境有一些关系,当时,身边的同学没有参加秋招的。大三暑假的时候,都跑去搞学院组织的实习。我是留在学校做项目,没有去参加那次实习。
我觉得学校还是非常有必要提醒学生们把握住秋招这次不错的机会的!
在网上投递了一些简历之后,很多笔试我觉得做的还可以的都没有回应。
我有点慌了!于是,我就从荆州来到武汉,想在武大华科这些不错的学校参加一些宣讲会。
到了武汉之后,我花了一天时间找了一个蛋壳公寓住下。第二天,我就跑去武汉理工大学参加宣讲会。

当天,我就面试了自己求职过程中的第一家公司—**玄武科技**。
就是这样一家中小型的公司,当时来求职面试的很多都是武大华科的学生。不过,他们之中一定有很多人和我一样,就是单纯来刷一波经验,找找信心。
整个过程也就持续了 3 天左右,我就顺利的拿下了玄武科技的 offer。不过,最终没有签约。
### 拿到 Offer
来武汉之前,我实际上已经在网上投递了 **ThoughtWorks**,并且,作业也已经通过了。
当时,我对 ThoughtWorks 是最有好感的,内心的想法就是:“拿下了 ThoughtWorks,就不再面试其他公司了”。
奈何 ThoughtWorks 的进度太慢,担心之余,才来武汉面试其他公司留个保底。
不过,我最终如愿以偿获得了 ThoughtWorks 的 offer。

面试 ThoughtWorks 的过程就不多说了,我在[《结束了我短暂的秋招,说点自己的感受》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484842&idx=1&sn=4489dfab0ef2479122b71407855afc71&chksm=cea24a61f9d5c3774a8ed67c5fcc3234cb0741fbe831152986e5d1c8fb4f36a003f4fb2f247e&scene=178&cur_album_id=1323354342556057602#rd)这篇文章中有提到。
## 几点建议
说几点自己的建议,虽然我不优秀,但毕竟你可以更优秀:
1. 确定好自己的方向,搞清你是要考研还是要找工作。如果你要考研的话,好好上每一门可能是考研的科目,平时有时间也要敲代码,最好也能做一个项目,对你复试还有能力提升都有帮助。找工作的话,尽早确定好自己的方向,心里有一个规划,搞清自己的优势和劣势。
2. 尽可能早一点以求职为导向来学习,这样更有针对性,并且可以大概率减己处在迷茫的时间,很大程度上还可以让自己少走很多弯路。
3. 自学很重要,养成自学的习惯,学会学习。
4. 不要觉得逃课就是坏学生。我大学逃了很多课,逃课的大部分时间都是在学自己觉得更重要的东西,逃的大部分也是不那么重要并且不会影响我毕业的课。
5. 大学恋爱还是相对来说很纯粹的,遇到合适的可以尝试去了解一下, 别人不喜欢你的话不要死缠烂打,这种东西强求不来。你不得不承认,你了解一个人欲望还是始于他的长相而并不是有趣的灵魂。
6. 管理自己的身材,没事去跑跑步,别当油腻男。
7. 别太看重绩点。我觉得绩点对于找工作还有考研实际的作用都可以忽略不计,不过不挂科还是比较重要的。但是,绩点确实在奖学金评选和保研名额选取上占有最大的分量。
8. 别太功利性。做事情以及学习知识都不要奢求它能立马带给你什么,坚持和功利往往是成反比的。
9. ……
## 后记
我们在找工作的过程中难免会遇到卡学历的情况,特别是我们这种学校本身就比较一般的。我觉得这真的不可厚非,没有什么不公平,要怪就只能怪自己没有考上好的学校。
**考虑到招聘成本和时间,公司一定更愿意在学校本身比较好的人中选拔人才。**
我也曾抱怨过自己为什么不在 211 或者 985 的学校。但,其实静下心来想一想,本来考不上 211 或者 985 就是自己的问题,而且在我们计算机这个领域,学历本身就相对于其他专业稍微要更加公平一点。
我身边专科、三本毕业就进大厂的人也比比皆是。我这句话真不是鸡汤,为了鼓励一些学校出身不太好的朋友。
**多行动,少抱怨。**
================================================
FILE: docs/about-the-author/writing-technology-blog-six-years.md
================================================
---
title: 坚持写技术博客六年了!
description: 坚持写技术博客六年的心得分享,写博客的好处、如何坚持下去、写哪些方向的博客、实用写作技巧等经验总结。
category: 走近作者
tag:
- 杂谈
---
坚持写技术博客已经有六年了,也算是一个小小的里程碑了。
一开始,我写技术博客就是简单地总结自己课堂上学习的课程比如网络、操作系统。渐渐地,我开始撰写一些更为系统化的知识点详解和面试常见问题总结。

许多人都想写技术博客,但却不清楚这对他们有何好处。有些人开始写技术博客,却不知道如何坚持下去,也不知道该写些什么。这篇文章我会认真聊聊我对记录技术博客的一些看法和心得,或许可以帮助你解决这些问题。
## 写技术博客有哪些好处?
### 学习效果更好,加深知识点的认识
**费曼学习法** 大家应该已经比较清楚了,这是一个经过实践证明非常有效的学习方式。费曼学习法的命名源自 Richard Feynman,这位物理学家曾获得过诺贝尔物理学奖,也曾参与过曼哈顿计划。
所谓费曼学习法,就是当你学习了一个新知识之后,想象自己是一个老师:用最简单、最浅显直白的话复述、表达复杂深奥的知识,最好不要使用行业术语,让非行业内的人也能听懂。为了达到这种效果,最好想象你是在给一个 80 多岁或 8 岁的小孩子上课,甚至他们都能听懂。

看书、看视频这类都属于是被动学习,学习效果比较差。费曼学习方法属于主动学习,学习效果非常好。
**写技术博客实际就是教别人的一种方式。** 不过,记录技术博客的时候是可以有专业术语(除非你的文章群体是非技术人员),只是你需要用自己的话表述出来,尽量让别人一看就懂。**切忌照搬书籍或者直接复制粘贴其他人的总结!**
如果我们被动的学习某个知识点,可能大部分时候都是仅仅满足自己能够会用的层面,你并不会深究其原理,甚至很多关键概念都没搞懂。
如果你是要将你所学到的知识总结成一篇博客的话,一定会加深你对这个知识点的思考。很多时候,你为了将一个知识点讲清楚,你回去查阅很多资料,甚至需要查看很多源码,这些细小的积累在潜移默化中加深了你对这个知识点的认识。
甚至,我还经常会遇到这种情况:**写博客的过程中,自己突然意识到自己对于某个知识点的理解存在错误。**
**写博客本身就是一个对自己学习到的知识进行总结、回顾、思考的过程。记录博客也是对于自己学习历程的一种记录。随着时间的流逝、年龄的增长,这又何尝不是一笔宝贵的精神财富呢?**
知识星球的一位球友还提到写技术博客有助于完善自己的知识体系:

### 帮助别人的同时获得成就感
就像我们程序员希望自己的产品能够得到大家的认可和喜欢一样。我们写技术博客在某一方面当然也是为了能够得到别人的认可。
**当你写的东西对别人产生帮助的时候,你会产生成就感和幸福感。**

这种成就感和幸福感会作为 **正向反馈** ,继续激励你写博客。
但是,即使受到很多读者的赞赏,也要保持谦虚学习的太多。人外有人,比你技术更厉害的读者多了去,一定要虚心学习!
当然,你可以可能会受到很多非议。可能会有很多人说你写的文章没有深度,还可能会有很多人说你闲的蛋疼,你写的东西网上/书上都有。
**坦然对待这些非议,做好自己,走好自己的路就好!用行动自证!**
### 可能会有额外的收入
写博客可能还会为你带来经济收入。输出价值的同时,还能够有合理的经济收入,这是最好的状态!
为什么说是可能呢? **因为就目前来看,大部分人还是很难短期通过写博客有收入。我也不建议大家一开始写博客就奔着赚钱的目的,这样功利性太强了,效果可能反而不好。就比如说你坚持了写了半年发现赚不到钱,那你可能就会坚持不下去了。**
我自己从大二开始写博客,大三下学期开始将自己的文章发布到公众号上,一直到大四下学期,才通过写博客赚到属于自己的第一笔钱。
第一笔钱是通过微信公众号接某培训机构的推广获得的。没记错的话,当时通过这个推广为自己带来了大约 **500** 元的收入。虽然这不是很多,但对于还在上大学的我来说,这笔钱非常宝贵。那时我才知道,原来写作真的可以赚钱,这也让我更有动力去分享自己的写作。可惜的是,在接了两次这家培训机构的广告之后,它就倒闭了。
之后,很长一段时间我都没有接到过广告。直到网易的课程合作找上门,一篇文章 1000 元,每个月接近一篇,发了接近两年,这也算是我在大学期间比较稳定的一份收入来源了。

老粉应该大部分都是通过 JavaGuide 这个项目认识我的,这是我在大三开始准备秋招面试时创建的一个项目。没想到这个项目竟然火了一把,一度霸占了 GitHub 榜单。可能当时国内这类开源文档教程类项目太少了,所以这个项目受欢迎程度非常高。

项目火了之后,有一个国内比较大的云服务公司找到我,说是要赞助 JavaGuide 这个项目。我既惊又喜,担心别人是骗子,反复确认合同之后,最终确定以每月 1000 元的费用在我的项目首页加上对方公司的 banner。
随着时间的推移,以及自己后来写了一些比较受欢迎、比较受众的文章,我的博客知名度也有所提升,通过写博客的收入也增加了不少。
### 增加个人影响力
写技术博客是一种展示自己技术水平和经验的方式,能够让更多的人了解你的专业领域知识和技能。持续分享优质的技术文章,一定能够在技术领域增加个人影响力,这一点是毋庸置疑的。
有了个人影响力之后,不论是对你后面找工作,还是搞付费知识分享或者出书,都非常有帮助。
拿我自己来说,已经很多知名出版社的编辑找过我,协商出一本的书的事情。这种机会应该也是很多人梦寐以求的。不过,我都一一拒绝了,因为觉得自己远远没有达到能够写书的水平。

其实不出书最主要的原因还是自己嫌麻烦,整个流程的事情太多了。我自己又是比较佛系随性的人,平时也不想把时间都留给工作。
## 怎样才能坚持写技术博客?
**不可否认,人都是有懒性的,这是人的本性。我们需要一个目标/动力来 Push 一下自己。**
就技术写作而言,你的目标可以以技术文章的数量为标准,比如:
- 一年写多少篇技术文章。我个人觉得一年的范围还是太长了,不太容易定一个比较合适的目标。
- 每月输出一篇高质量的技术文章。这个相对容易实现一些,每月一篇,一年也有十二篇了,也很不错了。
不过,以技术文章的数量为目标有点功利化,文章的质量同样很重要。一篇高质量的技术文可能需要花费一周甚至半个月的业余时间才能写完。一定要避免自己刻意追求数量,而忽略质量,迷失技术写作的本心。
我个人给自己定的目标是:**每个月至少写一篇原创技术文章或者认真修改完善过去写的三篇技术文章** (像开源项目推荐、开源项目学习、个人经验分享、面经分享等等类型的文章不会被记入)。
我的目标对我来说比较容易完成,因此不会出现为了完成目标而应付任务的情况。在我状态比较好,工作也不是很忙的时候,还会经常超额完成任务。下图是我今年 3 月份完成的任务(任务管理工具:Microsoft To-Do)。除了 gossip 协议是去年写的之外,其他都是 3 月份完成的。

如果觉得以文章数量为标准过于功利的话,也可以比较随性地按照自己的节奏来写作。不过,一般这种情况下,你很可能过段时间就忘了还有这件事,开始慢慢抵触写博客。
写完一篇技术文章之后,我们不光要同步到自己的博客,还要分发到国内一些常见的技术社区比如博客园、掘金。**分发到其他平台的原因是获得关注进而收获正向反馈(动力来源之一)与建议,这是技术写作能坚持下去的非常重要的一步,一定要重视!!!**
说实话,当你写完一篇自认为还不错的文章的幸福感和成就感还是有的。**但是,让自己去做这件事情还是比较痛苦的。** 就好比你让自己出去玩很简单,为了达到这个目的,你可以有各种借口。但是,想要自己老老实实学习,还是需要某个外力来督促自己的。
## 写哪些方向的博客比较好?
通常来说,写下面这些方向的博客会比较好:
1. **详细讲解某个知识点**:一定要有自己的思考而不是东拼西凑。不仅要介绍知识点的基本概念和原理,还需要适当结合实际案例和应用场景进行举例说明。
2. **问题排查/性能优化经历**:需要详细描述清楚具体的场景以及解决办法。一定要有足够的细节描述,包括出现问题的具体场景、问题的根本原因、解决问题的思路和具体步骤等等。同时,要注重实践性和可操作性,帮助读者更好地学习理解。
3. **源码阅读记录**:从一个功能点出发描述其底层源码实现,谈谈你从源码中学到了什么。
最重要的是一定要重视 Markdown 规范,不然内容再好也会显得不专业。
详见 [Markdown 规范](../javaguide/contribution-guideline.md) (很重要,尽量按照规范来,对你工作中写文档会非常有帮助)
## 有没有什么写作技巧分享?
### 句子不要过长
句子不要过长,尽量使用短句(但也不要太短),这样读者更容易阅读和理解。
### 尽量让文章更加生动有趣
尽量让文章更加生动有趣,比如你可以适当举一些形象的例子、用一些有趣的段子、歇后语或者网络热词。
不过,这个也主要看你的文章风格。
### 使用简单明了的语言
避免使用阅读者可能无法理解的行话或复杂语言。
注重清晰度和说服力,保持简单。简单的写作是有说服力的,一个五句话的好论点会比一百句话的精彩论点更能打动人。为什么格言、箴言这类文字容易让人接受,与简洁、直白也有些关系。
### 使用视觉效果
图表、图像等视觉效果可以让朴素的文本内容更容易理解。记得在适当的地方使用视觉效果来增强你的文章的表现力。

### 技术文章配图色彩要鲜明
下面是同样内容的两张图,都是通过 drawio 画的,小伙伴们更喜欢哪一张呢?
我相信大部分小伙伴都会选择后面一个色彩更鲜明的!
色彩的调整不过花费了我不到 30s 的时间,带来的阅读体验的上升却是非常之大!

### 确定你的读者
写作之前,思考一下你的文章的主要受众全体是谁。受众群体确定之后,你可以根据受众的需求和理解水平调整你的写作风格和内容难易程度。
### 审查和修改
在发表之前一定要审查和修改你的文章。这将帮助你发现错误、澄清任何令人困惑的信息并提高文档的整体质量。
**好文是改出来的,切记!!!**
## 总结
总的来说,写技术博客是一件利己利彼的事情。你可能会从中收获到很多东西,你写的东西也可能对别人也有很大的帮助。但是,写技术博客还是比较耗费自己时间的,你需要和工作以及生活做好权衡。
================================================
FILE: docs/about-the-author/zhishixingqiu-two-years.md
================================================
---
title: 我的知识星球 6 岁了!
description: JavaGuide知识星球介绍,提供Java面试指北专栏、简历修改、一对一答疑等服务,已帮助9000+球友提升求职竞争力。
category: 知识星球
star: 2
---
在 **2019 年 12 月 29 号**,经过了大概一年左右的犹豫期,我正式确定要开始做一个自己的星球,帮助学习 Java 和准备 Java 面试的同学。一转眼,已经六年了。感谢大家一路陪伴,我会信守承诺,继续认真维护这个纯粹的 Java 知识星球,不让信任我的读者失望。

我是比较早一批做星球的技术号主,也是坚持做下来的那一少部人(大部分博主割一波韭菜就不维护星球了)。最开始的一两年,纯粹靠爱发电。当初定价非常低(一顿饭钱),加上刚工作的时候比较忙,提供的服务也没有现在这么多。
慢慢的价格提上来,星球的收入确实慢慢也上来了。不过,考虑到我的受众主要是学生,定价依然比同类星球低很多。另外,我也没有弄训练营的打算,虽然训练营对于我这个流量来说可以赚到更多钱。
**我有自己的原则,不割韭菜,用心做内容,真心希望帮助到他人!**
## 我的知识星球评价如何?
知识星球是一个私密、长期的知识社群,用来连接创作者和铁杆读者。相比微信群,它更适合沉淀内容、做系统化的学习和信息管理。
下面是今年收到了部分好评,每一条都是真实存在的。我看到很多培训班或者机构通过虚构一些不存在的好评来欺骗他人购买高价服务(行业内非常常见),真的很难理解。

在这里,不只有理论,更有具体、可落地的求职/转行指导:
- 有球友入球后,在多次一对一建议下,很快就收到了美国大模型应用开发的面试并通过;
- 有球友在指导下顺利转行,拿到满意的中厂 Offer。
不少球友评价我是“良心博主”:深夜 11 点多还在帮忙改简历、给建议;对非科班、大龄转行等焦虑问题,也会耐心一一解答,做到有问必回。
口碑是最好的证明!这里有连续续费三年的老球友,也有因为信任而把星球推荐给弟弟妹妹的朋友。
下面是部分球友今年的求职战绩分享(只是一小部分,有校招,也有社招),同样完全真实。每年面试季之后,星球就有大量的球友询问 offer 如何选择。

## 我的知识星球能为你提供什么?
致力于打造最优质的 Java 面试交流星球(后端面试通用)!加入我们,你将获得远超票价的一站式成长服务:
💎 **核心面试求职服务**
- **简历深度精修**:提供免费的一对一简历修改服务(已累计帮助 **9000+** 位球友,好评如潮)。
- **6 大精品专栏**:永久阅读权限,内容涵盖高频面试题、源码解析、实战项目,构建完整知识体系。
- **独家面试手册**:多本原创 PDF 后端面试手册免费领取,全网独家。
- **有问必答**:一对一免费提问,提供专属求职指南,拒绝焦虑。
**🚀 实战项目**
星球已经推出的实战项目如下:
- [⭐AI 智能面试辅助平台 + RAG 知识库](https://javaguide.cn/zhuanlan/interview-guide.html):基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 开发。非常适合作为学习和简历项目,学习门槛低,帮助提升求职竞争力,是主打就业的实战项目。
- [手写 RPC 框架](https://javaguide.cn/zhuanlan/handwritten-rpc-framework.html):从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。麻雀虽小五脏俱全,项目代码注释详细,结构清晰。
今年陆续还会推出更多企业级实战案例(预告一下,下一个是大家期待的:**企业智能客服**)!
🔥 **氛围与福利**
- **海量资源**:Java 优质面试资源持续更新分享。
- **抱团成长**:打卡活动、读书交流、线下聚会,让学习之路不再孤单。
- **惊喜福利**:不定期节日抽奖、送书送课,福利拿到手软。
💡 **总结**:这里的任何一项服务(尤其是简历修改和面试资料),单独拎出来的价值都已远超星球门票。
目前星球正在做活动,两本书的价格,就能让你拥有上万培训班的服务!
这里再提供一张 **30**元的优惠卷(**价格马上上调,老用户扫码续费半价** ):

### 专属专栏
星球更新了 **《Java 面试指北》**、**《Java 必读源码系列》**(目前已经整理了 Dubbo 2.6.x、Netty 4.x、SpringBoot2.1 的源码)、 **《从零开始写一个 RPC 框架》**(已更新完)、**《Kafka 常见面试题/知识点总结》** 等多个优质专栏。

《Java 面试指北》内容概览:

进入星球之后,这些专栏即可免费永久阅读,永久同步更新!
### 实战项目
星球已经推出的实战项目如下:
- [⭐AI 智能面试辅助平台 + RAG 知识库](https://javaguide.cn/zhuanlan/interview-guide.html):基于 Spring Boot 4.0 + Java 21 + Spring AI 2.0 开发。非常适合作为学习和简历项目,学习门槛低,帮助提升求职竞争力,是主打就业的实战项目。
- [手写 RPC 框架](https://javaguide.cn/zhuanlan/handwritten-rpc-framework.html):从零开始基于 Netty+Kyro+Zookeeper 实现一个简易的 RPC 框架。麻雀虽小五脏俱全,项目代码注释详细,结构清晰。
今年陆续还会推出更多企业级实战案例!并且,星球还分享了很多高频项目经历的优化版介绍和面试准备(持续更新中)。

### PDF 面试手册
进入星球就免费赠送多本优质 PDF 面试手册。

### 优质精华主题沉淀
星球沉淀了几年的优质精华主题,内容涵盖面经、面试题、工具网站、技术资源、程序员进阶攻略等内容,干货非常多。

并且,每个月都会整理出当月优质的主题,方便大家阅读学习,避免错过优质的内容。毫不夸张,单纯这些优质主题就足够门票价值了。

加入星球之后,一定要记得抽时间把星球精华主题看看,相信你一定会有所收货!
JavaGuide 知识星球优质主题汇总传送门:<https://www.yuque.com/snailclimb/rpkqw1/ncxpnfmlng08wlf1>(为了避免这里成为知识杂货铺,我会对严格筛选入选的优质主题)。

### 简历修改
一到面试季,我平均一天晚上至少要看 15 ~30 份简历。过了面试季的话,找我看简历的话会稍微少一些。要不然的话,是真心顶不住!

简单统计了一下,到目前为止,我至少帮助 **9000+** 位球友提供了免费的简历修改服务。

我会针对每一份简历给出详细的修改完善建议,用心修改,深受好评!

### 一对一提问
加入即可解锁 **1 V 1 免费提问权益**,拒绝敷衍和套话,我会结合你的实际情况,给出最真诚、最落地的建议。
数据是最好的证明:截至目前,我已在星球内累计深度答疑 **10000+** 次,微信私聊帮助球友 **5000+** 人。无论是技术瓶颈还是职场迷茫,我都愿做你破局路上的引路人。
下面是今年做的一小部分答疑,感受一下:

我没法保证每个问题都能像上面这样写一长段,这也会取决于你的提问本身。但我可以承诺的是:**我会认真看完每一个问题,尽我所能帮你少走弯路、少花冤枉钱。**
光是这项一对一答疑服务,其实就已经远远值回星球的门票价了。
### 学习打卡
星球的学习打卡活动可以督促自己和其他球友们一起学习交流。

看球友们的打卡也能有收货,最重要的是这个学习氛围对于自己自律非常有帮助!

!
### 不定时福利
不定时地在星球送书、送专栏、发红包,福利多多,

## 是否收费?
星球是需要付费才能进入的。 **为什么要收费呢?**
1. 维护好星球是一件费时费力的事情,每到面试季,我经常凌晨还在看简历和回答球友问题。市面上单单一次简历修改服务也至少需要 200+,而简历修改也只是我的星球提供的服务的冰山一角。除此之外,我还要抽时间写星球专属的面试专栏和实战项目教程,单单是这些专栏和项目的价值就远超星球门票了。
2. 星球提供的服务比较多,如果我是免费提供这些服务的话,是肯定忙不过来的。付费这个门槛可以帮我筛选出真正需要帮助的那批人。
3. 免费的东西才是最贵的,加入星球之后无任何其他需要付费的项目,统统免费!
4. 合理的收费是对我付出劳动的一种正向激励,促进我继续输出!同时,这份收入还可以让我们家人过上更好的生活。虽然累点,但也是值得的!
## 如何加入?
目前星球正在做活动,两本书的价格,就能让你拥有上万培训班的服务!
这里再提供一张 **30**元的优惠卷(**价格马上上调,老用户扫码续费半价** ):

🚀 **入圈必做**:星球大部分资料都已经整理分类好放在了[星球使用指南](https://t.zsxq.com/0d18KSarv)中,干货满满,一定要看!
**无任何套路,无任何潜在收费项。用心做内容,不割韭菜!**
不过, **一定要确定需要再进** 。并且, **三天之内觉得内容不满意可以全额退款** 。
================================================
FILE: docs/ai/README.md
================================================
---
title: AI 应用开发面试指南
description: 深入浅出掌握 AI 应用开发核心知识,涵盖大模型基础、Agent、RAG、MCP 协议、AI 编程实战等高频面试考点,适合校招/社招 AI 应用开发岗位面试复习。
icon: "ai"
head:
- - meta
- name: keywords
content: AI面试,AI面试指南,AI应用开发,LLM面试,Agent面试,RAG面试,MCP面试,AI编程面试,AI编程实战
---
::: tip 写在前面
现在网上有很多所谓"AI 技术文章",点进去一看,满篇空洞的套话,逻辑混乱,甚至还有明显的 AI 生成痕迹——"作为一个 AI 语言模型..."这种低级错误都来不及删。
这类文章有几个共同特点:
- **内容堆砌**:大量概念罗列,但没有真正讲清楚原理,读完云里雾里。
- **缺乏实战视角**:纸上谈兵,没有真实的项目踩坑经验。
- **没有配图**:全是文字,读者很难建立直观的认知。
- **正确性存疑**:很多技术细节经不起推敲,甚至存在明显错误。
我在写这一系列 AI 文章的时候,坚持一个原则:**要么不写,要写就写透**。每一篇文章我都投入了大量时间:
- **深度调研**:查阅官方文档、技术博客、学术论文,确保内容准确。
- **精心配图**:绘制了几十张精美配图帮助理解。
- **实战导向**:内容都来自真实项目的踩坑经验,不是纸上谈兵。
- **反复打磨**:每篇文章都修改了十几遍,确保逻辑清晰、表达准确。
希望这些文章能真正帮到你。
:::
::: warning 持续更新中
AI 面试系列目前正在**持续更新中**,后续会陆续补充更多高频面试考点。
当前内容可能还不够完善,如果你有想要了解的主题或任何建议,欢迎在项目 issue 区留言反馈。
:::
## 这个专栏能帮你解决什么问题?
如果你正在准备 AI 应用开发相关的面试,或者想要系统学习 AI 应用开发的核心知识,这个专栏就是为你准备的。
通过这个专栏,你将获得:
### 1. 扎实的大模型基础知识
很多开发者在构建 Agent 工作流或调优 RAG 检索时,往往会在最底层的 LLM 参数上踩坑。比如:
- 为什么明明设置了温度为 0,结构化输出还是偶尔崩溃?
- 为什么往模型里塞了长文档后,它好像失忆了,忽略了 System Prompt 里的关键指令?
- Token 到底怎么算的?为什么中文和英文的消耗不一样?
这些问题,如果你不理解 LLM 的底层原理,就永远只能"知其然不知其所以然"。在[《万字拆解 LLM 运行机制》](./llm-basis/llm-operation-mechanism.md)中,我会带你扒开 LLM 的黑盒,把 Token、上下文窗口、Temperature 等概念还原为清晰、可控的工程概念。
### 2. 系统的 AI Agent 知识体系
AI Agent 是当下 AI 应用开发最热门的方向。但网上的资料要么太浅,要么太散,很难形成系统的认知。
在[《一文搞懂 AI Agent 核心概念》](./agent/agent-basis.md)中,我会带你:
- 梳理 AI Agent 从 2022 年到 2025 年的六代进化史
- 理解 Agent、传统编程、Workflow 三者的本质区别
- 掌握 Agent Loop、Context Engineering、Tools 注册等核心概念
### 3. 深入理解 RAG 检索增强生成
RAG 是企业级 AI 应用的核心技术。但很多开发者只知道"把文档切成块,转成向量,然后检索"这个流程,却不理解背后的原理。
在 RAG 系列文章中,我会带你深入理解:
- [《万字详解 RAG 基础概念》](./rag/rag-basis.md):RAG 是什么?为什么需要 RAG?RAG 的核心优势和局限性是什么?
- [《万字详解 RAG 向量索引算法和向量数据库》](./rag/rag-vector-store.md):HNSW、IVFFLAT 等索引算法的原理是什么?如何选择合适的向量数据库?
### 4. 掌握工具与协议
在 AI 应用开发中,工具接入的碎片化是一个大问题。MCP 协议的出现,就是要解决这个问题。
在[《万字拆解 MCP 协议》](./agent/mcp.md)中,我会带你理解:
- MCP 是什么?为什么被称为"AI 领域的 USB-C 接口"?
- MCP 的四大核心能力和四层分层架构
- 生产环境下开发 MCP Server 的最佳实践
在[《万字详解 Agent Skills》](./agent/skills.md)中,我会带你理解:
- Skills 是什么?为什么说它是"延迟加载"的 sub-agent?
- Skills 和 Prompt、MCP、Function Calling 的本质区别
- 如何在实战中设计优秀的 Skill
### 5. AI 编程面试准备
AI 编程工具正在深刻改变开发者的工作方式。在面试中,你可能会被问到:
- 用过什么 AI 编程 IDE?有什么使用技巧?
- 如何看待 AI 对后端开发的影响?AI 会淘汰程序员吗?
- 未来程序员的核心竞争力是什么?
在[《AI 编程开放性面试题》](./llm-basis/ai-ide.md)中,我会分享 7 道高频开放性面试问题的回答思路。
### 6. AI 编程实战
纸上得来终觉浅。只有亲手用过 AI 编程工具,才能真正理解它的工作边界和使用技巧。在 AI 编程实战系列中,我会通过真实场景的实战案例,分享 AI 辅助编程的使用经验:
- [《IDEA 搭配 Qoder 插件实战》](./ai-coding/idea-qoder-plugin.md):从接口优化到代码重构,展示如何在 JetBrains IDE 中利用 AI 完成从分析到落地的完整闭环
- [《Trae + MiniMax 多场景实战》](./ai-coding/trae-m2.7.md):使用 Trae IDE 接入 MiniMax 大模型,通过 Redis 故障排查和跨语言重构场景,分享 AI 辅助编程的实战经验与踩坑心得
## 文章列表
### 大模型基础
- [万字拆解 LLM 运行机制:Token、上下文与采样参数](./llm-basis/llm-operation-mechanism.md) - 深入剖析大模型底层原理,把 Token、上下文窗口、Temperature 等概念还原为清晰、可控的工程概念
- [AI 编程开放性面试题](./llm-basis/ai-ide.md) - 7 道高频开放性面试问题,涵盖 AI 编程 IDE 使用技巧、AI 对后端开发的影响等
### AI Agent
- [一文搞懂 AI Agent 核心概念](./agent/agent-basis.md) - 梳理 AI Agent 六代进化史,掌握 Agent Loop、Context Engineering、Tools 注册等核心概念
- [万字详解 Agent Skills](./agent/skills.md) - 深入理解 Skills 的设计理念,掌握 Skills 与 Prompt、MCP、Function Calling 的本质区别
- [万字拆解 MCP 协议,附带工程实践](./agent/mcp.md) - 理解 MCP 协议的核心概念、架构设计和生产级最佳实践
### RAG(检索增强生成)
- [万字详解 RAG 基础概念](./rag/rag-basis.md) - 深入理解 RAG 的工作原理、核心优势和局限性
- [万字详解 RAG 向量索引算法和向量数据库](./rag/rag-vector-store.md) - 掌握 HNSW、IVFFLAT 等索引算法原理,学会选择合适的向量数据库
### AI 编程实战
- [IDEA + Qoder 插件多场景实战:接口优化与代码重构](./ai-coding/idea-qoder-plugin.md) - 通过深分页优化、祖传代码重构两个真实案例,展示 AI 辅助编程的实战效果
- [Trae + MiniMax 多场景实战:Redis 故障排查与跨语言重构](./ai-coding/trae-m2.7.md) - 使用 Trae IDE 接入 MiniMax 大模型,通过 Redis 故障排查和跨语言重构场景,分享 AI 辅助编程的实战经验
## 配图预览
为了帮助读者更好地理解抽象的技术概念,我在每篇文章中都绘制了大量配图。这里展示几张:

_上下文窗口是 LLM 的"工作记忆",决定了模型能处理的最大文本量_

_RAG 的核心思想:先检索相关上下文,再让 LLM 基于上下文生成回答_

_MCP 被称为"AI 领域的 USB-C 接口",统一了 LLM 与外部工具的通信规范_
## 写在最后
AI 技术发展很快,但核心原理是相通的。我希望这个专栏不仅能帮你通过面试,更能帮你建立扎实的知识体系,让你在面对新技术时能够快速理解和上手。
如果你觉得这些文章对你有帮助,欢迎分享给身边的朋友。如果有任何问题或建议,也欢迎联系我或者项目 issue 区留言。
---

================================================
FILE: docs/ai/agent/agent-basis.md
================================================
---
title: 一文搞懂 AI Agent 核心概念:Agent Loop、Context Engineering、Tools 注册
description: 深入解析 AI Agent 核心概念,梳理从被动响应到常驻自治的六代进化史,对比 Agent、传统编程、Workflow 的本质区别。
category: AI 应用开发
icon: "robot"
head:
- - meta
- name: keywords
content: AI Agent,智能体,ReAct,Function Calling,RAG,MCP,多智能体协作,Computer Use
---
还记得第一次被 ChatGPT 震撼的时刻吗?那时它还是个需要你费尽心思写提示词的"静态百科全书"。然而短短三年过去,AI 的进化速度早已超越了我们的想象——它不仅长出了"四肢",学会了自己调用工具、自己操作电脑屏幕,甚至正在朝着 24 小时全自动打工的"数字实体"狂奔!
**AI Agent(智能体)** 正在从"聊天工具"向"超级生产力"狂奔,这是当下 AI 应用开发最热门的方向之一。无论是 OpenAI 的 Assistant API、Anthropic 的 Claude Agent,还是各种低代码平台(Coze、Dify),都在围绕 Agent 这个核心概念展开。
今天 Guide 就来系统梳理 AI Agent 的核心概念,帮你建立完整的知识体系。本文接近 1.5w 字,建议收藏,通过本文你将搞懂:
1. **AI Agent 六代进化史**:从 2022 年的被动响应到 2025 年的常驻自治,Agent 经历了怎样的演进?每一代的核心特征和技术突破是什么?
2. ⭐ **Agent vs 传统编程 vs Workflow**:三者的本质区别是什么?为什么说"传统编程和 Workflow 是人在做决策,Agent 是 AI 在做决策"?
3. ⭐ **Agent Loop(智能体循环)**:Agent 是如何通过"感知-思考-行动"的循环来完成复杂任务的?ReAct、Reflection 等推理模式是如何工作的?
4. ⭐ **Context Engineering(上下文工程)**:如何设计 System Prompt?如何管理多轮对话的上下文?如何避免上下文溢出?
5. ⭐ **Tools 注册与 Function Calling**:Agent 如何调用外部工具?Function Calling 的底层机制是什么?如何设计可靠的工具接口?
## 背景与演进
### AI Agent 六代进化史
还记得第一次被 ChatGPT 震撼的时刻吗?那时它还是个需要你费尽心思写提示词的“静态百科全书”。
然而短短三年过去,AI 的进化速度早已超越了我们的想象——它不仅长出了“四肢”,学会了自己调用工具、自己操作电脑屏幕,甚至正在朝着 24 小时全自动打工的“数字实体”狂奔!
从最初的“被动响应”到未来的“具身智能”,AI Agent(智能体)到底经历了怎样的疯狂迭代?今天,我们就来一次性硬核梳理 **AI Agent 的六代进化史**。带你看懂 AI 从聊天工具到超级生产力的终极演进路线图!👇
1. **第 0 代(2022年底):被动响应。** 以 ChatGPT 为代表,依赖提示词工程(Prompt Engineering),本质是“静态知识预言机”,无法感知实时世界且缺乏行动能力。
2. **第 1 代(2023年中):工具觉醒。** 引入 Function Calling (允许模型调用外部API)和 RAG 技术(增强外部知识检索,虽 2020 年提出,但 2023 年广泛应用),赋予 AI “执行四肢”与外部记忆。AutoGPT 是早期代理尝试,但确实因无限循环和缺乏可靠规划而效率低(常被称为“hallucination-prone”)。
3. **第 2 代(2023年底):工程化编排。** 确立 ReAct 推理框架,推广多智能体协作模式。Coze、Dify 等低代码平台降低了开发门槛,强调流程的可控性。这代强调从混乱自治到工程化,如通过DAG(有向无环图)避免AutoGPT的低效。
4. **第 3 代(2024年底):标准化与多模态。** MCP 协议(Model Context Protocol)终结了集成碎片化,Computer Use 允许 Agent 通过屏幕、鼠标、键盘交互图形界面(多模态扩展)。Cursor 等 AI 编程工具推动了“Vibe Coding”(氛围编程,使用 AI 根据自然语言提示生成功能代码)。
5. **第 4 代(2025年底):常驻自治。** 核心是 Agent Skills 技能封装和 Heartbeat 心跳机制(OpenClaw、Moltbook等普及),使 Agent 成为 24 小时后台运行、具备本地数据主权的“数字实体”。
6. **第 5 代(前瞻):闭环与具身。** 进化方向为内建记忆、具备预测能力的世界模型,并从数字世界扩展至物理机器人领域。
### ⭐️ Agent、传统编程、Workflow 三者的本质区别是什么?
**传统编程和 Workflow 是人在做决策,Agent 是 AI 在做决策。** 这是最本质的区别,其他差异(灵活性、门槛、维护成本)都从这一点派生而来。
**从决策主体看:**
```ebnf
传统编程:程序员 ──→ 代码 ──→ 执行结果
Workflow:产品/开发 ──→ 流程图 ──→ 执行结果
Agent:用户描述意图 ──→ AI 决策 ──→ 动态执行
```
一句话总结:**传统编程和 Workflow 都是人在做决策、提前设计好所有逻辑,而 Agent 是 AI 在做决策**。
**从三个核心维度对比:**
**1. 决策与灵活性**
| 方式 | 遇到预设外的情况时... |
| -------- | -------------------------------- |
| 传统编程 | 报错或走默认分支,需重新开发 |
| Workflow | 走预设兜底路径,无法真正理解情境 |
| Agent | AI 实时分析情境,动态调整策略 |
**2. 技能要求与门槛**
| 方式 | 技能要求 | 门槛 |
| ------------ | -------------------------------- | ---- |
| **传统编程** | 编程语言 + 算法 + 系统设计 | 高 |
| **Workflow** | 编程原理 + 图形化编排 + 条件逻辑 | 中 |
| **Agent** | 自然语言描述意图即可 | 低 |
**3. 修改与维护成本**
| 方式 | 典型修改链路 | 时间成本 |
| ------------ | ----------------------------------------------- | ---------------------- |
| **传统编程** | 发现问题 → 产品排期 → 研发 → 测试 → 部署 → 上线 | 数天至数周 |
| **Workflow** | 发现问题 → 产品排期 → 修改流程 → 测试 → 上线 | 数小时至数天 |
| **Agent** | 发现问题 → 修改 Prompt → 测试验证 | **数分钟,业务自闭环** |
**适用场景参考:**
| 场景特征 | 推荐方案 |
| ------------------------------------------ | ----------------------------------------- |
| 逻辑固定、高频执行、对性能和稳定性要求极高 | 传统编程 |
| 流程清晰、步骤有限、需要可视化管理 | Workflow |
| 步骤不确定、需理解自然语言意图、动态决策 | Agent |
| 超长流程 + 动态子任务 | Plan-and-Execute(Workflow + Agent 混合) |
Agent 不是对传统编程的替代,而是**开辟了新的可能性边界**。Workflow 与传统编程本质上都是"程序控制流程流转",属于同一范式下的相互替代关系;而 Agent 将决策权移交给 AI,解决的是那些**无法事先穷举所有情况**的问题——这是前两者从结构上就无法触达的场景。
### AI Agent 的挑战与未来趋势?
**当前核心挑战**
| 挑战类别 | 具体问题 |
| ------------------ | ------------------------------------------------------------------------------------------------------ |
| **上下文窗口限制** | 长任务中历史信息被截断导致"遗忘";上下文越长推理质量越下降(Lost in the Middle 问题) |
| **幻觉问题** | LLM 在推理步骤中仍可能生成虚假事实,工具调用结果并不总能纠正错误推理 |
| **Token 经济性** | 多轮迭代 + 工具调用叠加导致 Token 消耗极高,长任务成本可达数十美元 |
| **工具安全边界** | Agent 具备执行代码、调用 API 的能力,存在被恶意 Prompt 诱导执行危险操作的风险(Prompt Injection 攻击) |
| **规划能力上限** | 在需要深度多步推理的任务中,LLM 的规划能力仍有明显瓶颈,容易陷入局部最优 |
| **可观测性不足** | Agent 内部推理过程难以追踪,生产环境下的故障定位和性能调优复杂度极高 |
**未来发展趋势**
1. **更长上下文 + 记忆架构优化**:百万 Token 级上下文窗口 + 分层记忆系统,从根本上缓解遗忘问题。
2. **原生多模态 Agent**:视觉、语音、代码多模态融合,使 Agent 能理解截图、操作 GUI,处理更广泛的现实任务。
3. **Agent 安全与对齐**:沙箱隔离、权限最小化、行为审计将成为 Agent 工程化的标准配置。
4. **推理效率优化**:通过模型蒸馏、KV Cache 优化和 Speculative Decoding 降低 Agent Loop 的延迟与成本。
5. **标准化协议普及**:MCP 等开放协议加速工具生态整合,Agent 间通信协议(如 A2A)推动 Multi-Agent 互联互通。
6. **从 Agent 到 Agentic System**:单一 Agent → 多 Agent 协作网络,结合强化学习从真实环境交互中持续自我优化,向 AGI 级自主系统演进。
## AI Agent 核心概念
### ⭐️ 什么是 AI Agent?其核心思想是什么?
AI Agent(人工智能智能体)是一种能够感知环境、进行决策并执行动作的自主软件系统。它以大语言模型(LLM)为大脑,代表用户自动化完成复杂任务,例如自动化处理电子邮件、生成报告、执行多步查询或控制智能设备。
不同于单纯的聊天机器人,AI Agent 强调自主性和交互性,能够在动态环境中持续迭代,直到任务完成。
**核心公式**:Agent = LLM + Planning(规划)+ Memory(记忆)+ Tools(工具)

- **推理与规划(Reasoning / Planning)**:依赖 LLM 分析当前任务状态,拆解目标,生成思考路径,并决定下一步行动。例如,使用 Chain-of-Thought (CoT) 提示技术,让模型逐步推理复杂问题,避免直接给出错误答案。在规划中,可能涉及树状搜索(如 Monte Carlo Tree Search)或多代理协作,以优化多步决策。
- **记忆(Memory)**:包含短期记忆(上下文历史,用于保持对话连续性)和长期记忆(外部知识库检索,如向量数据库或知识图谱),用于辅助决策。这能防止模型遗忘历史信息,并从过去经验中学习。例如,在处理重复任务时,Agent 可以检索存储的类似案例,提高效率。
- **执行与工具(Acting / Tools)**::执行具体操作,如查询信息、调用外部工具(Function Call、MCP、Shell 命令、代码执行等)。工具扩展了 LLM 的能力,例如集成搜索引擎、数据库 API 或第三方服务,让 Agent 能处理超出预训练知识的实时数据。在工程实践中,工具还可以被进一步封装为技能(Skills)——既可以是代码层的组合工具模块(Toolkits),也可以是自然语言指令集(Agent Skills,如 SKILL.md)。
- **观察(Observation)**:接收工具执行的反馈,将其纳入上下文用于下一轮推理,直至任务完成。这形成了一个闭环反馈机制,确保 Agent 能适应不确定性并纠错。
### 什么是 Agent Loop?其工作流程是什么?
Agent Loop 是所有 Agent 范式共享的运行引擎,其本质是一个 `while` 循环:每一次迭代完成"LLM 推理 → 工具调用 → 上下文更新"的完整链路,直至任务终止。

**标准工作流:**
1. **初始化**:加载 System Prompt、可用工具列表及用户初始请求,组装第一轮上下文。
2. **循环迭代**(核心):读取当前完整上下文 → LLM 推理决定下一步行动(调用工具 or 直接回复)→ 触发并执行对应工具 → 捕获工具返回结果(Observation)→ 将 Observation 追加至上下文。
3. **终止条件**:当 LLM 在某轮判断任务完成,直接输出最终回复而不再调用工具时,退出循环。
4. **安全兜底**:为防止模型陷入死循环,须设置强制中断条件,如最大迭代轮次上限(通常 10 ~ 20 轮)或 Token 消耗阈值。
> **工程视角**:Agent Loop 的设计难点不在循环本身,而在于如何高效管理随迭代**不断增长的上下文**。上下文过长会导致关键信息被稀释、推理质量下降,这也正是 Context Engineering 要解决的核心问题。
在 LangChain、LlamaIndex、Spring AI 等主流框架中,Agent Loop 均有封装实现,可通过监控迭代次数、Token 消耗等指标诊断 Agent 性能瓶颈。
### Agent 框架由哪三大部分组成?
构建 Agent 系统的工程框架通常围绕以下三大模块展开:
1. **LLM Call(模型调用)**:底层 API 管理,负责抹平各大厂商 LLM 的接口差异,处理流式输出、Token 截断、重试机制等基础能力。例如,支持 OpenAI、Anthropic 或 Hugging Face 模型的统一调用,确保兼容性。
2. **Tools Call(工具调用)**:解决 LLM 如何与外部世界交互的问题。涵盖 Function Calling、MCP(Model Context Protocol)、Skills 等机制。主流应用包括本地文件读写、网页搜索、代码沙箱执行、第三方 API 触发(如邮件发送或数据库查询)。
3. **Context Engineering(上下文工程)**:管理传递给大模型的 Prompt 集合。
- 狭义:系统提示词的编排(如 Rules、角色的 Markdown 文档等)。
- 广义:动态记忆注入、用户会话状态管理、工具与 Skills 描述的动态组装。
这三层形成了 Agent 的完整能力栈:**调得到模型、用得了工具、管得好上下文**。其中,Context Engineering 是最容易被忽视但价值最高的一层。
模型想要迈向高价值应用,核心瓶颈就在于能否用好 Context。在不提供任何 Context 的情况下,最先进的模型可能也仅能解决不到 1% 的任务。优化技巧包括 Prompt 压缩(如摘要历史对话)和分层上下文(核心事实 + 临时细节)。
### Tools 注册与调用遵循什么标准格式?
在工程落地中,Tool 的定义与接入经历了一个从“各自为战”到“双层标准化”的演进过程。要让 Agent 准确理解并调用外部工具,业界目前依赖两大核心标准协议:**底层数据格式标准(OpenAI Schema)** 与 **应用通信接入标准(MCP)**。
#### 数据格式层:OpenAI Function Calling Schema
不论外部工具多么复杂,LLM 在推理时只认特定的数据结构。当前业界处理工具描述的数据格式标准高度统一于 **OpenAI Function Calling Schema**,Anthropic(Claude)、Google(Gemini)等主要模型提供商均已对齐这套规范或提供高度兼容的实现。
**核心机制**:通过 **JSON Schema** 严格定义工具的描述和参数规范。LLM 在推理时只消费这部分 JSON Schema 来理解工具的功能边界,从而决定"是否调用"以及"如何填充参数"。
**标准 JSON Schema 结构示例**(以查询服务慢 SQL 日志为例):
```json
{
"type": "function",
"function": {
"name": "query_slow_sql",
"description": "查询指定微服务在特定时间段内的慢 SQL 日志。当需要排查服务响应慢、数据库查询超时或 CPU 异常飙升时调用。若用户询问的是网络或内存问题,请勿调用此工具。",
"parameters": {
"type": "object",
"properties": {
"service_name": {
"type": "string",
"description": "待查询的服务名称,例如:user-service、order-service"
},
"time_range": {
"type": "string",
"description": "查询时间范围,格式为 HH:MM-HH:MM,例如:09:00-09:30"
},
"threshold_ms": {
"type": "integer",
"description": "慢 SQL 判定阈值(毫秒),默认为 1000,即超过 1 秒的查询视为慢 SQL"
}
},
"required": ["service_name", "time_range"]
}
}
}
```
**📌 工具描述的质量直接决定 Agent 的决策准确性。** 模型是否调用工具、调用哪个工具、如何填充参数,完全依赖对 `description` 字段的语义理解。好的工具描述应明确说明"何时该调用"和"何时不该调用",参数的 `description` 应包含格式要求和典型示例值。
#### 进阶封装:Skills 与 Agent Skills
当多个原子工具需要在特定场景下被反复组合调用时,可以将这一调用序列封装为一个 **Skill(技能)**,对外暴露为单一的可调用接口。
Skills 不是独立于 Tools 之外的新能力层,而是 Tools 在工程实践中的**高阶封装形态**。它解决的是”多步工具组合的复用与标准化”问题。
**2026 年的工程落地中,Skill 演化出了两种核心形态:**
1. **传统 Toolkits / 复合工具(黑盒形态)**:将多个原子工具在代码层封装为高阶工具,对外暴露单一的 JSON Schema。LLM 只能看到函数签名和参数描述,无法感知内部实现逻辑。核心价值是降低推理步骤和 Token 消耗,适用于逻辑固定、调用路径明确的场景。
2. **Agent Skills(白盒形态,2026 年主流趋势)**:以 `SKILL.md` 文件为核心的自然语言指令集。每个 Skill 是一个文件夹,包含 YAML front-matter(元数据)+ 详细自然语言指令。通过 **延迟加载(Lazy Loading)** 机制:启动时只读取 front-matter 做发现(不占上下文),LLM 决定调用时才动态加载完整内容注入上下文。核心价值是将团队”隐性知识”显性化,指导 Agent 处理复杂灵活的任务。
> **📌 Agent Skills 已成为跨生态的开放标准**:2025 年底 Anthropic 开源 [agentskills.io](https://agentskills.io) 规范后,Claude Code、Cursor、OpenAI Codex、GitHub Copilot、Vercel 等主流 AI 编程工具均已支持。更重要的是,**后端 Agent 框架也在 2026 年全面拥抱这一标准**:
>
> - **Spring AI**(2026 年 1 月):官方推出 Agent Skills 支持,通过 `SkillsTool` 扫描 SKILL.md 文件夹并实现延迟加载。社区库 `spring-ai-agent-utils` 可一行 Bean 配置集成。
> - **LangChain**(2026 年):官方文档明确 “Skills are primarily prompt-driven specializations”,通过 `load_skill` Tool 动态加载提示词,本质与 SKILL.md 思路一致。
**典型目录结构**(各生态已趋同):
```
.claude/skills/code-reviewer/
├── SKILL.md ← YAML front-matter + 详细指令
├── scripts/xxx.py ← 可选:配套脚本
└── reference.md ← 可选:参考资料
```
**选型建议**:
- 需要纯代码封装、逻辑固定 → 使用传统 Toolkits(`@Tool` 装饰器或 Tool 类)
- 需要团队知识沉淀、灵活任务指导 → 使用 Agent Skills(SKILL.md + 延迟加载)
详见这篇文章:[Agent Skills 常见问题总结](https://mp.weixin.qq.com/s/5iaTBH12VTH55jYwo4wmwA)。
#### 通信接入层:MCP (Model Cont
gitextract_shn9zbhp/ ├── .gitattributes ├── .github/ │ └── workflows/ │ └── test.yml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .markdownlint-cli2.mjs ├── .nojekyll ├── .prettierignore ├── LICENSE ├── README.md ├── README_EN.md ├── TRANSLATION_TOOLS.md ├── TranslateRepo.java ├── docs/ │ ├── .vuepress/ │ │ ├── client.ts │ │ ├── components/ │ │ │ ├── LayoutToggle.vue │ │ │ └── unlock/ │ │ │ ├── GlobalUnlock.vue │ │ │ └── UnlockContent.vue │ │ ├── config.ts │ │ ├── features/ │ │ │ └── unlock/ │ │ │ ├── config.ts │ │ │ └── heights.ts │ │ ├── navbar.ts │ │ ├── public/ │ │ │ └── robots.txt │ │ ├── shims-vue.d.ts │ │ ├── sidebar/ │ │ │ ├── about-the-author.ts │ │ │ ├── ai.ts │ │ │ ├── books.ts │ │ │ ├── constants.ts │ │ │ ├── high-quality-technical-articles.ts │ │ │ ├── index.ts │ │ │ ├── open-source-project.ts │ │ │ └── zhuanlan.ts │ │ ├── styles/ │ │ │ ├── config.scss │ │ │ ├── index.scss │ │ │ └── palette.scss │ │ └── theme.ts │ ├── README.md │ ├── about-the-author/ │ │ ├── README.md │ │ ├── deprecated-java-technologies.md │ │ ├── dog-that-copies-other-people-essay.md │ │ ├── feelings-after-one-month-of-induction-training.md │ │ ├── feelings-of-half-a-year-from-graduation-to-entry.md │ │ ├── internet-addiction-teenager.md │ │ ├── javaguide-100k-star.md │ │ ├── my-article-was-stolen-and-made-into-video-and-it-became-popular.md │ │ ├── my-college-life.md │ │ ├── writing-technology-blog-six-years.md │ │ └── zhishixingqiu-two-years.md │ ├── ai/ │ │ ├── README.md │ │ ├── agent/ │ │ │ ├── agent-basis.md │ │ │ ├── context-engineering.md │ │ │ ├── mcp.md │ │ │ ├── prompt-engineering.md │ │ │ └── skills.md │ │ ├── ai-coding/ │ │ │ ├── idea-qoder-plugin.md │ │ │ └── trae-m2.7.md │ │ ├── llm-basis/ │ │ │ ├── ai-ide.md │ │ │ └── llm-operation-mechanism.md │ │ └── rag/ │ │ ├── rag-basis.md │ │ └── rag-vector-store.md │ ├── books/ │ │ ├── README.md │ │ ├── cs-basics.md │ │ ├── database.md │ │ ├── distributed-system.md │ │ ├── java.md │ │ ├── search-engine.md │ │ └── software-quality.md │ ├── cs-basics/ │ │ ├── algorithms/ │ │ │ ├── 10-classical-sorting-algorithms.md │ │ │ ├── classical-algorithm-problems-recommendations.md │ │ │ ├── common-data-structures-leetcode-recommendations.md │ │ │ ├── linkedlist-algorithm-problems.md │ │ │ ├── string-algorithm-problems.md │ │ │ └── the-sword-refers-to-offer.md │ │ ├── data-structure/ │ │ │ ├── bloom-filter.md │ │ │ ├── graph.md │ │ │ ├── heap.md │ │ │ ├── linear-data-structure.md │ │ │ ├── pictures/ │ │ │ │ └── 线性数据结构/ │ │ │ │ └── 栈实现浏览器倒退和前进.drawio │ │ │ ├── red-black-tree.md │ │ │ └── tree.md │ │ ├── network/ │ │ │ ├── application-layer-protocol.md │ │ │ ├── arp.md │ │ │ ├── computer-network-xiexiren-summary.md │ │ │ ├── dns.md │ │ │ ├── http-status-codes.md │ │ │ ├── http-vs-https.md │ │ │ ├── http1.0-vs-http1.1.md │ │ │ ├── nat.md │ │ │ ├── network-attack-means.md │ │ │ ├── osi-and-tcp-ip-model.md │ │ │ ├── other-network-questions.md │ │ │ ├── other-network-questions2.md │ │ │ ├── tcp-connection-and-disconnection.md │ │ │ ├── tcp-reliability-guarantee.md │ │ │ └── the-whole-process-of-accessing-web-pages.md │ │ └── operating-system/ │ │ ├── linux-intro.md │ │ ├── operating-system-basic-questions-01.md │ │ ├── operating-system-basic-questions-02.md │ │ └── shell-intro.md │ ├── database/ │ │ ├── basis.md │ │ ├── character-set.md │ │ ├── elasticsearch/ │ │ │ └── elasticsearch-questions-01.md │ │ ├── mongodb/ │ │ │ ├── mongodb-questions-01.md │ │ │ └── mongodb-questions-02.md │ │ ├── mysql/ │ │ │ ├── a-thousand-lines-of-mysql-study-notes.md │ │ │ ├── how-sql-executed-in-mysql.md │ │ │ ├── index-invalidation-caused-by-implicit-conversion.md │ │ │ ├── innodb-implementation-of-mvcc.md │ │ │ ├── mysql-auto-increment-primary-key-continuous.md │ │ │ ├── mysql-high-performance-optimization-specification-recommendations.md │ │ │ ├── mysql-index-invalidation.md │ │ │ ├── mysql-index.md │ │ │ ├── mysql-logs.md │ │ │ ├── mysql-query-cache.md │ │ │ ├── mysql-query-execution-plan.md │ │ │ ├── mysql-questions-01.md │ │ │ ├── some-thoughts-on-database-storage-time.md │ │ │ └── transaction-isolation-level.md │ │ ├── nosql.md │ │ ├── redis/ │ │ │ ├── 3-commonly-used-cache-read-and-write-strategies.md │ │ │ ├── cache-basics.md │ │ │ ├── images/ │ │ │ │ ├── aof-rewrite.drawio │ │ │ │ ├── aof-work-process.drawio │ │ │ │ ├── hash-shopping-cart.drawio │ │ │ │ ├── memory-fragmentation.drawio │ │ │ │ ├── redis-aof-write-log-disc.drawio │ │ │ │ ├── redis-cache-avalanche.drawio │ │ │ │ ├── redis-cache-breakdown.drawio │ │ │ │ ├── redis-cache-penetration.drawio │ │ │ │ ├── redis-event-handler.drawio │ │ │ │ ├── redis-list.drawio │ │ │ │ └── redis4.0-master-slave-replication-replid.drawio │ │ │ ├── redis-cluster.md │ │ │ ├── redis-common-blocking-problems-summary.md │ │ │ ├── redis-data-structures-01.md │ │ │ ├── redis-data-structures-02.md │ │ │ ├── redis-delayed-task.md │ │ │ ├── redis-memory-fragmentation.md │ │ │ ├── redis-persistence.md │ │ │ ├── redis-questions-01.md │ │ │ ├── redis-questions-02.md │ │ │ ├── redis-skiplist.md │ │ │ └── redis-stream-mq.md │ │ └── sql/ │ │ ├── sql-questions-01.md │ │ ├── sql-questions-02.md │ │ ├── sql-questions-03.md │ │ ├── sql-questions-04.md │ │ ├── sql-questions-05.md │ │ └── sql-syntax-summary.md │ ├── distributed-system/ │ │ ├── api-gateway.md │ │ ├── distributed-configuration-center.md │ │ ├── distributed-id-design.md │ │ ├── distributed-id.md │ │ ├── distributed-lock-implementations.md │ │ ├── distributed-lock.md │ │ ├── distributed-process-coordination/ │ │ │ └── zookeeper/ │ │ │ ├── zookeeper-in-action.md │ │ │ ├── zookeeper-intro.md │ │ │ └── zookeeper-plus.md │ │ ├── distributed-transaction.md │ │ ├── images/ │ │ │ ├── api-gateway/ │ │ │ │ └── api-gateway-overview.drawio │ │ │ ├── distributed-id/ │ │ │ │ ├── database-number-segment-mode.drawio │ │ │ │ ├── distributed-id-requirements.drawio │ │ │ │ ├── id-after-the-sub-table-not-conflict.drawio │ │ │ │ ├── nosql.drawio │ │ │ │ └── the-primary-key-of-the-database-increases-automatically.drawio │ │ │ └── zookeeper/ │ │ │ ├── znode-structure.drawio │ │ │ └── zookeeper-watcher.drawio │ │ ├── protocol/ │ │ │ ├── cap-and-base-theorem.md │ │ │ ├── consistent-hashing.md │ │ │ ├── gossip-protocol.md │ │ │ ├── paxos-algorithm.md │ │ │ ├── raft-algorithm.md │ │ │ └── zab.md │ │ ├── rpc/ │ │ │ ├── dubbo.md │ │ │ ├── http&rpc.md │ │ │ └── rpc-intro.md │ │ └── spring-cloud-gateway-questions.md │ ├── high-availability/ │ │ ├── fallback-and-circuit-breaker.md │ │ ├── high-availability-system-design.md │ │ ├── idempotency.md │ │ ├── limit-request.md │ │ ├── performance-test.md │ │ ├── redundancy.md │ │ └── timeout-and-retry.md │ ├── high-performance/ │ │ ├── cdn.md │ │ ├── data-cold-hot-separation.md │ │ ├── deep-pagination-optimization.md │ │ ├── images/ │ │ │ └── read-and-write-separation-and-library-subtable/ │ │ │ ├── horizontal-slicing-database.drawio │ │ │ ├── read-and-write-separation-proxy.drawio │ │ │ ├── read-and-write-separation.drawio │ │ │ ├── two-forms-of-sub-table.drawio │ │ │ └── vertical-slicing-database.drawio │ │ ├── load-balancing.md │ │ ├── message-queue/ │ │ │ ├── disruptor-questions.md │ │ │ ├── kafka-questions-01.md │ │ │ ├── message-queue.md │ │ │ ├── rabbitmq-questions.md │ │ │ └── rocketmq-questions.md │ │ ├── read-and-write-separation-and-library-subtable.md │ │ └── sql-optimization.md │ ├── high-quality-technical-articles/ │ │ ├── README.md │ │ ├── advanced-programmer/ │ │ │ ├── 20-bad-habits-of-bad-programmers.md │ │ │ ├── meituan-three-year-summary-lesson-10.md │ │ │ ├── programmer-quickly-learn-new-technology.md │ │ │ ├── seven-tips-for-becoming-an-advanced-programmer.md │ │ │ ├── ten-years-of-dachang-growth-road.md │ │ │ ├── the-growth-strategy-of-the-technological-giant.md │ │ │ └── thinking-about-technology-and-business-after-five-years-of-work.md │ │ ├── interview/ │ │ │ ├── how-to-examine-the-technical-ability-of-programmers-in-the-first-test-of-technology.md │ │ │ ├── my-personal-experience-in-2021.md │ │ │ ├── screen-candidates-for-packaging.md │ │ │ ├── some-secrets-about-alibaba-interview.md │ │ │ ├── summary-of-spring-recruitment.md │ │ │ ├── technical-preliminary-preparation.md │ │ │ ├── the-experience-and-thinking-of-an-interview-experienced-by-an-older-programmer.md │ │ │ └── the-experience-of-get-offer-from-over-20-big-companies.md │ │ ├── personal-experience/ │ │ │ ├── 8-years-programmer-work-summary.md │ │ │ ├── four-year-work-in-tencent-summary.md │ │ │ ├── huawei-od-275-days.md │ │ │ └── two-years-of-back-end-develop--experience-in-didi-and-toutiao.md │ │ ├── programmer/ │ │ │ ├── efficient-book-publishing-and-practice-guide.md │ │ │ ├── high-value-certifications-for-programmers.md │ │ │ └── how-do-programmers-publish-a-technical-book.md │ │ └── work/ │ │ ├── 32-tips-improving-career.md │ │ ├── employee-performance.md │ │ └── get-into-work-mode-quickly-when-you-join-a-company.md │ ├── home.md │ ├── interview-preparation/ │ │ ├── backend-interview-plan.md │ │ ├── how-to-handle-interview-nerves.md │ │ ├── internship-experience.md │ │ ├── interview-experience.md │ │ ├── java-roadmap.md │ │ ├── key-points-of-interview.md │ │ ├── pdf-interview-javaguide.md │ │ ├── project-experience-guide.md │ │ ├── resume-guide.md │ │ ├── self-test-of-common-interview-questions.md │ │ └── teach-you-how-to-prepare-for-the-interview-hand-in-hand.md │ ├── java/ │ │ ├── basis/ │ │ │ ├── bigdecimal.md │ │ │ ├── generics-and-wildcards.md │ │ │ ├── java-basic-questions-01.md │ │ │ ├── java-basic-questions-02.md │ │ │ ├── java-basic-questions-03.md │ │ │ ├── java-keyword-summary.md │ │ │ ├── proxy.md │ │ │ ├── reflection.md │ │ │ ├── serialization.md │ │ │ ├── spi.md │ │ │ ├── syntactic-sugar.md │ │ │ ├── unsafe.md │ │ │ └── why-there-only-value-passing-in-java.md │ │ ├── collection/ │ │ │ ├── arrayblockingqueue-source-code.md │ │ │ ├── arraylist-source-code.md │ │ │ ├── concurrent-hash-map-source-code.md │ │ │ ├── copyonwritearraylist-source-code.md │ │ │ ├── delayqueue-source-code.md │ │ │ ├── hashmap-source-code.md │ │ │ ├── java-collection-precautions-for-use.md │ │ │ ├── java-collection-questions-01.md │ │ │ ├── java-collection-questions-02.md │ │ │ ├── linkedhashmap-source-code.md │ │ │ ├── linkedlist-source-code.md │ │ │ └── priorityqueue-source-code.md │ │ ├── concurrent/ │ │ │ ├── aqs.md │ │ │ ├── atomic-classes.md │ │ │ ├── cas.md │ │ │ ├── completablefuture-intro.md │ │ │ ├── java-concurrent-collections.md │ │ │ ├── java-concurrent-questions-01.md │ │ │ ├── java-concurrent-questions-02.md │ │ │ ├── java-concurrent-questions-03.md │ │ │ ├── java-thread-pool-best-practices.md │ │ │ ├── java-thread-pool-summary.md │ │ │ ├── jmm.md │ │ │ ├── optimistic-lock-and-pessimistic-lock.md │ │ │ ├── reentrantlock.md │ │ │ ├── threadlocal.md │ │ │ └── virtual-thread.md │ │ ├── io/ │ │ │ ├── io-basis.md │ │ │ ├── io-design-patterns.md │ │ │ ├── io-model.md │ │ │ └── nio-basis.md │ │ ├── jvm/ │ │ │ ├── class-file-structure.md │ │ │ ├── class-loading-process.md │ │ │ ├── classloader.md │ │ │ ├── jdk-monitoring-and-troubleshooting-tools.md │ │ │ ├── jvm-garbage-collection.md │ │ │ ├── jvm-in-action.md │ │ │ ├── jvm-intro.md │ │ │ ├── jvm-parameters-intro.md │ │ │ └── memory-area.md │ │ └── new-features/ │ │ ├── java10.md │ │ ├── java11.md │ │ ├── java12-13.md │ │ ├── java14-15.md │ │ ├── java16.md │ │ ├── java17.md │ │ ├── java18.md │ │ ├── java19.md │ │ ├── java20.md │ │ ├── java21.md │ │ ├── java22-23.md │ │ ├── java24.md │ │ ├── java25.md │ │ ├── java26.md │ │ ├── java8-common-new-features.md │ │ ├── java8-tutorial-translate.md │ │ └── java9.md │ ├── javaguide/ │ │ ├── contribution-guideline.md │ │ ├── faq.md │ │ ├── history.md │ │ ├── intro.md │ │ └── use-suggestion.md │ ├── open-source-project/ │ │ ├── README.md │ │ ├── big-data.md │ │ ├── machine-learning.md │ │ ├── practical-project.md │ │ ├── system-design.md │ │ ├── tool-library.md │ │ ├── tools.md │ │ └── tutorial.md │ ├── snippets/ │ │ ├── article-footer.snippet.md │ │ ├── article-header.snippet.md │ │ ├── planet.snippet.md │ │ ├── planet2.snippet.md │ │ ├── small-advertisement.snippet.md │ │ └── yuanma.snippet.md │ ├── system-design/ │ │ ├── J2EE基础知识.md │ │ ├── basis/ │ │ │ ├── RESTfulAPI.md │ │ │ ├── naming.md │ │ │ ├── pictures/ │ │ │ │ ├── common-design-patterns.drawio │ │ │ │ └── programming-principles.drawio │ │ │ ├── refactoring.md │ │ │ ├── software-engineering.md │ │ │ └── unit-test.md │ │ ├── design-pattern.md │ │ ├── framework/ │ │ │ ├── mybatis/ │ │ │ │ └── mybatis-interview.md │ │ │ ├── netty.md │ │ │ └── spring/ │ │ │ ├── Async.md │ │ │ ├── async.md │ │ │ ├── images/ │ │ │ │ ├── mvc-mode1.drawio │ │ │ │ └── mvc-model2.drawio │ │ │ ├── ioc-and-aop.md │ │ │ ├── spring-boot-auto-assembly-principles.md │ │ │ ├── spring-common-annotations.md │ │ │ ├── spring-design-patterns-summary.md │ │ │ ├── spring-knowledge-and-questions-summary.md │ │ │ ├── spring-transaction.md │ │ │ ├── springboot-knowledge-and-questions-summary.md │ │ │ └── springboot-source-code.md │ │ ├── schedule-task.md │ │ ├── security/ │ │ │ ├── advantages-and-disadvantages-of-jwt.md │ │ │ ├── basis-of-authority-certification.md │ │ │ ├── data-desensitization.md │ │ │ ├── data-validation.md │ │ │ ├── design-of-authority-system.md │ │ │ ├── encryption-algorithms.md │ │ │ ├── jwt-intro.md │ │ │ ├── sentive-words-filter.md │ │ │ ├── sso-intro.md │ │ │ └── why-password-reset-instead-of-retrieval.md │ │ ├── system-design-questions.md │ │ └── web-real-time-message-push.md │ ├── tools/ │ │ ├── docker/ │ │ │ ├── docker-in-action.md │ │ │ └── docker-intro.md │ │ ├── git/ │ │ │ ├── git-intro.md │ │ │ └── github-tips.md │ │ ├── gradle/ │ │ │ └── gradle-core-concepts.md │ │ └── maven/ │ │ ├── maven-best-practices.md │ │ └── maven-core-concepts.md │ └── zhuanlan/ │ ├── README.md │ ├── back-end-interview-high-frequency-system-design-and-scenario-questions.md │ ├── handwritten-rpc-framework.md │ ├── interview-guide.md │ ├── java-mian-shi-zhi-bei.md │ └── source-code-reading.md ├── index.html ├── package.json ├── sw.js └── translate_repo.py
SYMBOL INDEX (31 symbols across 6 files)
FILE: TranslateRepo.java
class TranslateRepo (line 19) | public class TranslateRepo {
class Language (line 48) | static class Language {
method Language (line 53) | Language(String name, String code, String suffix) {
class TranslationProgress (line 60) | static class TranslationProgress {
method main (line 65) | public static void main(String[] args) {
method printHeader (line 204) | private static void printHeader() {
method selectLanguage (line 211) | private static Language selectLanguage(Scanner scanner) {
method findMarkdownFiles (line 231) | private static List<Path> findMarkdownFiles(Path repoPath) throws IOEx...
method getOutputPath (line 252) | private static Path getOutputPath(Path inputPath, Path repoPath, Strin...
method translateFile (line 271) | private static int[] translateFile(Path inputPath, Path outputPath, St...
method splitContent (line 306) | private static List<String> splitContent(String content, int chunkSize) {
method translateText (line 331) | private static String translateText(String text, String targetLang) th...
method loadProgress (line 362) | private static TranslationProgress loadProgress(Path repoPath) {
method saveProgress (line 376) | private static void saveProgress(Path repoPath, TranslationProgress pr...
FILE: docs/.vuepress/client.ts
method enhance (line 8) | enhance({ app }) {
FILE: docs/.vuepress/features/unlock/heights.ts
constant PREVIEW_HEIGHT (line 1) | const PREVIEW_HEIGHT = {
type PreviewHeight (line 9) | type PreviewHeight =
FILE: docs/.vuepress/sidebar/constants.ts
constant ICONS (line 5) | const ICONS = {
constant COMMON_TEXT (line 87) | const COMMON_TEXT = {
FILE: sw.js
constant RUNTIME (line 9) | const RUNTIME = 'docsify'
constant HOSTNAME_WHITELIST (line 10) | const HOSTNAME_WHITELIST = [
FILE: translate_repo.py
function print_header (line 44) | def print_header():
function select_language (line 51) | def select_language():
function find_markdown_files (line 68) | def find_markdown_files(repo_path):
function get_output_path (line 88) | def get_output_path(input_path, repo_path, lang_suffix):
function split_content (line 112) | def split_content(content, chunk_size=CHUNK_SIZE):
function translate_text (line 138) | def translate_text(text, target_lang):
function translate_file (line 149) | def translate_file(input_path, output_path, lang_code):
function load_progress (line 180) | def load_progress(repo_path):
function save_progress (line 189) | def save_progress(repo_path, progress):
function main (line 196) | def main():
Condensed preview — 378 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,267K chars).
[
{
"path": ".gitattributes",
"chars": 98,
"preview": "* text=auto\n*.js linguist-language=java\n*.css linguist-language=java\n*.html linguist-language=java"
},
{
"path": ".github/workflows/test.yml",
"chars": 606,
"preview": "name: Docs Test\n\non:\n - push\n - pull_request\n\njobs:\n test-docs:\n name: Test docs\n runs-on: ubuntu-latest\n st"
},
{
"path": ".gitignore",
"chars": 304,
"preview": "node_modules/\n# *.drawio\n*.drawio.bkp\n.DS_Store\n# VS Code Config file\n.vscode/\n# VuePress Cache\n**/.vuepress/.cache/\n# V"
},
{
"path": ".husky/pre-commit",
"chars": 17,
"preview": "pnpm nano-staged\n"
},
{
"path": ".markdownlint-cli2.mjs",
"chars": 437,
"preview": "export default {\n config: {\n default: true,\n MD003: {\n style: \"atx\",\n },\n MD004: {\n style: \"dash\""
},
{
"path": ".nojekyll",
"chars": 0,
"preview": ""
},
{
"path": ".prettierignore",
"chars": 183,
"preview": "# Vuepress Cache\n**/.vuepress/.cache/**\n# Vuepress Temp\n**/.vuepress/.temp/**\n# Vuepress Output\ndist/\n\n# Node modules\nno"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 18168,
"preview": "- 推荐在线阅读(体验更好,速度更快):[javaguide.cn](https://javaguide.cn/)\n- 面试突击版本(只保留重点,附带精美 PDF 下载):[interview.javaguide.cn](https://i"
},
{
"path": "README_EN.md",
"chars": 25967,
"preview": "Recommended to read through online reading platforms for better experience and faster speed! Link: [javaguide.cn](https:"
},
{
"path": "TRANSLATION_TOOLS.md",
"chars": 3757,
"preview": "# Translation Tools for JavaGuide\n\nThis repository includes automated translation tools to translate all documentation t"
},
{
"path": "TranslateRepo.java",
"chars": 15805,
"preview": "import java.io.*;\nimport java.net.HttpURLConnection;\nimport java.net.URL;\nimport java.net.URLEncoder;\nimport java.nio.ch"
},
{
"path": "docs/.vuepress/client.ts",
"chars": 453,
"preview": "import { defineClientConfig } from \"vuepress/client\";\nimport { h } from \"vue\";\nimport LayoutToggle from \"./components/La"
},
{
"path": "docs/.vuepress/components/LayoutToggle.vue",
"chars": 3089,
"preview": "<template>\n <button\n class=\"layout-toggle-btn\"\n :class=\"{ 'is-hidden': isHidden }\"\n :title=\"isHidden ? '退出沉浸式阅"
},
{
"path": "docs/.vuepress/components/unlock/GlobalUnlock.vue",
"chars": 10138,
"preview": "<template>\n <div v-if=\"isClientReady && isLockedPage && !isUnlocked\">\n <Teleport v-if=\"teleportTargetSelector\" :to=\""
},
{
"path": "docs/.vuepress/components/unlock/UnlockContent.vue",
"chars": 4639,
"preview": "<template>\n <div class=\"unlock-container\" :class=\"{ 'is-locked': !isUnlocked }\">\n <div class=\"content-wrapper\" :styl"
},
{
"path": "docs/.vuepress/config.ts",
"chars": 2005,
"preview": "import { viteBundler } from \"@vuepress/bundler-vite\";\nimport { defineUserConfig } from \"vuepress\";\nimport theme from \"./"
},
{
"path": "docs/.vuepress/features/unlock/config.ts",
"chars": 1149,
"preview": "import { PREVIEW_HEIGHT } from \"./heights\";\n\nconst withDefaultHeight = (\n paths: readonly string[],\n height: string = "
},
{
"path": "docs/.vuepress/features/unlock/heights.ts",
"chars": 218,
"preview": "export const PREVIEW_HEIGHT = {\n SHORT: \"500px\",\n MEDIUM: \"1000px\",\n LONG: \"1500px\",\n XL: \"2000px\",\n XXL: \"2500px\","
},
{
"path": "docs/.vuepress/navbar.ts",
"chars": 1440,
"preview": "import { navbar } from \"vuepress-theme-hope\";\n\nexport default navbar([\n { text: \"后端面试\", icon: \"java\", link: \"/home.md\" "
},
{
"path": "docs/.vuepress/public/robots.txt",
"chars": 94,
"preview": "User-agent: *\nAllow: /\n\nSitemap: https://javaguide.cn/sitemap.xml\nHost: https://javaguide.cn/\n"
},
{
"path": "docs/.vuepress/shims-vue.d.ts",
"chars": 162,
"preview": "declare module \"*.vue\" {\n import type { DefineComponent } from \"vue\";\n const component: DefineComponent<object, object"
},
{
"path": "docs/.vuepress/sidebar/about-the-author.ts",
"chars": 774,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const aboutTheAuthor"
},
{
"path": "docs/.vuepress/sidebar/ai.ts",
"chars": 1116,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const ai = arraySide"
},
{
"path": "docs/.vuepress/sidebar/books.ts",
"chars": 606,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const books = arrayS"
},
{
"path": "docs/.vuepress/sidebar/constants.ts",
"chars": 1934,
"preview": "/**\n * 侧边栏图标常量\n * 统一管理所有侧边栏配置中使用的图标\n */\nexport const ICONS = {\n // 基础图标\n STAR: \"star\",\n BASIC: \"basic\",\n CODE: \"code"
},
{
"path": "docs/.vuepress/sidebar/high-quality-technical-articles.ts",
"chars": 2076,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const highQualityTec"
},
{
"path": "docs/.vuepress/sidebar/index.ts",
"chars": 16138,
"preview": "import { sidebar } from \"vuepress-theme-hope\";\n\nimport { aboutTheAuthor } from \"./about-the-author.js\";\nimport { ai } fr"
},
{
"path": "docs/.vuepress/sidebar/open-source-project.ts",
"chars": 686,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const openSourceProj"
},
{
"path": "docs/.vuepress/sidebar/zhuanlan.ts",
"chars": 519,
"preview": "import { arraySidebar } from \"vuepress-theme-hope\";\nimport { ICONS } from \"./constants.js\";\n\nexport const zhuanlan = arr"
},
{
"path": "docs/.vuepress/styles/config.scss",
"chars": 23,
"preview": "$theme-color: #2980b9;\n"
},
{
"path": "docs/.vuepress/styles/index.scss",
"chars": 2815,
"preview": "body {\n @media (min-width: 1440px) {\n font-size: 16px;\n }\n}\n\n// ============================================\n// 沉浸式"
},
{
"path": "docs/.vuepress/styles/palette.scss",
"chars": 389,
"preview": "$sidebar-width: 20rem;\n$sidebar-mobile-width: 16rem;\n$vp-font: 'Georgia, -apple-system, \"Nimbus Roman No9 L\", \"PingFang "
},
{
"path": "docs/.vuepress/theme.ts",
"chars": 1867,
"preview": "import { getDirname, path } from \"vuepress/utils\";\nimport { hopeTheme } from \"vuepress-theme-hope\";\n\nimport navbar from "
},
{
"path": "docs/README.md",
"chars": 3906,
"preview": "---\nhome: true\nicon: home\ntitle: JavaGuide(Java 面试 & 后端通用面试指南)\ndescription: JavaGuide 是一份 Java 面试和后端通用面试指南,同时覆盖数据库/MySQL"
},
{
"path": "docs/about-the-author/README.md",
"chars": 1969,
"preview": "---\ntitle: 个人介绍 Q&A\ndescription: JavaGuide作者Guide个人介绍,19年本科毕业、大学期间变现20w+实现经济独立、坚持写博客的经历与收获分享。\ncategory: 走近作者\n---\n\n<!-- @"
},
{
"path": "docs/about-the-author/deprecated-java-technologies.md",
"chars": 3195,
"preview": "---\ntitle: 已经淘汰的 Java 技术,不要再学了!\ndescription: 已淘汰的Java技术盘点,JSP、Struts、EJB、Java Applets、SOAP等过时技术不建议学习,附现代替代方案推荐。\ncategory"
},
{
"path": "docs/about-the-author/dog-that-copies-other-people-essay.md",
"chars": 1591,
"preview": "---\ntitle: 抄袭狗,你冬天睡觉脚必冷!!!\ndescription: 原创文章被抄袭的无奈经历,知乎、CSDN多平台盗文现象吐槽,分享如何屏蔽低质量内容和维护原创权益。\ncategory: 走近作者\ntag:\n - 杂谈\n---"
},
{
"path": "docs/about-the-author/feelings-after-one-month-of-induction-training.md",
"chars": 2995,
"preview": "---\ntitle: 入职培训一个月后的感受\ndescription: ThoughtWorks入职培训一个月感受,从Windows切换到Mac的适应、TWU培训内容、Feedback反馈文化等新人入职体验分享。\ncategory: 走近作"
},
{
"path": "docs/about-the-author/feelings-of-half-a-year-from-graduation-to-entry.md",
"chars": 3441,
"preview": "---\ntitle: 从毕业到入职半年的感受\ndescription: 应届生入职半年的工作感受,CRUD业务代码的价值、技术积累靠工作之余、从学校到职场的转变心得分享。\ncategory: 走近作者\ntag:\n - 个人经历\n---\n\n"
},
{
"path": "docs/about-the-author/internet-addiction-teenager.md",
"chars": 5345,
"preview": "---\ntitle: 我曾经也是网瘾少年\ndescription: 从网瘾少年到程序员的成长经历,初中沉迷游戏、高中觉醒奋起直追、高考失眠的真实故事,分享如何克服网瘾专注学习。\ncategory: 走近作者\ntag:\n - 个人经历\n--"
},
{
"path": "docs/about-the-author/javaguide-100k-star.md",
"chars": 1791,
"preview": "---\ntitle: JavaGuide 开源项目 100K Star 了!\ndescription: JavaGuide开源项目达成100K Star里程碑,从2018年创建到突破十万星标的复盘总结,分享开源维护心得与未来规划。\ncate"
},
{
"path": "docs/about-the-author/my-article-was-stolen-and-made-into-video-and-it-became-popular.md",
"chars": 2309,
"preview": "---\ntitle: 某培训机构盗我文章做成视频还上了B站热门\ndescription: 原创文章被培训机构盗用制作成B站视频的维权经历,揭露培训机构剽窃原创引流的套路,呼吁尊重原创内容。\ncategory: 走近作者\ntag:\n - 杂"
},
{
"path": "docs/about-the-author/my-college-life.md",
"chars": 11858,
"preview": "---\ntitle: 害,毕业三年了!\ndescription: 双非一本程序员的大学四年,从参加社团活动到办补习班赚钱、确定Java后端方向、创建JavaGuide、最终拿到ThoughtWorks offer的真实经历。\ncategor"
},
{
"path": "docs/about-the-author/writing-technology-blog-six-years.md",
"chars": 5373,
"preview": "---\ntitle: 坚持写技术博客六年了!\ndescription: 坚持写技术博客六年的心得分享,写博客的好处、如何坚持下去、写哪些方向的博客、实用写作技巧等经验总结。\ncategory: 走近作者\ntag:\n - 杂谈\n---\n\n坚"
},
{
"path": "docs/about-the-author/zhishixingqiu-two-years.md",
"chars": 5627,
"preview": "---\ntitle: 我的知识星球 6 岁了!\ndescription: JavaGuide知识星球介绍,提供Java面试指北专栏、简历修改、一对一答疑等服务,已帮助9000+球友提升求职竞争力。\ncategory: 知识星球\nstar: "
},
{
"path": "docs/ai/README.md",
"chars": 4328,
"preview": "---\ntitle: AI 应用开发面试指南\ndescription: 深入浅出掌握 AI 应用开发核心知识,涵盖大模型基础、Agent、RAG、MCP 协议、AI 编程实战等高频面试考点,适合校招/社招 AI 应用开发岗位面试复习。\nic"
},
{
"path": "docs/ai/agent/agent-basis.md",
"chars": 42210,
"preview": "---\ntitle: 一文搞懂 AI Agent 核心概念:Agent Loop、Context Engineering、Tools 注册\ndescription: 深入解析 AI Agent 核心概念,梳理从被动响应到常驻自治的六代进化史"
},
{
"path": "docs/ai/agent/context-engineering.md",
"chars": 0,
"preview": ""
},
{
"path": "docs/ai/agent/mcp.md",
"chars": 21986,
"preview": "---\ntitle: 万字拆解 MCP,附带工程实践\ndescription: 深入解析 MCP 协议核心概念,涵盖 MCP 四大核心能力、四层分层架构、JSON-RPC 2.0 通信机制及生产级 MCP Server 开发最佳实践。\nca"
},
{
"path": "docs/ai/agent/prompt-engineering.md",
"chars": 0,
"preview": ""
},
{
"path": "docs/ai/agent/skills.md",
"chars": 11455,
"preview": "---\ntitle: 万字详解 Agent Skills:是什么?怎么用?和 Prompt、MCP 有什么区别?\ndescription: 深入解析 Agent Skills 概念,探讨 Skills 与 Prompt、MCP、Functi"
},
{
"path": "docs/ai/ai-coding/idea-qoder-plugin.md",
"chars": 13059,
"preview": "---\ntitle: IDEA + Qoder 插件多场景实战:接口优化与代码重构\ndescription: 通过两个真实实战案例,展示 IDEA 搭配 Qoder 插件在深分页优化、祖传代码重构等场景下的实际效果,分享从执行者到指挥者的工"
},
{
"path": "docs/ai/ai-coding/trae-m2.7.md",
"chars": 15655,
"preview": "---\ntitle: Trae + MiniMax 多场景实战:Redis 故障排查与跨语言重构\ndescription: 使用 Trae IDE 接入 MiniMax 大模型,通过 Redis 连接池故障排查和 Redis C 源码到 G"
},
{
"path": "docs/ai/llm-basis/ai-ide.md",
"chars": 7011,
"preview": "---\ntitle: 9 道 AI 编程相关的开放性面试问题\ndescription: 涵盖 Cursor、Claude Code、Trae 等 AI 编程 IDE 使用技巧,Spec Coding 与 Vibe Coding 区别,以及 "
},
{
"path": "docs/ai/llm-basis/llm-operation-mechanism.md",
"chars": 16126,
"preview": "---\ntitle: 万字拆解 LLM 运行机制:Token、上下文与采样参数\ndescription: 深入剖析大语言模型(LLM)底层运行机制,详解 Token、上下文窗口、Temperature、Top-p 等核心概念与采样参数,帮助"
},
{
"path": "docs/ai/rag/rag-basis.md",
"chars": 10570,
"preview": "---\ntitle: 万字详解 RAG 基础概念\ndescription: 深入解析 RAG(检索增强生成)核心概念,涵盖 RAG 工作原理、与传统搜索引擎区别、核心优势与局限性等高频面试考点。\ncategory: AI 应用开发\nhead"
},
{
"path": "docs/ai/rag/rag-vector-store.md",
"chars": 13141,
"preview": "---\ntitle: 万字详解 RAG 向量索引算法和向量数据库\ndescription: 深入解析 RAG 场景下的向量数据库选型与使用,涵盖向量索引算法(HNSW、IVFFLAT)、ANN 近似检索原理、pgvector 实践等高频面试"
},
{
"path": "docs/books/README.md",
"chars": 1132,
"preview": "---\ntitle: 技术书籍精选\ndescription: 精选优质计算机技术书籍推荐,涵盖Java、数据库、分布式系统、计算机基础等方向,开源共建持续更新。\ncategory: 计算机书籍\n---\n\n<!-- @include: @sm"
},
{
"path": "docs/books/cs-basics.md",
"chars": 11568,
"preview": "---\ntitle: 计算机基础必读经典书籍\ndescription: 计算机基础书籍推荐,操作系统、计算机网络、算法与数据结构、编译原理等核心课程经典教材和学习资源汇总。\ncategory: 计算机书籍\nicon: \"computer\"\n"
},
{
"path": "docs/books/database.md",
"chars": 4523,
"preview": "---\ntitle: 数据库必读经典书籍\ndescription: 数据库书籍推荐,MySQL、PostgreSQL、Redis等数据库经典书籍,涵盖入门教程、原理剖析、性能优化等内容。\ncategory: 计算机书籍\nicon: \"dat"
},
{
"path": "docs/books/distributed-system.md",
"chars": 3490,
"preview": "---\ntitle: 分布式必读经典书籍\ndescription: 分布式系统书籍推荐,DDIA、分布式事务、共识算法、微服务架构等经典书籍,掌握分布式系统设计核心知识。\ncategory: 计算机书籍\nicon: \"distributed"
},
{
"path": "docs/books/java.md",
"chars": 9524,
"preview": "---\ntitle: Java 必读经典书籍\ndescription: Java程序员必读书籍推荐,Java基础、并发编程、JVM虚拟机、Spring/SpringBoot框架、Netty网络编程、性能调优等经典书籍精选。\ncategory"
},
{
"path": "docs/books/search-engine.md",
"chars": 1232,
"preview": "---\ntitle: 搜索引擎必读经典书籍\ndescription: 搜索引擎书籍推荐,Lucene入门、Elasticsearch核心技术与实战、源码解析与优化实战等经典书籍精选。\ncategory: 计算机书籍\nicon: \"searc"
},
{
"path": "docs/books/software-quality.md",
"chars": 4382,
"preview": "---\ntitle: 软件质量必读经典书籍\ndescription: 软件质量与代码整洁书籍推荐,重构、Clean Code、Effective Java、架构整洁之道等经典书籍,提升代码质量和架构设计能力。\ncategory: 计算机书籍"
},
{
"path": "docs/cs-basics/algorithms/10-classical-sorting-algorithms.md",
"chars": 20627,
"preview": "---\ntitle: 十大经典排序算法总结\ndescription: 系统梳理十大经典排序算法,附复杂度与稳定性对比,覆盖比较类与非比较类排序的核心原理与实现场景,帮助快速选型与优化。\ncategory: 计算机基础\ntag:\n - 算法"
},
{
"path": "docs/cs-basics/algorithms/classical-algorithm-problems-recommendations.md",
"chars": 2266,
"preview": "---\ntitle: 经典算法思想总结(含LeetCode题目推荐)\ndescription: 总结常见算法思想与解题模板,配合典型题目推荐,强调思维路径与复杂度权衡,快速构建解题体系。\ncategory: 计算机基础\ntag:\n - 算"
},
{
"path": "docs/cs-basics/algorithms/common-data-structures-leetcode-recommendations.md",
"chars": 1944,
"preview": "---\ntitle: 常见数据结构经典LeetCode题目推荐\ndescription: 按数据结构类别整理经典 LeetCode 题目清单,聚焦高频与核心考点,助力系统化刷题与巩固。\ncategory: 计算机基础\ntag:\n - 算法"
},
{
"path": "docs/cs-basics/algorithms/linkedlist-algorithm-problems.md",
"chars": 7737,
"preview": "---\ntitle: 几道常见的链表算法题\ndescription: 精选链表高频题的思路与实现,覆盖两数相加、反转、环检测等场景,强调边界处理与复杂度分析。\ncategory: 计算机基础\ntag:\n - 算法\nhead:\n - - "
},
{
"path": "docs/cs-basics/algorithms/string-algorithm-problems.md",
"chars": 9864,
"preview": "---\ntitle: 几道常见的字符串算法题\ndescription: 总结字符串高频算法与题型,重点讲解 KMP/BM 原理、滑动窗口等技巧,助力高效匹配与实现。\ncategory: 计算机基础\ntag:\n - 算法\nhead:\n -"
},
{
"path": "docs/cs-basics/algorithms/the-sword-refers-to-offer.md",
"chars": 14653,
"preview": "---\ntitle: 剑指offer部分编程题\ndescription: 选编《剑指 Offer》常见编程题,给出递归与迭代等多种思路与示例,实现对高频题型的高效复盘。\ncategory: 计算机基础\ntag:\n - 算法\nhead:\n "
},
{
"path": "docs/cs-basics/data-structure/bloom-filter.md",
"chars": 7966,
"preview": "---\ntitle: 布隆过滤器\ndescription: 解析 Bloom Filter 的原理与误判特性,结合哈希与位数组实现,适用于海量数据去重与缓存穿透防护。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n"
},
{
"path": "docs/cs-basics/data-structure/graph.md",
"chars": 4419,
"preview": "---\ntitle: 图\ndescription: 介绍图的基本概念与常用表示,结合 DFS/BFS 等核心算法与应用场景,掌握图论入门必备知识。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n - - meta"
},
{
"path": "docs/cs-basics/data-structure/heap.md",
"chars": 4115,
"preview": "---\ndescription: 解析堆的性质与操作,理解优先队列实现与堆排序性能优势,掌握插入/删除的复杂度与实践场景。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n - - meta\n - name:"
},
{
"path": "docs/cs-basics/data-structure/linear-data-structure.md",
"chars": 9251,
"preview": "---\ntitle: 线性数据结构\ndescription: 总结数组/链表/栈/队列的特性与操作,配合复杂度分析与典型应用,掌握线性结构的选型与实现。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n - - m"
},
{
"path": "docs/cs-basics/data-structure/pictures/线性数据结构/栈实现浏览器倒退和前进.drawio",
"chars": 2003,
"preview": "<mxfile host=\"Electron\" modified=\"2020-11-09T06:56:47.201Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/cs-basics/data-structure/red-black-tree.md",
"chars": 2165,
"preview": "---\ntitle: 红黑树\ndescription: 深入讲解红黑树的五大性质与旋转调整过程,理解自平衡机制及在标准库与索引结构中的应用。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n - - meta\n "
},
{
"path": "docs/cs-basics/data-structure/tree.md",
"chars": 4851,
"preview": "---\ntitle: 树\ndescription: 系统讲解树与二叉树的核心概念与遍历方法,结合高度/深度等指标,夯实数据结构基础与算法思维。\ncategory: 计算机基础\ntag:\n - 数据结构\nhead:\n - - meta\n "
},
{
"path": "docs/cs-basics/network/application-layer-protocol.md",
"chars": 4947,
"preview": "---\ntitle: 应用层常见协议总结(应用层)\ndescription: 汇总应用层常见协议的核心概念与典型场景,重点对比 HTTP 与 WebSocket 的通信模型与能力边界。\ncategory: 计算机基础\ntag:\n - 计算"
},
{
"path": "docs/cs-basics/network/arp.md",
"chars": 4626,
"preview": "---\ntitle: ARP 协议详解(网络层)\ndescription: 讲解 ARP 的地址解析机制与报文流程,结合 ARP 表与广播/单播详解常见攻击与防御策略。\ncategory: 计算机基础\ntag:\n - 计算机网络\nhead"
},
{
"path": "docs/cs-basics/network/computer-network-xiexiren-summary.md",
"chars": 19844,
"preview": "---\ntitle: 《计算机网络》(谢希仁)内容总结\ndescription: 基于《计算机网络》教材的学习笔记,梳理术语与分层模型等核心知识点,便于期末复习与面试巩固。\ncategory: 计算机基础\ntag:\n - 计算机网络\nhe"
},
{
"path": "docs/cs-basics/network/dns.md",
"chars": 5508,
"preview": "---\ntitle: DNS 域名系统详解(应用层)\ndescription: 详解 DNS 的层次结构与解析流程,覆盖递归/迭代、缓存与权威服务器,明确应用层端口与性能优化要点。\ncategory: 计算机基础\ntag:\n - 计算机网"
},
{
"path": "docs/cs-basics/network/http-status-codes.md",
"chars": 3051,
"preview": "---\ntitle: HTTP 常见状态码总结(应用层)\ndescription: 汇总常见 HTTP 状态码含义与使用场景,强调 201/204 等易混淆点,提升接口设计与调试效率。\ncategory: 计算机基础\ntag:\n - 计算"
},
{
"path": "docs/cs-basics/network/http-vs-https.md",
"chars": 5034,
"preview": "---\ntitle: HTTP vs HTTPS(应用层)\ndescription: 对比 HTTP 与 HTTPS 的协议与安全机制,解析 SSL/TLS 工作原理与握手流程,明确应用层安全落地细节。\ncategory: 计算机基础\nta"
},
{
"path": "docs/cs-basics/network/http1.0-vs-http1.1.md",
"chars": 5558,
"preview": "---\ntitle: HTTP 1.0 vs HTTP 1.1(应用层)\ndescription: 细致对比 HTTP/1.0 与 HTTP/1.1 的协议差异,涵盖长连接、管道化、缓存与状态码增强等关键变更与实践影响。\ncategory:"
},
{
"path": "docs/cs-basics/network/nat.md",
"chars": 3180,
"preview": "---\ntitle: NAT 协议详解(网络层)\ndescription: 解析 NAT 的地址转换与端口映射机制,结合 LAN/WAN 通信与转换表,理解家庭与企业网络的实践细节。\ncategory: 计算机基础\ntag:\n - 计算机"
},
{
"path": "docs/cs-basics/network/network-attack-means.md",
"chars": 18944,
"preview": "---\ntitle: 网络攻击常见手段总结(安全)\ndescription: 总结常见 TCP/IP 攻击与防护思路,覆盖 DDoS、IP/ARP 欺骗、中间人等手段,强调工程防护实践。\ncategory: 计算机基础\ntag:\n - 计"
},
{
"path": "docs/cs-basics/network/osi-and-tcp-ip-model.md",
"chars": 7252,
"preview": "---\ntitle: OSI 和 TCP/IP 网络分层模型详解(基础)\ndescription: 详解 OSI 与 TCP/IP 的分层模型与职责划分,结合历史与实践对比两者差异与工程取舍。\ncategory: 计算机基础\ntag:\n "
},
{
"path": "docs/cs-basics/network/other-network-questions.md",
"chars": 31985,
"preview": "---\ntitle: 计算机网络常见面试题总结(上)\ndescription: 最新计算机网络高频面试题总结(上):TCP/IP四层模型、HTTP全版本对比、TCP三次握手、DNS解析、WebSocket/SSE实时推送等,附图解+⭐️重点"
},
{
"path": "docs/cs-basics/network/other-network-questions2.md",
"chars": 14174,
"preview": "---\ntitle: 计算机网络常见面试题总结(下)\ndescription: 最新计算机网络高频面试题总结(下):TCP/UDP深度对比、三次握手四次挥手、HTTP/3 QUIC优化、IPv6优势、NAT/ARP详解,附表格+⭐️重点标注"
},
{
"path": "docs/cs-basics/network/tcp-connection-and-disconnection.md",
"chars": 9111,
"preview": "---\ntitle: TCP 三次握手和四次挥手(传输层)\ndescription: 一文讲清 TCP 三次握手与四次挥手:SEQ/ACK/SYN/FIN 如何同步,TIME_WAIT 与 2MSL 的原因,半连接队列(SYN Queue)"
},
{
"path": "docs/cs-basics/network/tcp-reliability-guarantee.md",
"chars": 6208,
"preview": "---\ntitle: TCP 传输可靠性保障(传输层)\ndescription: 系统梳理 TCP 的可靠性保障机制,覆盖重传/选择确认、流量与拥塞控制,明确端到端可靠传输的实现要点。\ncategory: 计算机基础\ntag:\n - 计算"
},
{
"path": "docs/cs-basics/network/the-whole-process-of-accessing-web-pages.md",
"chars": 3030,
"preview": "---\ntitle: 访问网页的全过程(知识串联)\ndescription: 串联从输入 URL 到页面渲染的完整链路,涵盖 DNS、TCP、HTTP 与静态资源加载,助力面试与实践理解。\ncategory: 计算机基础\ntag:\n - "
},
{
"path": "docs/cs-basics/operating-system/linux-intro.md",
"chars": 15514,
"preview": "---\ntitle: Linux 基础知识总结\ndescription: 简单介绍一下 Java 程序员必知的 Linux 的一些概念以及常见命令。\ncategory: 计算机基础\ntag:\n - 操作系统\n - Linux\nhead:"
},
{
"path": "docs/cs-basics/operating-system/operating-system-basic-questions-01.md",
"chars": 18577,
"preview": "---\ntitle: 操作系统常见面试题总结(上)\ndescription: 最新操作系统高频面试题总结(上):用户态/内核态切换、进程线程区别、死锁四条件、系统调用详解、调度算法对比,附图表+⭐️重点标注,一文掌握OS核心考点,快速通关后"
},
{
"path": "docs/cs-basics/operating-system/operating-system-basic-questions-02.md",
"chars": 15462,
"preview": "---\ntitle: 操作系统常见面试题总结(下)\ndescription: 最新操作系统高频面试题总结(下):虚拟内存映射、内存碎片/伙伴系统、TLB+页缺失处理、分页分段对比、页面置换算法详解、文件系统&磁盘调度,附图表+⭐️重点标注,"
},
{
"path": "docs/cs-basics/operating-system/shell-intro.md",
"chars": 27526,
"preview": "---\ntitle: Shell 编程基础知识总结\ndescription: Shell 编程在我们的日常开发工作中非常实用,目前 Linux 系统下最流行的运维自动化语言就是 Shell 和 Python 了。这篇文章我会简单总结一下 S"
},
{
"path": "docs/database/basis.md",
"chars": 17776,
"preview": "---\ntitle: 数据库基础知识总结\ndescription: 数据库基础知识总结,包括数据库、DBMS、数据库系统、DBA的概念区别,DBMS核心功能,元组、码、主键外键等关系型数据库核心概念,以及ER图的使用方法。\ncategory"
},
{
"path": "docs/database/character-set.md",
"chars": 8966,
"preview": "---\ntitle: 字符集详解\ndescription: 详解字符集与字符编码原理,深入分析ASCII、GB2312、GBK、UTF-8、UTF-16等常见编码,解释MySQL中utf8与utf8mb4的区别以及emoji存储问题的解决方"
},
{
"path": "docs/database/elasticsearch/elasticsearch-questions-01.md",
"chars": 565,
"preview": "---\ntitle: Elasticsearch常见面试题总结(付费)\ndescription: Elasticsearch常见面试题总结,涵盖ES核心概念、倒排索引原理、分片与副本机制、查询DSL、聚合分析、集群调优等高频面试知识点。\nc"
},
{
"path": "docs/database/mongodb/mongodb-questions-01.md",
"chars": 14406,
"preview": "---\ntitle: MongoDB常见面试题总结(上)\ndescription: MongoDB常见面试题总结上篇,详解MongoDB基础概念、存储结构、数据类型、副本集高可用、分片集群水平扩展等核心知识点,助力后端面试准备。\ncateg"
},
{
"path": "docs/database/mongodb/mongodb-questions-02.md",
"chars": 9954,
"preview": "---\ntitle: MongoDB常见面试题总结(下)\ndescription: MongoDB常见面试题总结下篇,深入讲解MongoDB各类索引(单字段、复合、多键、文本、地理位置、TTL)的原理、使用场景和查询优化技巧。\ncatego"
},
{
"path": "docs/database/mysql/a-thousand-lines-of-mysql-study-notes.md",
"chars": 26693,
"preview": "---\ntitle: 一千行 MySQL 学习笔记\ndescription: 一千行MySQL学习笔记精华总结,涵盖数据库操作、表管理、SQL语法、索引、视图、存储过程、触发器等核心知识点,适合快速查阅和复习。\ncategory: 数据库\n"
},
{
"path": "docs/database/mysql/how-sql-executed-in-mysql.md",
"chars": 5280,
"preview": "---\ntitle: SQL语句在MySQL中的执行过程\ndescription: 详解SQL语句在MySQL中的完整执行流程,从连接器身份认证、查询缓存、分析器语法解析、优化器生成执行计划到执行器调用存储引擎的全过程。\ncategory:"
},
{
"path": "docs/database/mysql/index-invalidation-caused-by-implicit-conversion.md",
"chars": 6570,
"preview": "---\ntitle: MySQL隐式转换造成索引失效\ndescription: 深入分析MySQL中隐式类型转换导致索引失效的原因和场景,通过实际案例演示字符串与数字比较时的性能问题,并给出避免索引失效的最佳实践。\ncategory: 数据"
},
{
"path": "docs/database/mysql/innodb-implementation-of-mvcc.md",
"chars": 10462,
"preview": "---\ntitle: InnoDB存储引擎对MVCC的实现\ndescription: 深入剖析InnoDB存储引擎MVCC的实现原理,详解隐藏列、undo log版本链、ReadView机制,以及快照读与当前读的区别,理解MySQL如何实现"
},
{
"path": "docs/database/mysql/mysql-auto-increment-primary-key-continuous.md",
"chars": 6957,
"preview": "---\ntitle: MySQL自增主键一定是连续的吗?\ndescription: 详解MySQL自增主键不连续的原因,分析唯一键冲突、事务回滚、批量插入等场景下自增值的分配机制,以及InnoDB自增锁模式的配置与影响。\ncategory:"
},
{
"path": "docs/database/mysql/mysql-high-performance-optimization-specification-recommendations.md",
"chars": 9939,
"preview": "---\ntitle: MySQL高性能优化规范建议总结\ndescription: MySQL高性能优化规范建议总结,涵盖数据库命名规范、表设计规范、字段设计规范、索引设计规范、SQL编写规范等,帮助你构建高效稳定的数据库系统。\ncatego"
},
{
"path": "docs/database/mysql/mysql-index-invalidation.md",
"chars": 8889,
"preview": "---\ntitle: MySQL索引失效场景总结\ndescription: 全面总结MySQL索引失效的常见场景,包括SELECT *查询、违背最左前缀原则、索引列计算函数转换、LIKE模糊查询、OR连接、IN/NOT IN使用不当、隐式类"
},
{
"path": "docs/database/mysql/mysql-index.md",
"chars": 19770,
"preview": "---\ntitle: MySQL索引详解\ndescription: MySQL索引详解,深入剖析B+树索引结构、聚簇索引与二级索引的区别、联合索引与最左前缀原则、覆盖索引与索引下推优化,以及常见的索引失效场景。\ncategory: 数据库\n"
},
{
"path": "docs/database/mysql/mysql-logs.md",
"chars": 12704,
"preview": "---\ntitle: MySQL三大日志(binlog、redo log和undo log)详解\ndescription: 深入解析MySQL三大日志binlog、redo log和undo log的作用与原理,详解两阶段提交保证数据一致性"
},
{
"path": "docs/database/mysql/mysql-query-cache.md",
"chars": 8339,
"preview": "---\ntitle: MySQL查询缓存详解\ndescription: 深入解析MySQL查询缓存的工作原理、配置管理及其优缺点,分析为什么MySQL 8.0移除了查询缓存功能,以及生产环境中的最佳实践建议。\ncategory: 数据库\nt"
},
{
"path": "docs/database/mysql/mysql-query-execution-plan.md",
"chars": 10108,
"preview": "---\ntitle: MySQL执行计划分析\ndescription: 详解MySQL EXPLAIN执行计划的各列含义,包括id、select_type、type、key、rows、Extra等关键字段解读,帮助你分析SQL性能瓶颈并进行"
},
{
"path": "docs/database/mysql/mysql-questions-01.md",
"chars": 40510,
"preview": "---\ntitle: MySQL常见面试题总结\ndescription: MySQL高频面试题精讲:基础架构、InnoDB引擎、索引原理、B+树、事务ACID、MVCC、redo/undo/binlog日志、行锁/表锁、慢查询优化,一文速通"
},
{
"path": "docs/database/mysql/some-thoughts-on-database-storage-time.md",
"chars": 6888,
"preview": "---\ntitle: MySQL日期类型选择建议\ndescription: 深入对比MySQL中DATETIME和TIMESTAMP的区别,分析时区处理、存储空间、取值范围等差异,给出日期类型选择的最佳实践建议。\ncategory: 数据库"
},
{
"path": "docs/database/mysql/transaction-isolation-level.md",
"chars": 4762,
"preview": "---\ntitle: MySQL事务隔离级别详解\ndescription: 详解MySQL四种事务隔离级别(读未提交、读已提交、可重复读、串行化)的特点与区别,分析脏读、不可重复读、幻读等并发问题,以及InnoDB如何通过MVCC和锁机制解"
},
{
"path": "docs/database/nosql.md",
"chars": 3958,
"preview": "---\ntitle: NoSQL基础知识总结\ndescription: NoSQL数据库基础知识总结,包括NoSQL与SQL的区别、NoSQL的优势、四种NoSQL数据库类型(键值、文档、图形、宽列)及其代表产品Redis、MongoDB、"
},
{
"path": "docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md",
"chars": 4484,
"preview": "---\ntitle: 3种常用的缓存读写策略详解\ndescription: 深入对比 Cache Aside、Read/Write Through、Write Behind 三种缓存读写策略,附详细时序图、一致性问题分析及生产级解决方案,R"
},
{
"path": "docs/database/redis/cache-basics.md",
"chars": 6627,
"preview": "---\ntitle: 缓存基础常见面试题总结\ndescription: 深入讲解缓存的核心思想、本地缓存与分布式缓存的区别、多级缓存架构设计。涵盖Caffeine、Redis等主流缓存方案,以及缓存一致性的解决方案。适合Java开发者学习缓"
},
{
"path": "docs/database/redis/images/aof-rewrite.drawio",
"chars": 1221,
"preview": "<mxfile host=\"Electron\" modified=\"2023-03-25T08:01:22.932Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/aof-work-process.drawio",
"chars": 2117,
"preview": "<mxfile host=\"Electron\" modified=\"2023-03-25T06:53:36.610Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/hash-shopping-cart.drawio",
"chars": 1711,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-31T01:12:05.119Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/memory-fragmentation.drawio",
"chars": 1375,
"preview": "<mxfile host=\"Electron\" modified=\"2021-12-30T08:24:33.950Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-aof-write-log-disc.drawio",
"chars": 3973,
"preview": "<mxfile host=\"Electron\" modified=\"2022-09-14T08:32:39.701Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-cache-avalanche.drawio",
"chars": 5481,
"preview": "<mxfile host=\"Electron\" modified=\"2022-12-03T04:54:11.822Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-cache-breakdown.drawio",
"chars": 5505,
"preview": "<mxfile host=\"Electron\" modified=\"2022-12-03T04:51:47.120Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-cache-penetration.drawio",
"chars": 5409,
"preview": "<mxfile host=\"Electron\" modified=\"2022-12-03T04:07:13.335Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-event-handler.drawio",
"chars": 2257,
"preview": "<mxfile host=\"Electron\" modified=\"2023-03-24T02:15:32.077Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis-list.drawio",
"chars": 1319,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-21T12:47:30.896Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/database/redis/images/redis4.0-master-slave-replication-replid.drawio",
"chars": 6293,
"preview": "<mxfile host=\"Electron\" modified=\"2022-09-15T11:47:26.812Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/database/redis/redis-cluster.md",
"chars": 536,
"preview": "---\ntitle: Redis集群详解(付费)\ndescription: Redis集群相关面试题详解,包括Redis Sentinel哨兵模式、Redis Cluster分片集群的原理、配置和使用,以及主从复制、故障转移等高可用方案。\n"
},
{
"path": "docs/database/redis/redis-common-blocking-problems-summary.md",
"chars": 5487,
"preview": "---\ntitle: Redis常见阻塞原因总结\ndescription: 全面总结Redis常见的阻塞原因,包括O(n)复杂度命令、bigkey操作、AOF日志刷盘、RDB快照创建、主从同步等场景,帮助你排查和预防Redis性能问题。\nc"
},
{
"path": "docs/database/redis/redis-data-structures-01.md",
"chars": 15262,
"preview": "---\ntitle: Redis 5 种基本数据类型详解\ndescription: 详解Redis五种基本数据类型String、List、Set、Hash、Zset的使用方法和应用场景,深入分析SDS、跳表、压缩列表等底层数据结构实现原理。"
},
{
"path": "docs/database/redis/redis-data-structures-02.md",
"chars": 8064,
"preview": "---\ntitle: Redis 3 种特殊数据类型详解\ndescription: 详解Redis三种特殊数据类型Bitmap、HyperLogLog、GEO的使用方法和应用场景,包括签到统计、UV统计、附近的人等典型业务场景实现。\ncat"
},
{
"path": "docs/database/redis/redis-delayed-task.md",
"chars": 2950,
"preview": "---\ntitle: 如何基于Redis实现延时任务?\ndescription: 详解基于Redis实现延时任务的两种方案:过期事件监听和Redisson延时队列,分析各方案的优缺点、可靠性问题和适用场景。\ncategory: 数据库\nta"
},
{
"path": "docs/database/redis/redis-memory-fragmentation.md",
"chars": 3792,
"preview": "---\ntitle: Redis内存碎片详解\ndescription: 深入解析Redis内存碎片产生的原因、判断方法和优化方案,包括内存碎片率计算、jemalloc分配器原理、自动内存碎片清理配置等。\ncategory: 数据库\ntag:"
},
{
"path": "docs/database/redis/redis-persistence.md",
"chars": 26519,
"preview": "---\ntitle: Redis持久化机制详解\ndescription: 深入解析Redis三种持久化机制RDB快照、AOF日志和混合持久化的工作原理、配置方法和优缺点对比,帮助你选择适合业务场景的持久化策略。\ncategory: 数据库\n"
},
{
"path": "docs/database/redis/redis-questions-01.md",
"chars": 27853,
"preview": "---\ntitle: Redis常见面试题总结(上)\ndescription: 最新Redis面试题总结(上):深入讲解Redis基础、五大常用数据结构、单线程模型原理、持久化机制、内存淘汰与过期策略、分布式锁与消息队列实现。适合准备后端面"
},
{
"path": "docs/database/redis/redis-questions-02.md",
"chars": 25544,
"preview": "---\ntitle: Redis常见面试题总结(下)\ndescription: 最新Redis面试题总结(下):深度剖析Redis事务原理、性能优化(pipeline/Lua/bigkey/hotkey)、缓存穿透/击穿/雪崩解决方案、慢查"
},
{
"path": "docs/database/redis/redis-skiplist.md",
"chars": 21082,
"preview": "---\ntitle: Redis为什么用跳表实现有序集合\ndescription: 深入讲解Redis有序集合Zset为何选择跳表而非红黑树、B+树实现,详解跳表的数据结构原理、时间复杂度分析和Redis源码实现。\ncategory: 数据"
},
{
"path": "docs/database/redis/redis-stream-mq.md",
"chars": 9034,
"preview": "---\ntitle: 如何基于Redis实现消息队列?\ndescription: 讲解 Redis 做消息队列的三种方式:List、Pub/Sub、Stream。对比生产级 MQ 核心能力,详解 Redis 5.0 Stream 的消费者组"
},
{
"path": "docs/database/sql/sql-questions-01.md",
"chars": 42118,
"preview": "---\ntitle: SQL常见面试题总结(1)\ndescription: SQL常见面试题总结第一篇,涵盖SELECT检索数据、WHERE条件过滤、ORDER BY排序、DISTINCT去重、LIMIT分页等基础查询操作及牛客真题解析。\n"
},
{
"path": "docs/database/sql/sql-questions-02.md",
"chars": 16970,
"preview": "---\ntitle: SQL常见面试题总结(2)\ndescription: SQL常见面试题总结第二篇,详解INSERT、UPDATE、DELETE等DML数据操作语句,包括批量插入、从其他表导入、带更新的插入等实战技巧。\ncategory"
},
{
"path": "docs/database/sql/sql-questions-03.md",
"chars": 47526,
"preview": "---\ntitle: SQL常见面试题总结(3)\ndescription: SQL常见面试题总结第三篇,深入讲解聚合函数COUNT、SUM、AVG、MAX、MIN的使用,以及GROUP BY分组、HAVING过滤、截断平均值计算等进阶技巧。"
},
{
"path": "docs/database/sql/sql-questions-04.md",
"chars": 30034,
"preview": "---\ntitle: SQL常见面试题总结(4)\ndescription: SQL常见面试题总结第四篇,详解MySQL 8.0窗口函数ROW_NUMBER、RANK、DENSE_RANK、NTILE、LAG、LEAD等的用法和应用场景。\nc"
},
{
"path": "docs/database/sql/sql-questions-05.md",
"chars": 36549,
"preview": "---\ntitle: SQL常见面试题总结(5)\ndescription: SQL常见面试题总结第五篇,详解NULL空值处理技巧,包括IFNULL、COALESCE函数,以及使用CASE WHEN进行条件统计和完成率计算。\ncategory"
},
{
"path": "docs/database/sql/sql-syntax-summary.md",
"chars": 30394,
"preview": "---\ntitle: SQL语法基础知识总结\ndescription: SQL语法基础知识总结,系统讲解DDL数据定义、DML数据操作、DQL数据查询、DCL数据控制语言,涵盖表操作、约束、索引、事务、连接查询等核心知识点。\ncategor"
},
{
"path": "docs/distributed-system/api-gateway.md",
"chars": 12492,
"preview": "---\ntitle: API网关基础知识总结\ncategory: 分布式\ndescription: API网关基础知识详解,涵盖网关核心功能(路由转发、身份认证、限流熔断、负载均衡)、工作原理及Zuul、Spring Cloud Gatew"
},
{
"path": "docs/distributed-system/distributed-configuration-center.md",
"chars": 7725,
"preview": "---\ntitle: 分布式配置中心面试题总结\ndescription: 深入解析分布式配置中心核心原理与面试高频考点,涵盖 Apollo、Nacos、Spring Cloud Config 对比选型、配置推送机制(长轮询/gRPC)、灰度"
},
{
"path": "docs/distributed-system/distributed-id-design.md",
"chars": 6357,
"preview": "---\ntitle: 分布式ID设计实战指南\ncategory: 分布式\ndescription: 分布式ID设计实战指南,结合订单系统、一码付、优惠券等业务场景讲解分布式ID的设计要点、技术选型及不同场景下的ID生成策略。\ntag:\n "
},
{
"path": "docs/distributed-system/distributed-id.md",
"chars": 17833,
"preview": "---\ntitle: 分布式ID生成方案总结\ncategory: 分布式\ndescription: 分布式ID生成方案详解,涵盖UUID、数据库自增ID、号段模式、雪花算法(Snowflake)、Leaf等主流方案的原理、优缺点对比及适用场"
},
{
"path": "docs/distributed-system/distributed-lock-implementations.md",
"chars": 13184,
"preview": "---\ntitle: 分布式锁常见实现方案总结\ncategory: 分布式\ndescription: 分布式锁常见实现方案详解,包括基于Redis SETNX、Redlock、ZooKeeper临时节点实现分布式锁的原理、优缺点对比及最佳实"
},
{
"path": "docs/distributed-system/distributed-lock.md",
"chars": 2828,
"preview": "---\ntitle: 分布式锁入门介绍\ncategory: 分布式\ndescription: 分布式锁基础概念详解,讲解为什么需要分布式锁、分布式锁的核心特性(互斥性、防死锁、可重入)、常见应用场景(秒杀、库存扣减)分析。\ntag:\n -"
},
{
"path": "docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md",
"chars": 6856,
"preview": "---\ntitle: ZooKeeper实战教程\ncategory: 分布式\ndescription: ZooKeeper实战教程,涵盖Docker安装部署、zkCli常用命令操作(create/get/set/delete/ls)、四字命"
},
{
"path": "docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-intro.md",
"chars": 16032,
"preview": "---\ntitle: ZooKeeper入门指南\ncategory: 分布式\ndescription: ZooKeeper入门指南,讲解ZooKeeper核心概念、数据模型(ZNode/节点类型)、Watcher监听机制、ACL权限控制及作"
},
{
"path": "docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md",
"chars": 19083,
"preview": "---\ntitle: ZooKeeper进阶详解\ncategory: 分布式\ndescription: ZooKeeper进阶详解,深入讲解ZAB协议原理、Leader选举机制(FastLeaderElection)、集群部署策略(奇数节点"
},
{
"path": "docs/distributed-system/distributed-transaction.md",
"chars": 515,
"preview": "---\ntitle: 分布式事务解决方案总结\ncategory: 分布式\ndescription: 分布式事务常见解决方案详解,包括2PC两阶段提交、3PC三阶段提交、TCC补偿事务、Saga编排模式、本地消息表、事务消息等方案的原理、优缺"
},
{
"path": "docs/distributed-system/images/api-gateway/api-gateway-overview.drawio",
"chars": 3643,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T02:35:21.450Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/distributed-id/database-number-segment-mode.drawio",
"chars": 1943,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T03:12:28.380Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/distributed-id/distributed-id-requirements.drawio",
"chars": 1807,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T03:06:20.012Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/distributed-id/id-after-the-sub-table-not-conflict.drawio",
"chars": 2967,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T03:08:13.594Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/distributed-id/nosql.drawio",
"chars": 2391,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T03:15:10.950Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/distributed-id/the-primary-key-of-the-database-increases-automatically.drawio",
"chars": 2447,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-27T03:13:28.105Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/zookeeper/znode-structure.drawio",
"chars": 2057,
"preview": "<mxfile host=\"Electron\" modified=\"2023-03-17T03:27:16.817Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/distributed-system/images/zookeeper/zookeeper-watcher.drawio",
"chars": 1641,
"preview": "<mxfile host=\"Electron\" modified=\"2023-03-17T04:31:30.767Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/distributed-system/protocol/cap-and-base-theorem.md",
"chars": 18712,
"preview": "---\ntitle: CAP定理与BASE理论详解\ncategory: 分布式\ndescription: CAP定理与BASE理论详解,深入讲解分布式系统一致性(Consistency)、可用性(Availability)、分区容错性(Pa"
},
{
"path": "docs/distributed-system/protocol/consistent-hashing.md",
"chars": 4843,
"preview": "---\ntitle: 一致性哈希算法详解\ncategory: 分布式\ndescription: 一致性哈希算法原理详解,讲解哈希环、虚拟节点机制、数据倾斜问题解决方案,以及在分布式缓存(Redis/Memcached)、负载均衡、分库分表中"
},
{
"path": "docs/distributed-system/protocol/gossip-protocol.md",
"chars": 7008,
"preview": "---\ntitle: Gossip协议详解\ncategory: 分布式\ndescription: Gossip协议原理详解,讲解去中心化信息传播机制、两种典型传播模式(反熵Anti-Entropy与谣言传播Rumor-Mongering)、"
},
{
"path": "docs/distributed-system/protocol/paxos-algorithm.md",
"chars": 14643,
"preview": "---\ntitle: Paxos算法详解\ncategory: 分布式\ndescription: Paxos共识算法原理详解,涵盖Basic Paxos两阶段提交(Prepare/Accept)流程、Proposer/Proposer/Acc"
},
{
"path": "docs/distributed-system/protocol/raft-algorithm.md",
"chars": 10849,
"preview": "---\ntitle: Raft算法详解\ncategory: 分布式\ndescription: Raft共识算法原理详解,涵盖Leader选举(随机超时机制)、日志复制(Log Replication)、安全性保证(选举限制/日志匹配)、成员"
},
{
"path": "docs/distributed-system/protocol/zab.md",
"chars": 4964,
"preview": "---\ntitle: ZAB协议详解\ncategory: 分布式\ndescription: ZooKeeper的核心共识协议ZAB(ZooKeeper Atomic Broadcast,原子广播协议)详解,包括消息广播模式、崩溃恢复模式、L"
},
{
"path": "docs/distributed-system/rpc/dubbo.md",
"chars": 15562,
"preview": "---\ntitle: Dubbo面试题总结\ncategory: 分布式\ndescription: Dubbo核心知识与面试题详解,涵盖Dubbo架构原理、SPI扩展机制、负载均衡策略(随机/轮询/一致性哈希)、服务注册发现、集群容错、服务治"
},
{
"path": "docs/distributed-system/rpc/http&rpc.md",
"chars": 7873,
"preview": "---\ntitle: HTTP与RPC对比\ncategory: 分布式\ndescription: HTTP与RPC对比详解,从TCP层出发讲解两种通信方式的本质区别、性能差异(序列化/连接复用)、传输协议对比及在微服务架构中的选型建议。\nt"
},
{
"path": "docs/distributed-system/rpc/rpc-intro.md",
"chars": 5804,
"preview": "---\ntitle: RPC基础知识总结\ncategory: 分布式\ndescription: RPC远程过程调用基础详解,讲解RPC核心原理、调用流程(客户端Stub/服务端Stub/网络传输)、序列化协议(Protobuf/Hessia"
},
{
"path": "docs/distributed-system/spring-cloud-gateway-questions.md",
"chars": 6243,
"preview": "---\ntitle: Spring Cloud Gateway面试题总结\ncategory: 分布式\ndescription: Spring Cloud Gateway核心原理详解,包括路由配置、Predicate断言、Filter过滤器机"
},
{
"path": "docs/high-availability/fallback-and-circuit-breaker.md",
"chars": 11951,
"preview": "---\ntitle: 降级&熔断详解\ndescription: 服务降级与熔断机制详解,讲解降级策略、熔断器原理及 Hystrix、Sentinel、Resilience4j 等框架的应用实践,涵盖雪崩效应、熔断状态机、隔离策略与系统自适应"
},
{
"path": "docs/high-availability/high-availability-system-design.md",
"chars": 6394,
"preview": "---\ntitle: 高可用系统设计指南\ndescription: 本文系统讲解高可用系统设计的核心知识,涵盖可用性衡量标准(SLA/多少个9)、常见故障原因(硬件故障/代码缺陷/流量激增/网络攻击)、以及10+种提升系统可用性的方法(集群"
},
{
"path": "docs/high-availability/idempotency.md",
"chars": 421,
"preview": "---\ntitle: 接口幂等方案总结(付费)\ndescription: 接口幂等性设计详解,涵盖幂等性概念、常见实现方案及在支付、订单等场景中的应用实践。\ncategory: 高可用\nicon: security-fill\n---\n\n**"
},
{
"path": "docs/high-availability/limit-request.md",
"chars": 8798,
"preview": "---\ntitle: 服务限流详解\ndescription: 服务限流原理与实现详解,涵盖固定窗口、滑动窗口、令牌桶、漏桶等主流限流算法的原理与应用。\ncategory: 高可用\nicon: limit_rate\n---\n\n针对软件系统来说"
},
{
"path": "docs/high-availability/performance-test.md",
"chars": 7453,
"preview": "---\ntitle: 性能测试入门\ndescription: 本文系统讲解性能测试核心知识,涵盖响应时间分位值(P90/P99/P999)、QPS/TPS、Little's Law 与曲棍球棒曲线、背压与自愈验证、性能测试分类(负载/压力/"
},
{
"path": "docs/high-availability/redundancy.md",
"chars": 5975,
"preview": "---\ntitle: 冗余设计详解\ndescription: 本文系统讲解冗余设计核心知识,涵盖冗余类型(硬件/软件/数据/服务冗余)、RTO/RPO 指标、高可用集群(主备/主主模式)、同城灾备、异地灾备、同城多活、异地多活架构对比及故障"
},
{
"path": "docs/high-availability/timeout-and-retry.md",
"chars": 6534,
"preview": "---\ntitle: 超时&重试详解\ndescription: 本文系统讲解超时与重试机制核心知识,涵盖连接超时/读取超时设置原则、重试策略对比(固定间隔/指数退避/抖动退避)、重试风险(重试风暴/雪崩效应)及规避方法、幂等性设计、Java"
},
{
"path": "docs/high-performance/cdn.md",
"chars": 8634,
"preview": "---\ntitle: CDN工作原理详解\ndescription: 本文详解 CDN(内容分发网络)的核心原理,涵盖 GSLB 全局负载均衡调度机制、CDN 缓存策略(预热/回源/刷新)、命中率与回源率优化,以及 Referer 防盗链与时"
},
{
"path": "docs/high-performance/data-cold-hot-separation.md",
"chars": 12458,
"preview": "---\ntitle: 数据冷热分离详解\ndescription: 本文详解数据冷热分离的核心原理与实践方案,涵盖冷热数据判定策略、多级分层设计、数据迁移一致性保障、冷数据查询优化、存储选型(HBase/TiDB/对象存储),以及订单/日志/"
},
{
"path": "docs/high-performance/deep-pagination-optimization.md",
"chars": 6338,
"preview": "---\ntitle: 深度分页介绍及优化建议\ndescription: 深度分页是指查询偏移量过大导致性能下降的场景,本文详解深度分页产生的原因及四种优化方案:范围查询、子查询优化、INNER JOIN 延迟关联、覆盖索引,并分析各方案的适"
},
{
"path": "docs/high-performance/images/read-and-write-separation-and-library-subtable/horizontal-slicing-database.drawio",
"chars": 4437,
"preview": "<mxfile host=\"Electron\" modified=\"2022-11-03T05:15:29.634Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/high-performance/images/read-and-write-separation-and-library-subtable/read-and-write-separation-proxy.drawio",
"chars": 2787,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-21T11:21:39.137Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/high-performance/images/read-and-write-separation-and-library-subtable/read-and-write-separation.drawio",
"chars": 2611,
"preview": "<mxfile host=\"Electron\" modified=\"2022-08-21T11:21:52.663Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_16_0) AppleWebKit/5"
},
{
"path": "docs/high-performance/images/read-and-write-separation-and-library-subtable/two-forms-of-sub-table.drawio",
"chars": 2845,
"preview": "<mxfile host=\"Electron\" modified=\"2022-11-03T03:26:55.023Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/high-performance/images/read-and-write-separation-and-library-subtable/vertical-slicing-database.drawio",
"chars": 2469,
"preview": "<mxfile host=\"Electron\" modified=\"2022-11-03T04:00:58.685Z\" agent=\"5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/5"
},
{
"path": "docs/high-performance/load-balancing.md",
"chars": 10085,
"preview": "---\ntitle: 负载均衡原理及算法详解\ndescription: 本文详解负载均衡的核心原理,涵盖四层/七层负载均衡区别、服务端与客户端负载均衡对比,深入讲解轮询、加权轮询、随机、一致性哈希等常见负载均衡算法,以及 Nginx、LVS"
},
{
"path": "docs/high-performance/message-queue/disruptor-questions.md",
"chars": 6840,
"preview": "---\ntitle: Disruptor常见问题总结\ndescription: 本文总结 Disruptor 高性能内存队列的核心知识与面试要点,涵盖 Disruptor 架构(RingBuffer/Sequencer/WaitStrate"
},
{
"path": "docs/high-performance/message-queue/kafka-questions-01.md",
"chars": 16713,
"preview": "---\ntitle: Kafka常见问题总结\ndescription: 本文总结 Kafka 常见面试题与核心知识点,涵盖 Kafka 架构(Broker/Topic/Partition/Consumer Group)、高性能原理(零拷贝/"
},
{
"path": "docs/high-performance/message-queue/message-queue.md",
"chars": 13784,
"preview": "---\ntitle: 消息队列基础知识总结\ndescription: 本文系统总结消息队列的核心知识,涵盖消息队列的应用场景(异步处理/解耦/削峰)、消息模型(点对点/发布订阅)、如何保证消息不丢失、消息幂等性、消息顺序性、消息积压处理等常"
},
{
"path": "docs/high-performance/message-queue/rabbitmq-questions.md",
"chars": 19795,
"preview": "---\ntitle: RabbitMQ常见问题总结\ndescription: 本文总结 RabbitMQ 常见面试题与核心知识点,涵盖 AMQP 协议、Exchange 交换机类型(Direct/Topic/Fanout)、消息确认机制、死"
},
{
"path": "docs/high-performance/message-queue/rocketmq-questions.md",
"chars": 59295,
"preview": "---\ntitle: RocketMQ常见问题总结\ndescription: 本文总结 RocketMQ 常见面试题与核心知识点,涵盖 RocketMQ 架构(NameServer/Broker/Proxy)、消息类型(普通/顺序/事务/定"
},
{
"path": "docs/high-performance/read-and-write-separation-and-library-subtable.md",
"chars": 11933,
"preview": "---\ntitle: 读写分离和分库分表详解\ndescription: 本文深入讲解数据库读写分离与分库分表的核心原理,涵盖主从复制机制、读写分离实现方案(代理/组件)、垂直分库分表与水平分库分表的区别,以及分库分表后的分布式事务、分布式I"
},
{
"path": "docs/high-performance/sql-optimization.md",
"chars": 14725,
"preview": "---\ntitle: 常见SQL优化手段总结\ndescription: 本文系统总结常见的 SQL 优化手段,涵盖慢 SQL 定位与分析(EXPLAIN、Show Profile)、索引优化策略、查询重写技巧、分页优化等实战方法,帮助你快速"
},
{
"path": "docs/high-quality-technical-articles/README.md",
"chars": 2301,
"preview": "# 程序人生\n\n<!-- @include: @small-advertisement.snippet.md -->\n\n这里主要会收录一些我看到的或者我自己写的和程序员密切相关的非技术类的优质文章,每一篇都值得你阅读 3 遍以上!常看常新!"
},
{
"path": "docs/high-quality-technical-articles/advanced-programmer/20-bad-habits-of-bad-programmers.md",
"chars": 2896,
"preview": "---\ntitle: 糟糕程序员的 20 个坏习惯\ndescription: \"糟糕程序员的 20 个坏习惯:围绕技术知识与面试总结梳理关键概念、常见问题与实践要点,帮助你高效学习与备战面试。\"\ncategory: 技术文章精选集\nauth"
}
]
// ... and 178 more files (download for full content)
About this extraction
This page contains the full source code of the Snailclimb/JavaGuide GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 378 files (3.4 MB), approximately 923.6k tokens, and a symbol index with 31 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.