├── .gitignore
├── README.md
├── notes
├── 2016 校招真题题解.md
├── Git.md
├── HTTP.md
├── JDK 中的设计模式.md
├── Java IO.md
├── Java 基础.md
├── Java 容器.md
├── Java 并发.md
├── Java 虚拟机.md
├── Leetcode 题解.md
├── Linux.md
├── MySQL.md
├── Redis.md
├── SQL.md
├── 一致性协议.md
├── 代码可读性.md
├── 代码风格规范.md
├── 分布式基础.md
├── 分布式问题分析.md
├── 剑指 offer 题解.md
├── 数据库系统原理.md
├── 正则表达式.md
├── 算法.md
├── 计算机操作系统.md
├── 计算机网络.md
├── 设计模式.md
├── 重构.md
└── 面向对象思想.md
└── pics
├── 02986f62-c641-44a8-a55f-983581490e0c.png
├── 037c3a0b-332d-434d-a374-f343ef72c8e1.jpg
├── 042cf928-3c8e-4815-ae9c-f2780202c68f.png
├── 05907ab4-42c5-4b5e-9388-6617f6c97bea.jpg
├── 061c29ce-e2ed-425a-911e-56fbba1efce3.jpg
├── 0635cbe8.png
├── 07717718-1230-4347-aa18-2041c315e670.jpg
├── 07903a31-0fb3-45fc-86f5-26f0b28fa4e7.png
├── 08427d38-8df1-49a1-8990-e0ce5ee36ca2.png
├── 08f32fd3-f736-4a67-81ca-295b2a7972f2.jpg
├── 09e6e8d4-4d83-4949-b908-6d6b4c2fd064.png
├── 0a9f4125-b6ab-4e94-a807-fd7070ae726a.png
├── 0aaf4630-d2a2-4783-b3f7-a2b6a7dfc01b.jpg
├── 0c55e11c-d3ce-4cd8-b139-028aea6f40e3.png
├── 0e34263d-7287-4ffe-a716-37c53d1a2526.png
├── 0ee0f61b-c782-441e-bf34-665650198ae0.jpg
├── 0f373947-c68f-45b4-a59e-086154745ac5.png
├── 10.gif
├── 107a6a2b-f15b-4cad-bced-b7fb95258c9c.png
├── 10bdf7bf-0daa-4a26-b927-f142b3f8e72b.png
├── 10f5e35b-1c71-4717-9e80-47f259702642.jpg
├── 11.gif
├── 111521118015898.gif
├── 111521118445538.gif
├── 111521118483039.gif
├── 111521118640738.gif
├── 111521119203347.gif
├── 111521119368714.gif
├── 1164a71f-413d-494a-9cc8-679fb6a2613d.jpg
├── 1202b2d6-9469-4251-bd47-ca6034fb6116.png
├── 123bdf81-1ef5-48a9-a08c-2db97057b4d2.png
├── 14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png
├── 1556770b-8c01-4681-af10-46f1df69202c.jpg
├── 1582217a-ed46-4cac-811e-90d13a65163b.png
├── 15b45dc6-27aa-4519-9194-f4acfa2b077f.jpg
├── 17976404-95f5-480e-9cb4-250e6aa1d55f.png
├── 185b9c49-4c13-4241-a848-fbff85c03a64.png
├── 1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg
├── 1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg
├── 1ab49e39-012b-4383-8284-26570987e3c4.jpg
├── 1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png
├── 1be8b4b0-cc7a-44d7-9c77-85be37b76f7d.png
├── 1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png
├── 1bfa3118-f3cd-4480-a950-cf6d646015db.png
├── 1ca52246-c443-48ae-b1f8-1cafc09ec75c.png
├── 1ee5f0a5-b8df-43b9-95ab-c516c54ec797.jpg
├── 1f039a45-6b91-4f31-a2c2-6c63eb8bdb56.png
├── 1f080e53-4758-406c-bb5f-dbedf89b63ce.jpg
├── 1f4a7f10-52b2-4bd7-a67d-a9581d66dc62.jpg
├── 20150928140509757.png
├── 2017511e-22f0-4d74-873d-1261b71cf5a4.png
├── 2018040302.jpg
├── 207c1801-2335-4b1b-b65c-126a0ba966cb.png
├── 21041ec2-babb-483f-bf47-8b8148eec162.png
├── 211c60d4-75ca-4acd-8a4f-171458ed58b4.jpg
├── 22de0538-7c6e-4365-bd3b-8ce3c5900216.png
├── 22fda4ae-4dd5-489d-ab10-9ebfdad22ae0.jpg
├── 23ba890e-e11c-45e2-a20c-64d217f83430.png
├── 245fd2fb-209c-4ad5-bc5e-eb5664966a0e.jpg
├── 249f3bb1-feee-4805-a259-a72699d638ca.jpg
├── 25d6d3d4-4726-47b1-a9cb-3316d1ff5dd5.png
├── 265a355d-aead-48aa-b455-f33b62fe729f.png
├── 2719067e-b299-4639-9065-bed6729dbf0b.png
├── 2766d04f-7dad-42e4-99d1-60682c9d5c61.jpg
├── 276c31df-3b28-4ac2-b006-1e80fc86a64f.jpg
├── 278fe431-af88-4a95-a895-9c3b80117de3.jpg
├── 27cd6f0c-f581-45da-b8c9-fed026830560.png
├── 292b4a35-4507-4256-84ff-c218f108ee31.jpg
├── 293d2af9-de1d-403e-bed0-85d029383528.png
├── 2_14_microkernelArchitecture.jpg
├── 2a842a14-e4ab-4f37-83fa-f82c206fe426.png
├── 2ad244f5-939c-49fa-9385-69bc688677ab.jpg
├── 2bf2fd8f-5ade-48ba-a2b3-74195ac77c4b.png
├── 2c4556e4-0751-4377-ab08-e7b89d697ca7.png
├── 2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png
├── 2d09a847-b854-439c-9198-b29c65810944.png
├── 2e6c72f5-3b8e-4e32-b87b-9491322628fe.png
├── 30210b86-472d-4574-abb6-b74898cc17a4.jpg
├── 3086c248-b552-499e-b101-9cffe5c2773e.png
├── 31d99967-1171-448e-8531-bccf5c14cffe.jpg
├── 323ffd6c-8b54-4f3e-b361-555a6c8bf218.png
├── 32b8374a-e822-4720-af0b-c0f485095ea2.jpg
├── 33ac2b23-cb85-4e99-bc41-b7b7199fad1c.png
├── 348bc2db-582e-4aca-9f88-38c40e9a0e69.png
├── 3646544a-cb57-451d-9e03-d3c4f5e4434a.png
├── 37a72755-4890-4b42-9eab-b0084e0c54d9.png
├── 386cd64f-7a9d-40e6-8c55-22b90ee2d258.png
├── 390c913b-5f31-444f-bbdb-2b88b688e7ce.jpg
├── 3939369b-3a4a-48a0-b9eb-3efae26dd400.png
├── 395a9e83-b1a1-4a1d-b170-d081e7bb5bab.png
├── 39ccb299-ee99-4dd1-b8b4-2f9ec9495cb4.png
├── 3b0d1aa8-d0e0-46c2-8fd1-736bf08a11aa.jpg
├── 3b49dd67-2c40-4b81-8ad2-7bbb1fe2fcbd.png
├── 3cd630ea-017c-488d-ad1d-732b4efeddf5.png
├── 3f5bba4b-7813-4aea-b578-970c7e3f6bf3.jpg
├── 41392d76-dd1d-4712-85d9-e8bb46b04a2d.png
├── 423f2a40-bee1-488e-b460-8e76c48ee560.png
├── 426df589-6f97-4622-b74d-4a81fcb1da8e.png
├── 43f2cafa-3568-4a89-a895-4725666b94a6.png
├── 44e4a7ab-215c-41a1-8e34-f55f6c09e517.jpg
├── 44edefb7-4b58-4519-b8ee-4aca01697b78.jpg
├── 450px-HTTP_persistent_connection.svg.png
├── 4583e24f-424b-4d50-8a14-2c38a1827d4a.png
├── 45e0e0bf-386d-4280-a341-a0b9496c7674.png
├── 4628274c-25b6-4053-97cf-d1239b44c43d.png
├── 46cec213-3048-4a80-aded-fdd577542801.jpg
├── 46f66e88-e65a-4ad0-a060-3c63fe22947c.png
├── 47358f87-bc4c-496f-9a90-8d696de94cee.png
├── 47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg
├── 485fdf34-ccf8-4185-97c6-17374ee719a0.png
├── 4885d0bc-1441-460f-bd75-a2088aa7f2d4.png
├── 48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg
├── 4bb7ed45-ec14-4d31-9da4-94024d9d3b05.png
├── 4d741402-344d-4b7c-be01-e57184bcad0e.png
├── 4e760981-a0c5-4dbf-9fbf-ce963e0629fb.png
├── 4f48e806-f90b-4c09-a55f-ac0cd641c047.png
├── 4fc032e0-ac6f-4b42-9182-ee104a25e7a1.png
├── 4ff355cf-9a7f-4468-af43-e5b02038facc.jpg
├── 50d38e84-238f-4081-8876-14ef6d7938b5.jpg
├── 518f16f2-a9f7-499a-98e1-f1dbb37b5a9a.png
├── 51e2ed95-65b8-4ae9-8af3-65602d452a25.jpg
├── 51fb761d-8ce0-4472-92ff-2f227ac7888a.png
├── 5292faa6-0141-4638-bf0f-bb95b081dcba.jpg
├── 52e1af6f-3a7a-4bee-aa8f-fcb5dacebe40.jpg
├── 5341d726-ffde-4d2a-a000-46597bcc9c5a.png
├── 536c6dfd-305a-4b95-b12c-28ca5e8aa043.png
├── 540631a4-6018-40a5-aed7-081e2eeeaeea.png
├── 54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png
├── 55dc4e84-573d-4c13-a765-52ed1dd251f9.png
├── 58e57a21-6b6b-40b6-af85-956dd4e0f55a.jpg
├── 5930aeb8-847d-4e9f-a168-9334d7dec744.png
├── 5942debd-fc00-477a-b390-7c5692cc8070.jpg
├── 5999e5de-7c16-4b52-b3aa-6dc7b58c7894.png
├── 5aa82b89-f266-44da-887d-18f31f01d8ef.png
├── 5aac64d3-2c7b-4f32-9e9a-1df2186f588b.png
├── 5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png
├── 5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg
├── 5d4a5181-65fb-4bf2-a9c6-899cab534b44.png
├── 5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg
├── 5e9b10f3-9504-4483-9667-d4770adebf9f.png
├── 5ed71283-a070-4b21-85ae-f2cbfd6ba6e1.jpg
├── 5f5ef0b6-98ea-497c-a007-f6c55288eab1.png
├── 5f96e565-0693-47df-80f1-29e4271057b7.png
├── 600e9c75-5033-4dad-ae2b-930957db638e.png
├── 600px-Sharedmem.jpg
├── 6019b2db-bc3e-4408-b6d8-96025f4481d6.png
├── 61942711-45a0-4e11-bbc9-434e31436f33.png
├── 62e0dd4f-44c3-43ee-bb6e-fedb9e068519.png
├── 62e77997-6957-4b68-8d12-bfd609bb2c68.jpg
├── 63cd5b50-d6d8-4df6-8912-ef4a1dd5ba13.jpg
├── 654acfed-a6a5-4fc7-8f40-3fdcae57bae8.jpg
├── 658fc5e7-79c0-4247-9445-d69bf194c539.png
├── 66192382-558b-4b05-a35d-ac4a2b1a9811.jpg
├── 67bf5487-c45d-49b6-b9c0-a058d8c68902.png
├── 68778c1b-15ab-4826-99c0-3b4fd38cb9e9.png
├── 688dacfe-1057-412f-b3a1-86abb5b0f914.png
├── 699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg
├── 69f16984-a66f-4288-82e4-79b4aa43e835.jpg
├── 6c0f4afb-20ab-49fd-837d-8144f4e38bfd.png
├── 6f4abf41-3728-4a6b-9b94-85eed7ca8163.png
├── 7.gif
├── 71363383-2d06-4c63-8b72-c01c2186707d.png
├── 72f0ff69-138d-4e54-b7ac-ebe025d978dc.png
├── 72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png
├── 73b73189-9e95-47e5-91d0-9378b8462e15.png
├── 76a49594323247f21c9b3a69945445ee.png
├── 76b48b4c-8999-4967-893b-832602e73285.png
├── 76dc7769-1aac-4888-9bea-064f1caa8e77.jpg
├── 7779232-1e8ed39548081a1f.png
├── 7779232-96822582feb08651.png
├── 77f81379-3987-4036-8d7c-93a4dcf7b05d.jpg
├── 79b12431-6d9d-4a7d-985b-1b79bc5bf5fb.png
├── 7a29acce-f243-4914-9f00-f2988c528412.jpg
├── 7b038838-c75b-4538-ae84-6299386704e5.jpg
├── 7b281b1e-0595-402b-ae35-8c91084c33c1.png
├── 7b3efa99-d306-4982-8cfb-e7153c33aab4.png
├── 7b68b142-9489-44f6-87b0-4cb5c6431e63.jpg
├── 7bd202a7-93d4-4f3a-a878-af68ae25539a.png
├── 7be0abf9-687c-4451-becd-626b0be7ec22.jpg
├── 7c54de21-e2ff-402e-bc42-4037de1c1592.png
├── 7c98e1b6-c446-4cde-8513-5c11b9f52aea.jpg
├── 7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg
├── 7f38a583-2f2e-4738-97af-510e6fb403a7.png
├── 7f642a65-b167-4c8f-b382-8322c6322b2c.jpg
├── 7fffa4b8-b36d-471f-ad0c-a88ee763bb76.png
├── 8006a450-6c2f-498c-a928-c927f758b1d0.png
├── 81538cd5-1bcf-4e31-86e5-e198df1e013b.jpg
├── 8229e8e7-a183-4d29-94e6-e8d8537c6ce5.png
├── 823cdab7-3779-4e3a-a951-dc2d154e0ee6.jpg
├── 836a4eaf-4798-4e48-b52a-a3dab9435ace.png
├── 8433fbb2-c35c-45ef-831d-e3ca42aebd51.png
├── 85583359-1b45-45f2-9811-4f7bb9a64db7.jpg
├── 85c05fb1-5546-4c50-9221-21f231cdc8c5.jpg
├── 88ff46b3-028a-4dbb-a572-1f062b8b96d3.png
├── 8a4c6ad4-a816-47d1-b93f-7ca4f78ab67a.png
├── 8adb2591-d3f1-4632-84cb-823fb9c5eb09.jpg
├── 8ae4550b-f0cb-4e4d-9e2b-c550538bf230.png
├── 8af348d0-4d72-4f76-b56c-0a440ed4673d.png
├── 8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg
├── 8b798007-e0fb-420c-b981-ead215692417.jpg
├── 8cc671f0-7134-44b1-a7b5-6d24fe55e1c1.jpg
├── 8dfb4cc9-26da-45e7-b820-4576fa1cbb0e.png
├── 8f0cc500-5994-4c7a-91a9-62885d658662.png
├── 8f3b9519-d705-48fe-87ad-2e4052fc81d2.png
├── 8f64e9c5-7682-4feb-9312-dea09514e160.jpg
├── 8f6f9dc9-9ecd-47c8-b50e-2814f0219056.png
├── 8fe838e3-ef77-4f63-bf45-417b6bc5c6bb.png
├── 9.gif
├── 902b83ab-8054-4bd2-898f-9a4a0fe52830.jpg
├── 910f613f-514f-4534-87dd-9b4699d59d31.png
├── 9110c1a0-8a54-4145-a814-2477d0128114.png
├── 91ef04e4-923a-4277-99c0-6be4ce81e5ac.jpg
├── 920c034c-c212-4f79-9ddb-84e4bb6cd088.png
├── 92ad9bae-7d02-43ba-8115-a9d6f530ca28.png
├── 94589319-975f-490b-8bae-90b3a4953559.png
├── 952afa9a-458b-44ce-bba9-463e60162945.png
├── 952e06bd-5a65-4cab-82e4-dd1536462f38.png
├── 955af054-8872-4569-82e7-2e10b66bc38e.png
├── 96b63e13-e2d8-4ddb-9aa1-a38959ca96e5.jpg
├── 992faced-afcf-414d-b801-9c16d6570fec.jpg
├── 9b829410-86c4-40aa-ba8d-9e8e26c0eeb8.jpg
├── 9cd0ae20-4fb5-4017-a000-f7d3a0eb3529.png
├── 9d0a637c-6a8f-4f5a-99b9-fdcfa26793ff.png
├── 9d549816-60b7-4899-9877-23b01503ab13.png
├── 9e80f75a-b12b-4344-80c8-1f9ccc2d5246.jpg
├── ClienteServidorSockets1521731145260.jpg
├── CountdownLatch.png
├── CyclicBarrier.png
├── DP-Decorator-java.io.png
├── GUID_Partition_Table_Scheme.svg.png
├── HTTP_RequestMessageExample.png
├── HTTP_ResponseMessageExample.png
├── How-HTTPS-Works.png
├── Iterator-1.jpg
├── JNIFigure1.gif
├── JVM-Stack.png
├── JVM-runtime-data-area.jpg
├── MultiNode-SessionReplication.jpg
├── MultiNode-SpringSession.jpg
├── MultiNode-StickySessions.jpg
├── PPjwP.png
├── ProcessState.png
├── Semaphore.png
├── Technology-ComputerNetworking-Internet-ISPs.png
├── ZnJvbT1jc2RuJnVybD15VkdkdVYyUXZ.jpg
├── a01d1516-8168-461a-a24b-620b9cfc40f4.png
├── a1198642-9159-4d88-8aec-c3b04e7a2563.jpg
├── a2d13178-f1ef-4811-a240-1fe95b55b1eb.png
├── a314bb79-5b18-4e63-a976-3448bffa6f1b.png
├── a3253deb-8d21-40a1-aae4-7d178e4aa319.jpg
├── a3da4342-078b-43e2-b748-7e71bec50dc4.png
├── a3f34241-bb80-4879-8ec9-dff2d81b514e.jpg
├── a4248c4b-6c1d-4fb8-a557-86da92d3a294.jpg
├── a4b162e5-db2a-4a27-b213-1fe481c5a06a.png
├── a4c17d43-fa5e-4935-b74e-147e7f7e782c.png
├── a57a6fc8-c5e9-456c-80ff-a5139dda4b6e.png
├── a6026bb4-3daf-439f-b1ec-a5a24e19d2fb.jpg
├── a6ac2b08-3861-4e85-baa8-382287bfee9f.png
├── a74b70ac-323a-4b31-b4d5-90569b8a944b.png
├── a9077f06-7584-4f2b-8c20-3a8e46928820.jpg
├── aa29cc88-7256-4399-8c7f-3cf4a6489559.png
├── aa42f9c6-ad7a-48f4-8e8b-f3b6de3feaec.png
├── ab77240d-7338-4547-9183-00215e7220ec.png
├── ac106e7e-489a-4082-abd9-dabebe48394c.jpg
├── ac9b31ec-cef1-4880-a875-fc4571ca10e1.png
├── ace830df-9919-48ca-91b5-60b193f593d2.png
├── ae3fc93a-44d5-4beb-b05a-874bd9c0a657.png
├── af4639f9-af54-4400-aaf5-4e261d96ace7.png
├── b0e8ef47-2f23-4379-8c64-10d5cb44d438.jpg
├── b1fa0453-a4b0-4eae-a352-48acca8fff74.png
├── b29f8971-9cb8-480d-b986-0e60c2ece069.png
├── b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg
├── b418ca51-f005-4510-b7ad-f092eb6aeb24.png
├── b4252c85-6fb0-4995-9a68-a1a5925fbdb1.png
├── b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg
├── b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png
├── b84ba6fb-312b-4e69-8c77-fb6eb6fb38d4.png
├── b9a39d2a-618c-468b-86db-2e851f1a0057.jpg
├── b9d79a5a-e7af-499b-b989-f10483e71b8b.jpg
├── bc775758-89ab-4805-9f9c-78b8739cf780.jpg
├── be7dca03-12ec-456b-8b54-b1b3161f5531.png
├── bee1ff1d-c80f-4b3c-b58c-7073a8896ab2.jpg
├── bf0ff9fc-467e-4a3f-8922-115ba2c55bde.png
├── bfbb11e2-d208-4efa-b97b-24cd40467cd8.png
├── c037c901-7eae-4e31-a1e4-9d41329e5c3e.png
├── c2117f61-1177-4768-bf33-cf4f950d911c.png
├── c23957e9-a572-44f8-be15-f306c8b92722.jpg
├── c2d343f7-604c-4856-9a3c-c71d6f67fecc.png
├── c3369072-c740-43b0-b276-202bd1d3960d.jpg
├── c5022dd3-be22-4250-b9f6-38ae984a04d7.jpg
├── c625baa0-dde6-449e-93df-c3a67f2f430f.jpg
├── c7d4956c-9988-4a10-a704-28fdae7f3d28.png
├── c812c28a-1513-4a82-bfda-ab6a40981aa0.png
├── c8d18ca9-0b09-441a-9a0c-fb063630d708.png
├── c9a1de44-b1c0-4d13-a654-827d4ef8a723.png
├── c9cfcd20-c901-435f-9a07-3e46830c359f.jpg
├── cb0ed469-27ab-471b-a830-648b279103c8.png
├── cbf50eb8-22b4-4528-a2e7-d187143d57f7.png
├── cd5fbcff-3f35-43a6-8ffa-082a93ce0f0e.png
├── cdbe1d12-5ad9-4acb-a717-bbc822c2acf3.png
├── ce039f03-6588-4f0c-b35b-a494de0eac47.png
├── cf4386a1-58c9-4eca-a17f-e12b1e9770eb.png
├── class_loader_hierarchy.png
├── cookiedata.png
├── d160ec2e-cfe2-4640-bda7-62f53e58b8c0.png
├── d1f81ac3-9fdb-4371-a49d-ca84917aa89f.jpg
├── d2d34239-e7c1-482b-b33e-3170c5943556.jpg
├── d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg
├── d4c3a4a1-0846-46ec-9cc3-eaddfca71254.jpg
├── d4eef1e2-5703-4ca4-82ab-8dda93d6b81f.png
├── d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png
├── d7f6dec1-02b6-4969-b3ab-e01ee78659b9.png
├── d99dc9e2-197c-4085-813d-7195da1c6762.png
├── db4921d4-184b-48ba-a3cf-1d1141e3ba2d.png
├── db54db2f-82b2-4222-8d63-e49a8a7fc966.png
├── dbb8516d-37ba-4e2c-b26b-eefd7de21b45.png
├── dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg
├── dbd60b1f-b700-4da6-a993-62578e892333.jpg
├── dc00f70e-c5c8-4d20-baf1-2d70014a97e3.jpg
├── dd15a984-e977-4644-b127-708cddb8ca99.png
├── dd782132-d830-4c55-9884-cfac0a541b8e.png
├── dd78a1fe-1ff3-4bcf-a56f-8c003995beb6.jpg
├── dda1608d-26e0-4f10-8327-a459969b150a.png
├── ddcf2327-8d84-425d-8535-121a94bcb88d.jpg
├── de9b9ea0-1327-4865-93e5-6f805c48bc9e.png
├── e026c24d-00fa-4e7c-97a8-95a98cdc383a.png
├── e0900bb2-220a-43b7-9aa9-1d5cd55ff56e.png
├── e143f6da-d114-4ba4-8712-f65299047fa2.png
├── e1eda3d5-5ec8-4708-8e25-1a04c5e11f48.png
├── e2f0d889-2330-424c-8193-198edebecff7.png
├── e3124763-f75e-46c3-ba82-341e6c98d862.jpg
├── e31abb94-9201-4e06-9902-61101b92f475.png
├── e41405a8-7c05-4f70-8092-e961e28d3112.jpg
├── e6723b94-1a33-4605-b775-f6813352d383.png
├── e6b733ad-606d-4028-b3e8-83c3a73a3797.jpg
├── e800b001-7779-495b-8459-d33a7440d7b8.jpg
├── e92d0ebc-7d46-413b-aec1-34a39602f787.png
├── ea5f3efe-d5e6-499b-b278-9e898af61257.jpg
├── eb4a7007-d437-4740-865d-672973effe25.png
├── eb859228-c0f2-4bce-910d-d9f76929352b.png
├── ed523051-608f-4c3f-b343-383e2d194470.png
├── ed5522bb-3a60-481c-8654-43e7195a48fe.png
├── ed7b96ac-6428-4bd5-9986-674c54c2a959.png
├── eebdeb57-8efb-4848-9bb6-97512990897c.jpg
├── ef280699-da36-4b38-9735-9b048a3c7fe0.png
├── ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png
├── f0e35b7a-2948-488a-a5a9-97d3f6b5e2d7.png
├── f3080f83-6239-459b-8e9c-03b6641f7815.png
├── f3bfe11f-9cba-4ff2-8cc6-629068408a80.jpg
├── f3d3e072-e947-43e9-b999-22385fd569a0.jpg
├── f42443e0-208d-41ea-be44-c7fd97d2e3bf.png
├── f48e2b92-2c2a-48cb-a443-bd313e187a25.jpg
├── f4cdda3e-324c-49b5-8c14-08a3db634b29.png
├── f50a8e52-a683-444c-8e32-63c1890fe84a.jpg
├── f5477abd-c246-4851-89ab-6b1cde2549b1.png
├── f5757d09-88e7-4bbd-8cfb-cecf55604854.png
├── f61b5419-c94a-4df1-8d4d-aed9ae8cc6d5.png
├── f716427a-94f2-4875-9c86-98793cf5dcc3.jpg
├── f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg
├── f7d170a3-e446-4a64-ac2d-cb95028f81a8.png
├── f7ecbb8d-bb8b-4d45-a3b7-f49425d6d83d.jpg
├── f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png
├── f87afe72-c2df-4c12-ac03-9b8d581a8af8.jpg
├── f8b16d1e-7363-4544-94d6-4939fdf849dc.png
├── f900f266-a323-42b2-bc43-218fdb8811a8.jpg
├── f99ee771-c56f-47fb-9148-c0036695b5fe.jpg
├── f9f9f993-8ece-4da7-b848-af9b438fad76.png
├── fa568fac-ac58-48dd-a9bb-23b3065bf2dc.png
├── fb327611-7e2b-4f2f-9f5b-38592d408f07.png
├── fb546e12-e1fb-4b72-a1fb-8a7f5000dce6.jpg
├── fbe54203-c005-48f0-8883-b05e564a3173.png
├── fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg
├── ff0c019c-6461-467d-a266-0455341fd4f4.png
├── ff396233-1bb1-4e74-8bc2-d7c90146f5dd.png
├── flow.png
├── hashMap_u54C8_u5E0C_u7B97_u6CD5_u4F8B_u56FE.png
├── image005.jpg
├── image007.jpg
├── image008.jpg
├── image009.jpg
├── java-collections.png
├── java-collections1.png
├── linux-filesystem.png
├── monitor-lock-rule.png
├── mutualssl_small.png
├── n2U3N.png
├── network-of-networks.gif
├── pcrypt.gif
├── ppt_img.gif
├── scrypt.gif
├── single-thread-rule.png
├── ssl-offloading.jpg
├── tGPV0.png
├── thread-join-rule.png
├── thread-start-rule.png
├── url_diagram.png
└── volatile-variable-rule.png
/.gitignore:
--------------------------------------------------------------------------------
1 | *.txt
2 | .idea/
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | | Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ | Ⅵ | Ⅶ | Ⅷ | Ⅸ | Ⅹ |
3 | | :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
4 | | 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
5 |
6 | 本仓库不参与商业行为,不向读者收取任何费用。(This repository is not engaging in business activities, and does not charge readers any fee.)
7 |
8 |
9 | ## 算法 :pencil2:
10 |
11 |
12 | > [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md)
13 |
14 | 《剑指 Offer 第二版》的最优解,在牛客网在线编程中出现的题目都已 AC。
15 |
16 | > [Leetcode 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode%20题解.md)
17 |
18 | 对题目做了一个分类,并对每种题型的解题思路做了总结。
19 |
20 | > [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md)
21 |
22 | 整理自《算法 第四版》
23 |
24 | ## 操作系统 :computer:
25 |
26 | > [计算机操作系统](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机操作系统.md)
27 |
28 | 整理自《现代操作系统》和《计算机操作系统》
29 |
30 | > [Linux](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Linux.md)
31 |
32 | 整理自《鸟哥的 Linux 私房菜》
33 |
34 |
35 | ## 网络 :cloud:
36 |
37 | > [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md)
38 |
39 | 整理自《计算机网络 第七版》,重点内容会在标题后面加 \*。
40 |
41 | > [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md)
42 |
43 | 整理自《图解 HTTP》
44 |
45 |
46 | ## 面向对象 :couple:
47 |
48 | > [设计模式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/设计模式.md)
49 |
50 | 整理自《Head First 设计模式》
51 |
52 | > [面向对象思想](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/面向对象思想.md)
53 |
54 | 一些面向对象思想和设计原则。
55 |
56 | ## 数据库 :floppy_disk:
57 |
58 | > [数据库系统原理](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/数据库系统原理.md)
59 |
60 | 整理自《数据库系统概论 第四版》
61 |
62 | > [SQL](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/SQL.md)
63 |
64 | 整理自《SQL 必知必会》
65 |
66 | > [MySQL](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/MySQL.md)
67 |
68 | 整理自《高性能 MySQL》
69 |
70 | > [Redis](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Redis.md)
71 |
72 | 整理自《Redis 设计与实现》和《Redis 实战》
73 |
74 | ## Java :coffee:
75 |
76 | > [Java 虚拟机](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20虚拟机.md)
77 |
78 | 整理自《深入理解 Java 虚拟机》
79 |
80 | > [Java 并发](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20并发.md)
81 |
82 | 只整理了一些比较基础的概念,之后会继续添加更多内容。
83 |
84 | > [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md)
85 |
86 | 容器的一些总结,包含容器源码的分析。
87 |
88 | > [Java I/O](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20IO.md)
89 |
90 | File, InputStream OutputStream, Reader Writer, Serializable, Socket, NIO
91 |
92 | > [Java 基础](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20基础.md)
93 |
94 | 整理了一些常见考点。
95 |
96 | > [JDK 中的设计模式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/JDK%20中的设计模式.md)
97 |
98 | 对每种设计模式做了一个总结,并给出在 JDK 中的使用实例。
99 |
100 | ## 分布式 :sweat_drops:
101 |
102 | > [分布式基础](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式基础.md)
103 |
104 | 整理自《大规模分布式存储系统》
105 |
106 | > [一致性协议](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/一致性协议.md)
107 |
108 | 两阶段提交、Paxos、Raft、拜占庭将军问题。
109 |
110 | > [分布式问题分析](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式问题分析.md)
111 |
112 | 分布式事务、负载均衡算法与实现、分布式锁、分布式 Session、分库分表的分布式困境与应对之策。
113 |
114 |
115 | ## 工具 :hammer:
116 |
117 | > [Git](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Git.md)
118 |
119 | 整理一些 Git 的使用和概念。
120 |
121 | > [正则表达式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/正则表达式.md)
122 |
123 | 整理自《正则表达式必知必会》
124 |
125 | ## 编码实践 :speak_no_evil:
126 |
127 | > [重构](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/重构.md)
128 |
129 | 重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
130 |
131 | > [代码可读性](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/代码可读性.md)
132 |
133 | 编程有很大一部分时间是在阅读代码,可读性良好的代码能够大大提高编程效率。
134 |
135 | > [代码风格规范](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/代码风格规范.md)
136 |
137 | Google 开源项目的代码风格规范。
138 |
139 | ## 后记 :memo:
140 |
141 | **关于仓库**
142 |
143 | 本仓库是笔者在准备 2018 年春招实习过程中的学习总结,内容以计算机书籍的学习笔记为主,在整理重点知识的同时会尽量保证知识的系统性。
144 |
145 | **关于贡献**
146 |
147 | 因为大部分内容是笔者一个字一个字打上去的,所以难免会有一些笔误。如果发现,可以直接在相应的文档上编辑修改。
148 |
149 | 笔者能力有限,很多内容还不够完善。如果您希望和笔者一起完善这个仓库,可以发表一个 Issue,表明您想要添加的内容,笔者会及时查看。
150 |
151 | 因为不打算将这个仓库做成一个大而全的面试宝典,只希望添加一些比较通用的基础知识,或者是与 Java 和分布式相关的内容,但是不添加 Java Web 相关的内容。
152 |
153 | 您也可以在 Issues 中发表关于改进本仓库的建议。
154 |
155 | **关于上传**
156 |
157 | 笔者在本地使用为知笔记软件进行书写,为了方便将本地笔记内容上传到 Github 上,实现了一整套自动化上传方案,包括文本文件的导出、提取图片、Markdown 文档转换、Git 同步。
158 |
159 | 进行 Markdown 文档转换是因为 Github 使用的 GFM 不支持 MathJax 公式和 TOC 标记,所以需要替换 MathJax 公式为 CodeCogs 的云服务和重新生成 TOC 目录。这里提供了笔者实现的 GFM 文档转换工具的下载:[GFM-Converter](https://github.com/CyC2018/GFM-Converter)。
160 |
161 | **关于排版**
162 |
163 | 笔记内容按照 [中文文案排版指北](http://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。这里提供了笔者实现的中英混排文档在线排版工具:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting),目前实现了加空格的功能,之后打算实现对英文专有名词提示首字母大写的功能。
164 |
165 | 不使用 `![]()` 这种方式来引用图片是为了能够控制图片以合适的大小显示。而且 GFM 不支持 `
![]() ` 让图片居中显示,只能使用 `` ,所以只能使用 img 标签来引用图片。
166 |
167 | **关于转载**
168 |
169 | 本仓库内容使用到的资料都会在最后面的参考资料中给出引用链接,希望您在使用本仓库的内容时也能给出相应的引用链接。
170 |
171 | **鸣谢**
172 |
173 | [TeeKee](https://github.com/linw7)
174 |
175 |
176 |
--------------------------------------------------------------------------------
/notes/Git.md:
--------------------------------------------------------------------------------
1 |
2 | * [学习资料](#学习资料)
3 | * [集中式与分布式](#集中式与分布式)
4 | * [Git 的中心服务器](#git-的中心服务器)
5 | * [Git 工作流](#git-工作流)
6 | * [分支实现](#分支实现)
7 | * [冲突](#冲突)
8 | * [Fast forward](#fast-forward)
9 | * [分支管理策略](#分支管理策略)
10 | * [储藏(Stashing)](#储藏stashing)
11 | * [SSH 传输设置](#ssh-传输设置)
12 | * [.gitignore 文件](#gitignore-文件)
13 | * [Git 命令一览](#git-命令一览)
14 |
15 |
16 |
17 | # 学习资料
18 |
19 | - [Git - 简明指南](http://rogerdudler.github.io/git-guide/index.zh.html)
20 | - [图解 Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html)
21 | - [廖雪峰 : Git 教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
22 | - [Learn Git Branching](https://learngitbranching.js.org/)
23 |
24 | # 集中式与分布式
25 |
26 | Git 属于分布式版本控制系统,而 SVN 属于集中式。
27 |
28 | 集中式版本控制只有中心服务器拥有一份代码,而分布式版本控制每个人的电脑上就有一份完整的代码。
29 |
30 | 集中式版本控制有安全性问题,当中心服务器挂了所有人都没办法工作了。
31 |
32 | 集中式版本控制需要连网才能工作,如果网速过慢,那么提交一个文件的会慢的无法让人忍受。而分布式版本控制不需要连网就能工作。
33 |
34 | 分布式版本控制新建分支、合并分支操作速度非常快,而集中式版本控制新建一个分支相当于复制一份完整代码。
35 |
36 | # Git 的中心服务器
37 |
38 | Git 的中心服务器用来交换每个用户的修改。没有中心服务器也能工作,但是中心服务器能够 24 小时保持开机状态,这样就能更方便的交换修改。Github 就是一种 Git 中心服务器。
39 |
40 | # Git 工作流
41 |
42 |
43 |
44 | 新建一个仓库之后,当前目录就成为了工作区,工作区下有一个隐藏目录 .git,它属于 Git 的版本库。
45 |
46 | Git 版本库有一个称为 stage 的暂存区,还有自动创建的 master 分支以及指向分支的 HEAD 指针。
47 |
48 |
49 |
50 | - git add files 把文件的修改添加到暂存区
51 | - git commit 把暂存区的修改提交到当前分支,提交之后暂存区就被清空了
52 | - git reset -- files 使用当前分支上的修改覆盖暂缓区,用来撤销最后一次 git add files
53 | - git checkout -- files 使用暂存区的修改覆盖工作目录,用来撤销本地修改
54 |
55 |
56 |
57 | 可以跳过暂存区域直接从分支中取出修改或者直接提交修改到分支中
58 |
59 | - git commit -a 直接把所有文件的修改添加到暂缓区然后执行提交
60 | - git checkout HEAD -- files 取出最后一次修改,可以用来进行回滚操作
61 |
62 | # 分支实现
63 |
64 | Git 把每次提交都连成一条时间线。分支使用指针来实现,例如 master 分支指针指向时间线的最后一个节点,也就是最后一次提交。HEAD 指针指向的是当前分支。
65 |
66 |
67 |
68 | 新建分支是新建一个指针指向时间线的最后一个节点,并让 HEAD 指针指向新分支表示新分支成为当前分支。
69 |
70 |
71 |
72 | 每次提交只会让当前分支向前移动,而其它分支不会移动。
73 |
74 |
75 |
76 | 合并分支也只需要改变指针即可。
77 |
78 |
79 |
80 | # 冲突
81 |
82 | 当两个分支都对同一个文件的同一行进行了修改,在分支合并时就会产生冲突。
83 |
84 |
85 |
86 | Git 会使用 <<<<<<< ,======= ,>>>>>>> 标记出不同分支的内容,只需要把不同分支中冲突部分修改成一样就能解决冲突。
87 |
88 | ```
89 | <<<<<<< HEAD
90 | Creating a new branch is quick & simple.
91 | =======
92 | Creating a new branch is quick AND simple.
93 | >>>>>>> feature1
94 | ```
95 |
96 | # Fast forward
97 |
98 | "快进式合并"(fast-farward merge),会直接将 master 分支指向合并的分支,这种模式下进行分支合并会丢失分支信息,也就不能在分支历史上看出分支信息。
99 |
100 | 可以在合并时加上 --no-ff 参数来禁用 Fast forward 模式,并且加上 -m 参数让合并时产生一个新的 commit。
101 |
102 | ```
103 | $ git merge --no-ff -m "merge with no-ff" dev
104 | ```
105 |
106 |
107 |
108 | # 分支管理策略
109 |
110 | master 分支应该是非常稳定的,只用来发布新版本;
111 |
112 | 日常开发在开发分支 dev 上进行。
113 |
114 |
115 |
116 | # 储藏(Stashing)
117 |
118 | 在一个分支上操作之后,如果还没有将修改提交到分支上,此时进行切换分支,那么另一个分支上也能看到新的修改。这是因为所有分支都共用一个工作区的缘故。
119 |
120 | 可以使用 git stash 将当前分支的修改储藏起来,此时当前工作区的所有修改都会被存到栈上,也就是说当前工作区是干净的,没有任何未提交的修改。此时就可以安全的切换到其它分支上了。
121 |
122 | ```
123 | $ git stash
124 | Saved working directory and index state \ "WIP on master: 049d078 added the index file"
125 | HEAD is now at 049d078 added the index file (To restore them type "git stash apply")
126 | ```
127 |
128 | 该功能可以用于 bug 分支的实现。如果当前正在 dev 分支上进行开发,但是此时 master 上有个 bug 需要修复,但是 dev 分支上的开发还未完成,不想立即提交。在新建 bug 分支并切换到 bug 分支之前就需要使用 git stash 将 dev 分支的未提交修改储藏起来。
129 |
130 | # SSH 传输设置
131 |
132 | Git 仓库和 Github 中心仓库之间是通过 SSH 加密。
133 |
134 | 如果工作区下没有 .ssh 目录,或者该目录下没有 id_rsa 和 id_rsa.pub 这两个文件,可以通过以下命令来创建 SSH Key:
135 |
136 | ```
137 | $ ssh-keygen -t rsa -C "youremail@example.com"
138 | ```
139 |
140 | 然后把公钥 id_rsa.pub 的内容复制到 Github "Account settings" 的 SSH Keys 中。
141 |
142 | # .gitignore 文件
143 |
144 | 忽略以下文件:
145 |
146 | 1. 操作系统自动生成的文件,比如缩略图;
147 | 2. 编译生成的中间文件,比如 Java 编译产生的 .class 文件;
148 | 3. 自己的敏感信息,比如存放口令的配置文件。
149 |
150 | 不需要全部自己编写,可以到 [https://github.com/github/gitignore](https://github.com/github/gitignore) 中进行查询。
151 |
152 | # Git 命令一览
153 |
154 |
155 |
156 | 比较详细的地址:http://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf
157 |
158 |
159 |
--------------------------------------------------------------------------------
/notes/JDK 中的设计模式.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、创建型](#一创建型)
3 | * [1. 单例模式](#1-单例模式)
4 | * [2. 简单工厂模式](#2-简单工厂模式)
5 | * [3. 工厂方法模式](#3-工厂方法模式)
6 | * [4. 抽象工厂](#4-抽象工厂)
7 | * [5. 生成器模式](#5-生成器模式)
8 | * [6. 原型模式](#6-原型模式)
9 | * [二、行为型](#二行为型)
10 | * [1. 责任链](#1-责任链)
11 | * [2. 命令模式](#2-命令模式)
12 | * [3. 解释器模式](#3-解释器模式)
13 | * [4. 迭代器](#4-迭代器)
14 | * [5. 中间人模式](#5-中间人模式)
15 | * [6. 备忘录模式](#6-备忘录模式)
16 | * [7. 观察者模式](#7-观察者模式)
17 | * [8. 策略模式](#8-策略模式)
18 | * [9. 模板方法](#9-模板方法)
19 | * [10. 访问者模式](#10-访问者模式)
20 | * [11. 空对象模式](#11-空对象模式)
21 | * [三、结构型](#三结构型)
22 | * [1. 适配器](#1-适配器)
23 | * [2. 桥接模式](#2-桥接模式)
24 | * [3. 组合模式](#3-组合模式)
25 | * [4. 装饰者模式](#4-装饰者模式)
26 | * [5. 蝇量模式](#5-蝇量模式)
27 | * [6. 动态代理](#6-动态代理)
28 | * [参考资料](#参考资料)
29 |
30 |
31 |
32 | # 一、创建型
33 |
34 | ## 1. 单例模式
35 |
36 | 确保只实例化一个对象,并提供一个对象的全局访问点。
37 |
38 | ```java
39 | java.lang.Runtime#getRuntime()
40 | java.awt.Toolkit#getDefaultToolkit()
41 | java.awt.GraphicsEnvironment#getLocalGraphicsEnvironment()
42 | java.awt.Desktop#getDesktop()
43 | ```
44 |
45 | ## 2. 简单工厂模式
46 |
47 | 在不对用户暴露对象内部逻辑的前提下创建对象。
48 |
49 | ## 3. 工厂方法模式
50 |
51 | 定义创建对象的接口,但是让子类来决定应该使用哪个类来创建。
52 |
53 | ```java
54 | java.lang.Proxy#newProxyInstance()
55 | java.lang.Object#toString()
56 | java.lang.Class#newInstance()
57 | java.lang.reflect.Array#newInstance()
58 | java.lang.reflect.Constructor#newInstance()
59 | java.lang.Boolean#valueOf(String)
60 | java.lang.Class#forName()
61 | ```
62 |
63 | ## 4. 抽象工厂
64 |
65 | 提供一个创建相关对象家族的接口,而没有明确指明它们的类。
66 |
67 | ```java
68 | java.util.Calendar#getInstance()
69 | java.util.Arrays#asList()
70 | java.util.ResourceBundle#getBundle()
71 | java.sql.DriverManager#getConnection()
72 | java.sql.Connection#createStatement()
73 | java.sql.Statement#executeQuery()
74 | java.text.NumberFormat#getInstance()
75 | javax.xml.transform.TransformerFactory#newInstance()
76 | ```
77 |
78 | ## 5. 生成器模式
79 |
80 | 定义一个新的类来构造另一个类的实例,以创建一个复杂的对象。
81 |
82 | 它可以封装一个对象的构造过程,并允许按步骤构造。
83 |
84 | ```java
85 | java.lang.StringBuilder#append()
86 | java.lang.StringBuffer#append()
87 | java.sql.PreparedStatement
88 | javax.swing.GroupLayout.Group#addComponent()
89 | ```
90 |
91 | ## 6. 原型模式
92 |
93 | 使用原型实例指定要创建对象的类型;通过复制这个原型来创建新对象。
94 |
95 | ```java
96 | java.lang.Object#clone()
97 | java.lang.Cloneable
98 | ```
99 |
100 | # 二、行为型
101 |
102 | ## 1. 责任链
103 |
104 | 避免将请求的发送者附加到其接收者,从而使其它对象也可以处理请求;将请求以对象的方式发送到链上直到请求被处理完毕。
105 |
106 | ```java
107 | java.util.logging.Logger#log()
108 | javax.servlet.Filter#doFilter()
109 | ```
110 |
111 | ## 2. 命令模式
112 |
113 | 将命令封装进对象中;允许使用命令对象对客户对象进行参数化;允许将命令对象存放到队列中。
114 |
115 | ```java
116 | java.lang.Runnable
117 | javax.swing.Action
118 | ```
119 |
120 | ## 3. 解释器模式
121 |
122 | 为语言创建解释器,通常由语言的语法和语法分析来定义。
123 |
124 | ```java
125 | java.util.Pattern
126 | java.text.Normalizer
127 | java.text.Format
128 | ```
129 |
130 | ## 4. 迭代器
131 |
132 | 提供一种一致的访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。
133 |
134 | ```java
135 | java.util.Iterator
136 | java.util.Enumeration
137 | ```
138 |
139 | ## 5. 中间人模式
140 |
141 | 使用中间人对象来封装对象之间的交互。中间人模式可以让降低交互对象之间的耦合程度。
142 |
143 | ```java
144 | java.util.Timer
145 | java.util.concurrent.Executor#execute()
146 | java.util.concurrent.ExecutorService#submit()
147 | java.lang.reflect.Method#invoke()
148 | ```
149 |
150 | ## 6. 备忘录模式
151 |
152 | 在不违反封装的情况下获得对象的内部状态,从而在需要时可以将对象恢复到最初状态。
153 |
154 | ```java
155 | java.util.Date
156 | java.io.Serializable
157 | ```
158 |
159 | ## 7. 观察者模式
160 |
161 | 定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。
162 |
163 | ```java
164 | java.util.EventListener
165 | javax.servlet.http.HttpSessionBindingListener
166 | javax.servlet.http.HttpSessionAttributeListener
167 | javax.faces.event.PhaseListener
168 | ```
169 |
170 | ## 8. 策略模式
171 |
172 | 定义一系列算法,封装每个算法,并使它们可以互换。策略可以让算法独立于使用它的客户端。
173 |
174 | ```java
175 | java.util.Comparator#compare()
176 | javax.servlet.http.HttpServlet
177 | javax.servlet.Filter#doFilter()
178 | ```
179 |
180 | ## 9. 模板方法
181 |
182 | 定义算法框架,并将一些步骤的实现延迟到子类。通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。
183 |
184 | ```java
185 | java.util.Collections#sort()
186 | java.io.InputStream#skip()
187 | java.io.InputStream#read()
188 | java.util.AbstractList#indexOf()
189 | ```
190 |
191 | ## 10. 访问者模式
192 |
193 | 提供便捷的维护方式来操作一组对象。它使你在不改变操作对象的前提下,可以修改或扩展对象的行为。
194 |
195 | 例如集合,它可以包含不同类型的元素,访问者模式允许在不知道具体元素类型的前提下对集合元素进行一些操作。
196 |
197 | ```java
198 | javax.lang.model.element.Element and javax.lang.model.element.ElementVisitor
199 | javax.lang.model.type.TypeMirror and javax.lang.model.type.TypeVisitor
200 | ```
201 |
202 | ## 11. 空对象模式
203 |
204 | 使用什么都不做的空对象来替代 NULL。
205 |
206 | # 三、结构型
207 |
208 | ## 1. 适配器
209 |
210 | 把一个类接口转换成另一个用户需要的接口。
211 |
212 | ```java
213 | java.util.Arrays#asList()
214 | javax.swing.JTable(TableModel)
215 | java.io.InputStreamReader(InputStream)
216 | java.io.OutputStreamWriter(OutputStream)
217 | javax.xml.bind.annotation.adapters.XmlAdapter#marshal()
218 | javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal()
219 | ```
220 |
221 | ## 2. 桥接模式
222 |
223 | 将抽象与实现分离开来,使它们可以独立变化。
224 |
225 | ```java
226 | AWT (It provides an abstraction layer which maps onto the native OS the windowing support.)
227 | JDBC
228 | ```
229 |
230 | ## 3. 组合模式
231 |
232 | 将对象组合成树形结构来表示整体-部分层次关系,允许用户以相同的方式处理单独对象和组合对象。
233 |
234 | ```java
235 | javax.swing.JComponent#add(Component)
236 | java.awt.Container#add(Component)
237 | java.util.Map#putAll(Map)
238 | java.util.List#addAll(Collection)
239 | java.util.Set#addAll(Collection)
240 | ```
241 |
242 | ## 4. 装饰者模式
243 |
244 | 为对象动态添加功能。
245 |
246 | ```java
247 | java.io.BufferedInputStream(InputStream)
248 | java.io.DataInputStream(InputStream)
249 | java.io.BufferedOutputStream(OutputStream)
250 | java.util.zip.ZipOutputStream(OutputStream)
251 | java.util.Collections#checked[List|Map|Set|SortedSet|SortedMap]()
252 | ```
253 |
254 | ## 5. 蝇量模式
255 |
256 | 利用共享的方式来支持大量的对象,这些对象一部分内部状态是相同的,而另一份状态可以变化。
257 |
258 | Java 利用缓存来加速大量小对象的访问时间。
259 |
260 | ```java
261 | java.lang.Integer#valueOf(int)
262 | java.lang.Boolean#valueOf(boolean)
263 | java.lang.Byte#valueOf(byte)
264 | java.lang.Character#valueOf(char)
265 | ```
266 |
267 | ## 6. 动态代理
268 |
269 | 提供一个占位符来控制对象的访问。
270 |
271 | 代理可以是一些轻量级的对象,它控制着对重量级对象的访问,只有在真正实例化这些重量级对象时才会去实例化它。
272 |
273 | ```java
274 | java.lang.reflect.Proxy
275 | RMI
276 | ```
277 |
278 | # 参考资料
279 |
280 | - [The breakdown of design patterns in JDK](http://www.programering.com/a/MTNxAzMwATY.html)
281 | - [Design Patterns](http://www.oodesign.com/)
282 |
283 |
284 |
--------------------------------------------------------------------------------
/notes/Java IO.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、概览](#一概览)
3 | * [二、磁盘操作](#二磁盘操作)
4 | * [三、字节操作](#三字节操作)
5 | * [四、字符操作](#四字符操作)
6 | * [五、对象操作](#五对象操作)
7 | * [六、网络操作](#六网络操作)
8 | * [InetAddress](#inetaddress)
9 | * [URL](#url)
10 | * [Sockets](#sockets)
11 | * [Datagram](#datagram)
12 | * [七、NIO](#七nio)
13 | * [流与块](#流与块)
14 | * [通道与缓冲区](#通道与缓冲区)
15 | * [缓冲区状态变量](#缓冲区状态变量)
16 | * [文件 NIO 实例](#文件-nio-实例)
17 | * [套接字 NIO 实例](#套接字-nio-实例)
18 | * [内存映射文件](#内存映射文件)
19 | * [对比](#对比)
20 | * [八、参考资料](#八参考资料)
21 |
22 |
23 |
24 | # 一、概览
25 |
26 | Java 的 I/O 大概可以分成以下几类:
27 |
28 | 1. 磁盘操作:File
29 | 2. 字节操作:InputStream 和 OutputStream
30 | 3. 字符操作:Reader 和 Writer
31 | 4. 对象操作:Serializable
32 | 5. 网络操作:Socket
33 | 6. 新的输入/输出:NIO
34 |
35 | # 二、磁盘操作
36 |
37 | File 类可以用于表示文件和目录,但是它只用于表示文件的信息,而不表示文件的内容。
38 |
39 | # 三、字节操作
40 |
41 |
42 |
43 | Java I/O 使用了装饰者模式来实现。以 InputStream 为例,InputStream 是抽象组件,FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作。FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能,例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。
44 |
45 | 实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。
46 |
47 | ```java
48 | BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
49 | ```
50 |
51 | DataInputStream 装饰者提供了对更多数据类型进行输入的操作,比如 int、double 等基本类型。
52 |
53 | 批量读入文件内容到字节数组:
54 |
55 | ```java
56 | byte[] buf = new byte[20*1024];
57 | int bytes = 0;
58 | // 最多读取 buf.length 个字节,返回的是实际读取的个数,返回 -1 的时候表示读到 eof,即文件尾
59 | while((bytes = in.read(buf, 0 , buf.length)) != -1) {
60 | // ...
61 | }
62 | ```
63 |
64 | # 四、字符操作
65 |
66 | 不管是磁盘还是网络传输,最小的存储单元都是字节,而不是字符,所以 I/O 操作的都是字节而不是字符。但是在程序中操作的通常是字符形式的数据,因此需要提供对字符进行操作的方法。
67 |
68 | InputStreamReader 实现从文本文件的字节流解码成字符流;OutputStreamWriter 实现字符流编码成为文本文件的字节流。它们继承自 Reader 和 Writer。
69 |
70 | 编码就是把字符转换为字节,而解码是把字节重新组合成字符。
71 |
72 | ```java
73 | byte[] bytes = str.getBytes(encoding); // 编码
74 | String str = new String(bytes, encoding); // 解码
75 | ```
76 |
77 | GBK 编码中,中文占 2 个字节,英文占 1 个字节;UTF-8 编码中,中文占 3 个字节,英文占 1 个字节;Java 使用双字节编码 UTF-16be,中文和英文都占 2 个字节。
78 |
79 | 如果编码和解码过程使用不同的编码方式那么就出现了乱码。
80 |
81 | # 五、对象操作
82 |
83 | 序列化就是将一个对象转换成字节序列,方便存储和传输。
84 |
85 | 序列化:ObjectOutputStream.writeObject()
86 |
87 | 反序列化:ObjectInputStream.readObject()
88 |
89 | 序列化的类需要实现 Serializable 接口,它只是一个标准,没有任何方法需要实现。
90 |
91 | transient 关键字可以使一些属性不会被序列化。
92 |
93 | **ArrayList 序列化和反序列化的实现** :ArrayList 中存储数据的数组是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。
94 |
95 | ```java
96 | private transient Object[] elementData;
97 | ```
98 |
99 | # 六、网络操作
100 |
101 | Java 中的网络支持:
102 |
103 | 1. InetAddress:用于表示网络上的硬件资源,即 IP 地址;
104 | 2. URL:统一资源定位符,通过 URL 可以直接读取或者写入网络上的数据;
105 | 3. Sockets:使用 TCP 协议实现网络通信;
106 | 4. Datagram:使用 UDP 协议实现网络通信。
107 |
108 | ## InetAddress
109 |
110 | 没有公有构造函数,只能通过静态方法来创建实例。
111 |
112 | ```java
113 | InetAddress.getByName(String host);
114 | InetAddress.getByAddress(byte[] addr);
115 | ```
116 |
117 | ## URL
118 |
119 | 可以直接从 URL 中读取字节流数据
120 |
121 | ```java
122 | URL url = new URL("http://www.baidu.com");
123 | InputStream is = url.openStream(); // 字节流
124 | InputStreamReader isr = new InputStreamReader(is, "utf-8"); // 字符流
125 | BufferedReader br = new BufferedReader(isr);
126 | String line = br.readLine();
127 | while (line != null) {
128 | System.out.println(line);
129 | line = br.readLine();
130 | }
131 | br.close();
132 | isr.close();
133 | is.close();
134 | ```
135 |
136 | ## Sockets
137 |
138 | - ServerSocket:服务器端类
139 | - Socket:客户端类
140 | - 服务器和客户端通过 InputStream 和 OutputStream 进行输入输出。
141 |
142 |
143 |
144 | ## Datagram
145 |
146 | - DatagramPacket:数据包类
147 | - DatagramSocket:通信类
148 |
149 | # 七、NIO
150 |
151 | 新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。
152 |
153 | ## 流与块
154 |
155 | I/O 与 NIO 最重要的区别是数据打包和传输的方式,I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。
156 |
157 | 面向流的 I/O 一次处理一个字节数据,一个输入流产生一个字节数据,一个输出流消费一个字节数据。为流式数据创建过滤器非常容易,链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。
158 |
159 | 一个面向块的 I/O 系统以块的形式处理数据,一次处理一个数据块。按块处理数据比按流处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。
160 |
161 | I/O 包和 NIO 已经很好地集成了,java.io.\* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如,java.io.\* 包中的一些类包含以块的形式读写数据的方法,这使得即使在面向流的系统中,处理速度也会更快。
162 |
163 | ## 通道与缓冲区
164 |
165 | ### 1. 通道
166 |
167 | 通道 Channel 是对原 I/O 包中的流的模拟,可以通过它读取和写入数据。
168 |
169 | 通道与流的不同之处在于,流只能在一个方向上移动,(一个流必须是 InputStream 或者 OutputStream 的子类),而通道是双向的,可以用于读、写或者同时用于读写。
170 |
171 | 通道包括以下类型:
172 |
173 | - FileChannel:从文件中读写数据;
174 | - DatagramChannel:通过 UDP 读写网络中数据;
175 | - SocketChannel:通过 TCP 读写网络中数据;
176 | - ServerSocketChannel:可以监听新进来的 TCP 连接,对每一个新进来的连接都会创建一个 SocketChannel。
177 |
178 | ### 2. 缓冲区
179 |
180 | 发送给一个通道的所有数据都必须首先放到缓冲区中,同样地,从通道中读取的任何数据都要读到缓冲区中。也就是说,不会直接对通道进行读写数据,而是要先经过缓冲区。
181 |
182 | 缓冲区实质上是一个数组,但它不仅仅是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。
183 |
184 | 缓冲区包括以下类型:
185 |
186 | - ByteBuffer
187 | - CharBuffer
188 | - ShortBuffer
189 | - IntBuffer
190 | - LongBuffer
191 | - FloatBuffer
192 | - DoubleBuffer
193 |
194 | ## 缓冲区状态变量
195 |
196 | - capacity:最大容量;
197 | - position:当前已经读写的字节数;
198 | - limit:还可以读写的字节数。
199 |
200 | 状态变量的改变过程举例:
201 |
202 | ① 新建一个大小为 8 个字节的缓冲区,此时 position 为 0,而 limit = capacity = 8。capacity 变量不会改变,下面的讨论会忽略它。
203 |
204 |
205 |
206 | ② 从输入通道中读取 3 个字节数据写入缓冲区中,此时 position 移动设为 3,limit 保持不变。
207 |
208 |
209 |
210 | ③ 以下图例为已经从输入通道读取了 5 个字节数据写入缓冲区中。在将缓冲区的数据写到输出通道之前,需要先调用 flip() 方法,这个方法将 limit 设置为当前 position,并将 position 设置为 0。
211 |
212 |
213 |
214 | ④ 从缓冲区中取 4 个字节到输出缓冲中,此时 position 设为 4。
215 |
216 |
217 |
218 | ⑤ 最后需要调用 clear() 方法来清空缓冲区,此时 position 和 limit 都被设置为最初位置。
219 |
220 |
221 |
222 | ## 文件 NIO 实例
223 |
224 | ① 为要读取的文件创建 FileInputStream,之后通过 FileInputStream 获取输入 FileChannel;
225 |
226 | ```java
227 | FileInputStream fin = new FileInputStream("readandshow.txt");
228 | FileChannel fic = fin.getChannel();
229 | ```
230 |
231 | ② 创建一个容量为 1024 的 Buffer;
232 |
233 | ```java
234 | ByteBuffer buffer = ByteBuffer.allocate(1024);
235 | ```
236 |
237 | ③ 将数据从输入 FileChannel 写入到 Buffer 中,如果没有数据的话,read() 方法会返回 -1;
238 |
239 | ```java
240 | int r = fcin.read(buffer);
241 | if (r == -1) {
242 | break;
243 | }
244 | ```
245 |
246 | ④ 为要写入的文件创建 FileOutputStream,之后通过 FileOutputStream 获取输出 FileChannel
247 |
248 | ```java
249 | FileOutputStream fout = new FileOutputStream("writesomebytes.txt");
250 | FileChannel foc = fout.getChannel();
251 | ```
252 |
253 | ⑤ 调用 flip() 切换读写
254 |
255 | ```java
256 | buffer.flip();
257 | ```
258 |
259 | ⑥ 把 Buffer 中的数据读取到输出 FileChannel 中
260 |
261 | ```java
262 | foc.write(buffer);
263 | ```
264 |
265 | ⑦ 最后调用 clear() 重置缓冲区
266 |
267 | ```java
268 | buffer.clear();
269 | ```
270 |
271 | ## 套接字 NIO 实例
272 |
273 | ### 1. ServerSocketChannel
274 |
275 | 每一个监听端口都需要有一个 ServerSocketChannel 用来监听连接。
276 |
277 | ```java
278 | ServerSocketChannel ssc = ServerSocketChannel.open();
279 | ssc.configureBlocking(false); // 设置为非阻塞
280 |
281 | ServerSocket ss = ssc.socket();
282 | InetSocketAddress address = new InetSocketAddress(ports[i]);
283 | ss.bind(address); // 绑定端口号
284 | ```
285 |
286 | ### 2. Selectors
287 |
288 | 异步 I/O 通过 Selector 注册对特定 I/O 事件的兴趣 ― 可读的数据的到达、新的套接字连接等等,在发生这样的事件时,系统将会发送通知。
289 |
290 | 创建 Selectors 之后,就可以对不同的通道对象调用 register() 方法。register() 的第一个参数总是这个 Selector。第二个参数是 OP_ACCEPT,这里它指定我们想要监听 ACCEPT 事件,也就是在新的连接建立时所发生的事件。
291 |
292 | SelectionKey 代表这个通道在此 Selector 上的这个注册。当某个 Selector 通知您某个传入事件时,它是通过提供对应于该事件的 SelectionKey 来进行的。SelectionKey 还可以用于取消通道的注册。
293 |
294 | ```java
295 | Selector selector = Selector.open();
296 | SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT);
297 | ```
298 |
299 | ### 3. 主循环
300 |
301 | 首先,我们调用 Selector 的 select() 方法。这个方法会阻塞,直到至少有一个已注册的事件发生。当一个或者更多的事件发生时,select() 方法将返回所发生的事件的数量。
302 |
303 | 接下来,我们调用 Selector 的 selectedKeys() 方法,它返回发生了事件的 SelectionKey 对象的一个集合。
304 |
305 | 我们通过迭代 SelectionKeys 并依次处理每个 SelectionKey 来处理事件。对于每一个 SelectionKey,您必须确定发生的是什么 I/O 事件,以及这个事件影响哪些 I/O 对象。
306 |
307 | ```java
308 | int num = selector.select();
309 |
310 | Set selectedKeys = selector.selectedKeys();
311 | Iterator it = selectedKeys.iterator();
312 |
313 | while (it.hasNext()) {
314 | SelectionKey key = (SelectionKey)it.next();
315 | // ... deal with I/O event ...
316 | }
317 | ```
318 |
319 | ### 4. 监听新连接
320 |
321 | 程序执行到这里,我们仅注册了 ServerSocketChannel,并且仅注册它们“接收”事件。为确认这一点,我们对 SelectionKey 调用 readyOps() 方法,并检查发生了什么类型的事件:
322 |
323 | ```java
324 | if ((key.readyOps() & SelectionKey.OP_ACCEPT)
325 | == SelectionKey.OP_ACCEPT) {
326 | // Accept the new connection
327 | // ...
328 | }
329 | ```
330 |
331 | 可以肯定地说,readOps() 方法告诉我们该事件是新的连接。
332 |
333 | ### 5. 接受新的连接
334 |
335 | 因为我们知道这个服务器套接字上有一个传入连接在等待,所以可以安全地接受它;也就是说,不用担心 accept() 操作会阻塞:
336 |
337 | ```java
338 | ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
339 | SocketChannel sc = ssc.accept();
340 | ```
341 |
342 | 下一步是将新连接的 SocketChannel 配置为非阻塞的。而且由于接受这个连接的目的是为了读取来自套接字的数据,所以我们还必须将 SocketChannel 注册到 Selector 上,如下所示:
343 |
344 | ```java
345 | sc.configureBlocking(false);
346 | SelectionKey newKey = sc.register(selector, SelectionKey.OP_READ);
347 | ```
348 |
349 | 注意我们使用 register() 的 OP_READ 参数,将 SocketChannel 注册用于读取而不是接受新连接。
350 |
351 | ### 6. 删除处理过的 SelectionKey
352 |
353 | 在处理 SelectionKey 之后,我们几乎可以返回主循环了。但是我们必须首先将处理过的 SelectionKey 从选定的键集合中删除。如果我们没有删除处理过的键,那么它仍然会在主集合中以一个激活的键出现,这会导致我们尝试再次处理它。我们调用迭代器的 remove() 方法来删除处理过的 SelectionKey:
354 |
355 | ```java
356 | it.remove();
357 | ```
358 |
359 | 现在我们可以返回主循环并接受从一个套接字中传入的数据 (或者一个传入的 I/O 事件) 了。
360 |
361 | ### 7. 传入的 I/O
362 |
363 | 当来自一个套接字的数据到达时,它会触发一个 I/O 事件。这会导致在主循环中调用 Selector.select(),并返回一个或者多个 I/O 事件。这一次, SelectionKey 将被标记为 OP_READ 事件,如下所示:
364 |
365 | ```java
366 | } else if ((key.readyOps() & SelectionKey.OP_READ)
367 | == SelectionKey.OP_READ) {
368 | // Read the data
369 | SocketChannel sc = (SocketChannel)key.channel();
370 | // ...
371 | }
372 | ```
373 |
374 | ## 内存映射文件
375 |
376 | 内存映射文件 I/O 是一种读和写文件数据的方法,它可以比常规的基于流或者基于通道的 I/O 快得多。
377 |
378 | 只有文件中实际读取或者写入的部分才会映射到内存中。
379 |
380 | 现代操作系统一般会根据需要将文件的部分映射为内存的部分,从而实现文件系统。Java 内存映射机制只不过是在底层操作系统中可以采用这种机制时,提供了对该机制的访问。
381 |
382 | 向内存映射文件写入可能是危险的,仅只是改变数组的单个元素这样的简单操作,就可能会直接修改磁盘上的文件。修改数据与将数据保存到磁盘是没有分开的。
383 |
384 | 下面代码行将文件的前 1024 个字节映射到内存中,map() 方法返回一个 MappedByteBuffer,它是 ByteBuffer 的子类。因此,您可以像使用其他任何 ByteBuffer 一样使用新映射的缓冲区,操作系统会在需要时负责执行映射。
385 |
386 | ```java
387 | MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, 1024);
388 | ```
389 |
390 | ## 对比
391 |
392 | NIO 与普通 I/O 的区别主要有以下两点:
393 |
394 | - NIO 是非阻塞的。应当注意,FileChannel 不能切换到非阻塞模式,套接字 Channel 可以。
395 | - NIO 面向块,I/O 面向流。
396 |
397 | # 八、参考资料
398 |
399 | - Eckel B, 埃克尔, 昊鹏, 等. Java 编程思想 [M]. 机械工业出版社, 2002.
400 | - [IBM: NIO 入门](https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html)
401 | - [深入分析 Java I/O 的工作机制](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html)
402 | - [NIO 与传统 IO 的区别](http://blog.csdn.net/shimiso/article/details/24990499)
403 | - [Decorator Design Pattern](http://stg-tud.github.io/sedc/Lecture/ws13-14/5.3-Decorator.html#mode=document)
404 | - [Socket Multicast](http://labojava.blogspot.com/2012/12/socket-multicast.html)
405 |
--------------------------------------------------------------------------------
/notes/MySQL.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、存储引擎](#一存储引擎)
3 | * [InnoDB](#innodb)
4 | * [MyISAM](#myisam)
5 | * [比较](#比较)
6 | * [二、数据类型](#二数据类型)
7 | * [整型](#整型)
8 | * [浮点数](#浮点数)
9 | * [字符串](#字符串)
10 | * [时间和日期](#时间和日期)
11 | * [三、索引](#三索引)
12 | * [索引分类](#索引分类)
13 | * [索引的优点](#索引的优点)
14 | * [索引优化](#索引优化)
15 | * [B-Tree 和 B+Tree 原理](#b-tree-和-b+tree-原理)
16 | * [四、查询性能优化](#四查询性能优化)
17 | * [五、切分](#五切分)
18 | * [垂直切分](#垂直切分)
19 | * [水平切分](#水平切分)
20 | * [切分的选择](#切分的选择)
21 | * [存在的问题](#存在的问题)
22 | * [六、故障转移和故障恢复](#六故障转移和故障恢复)
23 | * [参考资料](#参考资料)
24 |
25 |
26 |
27 | # 一、存储引擎
28 |
29 | ## InnoDB
30 |
31 | InnoDB 是 MySQL 默认的事务型存储引擎,只有在需要 InnoDB 不支持的特性时,才考虑使用其它存储引擎。
32 |
33 | 采用 MVCC 来支持高并发,并且实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ),并且通过间隙锁(next-key locking)策略防止幻读的出现。间隙锁使得 InnoDB 不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定,以防止幻影行的插入。
34 |
35 | 表是基于聚簇索引建立的,它对主键的查询性能有很高的提升。
36 |
37 | 内部做了很多优化,包括从磁盘读取数据时采用的可预测性读、能够自动在内存中创建哈希索引以加速读操作的自适应哈希索引、能够加速插入操作的插入缓冲区等。
38 |
39 | 通过一些机制和工具支持真正的热备份。其它存储引擎不支持热备份,要获取一致性视图需要停止对所有表的写入,而在读写混合场景中,停止写入可能也意味着停止读取。
40 |
41 | ## MyISAM
42 |
43 | MyISAM 提供了大量的特性,包括全文索引、压缩表、空间数据索引等。应该注意的是,MySQL 5.6.4 也添加了对 InnoDB 存储引擎的全文索引支持。
44 |
45 | 不支持事务。
46 |
47 | 不支持行级锁,只能对整张表加锁,读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取查询的同时,也可以往表中插入新的记录,这被称为并发插入(CONCURRENT INSERT)。
48 |
49 | 可以手工或者自动执行检查和修复操作,但是和事务恢复以及崩溃恢复不同,可能导致一些数据丢失,而且修复操作是非常慢的。
50 |
51 | 如果指定了 DELAY_KEY_WRITE 选项,在每次修改执行完成时,不会立即将修改的索引数据写入磁盘,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入磁盘。这种方式可以极大的提升写入性能,但是在数据库或者主机崩溃时会造成索引损坏,需要执行修复操作。
52 |
53 | MyISAM 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以继续使用 MyISAM。
54 |
55 | ## 比较
56 |
57 | 1. 事务:InnoDB 是事务型的。
58 | 2. 备份:InnoDB 支持在线热备份。
59 | 3. 崩溃恢复:MyISAM 崩溃后发生损坏的概率比 InnoDB 高很多,而且恢复的速度也更慢。
60 | 4. 并发:MyISAM 只支持表级锁,而 InnoDB 还支持行级锁。
61 | 5. 其它特性:MyISAM 支持压缩表和空间数据索引。
62 |
63 | # 二、数据类型
64 |
65 | ## 整型
66 |
67 | TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 32, 64 位存储空间,一般情况下越小的列越好。
68 |
69 | INT(11) 中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说是没有意义的。
70 |
71 | ## 浮点数
72 |
73 | FLOAT 和 DOUBLE 为浮点类型,DECIMAL 为高精度小数类型。CPU 原生支持浮点运算,但是不支持 DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需要更高的代价。
74 |
75 | FLOAT、DOUBLE 和 DECIMAL 都可以指定列宽,例如 DECIMAL(18, 9) 表示总共 18 位,取 9 位存储小数部分,剩下 9 位存储整数部分。
76 |
77 | ## 字符串
78 |
79 | 主要有 CHAR 和 VARCHAR 两种类型,一种是定长的,一种是变长的。
80 |
81 | VARCHAR 这种变长类型能够节省空间,因为只需要存储必要的内容。但是在执行 UPDATE 时可能会使行变得比原来长,当超出一个页所能容纳的大小时,就要执行额外的操作。MyISAM 会将行拆成不同的片段存储,而 InnoDB 则需要分裂页来使行放进页内。
82 |
83 | VARCHAR 会保留字符串末尾的空格,而 CHAR 会删除。
84 |
85 | ## 时间和日期
86 |
87 | MySQL 提供了两种相似的日期时间类型:DATATIME 和 TIMESTAMP。
88 |
89 | ### 1. DATATIME
90 |
91 | 能够保存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。
92 |
93 | 它与时区无关。
94 |
95 | 默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATATIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。
96 |
97 | ### 2. TIMESTAMP
98 |
99 | 和 UNIX 时间戳相同,保存从 1970 年 1 月 1 日午夜(格林威治时间)以来的秒数,使用 4 个字节,只能表示从 1970 年 到 2038 年。
100 |
101 | 它和时区有关。
102 |
103 | MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提供了 UNIX_TIMESTAMP() 函数把日期转换为 UNIX 时间戳。
104 |
105 | 默认情况下,如果插入时没有指定 TIMESTAMP 列的值,会将这个值设置为当前时间。
106 |
107 | 应该尽量使用 TIMESTAMP,因为它比 DATETIME 空间效率更高。
108 |
109 | # 三、索引
110 |
111 | 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
112 |
113 | 索引能够轻易将查询性能提升几个数量级。
114 |
115 | 对于非常小的表、大部分情况下简单的全表扫描比建立索引更高效。对于中到大型的表,索引就非常有效。但是对于特大型的表,建立和使用索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配,例如可以使用分区技术。
116 |
117 | ## 索引分类
118 |
119 | ### 1. B+Tree 索引
120 |
121 |
122 |
123 | 《高性能 MySQL》一书使用 B-Tree 进行描述,其实从技术上来说这种索引是 B+Tree。
124 |
125 | B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
126 |
127 | 因为不再需要进行全表扫描,只需要对树进行搜索即可,因此查找速度快很多。
128 |
129 | 可以指定多个列作为索引列,多个索引列共同组成键。B+Tree 索引适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。
130 |
131 | 除了用于查找,还可以用于排序和分组。
132 |
133 | 如果不是按照索引列的顺序进行查找,则无法使用索引。
134 |
135 | ### 2. 哈希索引
136 |
137 | 基于哈希表实现,优点是查找非常快。
138 |
139 | 在 MySQL 中只有 Memory 引擎显式支持哈希索引。
140 |
141 | InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。
142 |
143 | 限制:
144 |
145 | - 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影响并不明显;
146 | - 无法用于分组与排序;
147 | - 只支持精确查找,无法用于部分查找和范围查找;
148 | - 如果哈希冲突很多,查找速度会变得很慢。
149 |
150 | ### 3. 空间数据索引(R-Tree)
151 |
152 | MyISAM 存储引擎支持空间索引,可以用于地理数据存储。
153 |
154 | 空间索引会从所有维度来索引数据,可以有效地使用任意维度来进行组合查询。
155 |
156 | 必须使用 GIS 相关的函数来维护数据。
157 |
158 | ### 4. 全文索引
159 |
160 | MyISAM 存储引擎支持全文索引,用于查找文本中的关键词,而不是直接比较索引中的值。
161 |
162 | 使用 MATCH AGAINST,而不是普通的 WHERE。
163 |
164 | ## 索引的优点
165 |
166 | - 大大减少了服务器需要扫描的数据量;
167 |
168 | - 帮助服务器避免进行排序和创建临时表(B+Tree 索引是有序的,可以用来做 ORDER BY 和 GROUP BY 操作);
169 |
170 | - 将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,也就将相邻的列值都存储在一起)。
171 |
172 | ## 索引优化
173 |
174 | ### 1. 独立的列
175 |
176 | 在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。
177 |
178 | 例如下面的查询不能使用 actor_id 列的索引:
179 |
180 | ```sql
181 | SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
182 | ```
183 |
184 | ### 2. 前缀索引
185 |
186 | 对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。
187 |
188 | 对于前缀长度的选取需要根据 **索引选择性** 来确定:不重复的索引值和记录总数的比值。选择性越高,查询效率也越高。最大值为 1,此时每个记录都有唯一的索引与其对应。
189 |
190 | ### 3. 多列索引
191 |
192 | 在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。例如下面的语句中,最好把 actor_id 和 film_id 设置为多列索引。
193 |
194 | ```sql
195 | SELECT film_id, actor_ id FROM sakila.film_actor
196 | WhERE actor_id = 1 AND film_id = 1;
197 | ```
198 |
199 | ### 4. 索引列的顺序
200 |
201 | 让选择性最强的索引列放在前面,例如下面显示的结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的前面。
202 |
203 | ```sql
204 | SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity,
205 | COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity,
206 | COUNT(*)
207 | FROM payment;
208 | ```
209 |
210 | ```html
211 | staff_id_selectivity: 0.0001
212 | customer_id_selectivity: 0.0373
213 | COUNT(*): 16049
214 | ```
215 |
216 | ### 5. 聚簇索引
217 |
218 |
219 |
220 | 聚簇索引并不是一种索引类型,而是一种数据存储方式。
221 |
222 | 术语“聚簇”表示数据行和相邻的键值紧密地存储在一起,InnoDB 的聚簇索引在同一个结构中保存了 B+Tree 索引和数据行。
223 |
224 | 因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
225 |
226 | **优点**
227 |
228 | 1. 可以把相关数据保存在一起,减少 I/O 操作。例如电子邮件表可以根据用户 ID 来聚集数据,这样只需要从磁盘读取少数的数据也就能获取某个用户的全部邮件,如果没有使用聚聚簇索引,则每封邮件都可能导致一次磁盘 I/O。
229 | 2. 数据访问更快。
230 |
231 | **缺点**
232 |
233 | 1. 聚簇索引最大限度提高了 I/O 密集型应用的性能,但是如果数据全部放在内存,就没必要用聚簇索引。
234 | 2. 插入速度严重依赖于插入顺序,按主键的顺序插入是最快的。
235 | 3. 更新操作代价很高,因为每个被更新的行都会移动到新的位置。
236 | 4. 当插入到某个已满的页中,存储引擎会将该页分裂成两个页面来容纳该行,页分裂会导致表占用更多的磁盘空间。
237 | 5. 如果行比较稀疏,或者由于页分裂导致数据存储不连续时,聚簇索引可能导致全表扫描速度变慢。
238 |
239 | ### 6. 覆盖索引
240 |
241 | 索引包含所有需要查询的字段的值。
242 |
243 | **优点**
244 |
245 | 1. 因为索引条目通常远小于数据行的大小,所以若只读取索引,能大大减少数据访问量。
246 | 2. 一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。
247 | 3. 对于 InnoDB 引擎,若二级索引能够覆盖查询,则无需访问聚簇索引。
248 |
249 | ## B-Tree 和 B+Tree 原理
250 |
251 | ### 1. B-Tree
252 |
253 |
254 |
255 | 为了描述 B-Tree,首先定义一条数据记录为一个二元组 [key, data]。
256 |
257 | B-Tree 是满足下列条件的数据结构:
258 |
259 | - 所有叶节点具有相同的深度,也就是说 B-Tree 是平衡的;
260 | - 一个节点中的 key 从左到右非递减排列;
261 | - 如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。
262 |
263 | 在 B-Tree 中按 key 检索数据的算法非常直观:首先在根节点进行二分查找,如果找到则返回对应节点的 data,否则在相应区间的指针指向的节点递归进行查找。
264 |
265 | 由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,需要对树进行一个分裂、合并、转移等操作以保持 B-Tree 性质。
266 |
267 | ### 2. B+Tree
268 |
269 |
270 |
271 | 与 B-Tree 相比,B+Tree 有以下不同点:
272 |
273 | - 每个节点的指针上限为 2d 而不是 2d+1;
274 | - 内节点不存储 data,只存储 key,叶子节点不存储指针。
275 |
276 | ### 3. 带有顺序访问指针的 B+Tree
277 |
278 |
279 |
280 | 一般在数据库系统或文件系统中使用的 B+Tree 结构都在经典 B+Tree 基础上进行了优化,在叶子节点增加了顺序访问指针,做这个优化的目的是为了提高区间访问的性能。
281 |
282 | ### 4. 为什么使用 B-Tree 和 B+Tree
283 |
284 | 红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用 B-/+Tree 作为索引结构。
285 |
286 | 页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页的大小通常为 4k),主存和磁盘以页为单位交换数据。
287 |
288 | 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。这样做的理论依据是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载入。
289 |
290 | B-Tree 中一次检索最多需要 h-1 次 I/O(根节点常驻内存),渐进复杂度为 O(h)=O(logdN)。一般实际应用中,出度 d 是非常大的数字,通常超过 100,因此 h 非常小(通常不超过 3)。而红黑树这种结构,h 明显要深的多。并且于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性,效率明显比 B-Tree 差很多。
291 |
292 | B+Tree 更适合外存索引,原因和内节点出度 d 有关。由于 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,拥有更好的性能。
293 |
294 | # 四、查询性能优化
295 |
296 | ### Explain
297 |
298 | 用来分析 SQL 语句,分析结果中比较重要的字段有:
299 |
300 | - select_type : 查询类型,有简单查询、联合查询和子查询
301 |
302 | - key : 使用的索引
303 |
304 | - rows : 扫描的行数
305 |
306 | ### 减少返回的列
307 |
308 | 慢查询主要是因为访问了过多数据,除了访问过多行之外,也包括访问过多列。
309 |
310 | 最好不要使用 SELECT * 语句,要根据需要选择查询的列。
311 |
312 | ### 减少返回的行
313 |
314 | 最好使用 LIMIT 语句来取出想要的那些行。
315 |
316 | 还可以建立索引来减少条件语句的全表扫描。例如对于下面的语句,不使用索引的情况下需要进行全表扫描,而使用索引只需要扫描几行记录即可,使用 Explain 语句可以通过观察 rows 字段来看出这种差异。
317 |
318 | ```sql
319 | SELECT * FROM sakila.film_actor WHERE film_id = 1;
320 | ```
321 |
322 | ### 拆分大的 DELETE 或 INSERT 语句
323 |
324 | 如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。
325 |
326 | ```sql
327 | DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH);
328 | ```
329 |
330 | ```sql
331 | rows_affected = 0
332 | do {
333 | rows_affected = do_query(
334 | "DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")
335 | } while rows_affected > 0
336 | ```
337 |
338 | # 五、切分
339 |
340 |
341 | 随着时间和业务的发展,数据库中的表会越来越多,并且表中的数据量也会越来越大,那么读写操作的开销也会随着增大。
342 |
343 | ## 垂直切分
344 |
345 | 将表按功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立商品数据库 payDB、用户数据库 userDB 等,分别用来存储项目与商品有关的表和与用户有关的表。
346 |
347 | ## 水平切分
348 |
349 | 把表中的数据按照某种规则存储到多个结构相同的表中,例如按 id 的散列值、性别等进行划分。
350 |
351 | ## 切分的选择
352 |
353 | 如果数据库中的表太多,并且项目各项业务逻辑清晰,那么垂直切分是首选。
354 |
355 | 如果数据库的表不多,但是单表的数据量很大,应该选择水平切分。
356 |
357 | ## 存在的问题
358 |
359 | ### 1. 事务问题
360 |
361 | 在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
362 |
363 | ### 2. 跨库跨表连接问题
364 |
365 | 在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上。这时,表的连接操作将受到限制,我们无法连接位于不同分库的表,也无法连接分表粒度不同的表,导致原本只需要一次查询就能够完成的业务需要进行多次才能完成。
366 |
367 | ### 3. 额外的数据管理负担和数据运算压力
368 |
369 | 最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算。
370 |
371 |
372 | # 六、故障转移和故障恢复
373 |
374 | 故障转移也叫做切换,当主库出现故障时就切换到备库,使备库成为主库。故障恢复顾名思义就是从故障中恢复过来,并且保证数据的正确性。
375 |
376 | ### 提升备库或切换角色
377 |
378 | 提升一台备库为主库,或者在一个主-主复制结构中调整主动和被动角色。
379 |
380 | ### 虚拟 IP 地址和 IP 托管
381 |
382 | 为 MySQL 实例指定一个逻辑 IP 地址,当 MySQL 实例失效时,可以将 IP 地址转移到另一台 MySQL 服务器上。
383 |
384 | ### 中间件解决方案
385 |
386 | 通过代理,可以路由流量到可以使用的服务器上。
387 |
388 | ### 在应用中处理故障转移
389 |
390 | 将故障转移整合到应用中可能导致应用变得太过笨拙。
391 |
392 | # 参考资料
393 |
394 | - BaronScbwartz, PeterZaitsev, VadimTkacbenko, 等. 高性能 MySQL[M]. 电子工业出版社, 2013.
395 | - [How Sharding Works](https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6)
396 | - [MySQL 索引背后的数据结构及算法原理 ](http://blog.codinglabs.org/articles/theory-of-mysql-index.html)
397 | - [20+ 条 MySQL 性能优化的最佳经验 ](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html)
398 | - [数据库为什么分库分表?mysql的分库分表方案](https://www.i3geek.com/archives/1108)
399 |
--------------------------------------------------------------------------------
/notes/一致性协议.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、两阶段提交协议](#一两阶段提交协议)
3 | * [二、Paxos 协议](#二paxos-协议)
4 | * [三、Raft 协议](#三raft-协议)
5 | * [四、拜占庭将军问题](#四拜占庭将军问题)
6 | * [五、参考资料](#五参考资料)
7 |
8 |
9 |
10 | # 一、两阶段提交协议
11 |
12 | Two-phase Commit(2PC)。
13 |
14 | 可以保证一个事务跨越多个节点时保持 ACID 特性。
15 |
16 | 两类节点:协调者(Coordinator)和参与者(Participants),协调者只有一个,参与者可以有多个。
17 |
18 | ## 运行过程
19 |
20 | 1. 准备阶段:协调者询问参与者事务是否执行成功;
21 |
22 | 2. 提交阶段:如果事务在每个参与者上都执行成功,协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。
23 |
24 |
25 |
26 |
27 | 需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。
28 |
29 | ## 存在的问题
30 |
31 | - 参与者发生故障。解决方案:可以给事务设置一个超时时间,如果某个参与者一直不响应,那么认为事务执行失败。
32 |
33 | - 协调者发生故障。解决方案:将操作日志同步到备用协调者,让备用协调者接替后续工作。
34 |
35 | # 二、Paxos 协议
36 |
37 | 用于达成共识性问题,即对多个节点产生的值,该算法能保证只选出唯一一个值。
38 |
39 | 主要有三类节点:
40 |
41 | 1. 提议者(Proposer):提议一个值;
42 | 2. 接受者(Acceptor):对每个提议进行投票;
43 | 3. 告知者(Learner):被告知投票的结果,不参与投票过程。
44 |
45 |
46 |
47 | ## 执行过程
48 |
49 | 规定一个提议包含两个字段:[n, v],其中 n 为序号(具有唯一性),v 为提议值。
50 |
51 | 下图演示了两个 Proposer 和三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有 Acceptor 发送提议请求。
52 |
53 |
54 |
55 | 当 Acceptor 接收到一个提议请求,包含的提议为 [n1, v1],并且之前还未接收过提议请求,那么发送一个提议响应,设置当前接收到的提议为 [n1, v1],并且保证以后不会再接受序号小于 n1 的提议。
56 |
57 | 如下图,Acceptor X 在收到 [n=2, v=8] 的提议请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的提议响应,并且设置当前接收到的提议为 [n=2, v=8],并且保证以后不会再接受序号小于 2 的提议。其它的 Acceptor 类似。
58 |
59 |
60 |
61 | 如果 Acceptor 接收到一个提议请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送提议响应,该提议响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。
62 |
63 | 如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的提议请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的提议请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的提议响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。
64 |
65 |
66 |
67 | 当一个 Proposer 接收到超过一半 Acceptor 的提议响应时,就可以发送接受请求。
68 |
69 | Proposer A 接收到两个提议响应之后,就发送 [n=2, v=8] 接受请求。该接受请求会被所有 Acceptor 丢弃,因为此时所有 Acceptor 都保证不接受序号小于 4 的提议。
70 |
71 | Proposer B 过后也收到了两个提议响应,因此也开始发送接受请求。需要注意的是,接受请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的接受请求。
72 |
73 |
74 |
75 | Acceptor 接收到接受请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送通知给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。
76 |
77 |
78 |
79 | ## 约束条件
80 |
81 | ### 1. 正确性
82 |
83 | 指只有一个提议值会生效。
84 |
85 | 因为 Paxos 协议要求每个生效的提议被多数 Acceptor 接收,并且 Acceptor 不会接受两个不同的提议,因此可以保证正确性。
86 |
87 | ### 2. 可终止性
88 |
89 | 指最后总会有一个提议生效。
90 |
91 | Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接受的那个提议靠拢,因此能够保证可终止性。
92 |
93 | # 三、Raft 协议
94 |
95 | Raft 和 Paxos 类似,但是更容易理解,也更容易实现。
96 |
97 | Raft 主要是用来竞选主节点。
98 |
99 | ## 单个 Candidate 的竞选
100 |
101 | 有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。
102 |
103 | ① 下图表示一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。
104 |
105 |
106 |
107 | ② 此时 A 发送投票请求给其它所有节点。
108 |
109 |
110 |
111 | ③ 其它节点会对请求进行回复,如果超过一半的节点回复了,那么该 Candidate 就会变成 Leader。
112 |
113 |
114 |
115 | ④ 之后 Leader 会周期性地发送心跳包给 Follower,Follower 接收到心跳包,会重新开始计时。
116 |
117 |
118 |
119 | ## 多个 Candidate 竞选
120 |
121 | ① 如果有多个 Follower 成为 Candidate,并且所获得票数相同,那么就需要重新开始投票,例如下图中 Candidate B 和 Candidate D 都获得两票,因此需要重新开始投票。
122 |
123 |
124 |
125 | ② 当重新开始投票时,由于每个节点设置的随机竞选超时时间不同,因此能下一次再次出现多个 Candidate 并获得同样票数的概率很低。
126 |
127 |
128 |
129 | ## 日志复制
130 |
131 | ① 来自客户端的修改都会被传入 Leader。注意该修改还未被提交,只是写入日志中。
132 |
133 |
134 |
135 | ② Leader 会把修改复制到所有 Follower。
136 |
137 |
138 |
139 | ③ Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交。
140 |
141 |
142 |
143 | ④ 此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致。
144 |
145 |
146 |
147 | # 四、拜占庭将军问题
148 |
149 | > [拜占庭将军问题深入探讨](http://www.8btc.com/baizhantingjiangjun)
150 |
151 | # 五、参考资料
152 |
153 | - 杨传辉. 大规模分布式存储系统: 原理解析与架构实战[M]. 机械工业出版社, 2013.
154 | - [区块链技术指南](https://www.gitbook.com/book/yeasy/blockchain_guide/details)
155 | - [NEAT ALGORITHMS - PAXOS](http://harry.me/blog/2014/12/27/neat-algorithms-paxos/)
156 | - [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft)
157 | - [Paxos By Example](https://angus.nyc/2012/paxos-by-example/)
158 |
--------------------------------------------------------------------------------
/notes/代码可读性.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、可读性的重要性](#一可读性的重要性)
3 | * [二、用名字表达代码含义](#二用名字表达代码含义)
4 | * [三、名字不能带来歧义](#三名字不能带来歧义)
5 | * [四、良好的代码风格](#四良好的代码风格)
6 | * [五、编写注释](#五编写注释)
7 | * [六、如何编写注释](#六如何编写注释)
8 | * [七、提高控制流的可读性](#七提高控制流的可读性)
9 | * [八、拆分长表达式](#八拆分长表达式)
10 | * [九、变量与可读性](#九变量与可读性)
11 | * [十、抽取函数](#十抽取函数)
12 | * [十一、一次只做一件事](#十一一次只做一件事)
13 | * [十二、用自然语言表述代码](#十二用自然语言表述代码)
14 | * [十三、减少代码量](#十三减少代码量)
15 | * [参考资料](#参考资料)
16 |
17 |
18 |
19 | # 一、可读性的重要性
20 |
21 | 编程有很大一部分时间是在阅读代码,不仅要阅读自己的代码,而且要阅读别人的代码。因此,可读性良好的代码能够大大提高编程效率。
22 |
23 | 可读性良好的代码往往会让代码架构更好,因为程序员更愿意去修改这部分代码,而且也更容易修改。
24 |
25 | 只有在核心领域为了效率才可以放弃可读性,否则可读性是第一位。
26 |
27 | # 二、用名字表达代码含义
28 |
29 | 一些比较有表达力的单词:
30 |
31 | | 单词 | 可替代单词 |
32 | | --- | --- |
33 | | send | deliver、dispatch、announce、distribute、route |
34 | | find | search、extract、locate、recover |
35 | | start| launch、create、begin、open|
36 | | make | create、set up、build、generate、compose、add、new |
37 |
38 | 使用 i、j、k 作为循环迭代器的名字过于简单,user_i、member_i 这种名字会更有表达力。因为循环层次越多,代码越难理解,有表达力的迭代器名字可读性会更高
39 |
40 | 为名字添加形容词等信息能让名字更具有表达力,但是名字也会变长。名字长短的准则是:作用域越大,名字越长。因此只有在短作用域才能使用一些简单名字。
41 |
42 | # 三、名字不能带来歧义
43 |
44 | 起完名字要思考一下别人会对这个名字有何解读,会不会误解了原本想表达的含义。
45 |
46 | 用 min、max 表示数量范围;用 first、last 表示访问空间的包含范围,begin、end 表示访问空间的排除范围,即 end 不包含尾部。
47 |
48 |
49 |
50 | 布尔相关的命名加上 is、can、should、has 等前缀。
51 |
52 | # 四、良好的代码风格
53 |
54 | 适当的空行和缩进。
55 |
56 | 排列整齐的注释:
57 |
58 | ```java
59 | int a = 1; // 注释
60 | int b = 11; // 注释
61 | int c = 111; // 注释
62 | ```
63 |
64 | 语句顺序不能随意,比如与 html 表单相关联的变量的赋值应该和表单在 html 中的顺序一致;
65 |
66 | 把相关的代码按块组织起来放在一起。
67 |
68 | # 五、编写注释
69 |
70 | 阅读代码首先会注意到注释,如果注释没太大作用,那么就会浪费代码阅读的时间。那些能直接看出含义的代码不需要写注释,特别是并不需要为每个方法都加上注释,比如那些简单的 getter 和 setter 方法,为这些方法写注释反而让代码可读性更差。
71 |
72 | 不能因为有注释就随便起个名字,而是争取起个好名字而不写注释。
73 |
74 | 可以用注释来记录采用当前解决办法的思考过程,从而让读者更容易理解代码。
75 |
76 | 注释用来提醒一些特殊情况。
77 |
78 | 用 TODO 等做标记:
79 |
80 | | 标记 | 用法 |
81 | |---|---|
82 | |TODO| 待做 |
83 | |FIXME| 待修复 |
84 | |HACH| 粗糙的解决方案 |
85 | |XXX| 危险!这里有重要的问题 |
86 |
87 | # 六、如何编写注释
88 |
89 | 尽量简洁明了:
90 |
91 | ```java
92 | // The first String is student's name
93 | // The Second Integer is student's score
94 | Map scoreMap = new HashMap<>();
95 | ```
96 |
97 | ```java
98 | // Student' name -> Student's score
99 | Map scoreMap = new HashMap<>();
100 | ```
101 |
102 | 添加测试用例来说明:
103 |
104 | ```java
105 | //...
106 | // Example: add(1, 2), return 3
107 | int add(int x, int y) {
108 | return x + y;
109 | }
110 | ```
111 |
112 | 在很复杂的函数调用中对每个参数标上名字:
113 |
114 | ```java
115 | int a = 1;
116 | int b = 2;
117 | int num = add(\* x = *\ a, \* y = *\ b);
118 | ```
119 |
120 | 使用专业名词来缩短概念上的解释,比如用设计模式名来说明代码。
121 |
122 | # 七、提高控制流的可读性
123 |
124 | 条件表达式中,左侧是变量,右侧是常数。比如下面第一个语句正确:
125 |
126 | ```java
127 | if(len < 10)
128 | if(10 > len)
129 | ```
130 |
131 | if / else 条件语句,逻辑的处理顺序为:① 正逻辑;② 关键逻辑;③ 简单逻辑。
132 |
133 | ```java
134 | if(a == b) {
135 | // 正逻辑
136 | } else{
137 | // 反逻辑
138 | }
139 | ```
140 |
141 | 只有在逻辑简单的情况下使用 ? : 三目运算符来使代码更紧凑,否则应该拆分成 if / else;
142 |
143 | do / while 的条件放在后面,不够简单明了,并且会有一些迷惑的地方,最好使用 while 来代替。
144 |
145 | 如果只有一个 goto 目标,那么 goto 尚且还能接受,但是过于复杂的 goto 会让代码可读性特别差,应该避免使用 goto。
146 |
147 | 在嵌套的循环中,用一些 return 语句往往能减少嵌套的层数。
148 |
149 | # 八、拆分长表达式
150 |
151 | 长表达式的可读性很差,可以引入一些解释变量从而拆分表达式:
152 |
153 | ```python
154 | if line.split(':')[0].strip() == "root":
155 | ...
156 | ```
157 | ```python
158 | username = line.split(':')[0].strip()
159 | if username == "root":
160 | ...
161 | ```
162 |
163 | 使用摩根定理简化一些逻辑表达式:
164 |
165 | ```java
166 | if(!a && !b) {
167 | ...
168 | }
169 | ```
170 | ```java
171 | if(!(a || b)) {
172 | ...
173 | }
174 | ```
175 |
176 | # 九、变量与可读性
177 |
178 | **去除控制流变量** 。在循环中通过使用 break 或者 return 可以减少控制流变量的使用。
179 |
180 | ```java
181 | boolean done = false;
182 | while(/* condition */ && !done) {
183 | ...
184 | if(...) {
185 | done = true;
186 | continue;
187 | }
188 | }
189 | ```
190 | ```
191 | while(/* condition */) {
192 | ...
193 | if(...) {
194 | break;
195 | }
196 | }
197 | ```
198 |
199 | **减小变量作用域** 。作用域越小,越容易定位到变量所有使用的地方。
200 |
201 | JavaScript 可以用闭包减小作用域。以下代码中 submit_form 是函数变量,submitted 变量控制函数不会被提交两次。第一个实现中 submitted 是全局变量,第二个实现把 submitted 放到匿名函数中,从而限制了起作用域范围。
202 |
203 | ```js
204 | submitted = false;
205 | var submit_form = function(form_name) {
206 | if(submitted) {
207 | return;
208 | }
209 | submitted = true;
210 | };
211 | ```
212 |
213 | ```js
214 | var submit_form = (function() {
215 | var submitted = false;
216 | return function(form_name) {
217 | if(submitted) {
218 | return;
219 | }
220 | submitted = true;
221 | }
222 | }()); // () 使得外层匿名函数立即执行
223 | ```
224 |
225 | JavaScript 中没有用 var 声明的变量都是全局变量,而全局变量很容易造成迷惑,因此应当总是用 var 来声明变量。
226 |
227 | 变量定义的位置应当离它使用的位置最近。
228 |
229 | **实例解析**
230 |
231 | 在一个网页中有以下文本输入字段:
232 |
233 | ```html
234 |
235 |
236 |
237 |
238 | ```
239 |
240 | 现在要接受一个字符串并把它放到第一个空的 input 字段中,初始实现如下:
241 |
242 | ```js
243 | var setFirstEmptyInput = function(new_alue) {
244 | var found = false;
245 | var i = 1;
246 | var elem = document.getElementById('input' + i);
247 | while(elem != null) {
248 | if(elem.value === '') {
249 | found = true;
250 | break;
251 | }
252 | i++;
253 | elem = document.getElementById('input' + i);
254 | }
255 | if(found) elem.value = new_value;
256 | return elem;
257 | }
258 | ```
259 |
260 | 以上实现有以下问题:
261 |
262 | - found 可以去除;
263 | - elem 作用域过大;
264 | - 可以用 for 循环代替 while 循环;
265 |
266 | ```js
267 | var setFirstEmptyInput = function(new_value) {
268 | for(var i = 1; true; i++) {
269 | var elem = document.getElementById('input' + i);
270 | if(elem === null) {
271 | return null;
272 | }
273 | if(elem.value === '') {
274 | elem.value = new_value;
275 | return elem;
276 | }
277 | }
278 | };
279 | ```
280 |
281 | # 十、抽取函数
282 |
283 | 工程学就是把大问题拆分成小问题再把这些问题的解决方案放回一起。
284 |
285 | 首先应该明确一个函数的高层次目标,然后对于不是直接为了这个目标工作的代码,抽取出来放到独立的函数中。
286 |
287 | 介绍性的代码:
288 |
289 | ```java
290 | int findClostElement(int[] arr) {
291 | int clostIdx;
292 | int clostDist = Interger.MAX_VALUE;
293 | for(int i = 0; i < arr.length; i++) {
294 | int x = ...;
295 | int y = ...;
296 | int z = ...;
297 | int value = x * y * z;
298 | int dist = Math.sqrt(Math.pow(value, 2), Math.pow(arr[i], 2));
299 | if(dist < clostDist) {
300 | clostIdx = i;
301 | clostDist = value;
302 | }
303 | }
304 | return clostIdx;
305 | }
306 | ```
307 |
308 | 以上代码中循环部分主要计算距离,这部分不属于代码高层次目标,高层次目标是寻找最小距离的值,因此可以把这部分代替提取到独立的函数中。这样做也带来一个额外的好处有:可以单独进行测试、可以快速找到程序错误并修改。
309 |
310 | ```java
311 | public int findClostElement(int[] arr) {
312 | int clostIdx;
313 | int clostDist = Interger.MAX_VALUE;
314 | for(int i = 0; i < arr.length; i++) {
315 | int dist = computDist(arr, i);
316 | if(dist < clostDist) {
317 | clostIdx = i;
318 | clostDist = value;
319 | }
320 | }
321 | return clostIdx;
322 | }
323 | ```
324 |
325 | 并不是函数抽取的越多越好,如果抽取过多,在阅读代码的时候可能需要不断跳来跳去。只有在当前函数不需要去了解某一块代码细节而能够表达其内容时,把这块代码抽取成子函数才是好的。
326 |
327 | 函数抽取也用于减小代码的冗余。
328 |
329 | # 十一、一次只做一件事
330 |
331 | 只做一件事的代码很容易让人知道其要做的事;
332 |
333 | 基本流程:列出代码所做的所有任务;把每个任务拆分到不同的函数,或者不同的段落。
334 |
335 | # 十二、用自然语言表述代码
336 |
337 | 先用自然语言书写代码逻辑,也就是伪代码,然后再写代码,这样代码逻辑会更清晰。
338 |
339 | # 十三、减少代码量
340 |
341 | 不要过度设计,编码过程会有很多变化,过度设计的内容到最后往往是无用的。
342 |
343 | 多用标准库实现。
344 |
345 | # 参考资料
346 |
347 | - Dustin, Boswell, Trevor, 等. 编写可读代码的艺术 [M]. 机械工业出版社, 2012.
348 |
--------------------------------------------------------------------------------
/notes/代码风格规范.md:
--------------------------------------------------------------------------------
1 | # Google Java Style Guide
2 |
3 | - http://www.hawstein.com/posts/google-java-style.html
4 | - http://google.github.io/styleguide/javaguide.html
5 |
6 | # Google C++ Style Guide
7 |
8 | - http://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/
9 | - http://google.github.io/styleguide/cppguide.html
10 |
11 | # Google Python Style Guide
12 |
13 | - http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/
14 | - http://google.github.io/styleguide/pyguide.html
15 |
--------------------------------------------------------------------------------
/notes/分布式基础.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、基本概念](#一基本概念)
3 | * [异常](#异常)
4 | * [超时](#超时)
5 | * [衡量指标](#衡量指标)
6 | * [二、数据分布](#二数据分布)
7 | * [哈希分布](#哈希分布)
8 | * [顺序分布](#顺序分布)
9 | * [三、负载均衡](#三负载均衡)
10 | * [四、复制](#四复制)
11 | * [强同步复制协议](#强同步复制协议)
12 | * [异步复制协议](#异步复制协议)
13 | * [五、CAP](#五cap)
14 | * [六、BASE](#六base)
15 | * [基本可用](#基本可用)
16 | * [软状态](#软状态)
17 | * [最终一致性](#最终一致性)
18 | * [七、容错](#七容错)
19 | * [故障检测](#故障检测)
20 | * [故障恢复](#故障恢复)
21 | * [八、CDN 架构](#八cdn-架构)
22 | * [参考资料](#参考资料)
23 |
24 |
25 |
26 | # 一、基本概念
27 |
28 | ## 异常
29 |
30 | ### 1. 服务器宕机
31 |
32 | 内存错误、服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用。
33 |
34 | 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上。
35 |
36 | ### 2. 网络异常
37 |
38 | 有一种特殊的网络异常称为 **网络分区** ,即集群的所有节点被划分为多个区域,每个区域内部可以通信,但是区域之间无法通信。
39 |
40 | ### 3. 磁盘故障
41 |
42 | 磁盘故障是一种发生概率很高的异常。
43 |
44 | 使用冗余机制,将数据存储到多台服务器。
45 |
46 | ## 超时
47 |
48 | 在分布式系统中,一个请求除了成功和失败两种状态,还存在着超时状态。
49 |
50 |
51 |
52 | 可以将服务器的操作设计为具有 **幂等性** ,即执行多次的结果与执行一次的结果相同。如果使用这种方式,当出现超时的时候,可以不断地重新请求直到成功。
53 |
54 | ## 衡量指标
55 |
56 | ### 1. 性能
57 |
58 | 常见的性能指标有:吞吐量、响应时间。
59 |
60 | 其中,吞吐量指系统在某一段时间可以处理的请求总数,通常为每秒的读操作数或者写操作数;响应时间指从某个请求发出到接收到返回结果消耗的时间。
61 |
62 | 这两个指标往往是矛盾的,追求高吞吐的系统,往往很难做到低响应时间,解释如下:
63 |
64 | - 在无并发的系统中,吞吐量为响应时间的倒数,例如响应时间为 10 ms,那么吞吐量为 100 req/s,因此高吞吐也就意味着低响应时间。
65 |
66 | - 但是在并发的系统中,由于一个请求在调用 I/O 资源的时候,需要进行等待。服务器端一般使用的是异步等待方式,即等待的请求被阻塞之后不需要一直占用 CPU 资源。这种方式能大大提高 CPU 资源的利用率,例如上面的例子中,单个请求在无并发的系统中响应时间为 10 ms,如果在并发的系统中,那么吞吐量将大于 100 req/s。因此为了追求高吞吐量,通常会提高并发程度。但是并发程度的增加,会导致请求的平均响应时间也增加,因为请求不能马上被处理,需要和其它请求一起进行并发处理,响应时间自然就会增高。
67 |
68 | ### 2. 可用性
69 |
70 | 可用性指系统在面对各种异常时可以提供正常服务的能力。可以用系统可用时间占总时间的比值来衡量,4 个 9 的可用性表示系统 99.99% 的时间是可用的。
71 |
72 | ### 3. 一致性
73 |
74 | 可以从两个角度理解一致性:从客户端的角度,读写操作是否满足某种特性;从服务器的角度,多个数据副本之间是否一致。
75 |
76 | 有以下三种一致性模型:
77 |
78 | 1. 强一致性:新数据写入之后,在任何数据副本上都能读取到最新值;
79 | 2. 弱一致性:新数据写入之后,不能保证在数据副本上能读取到最新值;
80 | 3. 最终一致性:新数据写入之后,只能保证过了一个时间窗口后才能在数据副本上读取到最新值;
81 |
82 | ### 4. 可扩展性
83 |
84 | 指系统通过扩展集群服务器规模来提高性能的能力。理想的分布式系统需要实现“线性可扩展”,即随着集群规模的增加,系统的整体性能也会线性增加。
85 |
86 | # 二、数据分布
87 |
88 | 分布式系统的数据分布在多个节点中,常用的数据分布方式有哈希分布和顺序分布。
89 |
90 | ## 哈希分布
91 |
92 | 哈希分布就是将数据计算哈希值之后,按照哈希值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash(key)%N。
93 |
94 | 传统的哈希分布算法存在一个问题:当节点数量变化时,也就是 N 值变化,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移。
95 |
96 | **一致性哈希**
97 |
98 | Distributed Hash Table(DHT):对于哈希空间 [0, 2n-1],将该哈希空间看成一个哈希环,将每个节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上。
99 |
100 |
101 |
102 | 一致性哈希的优点是在加入或者删除节点时只会影响到哈希环中相邻的节点,例如下图中新增节点 X,只需要将数据对象 C 重新存放到节点 X 上即可,对于节点 A、B、D 都没有影响。
103 |
104 |
105 |
106 | ## 顺序分布
107 |
108 | 哈希分布式破坏了数据的有序性,顺序分布则不会。
109 |
110 | 顺序分布的数据划分为多个连续的部分,按一定策略分布到不同节点上。例如下图中,User 表的主键范围为 1 \~ 7000,使用顺序分布可以将其划分成多个子表,对应的主键范围为 1 \~ 1000,1001 \~ 2000,...,6001 \~ 7000。
111 |
112 | 引入 Meta 表是为了支持更大的集群规模,它将原来的一层索引结分成两层,Meta 维护着 User 子表所在的节点,从而减轻 Root 节点的负担。
113 |
114 |
115 |
116 | # 三、负载均衡
117 |
118 | 衡量负载的因素很多,如 CPU、内存、磁盘等资源使用情况、读写请求数等。分布式系统应当能够自动负载均衡,当某个节点的负载较高,将它的部分数据迁移到其它节点。
119 |
120 | 每个集群都有一个总控节点,其它节点为工作节点,由总控节点根据全局负载信息进行整体调度,工作节点定时发送心跳包(Heartbeat)将节点负载相关的信息发送给总控节点。
121 |
122 | 一个新上线的工作节点,由于其负载较低,如果不加控制,总控节点会将大量数据同时迁移到该节点上,造成该节点一段时间内无法工作。因此负载均衡操作需要平滑进行,新加入的节点需要较长的一段时间来达到比较均衡的状态。
123 |
124 | # 四、复制
125 |
126 | 复制是保证分布式系统高可用的基础,让一个数据存储多个副本,当某个副本所在的节点出现故障时,能够自动切换到其它副本上,从而实现故障恢复。
127 |
128 | 多个副本通常有一个为主副本,其它为备副本。主副本用来处理写请求,备副本主要用来处理读请求,实现读写分离。主副本将同步操作日志发送给备副本,备副本通过回放操作日志获取最新修改。
129 |
130 |
131 |
132 | 主备副本之间有两种复制协议,一种是强同步复制协议,一种是异步复制协议。
133 |
134 | ## 强同步复制协议
135 |
136 | 要求主副本将同步操作日志发给备副本之后进行等待,要求至少一个备副本返回成功后,才开始修改主副本,修改完成之后通知客户端操作成功。
137 |
138 | 优点:至少有一个备副本拥有完整的数据,出现故障时可以安全地切换到该备副本,因此一致性好。
139 |
140 | 缺点:可用性差,因为主副本需要等待,那么整个分布式系统的可用时间就会降低。
141 |
142 | ## 异步复制协议
143 |
144 | 主副本将同步操作日志发给备副本之后不需要进行等待,直接修改主副本并通知客户端操作成功。
145 |
146 | 优点:可用性好。
147 |
148 | 缺点:一致性差。
149 |
150 | # 五、CAP
151 |
152 | 分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容忍性(P:Partition tolerance),最多只能同时满足其中两项。这三个概念上文中已经提到。
153 |
154 | 在设计分布式系统时,需要根据实际需求弱化某一要求。因此就有了下图中的三种设计:CA、CP 和 AP。
155 |
156 |
157 |
158 | 需要注意的是,分区容忍性必不可少,因为需要总是假设网络是不可靠的。因此实际上设计分布式系统需要在一致性和可用性之间做权衡。
159 |
160 | # 六、BASE
161 |
162 | BASE 是 Basically Available(基本可用)、Soft State(软状态)和 Eventually Consistent(最终一致性)三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡的结果,是基于 CAP 定理逐步演化而来的。BASE 理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。
163 |
164 |
165 |
166 | ## 基本可用
167 |
168 | 指分布式系统在出现故障的时候,保证核心可用,允许损失部分可用性。
169 |
170 | 例如,电商在做促销时,服务层可能只提供降级服务,部分用户可能会被引导到降级页面上。
171 |
172 | ## 软状态
173 |
174 | 指允许系统存在中间状态,而该中间状态不会影响系统整体可用性,即不同节点的数据副本之间进行同步的过程允许存在延时。
175 |
176 | ## 最终一致性
177 |
178 | 指所有的数据副本,在经过一段时间的同步之后,最终都能够达到一致的状态。
179 |
180 | 强一致性需要保证数据副本实时一致,而最终一致性只需要保证过一段时间是一致的。
181 |
182 | ACID 是传统数据库系统常用的设计理论,追求强一致性模型。BASE 常用于大型分布式系统,只需要保证最终一致性。在实际的分布式场景中,不同业务单元和组件对一致性的要求是不同的,因此 ACID 和 BASE 往往会结合在一起使用。
183 |
184 | # 七、容错
185 |
186 | 分布式系统故障发生的概率很大,为了实现高可用以及减少人工运维成本,需要实现自动化容错。
187 |
188 | ## 故障检测
189 |
190 | 通过 **租约机制** 来对故障进行检测。假设节点 A 为主控节点,节点 A 向节点 B 发送租约,节点 B 在租约规定的期限内才能提供服务。期限快到达时,节点 B 需要向 A 重新申请租约。
191 |
192 | 如果过期,那么 B 不再提供服务,并且 A 也能知道 B 此时可能发生故障并已经停止服务。可以看到,通过这种机制,A 和 B 都能对 B 发生故障这一事实达成一致。
193 |
194 | ## 故障恢复
195 |
196 | 当某个节点故障时,就将它上面的服务迁移到其它节点。
197 |
198 | # 八、CDN 架构
199 |
200 | 通过将内容发布到靠近用户的边缘节点,使不同地域的用户在访问相同网页时可以就近获取。不仅可以减轻服务器的负担,也可以提高用户的访问速度。
201 |
202 | 从下图可以看出,DNS 在对域名解析时不再向用户返回源服务器的 IP 地址,而是返回边缘节点的 IP 地址,所以用户最终访问的是边缘节点。边缘节点会先从源服务器中获取用户所需的数据,如果请求成功,边缘节点会将页面缓存下来,下次用户访问时可以直接读取。
203 |
204 |
205 |
206 | # 参考资料
207 |
208 | - 杨传辉. 大规模分布式存储系统: 原理解析与架构实战[M]. 机械工业出版社, 2013.
209 |
--------------------------------------------------------------------------------
/notes/分布式问题分析.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、谈谈业务中使用分布式的场景](#一谈谈业务中使用分布式的场景)
3 | * [二、分布式事务](#二分布式事务)
4 | * [产生原因](#产生原因)
5 | * [应用场景](#应用场景)
6 | * [解决方案](#解决方案)
7 | * [三、负载均衡的算法与实现](#三负载均衡的算法与实现)
8 | * [算法](#算法)
9 | * [实现](#实现)
10 | * [四、分布式锁](#四分布式锁)
11 | * [使用场景](#使用场景)
12 | * [实现方式](#实现方式)
13 | * [五、分布式 Session](#五分布式-session)
14 | * [1. Sticky Sessions](#1-sticky-sessions)
15 | * [2. Session Replication](#2-session-replication)
16 | * [3. Persistent DataStore](#3-persistent-datastore)
17 | * [4. In-Memory DataStore](#4-in-memory-datastore)
18 | * [六、分库与分表带来的分布式困境与应对之策](#六分库与分表带来的分布式困境与应对之策)
19 | * [事务问题](#事务问题)
20 | * [查询问题](#查询问题)
21 | * [ID 唯一性](#id-唯一性)
22 | * [参考资料](#参考资料)
23 |
24 |
25 |
26 | # 一、谈谈业务中使用分布式的场景
27 |
28 | 分布式主要是为了提供可扩展性以及高可用性,业务中使用分布式的场景主要有分布式存储以及分布式计算。
29 |
30 | 分布式存储中可以将数据分片到多个节点上,不仅可以提高性能(可扩展性),同时也可以使用多个节点对同一份数据进行备份(高可用性)。
31 |
32 | 至于分布式计算,就是将一个大的计算任务分解成小任务分配到多个节点上去执行,再汇总每个小任务的执行结果得到最终结果。MapReduce 是分布式计算最好的例子。
33 |
34 | # 二、分布式事务
35 |
36 | 指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。
37 |
38 | ## 产生原因
39 |
40 | - 数据库分库分表;
41 | - SOA 架构,比如一个电商网站将订单业务和库存业务分离出来放到不同的节点上。
42 |
43 | ## 应用场景
44 |
45 | - 下单:减少库存、更新订单状态。库存和订单如果不在同一个数据库,就涉及分布式事务。
46 | - 支付:买家账户扣款、卖家账户入账。买家和卖家账户信息如果不在同一个数据库,就涉及分布式事务。
47 |
48 | ## 解决方案
49 |
50 | ### 1. 两阶段提交协议
51 |
52 | > [两阶段提交](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E4%B8%80%E8%87%B4%E6%80%A7%E5%8D%8F%E8%AE%AE.md#%E4%B8%A4%E9%98%B6%E6%AE%B5%E6%8F%90%E4%BA%A4%E5%8D%8F%E8%AE%AE)
53 |
54 | 两阶段提交协议可以很好地解决分布式事务问题。它可以使用 XA 来实现,XA 包含两个部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如 Oracle、DB2 这些商业数据库都实现了 XA 接口;而事务管理器作为全局的协调者,负责各个本地资源的提交和回滚。
55 |
56 | ### 2. 消息中间件
57 |
58 | 消息中间件也可称作消息系统 (MQ),它本质上是一个暂存转发消息的一个中间件。在分布式应用当中,我们可以把一个业务操作转换成一个消息,比如支付宝的余额转入余额宝操作,支付宝系统执行减少余额操作之后向消息系统发送一个消息,余额宝系统订阅这条消息然后进行增加余额宝操作。
59 |
60 | #### 2.1 消息处理模型
61 |
62 | (一)消息队列
63 |
64 |
65 |
66 | (二)发布/订阅
67 |
68 |
69 |
70 |
71 | #### 2.2 消息的可靠性
72 |
73 | (一)发送端的可靠性
74 |
75 | 发送端完成操作后一定能将消息成功发送到消息系统。
76 |
77 | 实现方法:在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息中间件,若转移消息成功则删除消息表中的数据,否则继续重传。
78 |
79 | (二)接收端的可靠性
80 |
81 | 接收端能够从消息中间件成功消费一次消息。
82 |
83 | 实现方法:
84 |
85 | - 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。
86 | - 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。
87 |
88 | # 三、负载均衡的算法与实现
89 |
90 | ## 算法
91 |
92 | ### 1. 轮询(Round Robin)
93 |
94 | 轮询算法把每个请求轮流发送到每个服务器上。下图中,一共有 6 个客户端产生了 6 个请求,这 6 个请求按 (1, 2, 3, 4, 5, 6) 的顺序发送。最后,(1, 3, 5) 的请求会被发送到服务器 1,(2, 4, 6) 的请求会被发送到服务器 2。
95 |
96 |
97 |
98 | 该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担过大的负载(下图的 Server 2)。
99 |
100 |
101 |
102 | ### 2. 加权轮询(Weighted Round Robbin)
103 |
104 | 加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值。例如下图中,服务器 1 被赋予的权值为 5,服务器 2 被赋予的权值为 1,那么 (1, 2, 3, 4, 5) 请求会被发送到服务器 1,(6) 请求会被发送到服务器 2。
105 |
106 |
107 |
108 | ### 3. 最少连接(least Connections)
109 |
110 | 由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数过大,而另一台服务器的连接过小,造成负载不均衡。例如下图中,(1, 3, 5) 请求会被发送到服务器 1,但是 (1, 3) 很快就断开连接,此时只有 (5) 请求连接服务器 1;(2, 4, 6) 请求被发送到服务器 2,只有 (2) 的连接断开。该系统继续运行时,服务器 2 会承担过大的负载。
111 |
112 |
113 |
114 | 最少连接算法就是将请求发送给当前最少连接数的服务器上。例如下图中,服务器 1 当前连接数最小,那么新到来的请求 6 就会被发送到服务器 1 上。
115 |
116 |
117 |
118 | ### 4. 加权最小连接(Weighted Least Connection)
119 |
120 | 在最小连接的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。
121 |
122 |
123 |
124 | ### 5. 随机算法(Random)
125 |
126 | 把请求随机发送到服务器上。和轮询算法类似,该算法比较适合服务器性能差不多的场景。
127 |
128 |
129 |
130 | ### 6. 源地址哈希法 (IP Hash)
131 |
132 | 源地址哈希通过对客户端 IP 哈希计算得到的一个数值,用该数值对服务器数量进行取模运算,取模结果便是目标服务器的序号。
133 |
134 | - 优点:保证同一 IP 的客户端都会被 hash 到同一台服务器上。
135 | - 缺点:不利于集群扩展,后台服务器数量变更都会影响 hash 结果。可以采用一致性 Hash 改进。
136 |
137 |
138 |
139 | ## 实现
140 |
141 | ### 1. HTTP 重定向
142 |
143 | HTTP 重定向负载均衡服务器收到 HTTP 请求之后会返回服务器的地址,并将该地址写入 HTTP 重定向响应中返回给浏览器,浏览器收到后需要再次发送请求。
144 |
145 | 缺点:
146 |
147 | - 用户访问的延迟会增加;
148 | - 如果负载均衡器宕机,就无法访问该站点。
149 |
150 |
151 |
152 | ### 2. DNS 重定向
153 |
154 | 使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。
155 |
156 | 缺点:
157 |
158 | - DNS 查找表可能会被客户端缓存起来,那么之后的所有请求都会被重定向到同一个服务器。
159 |
160 |
161 |
162 | ### 3. 修改 MAC 地址
163 |
164 | 使用 LVS(Linux Virtual Server)这种链路层负载均衡器,根据负载情况修改请求的 MAC 地址。
165 |
166 |
167 |
168 | ### 4. 修改 IP 地址
169 |
170 | 在网络层修改请求的目的 IP 地址。
171 |
172 |
173 |
174 | ### 5. 代理自动配置
175 |
176 | 正向代理与反向代理的区别:
177 |
178 | - 正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端。
179 | - 反向代理:发生在服务器端,用户不知道代理的存在。
180 |
181 | PAC 服务器是用来判断一个请求是否要经过代理。
182 |
183 |
184 |
185 | # 四、分布式锁
186 |
187 | Java 提供了两种内置的锁的实现,一种是由 JVM 实现的 synchronized 和 JDK 提供的 Lock,对于单机单进程应用,可以使用它们来实现锁。当应用涉及到多机、多进程共同完成时,那么这时候就需要一个全局锁来实现多个进程之间的同步。
188 |
189 | ## 使用场景
190 |
191 | 在服务器端使用分布式部署的情况下,一个服务可能分布在不同的节点上,比如订单服务分布在节点 A 和节点 B 上。如果多个客户端同时对一个服务进行请求时,就需要使用分布式锁。例如一个服务可以使用 APP 端或者 Web 端进行访问,如果一个用户同时使用 APP 端和 Web 端访问该服务,并且 APP 端的请求路由到了节点 A,WEB 端的请求被路由到了节点 B,这时候就需要使用分布式锁来进行同步。
192 |
193 | ## 实现方式
194 |
195 | ### 1. 数据库分布式锁
196 |
197 | **(一)基于 MySQL 锁表**
198 |
199 | 该实现完全依靠数据库的唯一索引。当想要获得锁时,就向数据库中插入一条记录,释放锁时就删除这条记录。如果记录具有唯一索引,就不会同时插入同一条记录。
200 |
201 | 这种方式存在以下几个问题:
202 |
203 | 1. 锁没有失效时间,解锁失败会导致死锁,其他线程无法再获得锁。
204 | 2. 只能是非阻塞锁,插入失败直接就报错了,无法重试。
205 | 3. 不可重入,同一线程在没有释放锁之前无法再获得锁。
206 |
207 | **(二)采用乐观锁增加版本号**
208 |
209 | 根据版本号来判断更新之前有没有其他线程更新过,如果被更新过,则获取锁失败。
210 |
211 | ### 2. Redis 分布式锁
212 |
213 | **(一)基于 SETNX、EXPIRE**
214 |
215 | 使用 SETNX(set if not exist)命令插入一个键值对时,如果 Key 已经存在,那么会返回 False,否则插入成功并返回 True。因此客户端在尝试获得锁时,先使用 SETNX 向 Redis 中插入一个记录,如果返回 True 表示获得锁,返回 False 表示已经有客户端占用锁。
216 |
217 | EXPIRE 可以为一个键值对设置一个过期时间,从而避免了死锁的发生。
218 |
219 | **(二)RedLock 算法**
220 |
221 | RedLock 算法使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时还可用。
222 |
223 | 1. 尝试从 N 个相互独立 Redis 实例获取锁,如果一个实例不可用,应该尽快尝试下一个。
224 | 2. 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N/2+1)实例上获取了锁,那么就认为锁获取成功了。
225 | 3. 如果锁获取失败,会到每个实例上释放锁。
226 |
227 | ### 3. Zookeeper 分布式锁
228 |
229 | Zookeeper 是一个为分布式应用提供一致性服务的软件,例如配置管理、分布式协同以及命名的中心化等,这些都是分布式系统中非常底层而且是必不可少的基本功能,但是如果自己实现这些功能而且要达到高吞吐、低延迟同时还要保持一致性和可用性,实际上非常困难。
230 |
231 | **(一)抽象模型**
232 |
233 | Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点表示它的父节点为 /app1。
234 |
235 |
236 |
237 | **(二)节点类型**
238 |
239 | - 永久节点:不会因为会话结束或者超时而消失;
240 | - 临时节点:如果会话结束或者超时就会消失;
241 | - 有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,依次类推。
242 |
243 | **(三)监听器**
244 |
245 | 为一个节点注册监听器,在节点状态发生改变时,会给客户端发送消息。
246 |
247 | **(四)分布式锁实现**
248 |
249 | 1. 创建一个锁目录 /lock。
250 | 1. 在 /lock 下创建临时的且有序的子节点,第一个客户端对应的子节点为 /lock/lock-0000000000,第二个为 /lock/lock-0000000001,以此类推。
251 | 2. 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则监听自己的前一个子节点,获得子节点的变更通知后重复此步骤直至获得锁;
252 | 3. 执行业务代码,完成后,删除对应的子节点。
253 |
254 | **(五)会话超时**
255 |
256 | 如果一个已经获得锁的会话超时了,因为创建的是临时节点,因此该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库分布式锁的死锁问题。
257 |
258 | **(六)羊群效应**
259 |
260 | 在步骤二,一个节点未获得锁,需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。
261 |
262 | # 五、分布式 Session
263 |
264 | 在分布式场景下,一个用户的 Session 如果只存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上,该服务器没有用户的 Session,就可能导致用户需要重新进行登录等操作。
265 |
266 |
267 |
268 | ## 1. Sticky Sessions
269 |
270 | 需要配置负载均衡器,使得一个用户的所有请求都路由到一个服务器节点上,这样就可以把用户的 Session 存放在该服务器节点中。
271 |
272 | 缺点:当服务器节点宕机时,将丢失该服务器节点上的所有 Session。
273 |
274 |
275 |
276 | ## 2. Session Replication
277 |
278 | 在服务器节点之间进行 Session 同步操作,这样的话用户可以访问任何一个服务器节点。
279 |
280 | 缺点:需要更好的服务器硬件条件;需要对服务器进行配置。
281 |
282 |
283 |
284 | ## 3. Persistent DataStore
285 |
286 | 将 Session 信息持久化到一个数据库中。
287 |
288 | 缺点:有可能需要去实现存取 Session 的代码。
289 |
290 |
291 |
292 | ## 4. In-Memory DataStore
293 |
294 | 可以使用 Redis 和 Memcached 这种内存型数据库对 Session 进行存储,可以大大提高 Session 的读写效率。内存型数据库同样可以持久化数据到磁盘中来保证数据的安全性。
295 |
296 | # 六、分库与分表带来的分布式困境与应对之策
297 |
298 |
299 |
300 | ## 事务问题
301 |
302 | 使用分布式事务。
303 |
304 | ## 查询问题
305 |
306 | 使用汇总表。
307 |
308 | ## ID 唯一性
309 |
310 | - 使用全局唯一 ID:GUID。
311 | - 为每个分片指定一个 ID 范围。
312 | - 分布式 ID 生成器 (如 Twitter 的 [Snowflake](https://twitter.github.io/twitter-server/) 算法)。
313 |
314 | # 参考资料
315 |
316 | - [Comparing Load Balancing Algorithms](http://www.jscape.com/blog/load-balancing-algorithms)
317 | - [负载均衡算法及手段](https://segmentfault.com/a/1190000004492447)
318 | - [Redirection and Load Balancing](http://slideplayer.com/slide/6599069/#)
319 | - [Session Management using Spring Session with JDBC DataStore](https://sivalabs.in/2018/02/session-management-using-spring-session-jdbc-datastore/)
320 | - [Apache Wicket User Guide - Reference Documentation](https://ci.apache.org/projects/wicket/guide/6.x/)
321 | - [集群/分布式环境下 5 种 Session 处理策略](http://blog.csdn.net/u010028869/article/details/50773174?ref=myread)
322 | - [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023)
323 | - [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be)
324 | - [分布式系统的事务处理](https://coolshell.cn/articles/10910.html)
325 | - [关于分布式事务](http://blog.csdn.net/suifeng3051/article/details/52691210)
326 | - [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html)
327 | - [How Sharding Works](https://medium.com/@jeeyoungk/how-sharding-works-b4dec46b3f6)
328 | - [服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策](http://blog.720ui.com/2017/mysql_core_09_multi_db_table2/ "服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策")
329 | - [How to create unique row ID in sharded databases?](https://stackoverflow.com/questions/788829/how-to-create-unique-row-id-in-sharded-databases)
330 |
--------------------------------------------------------------------------------
/notes/正则表达式.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、概述](#一概述)
3 | * [二、匹配单个字符](#二匹配单个字符)
4 | * [三、匹配一组字符](#三匹配一组字符)
5 | * [四、使用元字符](#四使用元字符)
6 | * [五、重复匹配](#五重复匹配)
7 | * [六、位置匹配](#六位置匹配)
8 | * [七、使用子表达式](#七使用子表达式)
9 | * [八、回溯引用](#八回溯引用)
10 | * [九、前后查找](#九前后查找)
11 | * [十、嵌入条件](#十嵌入条件)
12 | * [参考资料](#参考资料)
13 |
14 |
15 |
16 | # 一、概述
17 |
18 | 正则表达式用于文本内容的查找和替换。
19 |
20 | 正则表达式内置于其它语言或者软件产品中,它本身不是一种语言或者软件。
21 |
22 | [正则表达式在线工具](https://regexr.com/)
23 |
24 | # 二、匹配单个字符
25 |
26 | 正则表达式一般是区分大小写的,但是也有些实现是不区分。
27 |
28 | **.** 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符;
29 |
30 | **\\** 是元字符,表示它有特殊的含义,而不是字符本身的含义。如果需要匹配 . ,那么要用 \ 进行转义,即在 . 前面加上 \ 。
31 |
32 | **正则表达式**
33 |
34 | ```
35 | nam.
36 | ```
37 |
38 | **匹配结果**
39 |
40 | My **name** is Zheng.
41 |
42 | # 三、匹配一组字符
43 |
44 | **[ ]** 定义一个字符集合;
45 |
46 | 0-9、a-z 定义了一个字符区间,区间使用 ASCII 码来确定,字符区间只能用在 [ ] 之间。
47 |
48 | **-** 元字符只有在 [ ] 之间才是元字符,在 [ ] 之外就是一个普通字符;
49 |
50 | **^** 是取非操作,必须在 [ ] 字符集合中使用;
51 |
52 | **应用**
53 |
54 | 匹配以 abc 为开头,并且最后一个字母不为数字的字符串:
55 |
56 | **正则表达式**
57 |
58 | ```
59 | abc[^0-9]
60 | ```
61 |
62 | **匹配结果**
63 |
64 | 1. **abcd**
65 | 2. abc1
66 | 3. abc2
67 |
68 | # 四、使用元字符
69 |
70 | ## 匹配空白字符
71 |
72 | | 元字符 | 说明 |
73 | | :---: | :---: |
74 | | [\b] | 回退(删除)一个字符 |
75 | | \f | 换页符 |
76 | | \n | 换行符 |
77 | | \r | 回车符 |
78 | | \t | 制表符 |
79 | | \v | 垂直制表符 |
80 |
81 | \r\n 是 Windows 中的文本行结束标签,在 Unix/Linux 则是 \n ;\r\n\r\n 可以匹配 Windows 下的空白行,因为它将匹配两个连续的行尾标签,而这正是两条记录之间的空白行;
82 |
83 | . 是元字符,前提是没有对它们进行转义;f 和 n 也是元字符,但是前提是对它们进行了转义。
84 |
85 | ## 匹配特定的字符类别
86 |
87 | ### 1. 数字元字符
88 |
89 | | 元字符 | 说明 |
90 | | :---: | :---: |
91 | | \d | 数字字符,等价于 [0-9] |
92 | | \D | 非数字字符,等价于 [^0-9] |
93 |
94 | ### 2. 字母数字元字符
95 |
96 | | 元字符 | 说明 |
97 | | :---: | :---: |
98 | | \w | 大小写字母,下划线和数字,等价于 [a-zA-Z0-9\_] |
99 | | \W | 对 \w 取非 |
100 |
101 | ### 3. 空白字符元字符
102 |
103 | | 元字符 | 说明 |
104 | | :---: | :---: |
105 | | \s | 任何一个空白字符,等价于 [\f\n\r\t\v] |
106 | | \S | 对 \s 取非 |
107 |
108 | \x 匹配十六进制字符,\0 匹配八进制,例如 \x0A 对应 ASCII 字符 10 ,等价于 \n,也就是它会匹配 \n 。
109 |
110 | # 五、重复匹配
111 |
112 | **\+** 匹配 1 个或者多个字符, **\*** 匹配 0 个或者多个,**?** 匹配 0 个或者 1 个。
113 |
114 | **应用**
115 |
116 | 匹配邮箱地址。
117 |
118 | **正则表达式**
119 |
120 | ```
121 | [\w.]+@\w+\.\w+
122 | ```
123 |
124 | [\w.] 匹配的是字母数字或者 . ,在其后面加上 + ,表示匹配多次。在字符集合 [ ] 里,. 不是元字符;
125 |
126 | **匹配结果**
127 |
128 | **abc.def@qq.com**
129 |
130 | 为了可读性,常常把转义的字符放到字符集合 [ ] 中,但是含义是相同的。
131 |
132 | ```
133 | [\w.]+@\w+\.\w+
134 | [\w.]+@[\w]+\.[\w]+
135 | ```
136 |
137 | **{n}** 匹配 n 个字符,**{m, n}** 匹配 m\~n 个字符,**{m,}** 至少匹配 m 个字符;
138 |
139 | \* 和 + 都是贪婪型元字符,会匹配最多的内容,在元字符后面加 ? 可以转换为懒惰型元字符,例如 \*?、+? 和 {m, n}? 。
140 |
141 | **正则表达式**
142 |
143 | ```
144 | a.+c
145 | ```
146 |
147 | 由于 + 是贪婪型的,因此 .+ 会匹配更可能多的内容,所以会把整个 abcabcabc 文本都匹配,而不是只匹配前面的 abc 文本。用懒惰型可以实现匹配前面的。
148 |
149 | **匹配结果**
150 |
151 | **abcabcabc**
152 |
153 | # 六、位置匹配
154 |
155 | ## 单词边界
156 |
157 | **\b** 可以匹配一个单词的边界,边界是指位于 \w 和 \W 之间的位置;**\B** 匹配一个不是单词边界的位置。
158 |
159 | \b 只匹配位置,不匹配字符,因此 \babc\b 匹配出来的结果为 3 个字符。
160 |
161 | ## 字符串边界
162 |
163 | **^** 匹配整个字符串的开头,**$** 匹配结尾。
164 |
165 | ^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。
166 |
167 | 分行匹配模式(multiline)下,换行被当做字符串的边界。
168 |
169 | **应用**
170 |
171 | 匹配代码中以 // 开始的注释行
172 |
173 | **正则表达式**
174 |
175 | ```
176 | ^\s*\/\/.*$
177 | ```
178 |
179 |
180 |
181 | **匹配结果**
182 |
183 | 1. public void fun() {
184 | 2. **// 注释 1**
185 | 3. int a = 1;
186 | 4. int b = 2;
187 | 5. **// 注释 2**
188 | 6. int c = a + b;
189 | 7. }
190 |
191 | # 七、使用子表达式
192 |
193 | 使用 **( )** 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。
194 |
195 | 子表达式可以嵌套,但是嵌套层次过深会变得很难理解。
196 |
197 | **正则表达式**
198 |
199 | ```
200 | (ab){2,}
201 | ```
202 |
203 | **匹配结果**
204 |
205 | **ababab**
206 |
207 | **|** 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。
208 |
209 | **正则表达式**
210 |
211 | ```
212 | (19|20)\d{2}
213 | ```
214 |
215 | **匹配结果**
216 |
217 | 1. **1900**
218 | 2. **2010**
219 | 3. 1020
220 |
221 | **应用**
222 |
223 | 匹配 IP 地址。IP 地址中每部分都是 0-255 的数字,用正则表达式匹配时以下情况是合法的:
224 |
225 | 1. 一位数字
226 | 2. 不以 0 开头的两位数字
227 | 3. 1 开头的三位数
228 | 4. 2 开头,第 2 位是 0-4 的三位数
229 | 5. 25 开头,第 3 位是 0-5 的三位数
230 |
231 | **正则表达式**
232 |
233 | ```
234 | ((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))
235 | ```
236 |
237 | **匹配结果**
238 |
239 | 1. **192.168.0.1**
240 | 2. 00.00.00.00
241 | 3. 555.555.555.555
242 |
243 | # 八、回溯引用
244 |
245 | 回溯引用使用 **\n** 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。
246 |
247 | **应用**
248 |
249 | 匹配 HTML 中合法的标题元素。
250 |
251 | **正则表达式**
252 |
253 | \1 将回溯引用子表达式 (h[1-6]) 匹配的内容,也就是说必须和子表达式匹配的内容一致。
254 |
255 | ```
256 | <(h[1-6])>\w*?<\/\1>
257 | ```
258 |
259 | **匹配结果**
260 |
261 | 1. **<h1>x</h1>**
262 | 2. **<h2>x</h2>**
263 | 3. <h3>x</h1>
264 |
265 | ## 替换
266 |
267 | 需要用到两个正则表达式。
268 |
269 | **应用**
270 |
271 | 修改电话号码格式。
272 |
273 | **文本**
274 |
275 | 313-555-1234
276 |
277 | **查找正则表达式**
278 |
279 | ```
280 | (\d{3})(-)(\d{3})(-)(\d{4})
281 | ```
282 |
283 | **替换正则表达式**
284 |
285 | 在第一个子表达式查找的结果加上 () ,然后加一个空格,在第三个和第五个字表达式查找的结果中间加上 - 进行分隔。
286 |
287 | ```
288 | ($1) $3-$5
289 | ```
290 |
291 | **结果**
292 |
293 | (313) 555-1234
294 |
295 | ## 大小写转换
296 |
297 | | 元字符 | 说明 |
298 | | :---: | :---: |
299 | | \l | 把下个字符转换为小写 |
300 | | \u| 把下个字符转换为大写 |
301 | | \L | 把\L 和\E 之间的字符全部转换为小写 |
302 | | \U | 把\U 和\E 之间的字符全部转换为大写 |
303 | | \E | 结束\L 或者\U |
304 |
305 | **应用**
306 |
307 | 把文本的第二个和第三个字符转换为大写。
308 |
309 | **文本**
310 |
311 | abcd
312 |
313 | **查找**
314 |
315 | ```
316 | (\w)(\w{2})(\w)
317 | ```
318 |
319 | **替换**
320 |
321 | ```
322 | $1\U$2\E$3
323 | ```
324 |
325 | **结果**
326 |
327 | aBCd
328 |
329 | # 九、前后查找
330 |
331 | 前后查找规定了匹配的内容首尾应该匹配的内容,但是又不包含首尾匹配的内容。向前查找用 **?=** 来定义,它规定了尾部匹配的内容,这个匹配的内容在 ?= 之后定义。所谓向前查找,就是规定了一个匹配的内容,然后以这个内容为尾部向前面查找需要匹配的内容。向后匹配用 ?<= 定义(注: javaScript 不支持向后匹配, java 对其支持也不完善)。
332 |
333 | **应用**
334 |
335 | 查找出邮件地址 @ 字符前面的部分。
336 |
337 | **正则表达式**
338 |
339 | ```
340 | \w+(?=@)
341 | ```
342 |
343 | **结果**
344 |
345 | **abc** @qq.com
346 |
347 | 对向前和向后查找取非,只要把 = 替换成 ! 即可,比如 (?=) 替换成 (?!) 。取非操作使得匹配那些首尾不符合要求的内容。
348 |
349 | # 十、嵌入条件
350 |
351 | ## 回溯引用条件
352 |
353 | 条件判断为某个子表达式是否匹配,如果匹配则需要继续匹配条件表达式后面的内容。
354 |
355 | **正则表达式**
356 |
357 | 子表达式 (\\() 匹配一个左括号,其后的 ? 表示匹配 0 个或者 1 个。 ?(1) 为条件,当子表达式 1 匹配时条件成立,需要执行 \) 匹配,也就是匹配右括号。
358 |
359 | ```
360 | (\()?abc(?(1)\))
361 | ```
362 |
363 | **结果**
364 |
365 | 1. **(abc)**
366 | 2. **abc**
367 | 3. (abc
368 |
369 | ## 前后查找条件
370 |
371 | 条件为定义的首尾是否匹配,如果匹配,则继续执行后面的匹配。注意,首尾不包含在匹配的内容中。
372 |
373 | **正则表达式**
374 |
375 | ?(?=-) 为前向查找条件,只有在以 - 为前向查找的结尾能匹配 \d{5} ,才继续匹配 -\d{4} 。
376 |
377 | ```
378 | \d{5}(?(?=-)-\d{4})
379 | ```
380 |
381 | **结果**
382 |
383 | 1. **11111**
384 | 2. 22222-
385 | 3. **33333-4444**
386 |
387 | # 参考资料
388 |
389 | - BenForta. 正则表达式必知必会 [M]. 人民邮电出版社, 2007.
390 |
--------------------------------------------------------------------------------
/notes/设计模式.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、概述](#一概述)
3 | * [二、单例模式](#二单例模式)
4 | * [三、简单工厂](#三简单工厂)
5 | * [四、工厂方法模式](#四工厂方法模式)
6 | * [五、抽象工厂模式](#五抽象工厂模式)
7 | * [参考资料](#参考资料)
8 |
9 |
10 |
11 | # 一、概述
12 |
13 | 设计模式不是代码,而是解决问题的方案,学习现有的设计模式可以做到经验复用。
14 |
15 | 拥有设计模式词汇,在沟通时就能用更少的词汇来讨论,并且不需要了解底层细节。
16 |
17 | # 二、单例模式
18 |
19 | ## 意图
20 |
21 | 确保一个类只有一个实例,并提供了一个全局访问点。
22 |
23 | ## 类图
24 |
25 | 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
26 |
27 | 私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
28 |
29 |
30 |
31 | ## 使用场景
32 |
33 | - Logger Classes
34 | - Configuration Classes
35 | - Accesing resources in shared mode
36 | - Factories implemented as Singletons
37 |
38 | ## JDK 的使用
39 |
40 | - [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29)
41 | - [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--)
42 | - [java.lang.System#getSecurityManager()](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--)
43 |
44 | ## 实现
45 |
46 | ### 懒汉式-线程不安全
47 |
48 | 以下实现中,私有静态变量 uniqueInstance 被延迟化实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
49 |
50 | 这个实现在多线程环境下是不安全的,如果多个线程能够同时进入 if(uniqueInstance == null) ,那么就会多次实例化 uniqueInstance。
51 |
52 | ```java
53 | public class Singleton {
54 |
55 | private static Singleton uniqueInstance;
56 |
57 | private Singleton() {
58 | }
59 |
60 | public static Singleton getUniqueInstance() {
61 | if (uniqueInstance == null) {
62 | uniqueInstance = new Singleton();
63 | }
64 | return uniqueInstance;
65 | }
66 | }
67 | ```
68 |
69 | ### 懒汉式-线程安全
70 |
71 | 只需要对 getUniqueInstance() 方法加锁,那么在一个时间点只能有一个线程能够进入该方法,从而避免了对 uniqueInstance 进行多次实例化的问题。
72 |
73 | 但是这样有一个问题,就是当一个线程进入该方法之后,其它线程试图进入该方法都必须等待,因此性能上有一定的损耗。
74 |
75 | ```java
76 | public static synchronized Singleton getUniqueInstance() {
77 | if (uniqueInstance == null) {
78 | uniqueInstance = new Singleton();
79 | }
80 | return uniqueInstance;
81 | }
82 | ```
83 |
84 | ### 饿汉式-线程安全
85 |
86 | 线程不安全问题主要是由于 uniqueInstance 被实例化了多次,如果 uniqueInstance 采用直接实例化的话,就不会被实例化多次,也就不会产生线程不安全问题。但是直接实例化的方式也丢失了延迟实例化带来的节约资源的优势。
87 |
88 | ```java
89 | private static Singleton uniqueInstance = new Singleton();
90 | ```
91 |
92 | ### 双重校验锁-线程安全
93 |
94 | uniqueInstance 只需要被实例化一次,之后就可以直接使用了。加锁操作只需要对实例化那部分的代码进行。也就是说,只有当 uniqueInstance 没有被实例化时,才需要进行加锁。
95 |
96 | 双重校验锁先判断 uniqueInstance 是否已经被初始化了,如果没有被实例化,那么才对实例化语句进行加锁。
97 |
98 | ```java
99 | public class Singleton {
100 |
101 | private volatile static Singleton uniqueInstance;
102 |
103 | private Singleton() {
104 | }
105 |
106 | public static Singleton getUniqueInstance() {
107 | if (uniqueInstance == null) {
108 | synchronized (Singleton.class) {
109 | if (uniqueInstance == null) {
110 | uniqueInstance = new Singleton();
111 | }
112 | }
113 | }
114 | return uniqueInstance;
115 | }
116 | }
117 | ```
118 |
119 | 考虑下面的实现,也就是只使用了一个 if 语句。在 uniqueInstance == null 的情况下,如果两个线程同时执行 if 语句,那么两个线程就会同时进入 if 语句块内。虽然在 if 语句块内有加锁操作,但是两个线程都会执行 uniqueInstance = new Singleton(); 这条语句,只是早晚的问题,也就是说会进行两次实例化,从而产生了两个实例。因此必须使用双重校验锁,也就是需要使用两个 if 判断。
120 |
121 | ```java
122 | if (uniqueInstance == null) {
123 | synchronized (Singleton.class) {
124 | uniqueInstance = new Singleton();
125 | }
126 | }
127 | ```
128 |
129 | uniqueInstance 采用 volatile 关键字修饰也是很有必要的。
130 |
131 | uniqueInstance = new Singleton(); 这段代码其实是分为三步执行。
132 |
133 | 1. 分配内存空间。
134 | 2. 初始化对象。
135 | 3. 将 uniqueInstance 指向分配的内存地址。
136 |
137 | 但是由于 JVM 具有指令重排的特性,有可能执行顺序变为了 1>3>2,这在单线程情况下自然是没有问题。但如果是多线程就有可能 B 线程获得是一个还没有被初始化的对象以致于程序出错。
138 |
139 | 所以使用 volatile 修饰的目的是禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。
140 |
141 | # 三、简单工厂
142 |
143 | ## 意图
144 |
145 | 在创建一个对象时不向客户暴露内部细节;
146 |
147 | ## 类图
148 |
149 | 简单工厂不是设计模式,更像是一种编程习惯。它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个子类来实例化。
150 |
151 |
152 |
153 | 这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。因为客户类往往有多个,如果不使用简单工厂,所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。
154 |
155 | 如果存在下面这种代码,就需要使用简单工厂将对象实例化的部分放到简单工厂中。
156 |
157 | ```java
158 | public class Client {
159 | public static void main(String[] args) {
160 | int type = 1;
161 | Product product;
162 | if (type == 1) {
163 | product = new ConcreteProduct1();
164 | } else if (type == 2) {
165 | product = new ConcreteProduct2();
166 | } else {
167 | product = new ConcreteProduct();
168 | }
169 | }
170 | }
171 | ```
172 |
173 | ## 实现
174 |
175 | ```java
176 | public interface Product {
177 | }
178 | ```
179 |
180 | ```java
181 | public class ConcreteProduct implements Product {
182 | }
183 | ```
184 |
185 | ```java
186 | public class ConcreteProduct1 implements Product {
187 | }
188 | ```
189 |
190 | ```java
191 | public class ConcreteProduct2 implements Product {
192 | }
193 | ```
194 |
195 | ```java
196 | public class SimpleFactory {
197 | public Product createProduct(int type) {
198 | if (type == 1) {
199 | return new ConcreteProduct1();
200 | } else if (type == 2) {
201 | return new ConcreteProduct2();
202 | }
203 | return new ConcreteProduct();
204 | }
205 | }
206 | ```
207 |
208 | ```java
209 | public class Client {
210 | public static void main(String[] args) {
211 | SimpleFactory simpleFactory = new SimpleFactory();
212 | Product product = simpleFactory.createProduct(1);
213 | }
214 | }
215 | ```
216 |
217 | # 四、工厂方法模式
218 |
219 | ## 意图
220 |
221 | 定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化推迟到子类。
222 |
223 | ## 类图
224 |
225 | 在简单工厂中,创建对象的是另一个类,而在工厂方法中,是由子类来创建对象。
226 |
227 | 下图中,Factory 有一个 doSomethind() 方法,这个方法需要用到一组产品对象,这组产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。
228 |
229 |
230 |
231 | ## 实现
232 |
233 | ```java
234 | public abstract class Factory {
235 | abstract public Product factoryMethod();
236 | public void doSomething() {
237 | Product product = factoryMethod();
238 | // do something with the product
239 | }
240 | }
241 | ```
242 |
243 | ```java
244 | public class ConcreteFactory extends Factory {
245 | public Product factoryMethod() {
246 | return new ConcreteProduct();
247 | }
248 | }
249 | ```
250 |
251 | ```java
252 | public class ConcreteFactory1 extends Factory {
253 | public Product factoryMethod() {
254 | return new ConcreteProduct1();
255 | }
256 | }
257 | ```
258 |
259 | ```java
260 | public class ConcreteFactory2 extends Factory {
261 | public Product factoryMethod() {
262 | return new ConcreteProduct2();
263 | }
264 | }
265 | ```
266 |
267 | # 五、抽象工厂模式
268 |
269 | ## 意图
270 |
271 | 提供一个接口,用于创建 **相关的对象家族** 。
272 |
273 | ## 类图
274 |
275 |
276 |
277 | 抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂模式只是用于创建一个对象,这和抽象工厂模式有很大不同。
278 |
279 | 抽象工厂模式用到了工厂模式来创建单一对象,AbstractFactory 中的 createProductA 和 createProductB 方法都是让子类来实现,这两个方法单独来看就是在创建一个对象,这符合工厂模式的定义。
280 |
281 | 至于创建对象的家族这一概念是在 Client 体现,Client 要通过 AbstractFactory 同时调用两个方法来创建出两个对象,在这里这两个对象就有很大的相关性,Client 需要同时创建出这两个对象。
282 |
283 | 从高层次来看,抽象工厂使用了组合,即 Cilent 组合了 AbstractFactory,而工厂模式使用了继承。
284 |
285 | ## 代码实现
286 |
287 | ```java
288 | public class AbstractProductA {
289 | }
290 | ```
291 |
292 | ```java
293 | public class AbstractProductB {
294 | }
295 | ```
296 |
297 | ```java
298 | public class ProductA1 extends AbstractProductA {
299 | }
300 | ```
301 |
302 | ```java
303 | public class ProductA2 extends AbstractProductA {
304 | }
305 | ```
306 |
307 | ```java
308 | public class ProductB1 extends AbstractProductB {
309 | }
310 | ```
311 |
312 | ```java
313 | public class ProductB2 extends AbstractProductB {
314 | }
315 | ```
316 |
317 | ```java
318 | public abstract class AbstractFactory {
319 | abstract AbstractProductA createProductA();
320 | abstract AbstractProductB createProductB();
321 | }
322 | ```
323 |
324 | ```java
325 | public class ConcreteFactory1 extends AbstractFactory {
326 | AbstractProductA createProductA() {
327 | return new ProductA1();
328 | }
329 |
330 | AbstractProductB createProductB() {
331 | return new ProductB1();
332 | }
333 | }
334 | ```
335 |
336 | ```java
337 | public class ConcreteFactory2 extends AbstractFactory {
338 | AbstractProductA createProductA() {
339 | return new ProductA2();
340 | }
341 |
342 | AbstractProductB createProductB() {
343 | return new ProductB2();
344 | }
345 | }
346 | ```
347 |
348 | ```java
349 | public class Client {
350 | public static void main(String[] args) {
351 | AbstractFactory abstractFactory = new ConcreteFactory1();
352 | AbstractProductA productA = abstractFactory.createProductA();
353 | abstractFactory = new ConcreteFactory2();
354 | productA = abstractFactory.createProductA();
355 | }
356 | }
357 | ```
358 |
359 | # 参考资料
360 |
361 | - 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007.
362 | - [Design Patterns](http://www.oodesign.com/)
363 | - [Design patterns implemented in Java](http://java-design-patterns.com/)
364 |
--------------------------------------------------------------------------------
/notes/面向对象思想.md:
--------------------------------------------------------------------------------
1 |
2 | * [一、设计原则](#一设计原则)
3 | * [S.O.L.I.D](#solid)
4 | * [其他常见原则](#其他常见原则)
5 | * [二、三大特性](#二三大特性)
6 | * [封装](#封装)
7 | * [继承](#继承)
8 | * [多态](#多态)
9 | * [三、类图](#三类图)
10 | * [泛化关系 (Generalization)](#泛化关系-generalization)
11 | * [实现关系 (Realization)](#实现关系-realization)
12 | * [聚合关系 (Aggregation)](#聚合关系-aggregation)
13 | * [组合关系 (Composition)](#组合关系-composition)
14 | * [关联关系 (Association)](#关联关系-association)
15 | * [依赖关系 (Dependency)](#依赖关系-dependency)
16 | * [参考资料](#参考资料)
17 |
18 |
19 |
20 | # 一、设计原则
21 |
22 | ## S.O.L.I.D
23 |
24 | | 简写 | 全拼 | 中文翻译 |
25 | | :--: | :--: | :--: |
26 | | SRP | The Single Responsibility Principle | 单一责任原则 |
27 | | OCP | The Open Closed Principle | 开放封闭原则 |
28 | | LSP | The Liskov Substitution Principle | 里氏替换原则 |
29 | | ISP | The Interface Segregation Principle | 接口分离原则 |
30 | | DIP | The Dependency Inversion Principle | 依赖倒置原则 |
31 |
32 | ### 1. 单一责任原则
33 |
34 | > 修改一个类的原因应该只有一个。
35 |
36 | 换句话说就是让一个类只负责一件事,当这个类需要做过多事情的时候,就需要分解这个类。
37 |
38 | 如果一个类承担的职责过多,就等于把这些职责耦合在了一起,一个职责的变化可能会削弱这个类完成其它职责的能力。
39 |
40 | ### 2. 开放封闭原则
41 |
42 | > 类应该对扩展开放,对修改关闭。
43 |
44 | 扩展就是添加新功能的意思,因此该原则要求在添加新功能时不需要修改代码。
45 |
46 | 符合开闭原则最典型的设计模式是装饰者模式,它可以动态地将责任附加到对象上,而不用去修改类的代码。
47 |
48 | ### 3. 里氏替换原则
49 |
50 | > 子类对象必须能够替换掉所有父类对象。
51 |
52 | 继承是一种 IS-A 关系,子类需要能够当成父类来使用,并且需要比父类更特殊。
53 |
54 | 如果不满足这个原则,那么各个子类的行为上就会有很大差异,增加继承体系的复杂度。
55 |
56 | ### 4. 接口分离原则
57 |
58 | > 不应该强迫客户依赖于它们不用的方法。
59 |
60 | 因此使用多个专门的接口比使用单一的总接口要好。
61 |
62 | ### 5. 依赖倒置原则
63 |
64 | > 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
65 |
66 | 高层模块包含一个应用程序中重要的策略选择和业务模块,如果高层模块依赖于低层模块,那么低层模块的改动就会直接影响到高层模块,从而迫使高层模块也需要改动。
67 |
68 | 依赖于抽象意味着:
69 |
70 | - 任何变量都不应该持有一个指向具体类的指针或者引用;
71 | - 任何类都不应该从具体类派生;
72 | - 任何方法都不应该覆写它的任何基类中的已经实现的方法。
73 |
74 | ## 其他常见原则
75 |
76 | 除了上述的经典原则,在实际开发中还有下面这些常见的设计原则。
77 |
78 | | 简写 | 全拼 | 中文翻译 |
79 | | :--: | :--: | :--: |
80 | |LOD| The Law of Demeter | 迪米特法则 |
81 | |CRP| The Composite Reuse Principle | 合成复用原则 |
82 | |CCP| The Common Closure Principle | 共同封闭原则 |
83 | |SAP| The Stable Abstractions Principle | 稳定抽象原则 |
84 | |SDP| The Stable Dependencies Principle | 稳定依赖原则 |
85 |
86 | ### 1. 迪米特法则
87 |
88 | 迪米特法则又叫作最少知识原则(Least Knowledge Principle,简写 LKP),就是说一个对象应当对其他对象有尽可能少的了解,不和陌生人说话。
89 |
90 | ### 2. 合成复用原则
91 |
92 | 尽量使用对象组合,而不是继承来达到复用的目的。
93 |
94 | ### 3. 共同封闭原则
95 |
96 | 一起修改的类,应该组合在一起(同一个包里)。如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。
97 |
98 | ### 4. 稳定抽象原则
99 |
100 | 最稳定的包应该是最抽象的包,不稳定的包应该是具体的包,即包的抽象程度跟它的稳定性成正比。
101 |
102 | ### 5. 稳定依赖原则
103 |
104 | 包之间的依赖关系都应该是稳定方向依赖的,包要依赖的包要比自己更具有稳定性。
105 |
106 | # 二、三大特性
107 |
108 | ## 封装
109 |
110 | 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
111 |
112 | 优点:
113 |
114 | - 减少耦合:可以独立地开发、测试、优化、使用、理解和修改
115 | - 减轻维护的负担:可以更容易被程序员理解,并且在调试的时候可以不影响其他模块
116 | - 有效地调节性能:可以通过剖析确定哪些模块影响了系统的性能
117 | - 提高软件的可重用性
118 | - 降低了构建大型系统的风险:即使整个系统不可用,但是这些独立的模块却有可能是可用的
119 |
120 | 以下 Person 类封装 name、gender、age 等属性,外界只能通过 get() 方法获取一个 Person 对象的 name 属性和 gender 属性,而无法获取 age 属性,但是 age 属性可以供 work() 方法使用。
121 |
122 | 注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。
123 |
124 | ```java
125 | public class Person {
126 | private String name;
127 | private int gender;
128 | private int age;
129 |
130 | public String getName() {
131 | return name;
132 | }
133 |
134 | public String getGender() {
135 | return gender == 0 ? "man" : "woman";
136 | }
137 |
138 | public void work() {
139 | if(18 <= age && age <= 50) {
140 | System.out.println(name + " is working very hard!");
141 | } else {
142 | System.out.println(name + " can't work any more!");
143 | }
144 | }
145 | }
146 | ```
147 |
148 | ## 继承
149 |
150 | 继承实现了 **IS-A** 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。
151 |
152 | Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 **向上转型** 。
153 |
154 | ```java
155 | Animal animal = new Cat();
156 | ```
157 |
158 | 继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。
159 |
160 | ## 多态
161 |
162 | 多态分为编译时多态和运行时多态。编译时多态主要指方法的重载,运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定。
163 |
164 | 运行时多态有三个条件:
165 |
166 | 1. 继承
167 | 2. 覆盖
168 | 3. 向上转型
169 |
170 | 下面的代码中,乐器类(Instrument)有两个子类:Wind 和 Percussion,它们都覆盖了父类的 play() 方法,并且在 main() 方法中使用父类 Instrument 来引用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而不是 Instrument 类的方法。
171 |
172 | ```java
173 | public class Instrument {
174 | public void play() {
175 | System.out.println("Instument is playing...");
176 | }
177 | }
178 |
179 | public class Wind extends Instrument {
180 | public void play() {
181 | System.out.println("Wind is playing...");
182 | }
183 | }
184 |
185 | public class Percussion extends Instrument {
186 | public void play() {
187 | System.out.println("Percussion is playing...");
188 | }
189 | }
190 |
191 | public class Music {
192 | public static void main(String[] args) {
193 | List instruments = new ArrayList<>();
194 | instruments.add(new Wind());
195 | instruments.add(new Percussion());
196 | for(Instrument instrument : instruments) {
197 | instrument.play();
198 | }
199 | }
200 | }
201 | ```
202 |
203 | # 三、类图
204 |
205 | ## 泛化关系 (Generalization)
206 |
207 | 用来描述继承关系,在 Java 中使用 extends 关键字。
208 |
209 |
210 |
211 | ## 实现关系 (Realization)
212 |
213 | 用来实现一个接口,在 Java 中使用 implement 关键字。
214 |
215 |
216 |
217 | ## 聚合关系 (Aggregation)
218 |
219 | 表示整体由部分组成,但是整体和部分不是强依赖的,整体不存在了部分还是会存在。
220 |
221 |
222 |
223 | ## 组合关系 (Composition)
224 |
225 | 和聚合不同,组合中整体和部分是强依赖的,整体不存在了部分也不存在了。比如公司和部门,公司没了部门就不存在了。但是公司和员工就属于聚合关系了,因为公司没了员工还在。
226 |
227 |
228 |
229 | ## 关联关系 (Association)
230 |
231 | 表示不同类对象之间有关联,这是一种静态关系,与运行过程的状态无关,在最开始就可以确定。因此也可以用 1 对 1、多对 1、多对多这种关联关系来表示。比如学生和学校就是一种关联关系,一个学校可以有很多学生,但是一个学生只属于一个学校,因此这是一种多对一的关系,在运行开始之前就可以确定。
232 |
233 |
234 |
235 | ## 依赖关系 (Dependency)
236 |
237 | 和关联关系不同的是,依赖关系是在运行过程中起作用的。A 类和 B 类是依赖关系主要有三种形式:
238 |
239 | 1. A 类是 B 类中的(某中方法的)局部变量;
240 | 2. A 类是 B 类方法当中的一个参数;
241 | 3. A 类向 B 类发送消息,从而影响 B 类发生变化;
242 |
243 |
244 |
245 | # 参考资料
246 |
247 | - Java 编程思想
248 | - 敏捷软件开发:原则、模式与实践
249 | - [面向对象设计的 SOLID 原则](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html)
250 | - [看懂 UML 类图和时序图](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization)
251 | - [UML 系列——时序图(顺序图)sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html)
252 | - [面向对象编程三大特性 ------ 封装、继承、多态](http://blog.csdn.net/jianyuerensheng/article/details/51602015)
253 |
--------------------------------------------------------------------------------
/pics/02986f62-c641-44a8-a55f-983581490e0c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/02986f62-c641-44a8-a55f-983581490e0c.png
--------------------------------------------------------------------------------
/pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/037c3a0b-332d-434d-a374-f343ef72c8e1.jpg
--------------------------------------------------------------------------------
/pics/042cf928-3c8e-4815-ae9c-f2780202c68f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/042cf928-3c8e-4815-ae9c-f2780202c68f.png
--------------------------------------------------------------------------------
/pics/05907ab4-42c5-4b5e-9388-6617f6c97bea.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/05907ab4-42c5-4b5e-9388-6617f6c97bea.jpg
--------------------------------------------------------------------------------
/pics/061c29ce-e2ed-425a-911e-56fbba1efce3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/061c29ce-e2ed-425a-911e-56fbba1efce3.jpg
--------------------------------------------------------------------------------
/pics/0635cbe8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0635cbe8.png
--------------------------------------------------------------------------------
/pics/07717718-1230-4347-aa18-2041c315e670.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/07717718-1230-4347-aa18-2041c315e670.jpg
--------------------------------------------------------------------------------
/pics/07903a31-0fb3-45fc-86f5-26f0b28fa4e7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/07903a31-0fb3-45fc-86f5-26f0b28fa4e7.png
--------------------------------------------------------------------------------
/pics/08427d38-8df1-49a1-8990-e0ce5ee36ca2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/08427d38-8df1-49a1-8990-e0ce5ee36ca2.png
--------------------------------------------------------------------------------
/pics/08f32fd3-f736-4a67-81ca-295b2a7972f2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/08f32fd3-f736-4a67-81ca-295b2a7972f2.jpg
--------------------------------------------------------------------------------
/pics/09e6e8d4-4d83-4949-b908-6d6b4c2fd064.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/09e6e8d4-4d83-4949-b908-6d6b4c2fd064.png
--------------------------------------------------------------------------------
/pics/0a9f4125-b6ab-4e94-a807-fd7070ae726a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0a9f4125-b6ab-4e94-a807-fd7070ae726a.png
--------------------------------------------------------------------------------
/pics/0aaf4630-d2a2-4783-b3f7-a2b6a7dfc01b.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0aaf4630-d2a2-4783-b3f7-a2b6a7dfc01b.jpg
--------------------------------------------------------------------------------
/pics/0c55e11c-d3ce-4cd8-b139-028aea6f40e3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0c55e11c-d3ce-4cd8-b139-028aea6f40e3.png
--------------------------------------------------------------------------------
/pics/0e34263d-7287-4ffe-a716-37c53d1a2526.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0e34263d-7287-4ffe-a716-37c53d1a2526.png
--------------------------------------------------------------------------------
/pics/0ee0f61b-c782-441e-bf34-665650198ae0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0ee0f61b-c782-441e-bf34-665650198ae0.jpg
--------------------------------------------------------------------------------
/pics/0f373947-c68f-45b4-a59e-086154745ac5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/0f373947-c68f-45b4-a59e-086154745ac5.png
--------------------------------------------------------------------------------
/pics/10.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/10.gif
--------------------------------------------------------------------------------
/pics/107a6a2b-f15b-4cad-bced-b7fb95258c9c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/107a6a2b-f15b-4cad-bced-b7fb95258c9c.png
--------------------------------------------------------------------------------
/pics/10bdf7bf-0daa-4a26-b927-f142b3f8e72b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/10bdf7bf-0daa-4a26-b927-f142b3f8e72b.png
--------------------------------------------------------------------------------
/pics/10f5e35b-1c71-4717-9e80-47f259702642.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/10f5e35b-1c71-4717-9e80-47f259702642.jpg
--------------------------------------------------------------------------------
/pics/11.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/11.gif
--------------------------------------------------------------------------------
/pics/111521118015898.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521118015898.gif
--------------------------------------------------------------------------------
/pics/111521118445538.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521118445538.gif
--------------------------------------------------------------------------------
/pics/111521118483039.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521118483039.gif
--------------------------------------------------------------------------------
/pics/111521118640738.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521118640738.gif
--------------------------------------------------------------------------------
/pics/111521119203347.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521119203347.gif
--------------------------------------------------------------------------------
/pics/111521119368714.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/111521119368714.gif
--------------------------------------------------------------------------------
/pics/1164a71f-413d-494a-9cc8-679fb6a2613d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1164a71f-413d-494a-9cc8-679fb6a2613d.jpg
--------------------------------------------------------------------------------
/pics/1202b2d6-9469-4251-bd47-ca6034fb6116.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1202b2d6-9469-4251-bd47-ca6034fb6116.png
--------------------------------------------------------------------------------
/pics/123bdf81-1ef5-48a9-a08c-2db97057b4d2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/123bdf81-1ef5-48a9-a08c-2db97057b4d2.png
--------------------------------------------------------------------------------
/pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/14cfe8d4-e31b-49e0-ac6a-6f4f7aa06ab6.png
--------------------------------------------------------------------------------
/pics/1556770b-8c01-4681-af10-46f1df69202c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1556770b-8c01-4681-af10-46f1df69202c.jpg
--------------------------------------------------------------------------------
/pics/1582217a-ed46-4cac-811e-90d13a65163b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1582217a-ed46-4cac-811e-90d13a65163b.png
--------------------------------------------------------------------------------
/pics/15b45dc6-27aa-4519-9194-f4acfa2b077f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/15b45dc6-27aa-4519-9194-f4acfa2b077f.jpg
--------------------------------------------------------------------------------
/pics/17976404-95f5-480e-9cb4-250e6aa1d55f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/17976404-95f5-480e-9cb4-250e6aa1d55f.png
--------------------------------------------------------------------------------
/pics/185b9c49-4c13-4241-a848-fbff85c03a64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/185b9c49-4c13-4241-a848-fbff85c03a64.png
--------------------------------------------------------------------------------
/pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1a231f2a-5c2f-4231-8e0f-915aa5894347.jpg
--------------------------------------------------------------------------------
/pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1a851e90-0d5c-4d4f-ac54-34c20ecfb903.jpg
--------------------------------------------------------------------------------
/pics/1ab49e39-012b-4383-8284-26570987e3c4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1ab49e39-012b-4383-8284-26570987e3c4.jpg
--------------------------------------------------------------------------------
/pics/1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1b7f180e-7fee-4eaf-8ebb-164b68ae2b29.png
--------------------------------------------------------------------------------
/pics/1be8b4b0-cc7a-44d7-9c77-85be37b76f7d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1be8b4b0-cc7a-44d7-9c77-85be37b76f7d.png
--------------------------------------------------------------------------------
/pics/1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png
--------------------------------------------------------------------------------
/pics/1bfa3118-f3cd-4480-a950-cf6d646015db.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1bfa3118-f3cd-4480-a950-cf6d646015db.png
--------------------------------------------------------------------------------
/pics/1ca52246-c443-48ae-b1f8-1cafc09ec75c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1ca52246-c443-48ae-b1f8-1cafc09ec75c.png
--------------------------------------------------------------------------------
/pics/1ee5f0a5-b8df-43b9-95ab-c516c54ec797.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1ee5f0a5-b8df-43b9-95ab-c516c54ec797.jpg
--------------------------------------------------------------------------------
/pics/1f039a45-6b91-4f31-a2c2-6c63eb8bdb56.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1f039a45-6b91-4f31-a2c2-6c63eb8bdb56.png
--------------------------------------------------------------------------------
/pics/1f080e53-4758-406c-bb5f-dbedf89b63ce.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1f080e53-4758-406c-bb5f-dbedf89b63ce.jpg
--------------------------------------------------------------------------------
/pics/1f4a7f10-52b2-4bd7-a67d-a9581d66dc62.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/1f4a7f10-52b2-4bd7-a67d-a9581d66dc62.jpg
--------------------------------------------------------------------------------
/pics/20150928140509757.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/20150928140509757.png
--------------------------------------------------------------------------------
/pics/2017511e-22f0-4d74-873d-1261b71cf5a4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2017511e-22f0-4d74-873d-1261b71cf5a4.png
--------------------------------------------------------------------------------
/pics/2018040302.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2018040302.jpg
--------------------------------------------------------------------------------
/pics/207c1801-2335-4b1b-b65c-126a0ba966cb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/207c1801-2335-4b1b-b65c-126a0ba966cb.png
--------------------------------------------------------------------------------
/pics/21041ec2-babb-483f-bf47-8b8148eec162.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/21041ec2-babb-483f-bf47-8b8148eec162.png
--------------------------------------------------------------------------------
/pics/211c60d4-75ca-4acd-8a4f-171458ed58b4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/211c60d4-75ca-4acd-8a4f-171458ed58b4.jpg
--------------------------------------------------------------------------------
/pics/22de0538-7c6e-4365-bd3b-8ce3c5900216.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/22de0538-7c6e-4365-bd3b-8ce3c5900216.png
--------------------------------------------------------------------------------
/pics/22fda4ae-4dd5-489d-ab10-9ebfdad22ae0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/22fda4ae-4dd5-489d-ab10-9ebfdad22ae0.jpg
--------------------------------------------------------------------------------
/pics/23ba890e-e11c-45e2-a20c-64d217f83430.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/23ba890e-e11c-45e2-a20c-64d217f83430.png
--------------------------------------------------------------------------------
/pics/245fd2fb-209c-4ad5-bc5e-eb5664966a0e.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/245fd2fb-209c-4ad5-bc5e-eb5664966a0e.jpg
--------------------------------------------------------------------------------
/pics/249f3bb1-feee-4805-a259-a72699d638ca.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/249f3bb1-feee-4805-a259-a72699d638ca.jpg
--------------------------------------------------------------------------------
/pics/25d6d3d4-4726-47b1-a9cb-3316d1ff5dd5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/25d6d3d4-4726-47b1-a9cb-3316d1ff5dd5.png
--------------------------------------------------------------------------------
/pics/265a355d-aead-48aa-b455-f33b62fe729f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/265a355d-aead-48aa-b455-f33b62fe729f.png
--------------------------------------------------------------------------------
/pics/2719067e-b299-4639-9065-bed6729dbf0b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2719067e-b299-4639-9065-bed6729dbf0b.png
--------------------------------------------------------------------------------
/pics/2766d04f-7dad-42e4-99d1-60682c9d5c61.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2766d04f-7dad-42e4-99d1-60682c9d5c61.jpg
--------------------------------------------------------------------------------
/pics/276c31df-3b28-4ac2-b006-1e80fc86a64f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/276c31df-3b28-4ac2-b006-1e80fc86a64f.jpg
--------------------------------------------------------------------------------
/pics/278fe431-af88-4a95-a895-9c3b80117de3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/278fe431-af88-4a95-a895-9c3b80117de3.jpg
--------------------------------------------------------------------------------
/pics/27cd6f0c-f581-45da-b8c9-fed026830560.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/27cd6f0c-f581-45da-b8c9-fed026830560.png
--------------------------------------------------------------------------------
/pics/292b4a35-4507-4256-84ff-c218f108ee31.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/292b4a35-4507-4256-84ff-c218f108ee31.jpg
--------------------------------------------------------------------------------
/pics/293d2af9-de1d-403e-bed0-85d029383528.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/293d2af9-de1d-403e-bed0-85d029383528.png
--------------------------------------------------------------------------------
/pics/2_14_microkernelArchitecture.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2_14_microkernelArchitecture.jpg
--------------------------------------------------------------------------------
/pics/2a842a14-e4ab-4f37-83fa-f82c206fe426.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2a842a14-e4ab-4f37-83fa-f82c206fe426.png
--------------------------------------------------------------------------------
/pics/2ad244f5-939c-49fa-9385-69bc688677ab.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2ad244f5-939c-49fa-9385-69bc688677ab.jpg
--------------------------------------------------------------------------------
/pics/2bf2fd8f-5ade-48ba-a2b3-74195ac77c4b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2bf2fd8f-5ade-48ba-a2b3-74195ac77c4b.png
--------------------------------------------------------------------------------
/pics/2c4556e4-0751-4377-ab08-e7b89d697ca7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2c4556e4-0751-4377-ab08-e7b89d697ca7.png
--------------------------------------------------------------------------------
/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png
--------------------------------------------------------------------------------
/pics/2d09a847-b854-439c-9198-b29c65810944.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2d09a847-b854-439c-9198-b29c65810944.png
--------------------------------------------------------------------------------
/pics/2e6c72f5-3b8e-4e32-b87b-9491322628fe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/2e6c72f5-3b8e-4e32-b87b-9491322628fe.png
--------------------------------------------------------------------------------
/pics/30210b86-472d-4574-abb6-b74898cc17a4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/30210b86-472d-4574-abb6-b74898cc17a4.jpg
--------------------------------------------------------------------------------
/pics/3086c248-b552-499e-b101-9cffe5c2773e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3086c248-b552-499e-b101-9cffe5c2773e.png
--------------------------------------------------------------------------------
/pics/31d99967-1171-448e-8531-bccf5c14cffe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/31d99967-1171-448e-8531-bccf5c14cffe.jpg
--------------------------------------------------------------------------------
/pics/323ffd6c-8b54-4f3e-b361-555a6c8bf218.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/323ffd6c-8b54-4f3e-b361-555a6c8bf218.png
--------------------------------------------------------------------------------
/pics/32b8374a-e822-4720-af0b-c0f485095ea2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/32b8374a-e822-4720-af0b-c0f485095ea2.jpg
--------------------------------------------------------------------------------
/pics/33ac2b23-cb85-4e99-bc41-b7b7199fad1c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/33ac2b23-cb85-4e99-bc41-b7b7199fad1c.png
--------------------------------------------------------------------------------
/pics/348bc2db-582e-4aca-9f88-38c40e9a0e69.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/348bc2db-582e-4aca-9f88-38c40e9a0e69.png
--------------------------------------------------------------------------------
/pics/3646544a-cb57-451d-9e03-d3c4f5e4434a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3646544a-cb57-451d-9e03-d3c4f5e4434a.png
--------------------------------------------------------------------------------
/pics/37a72755-4890-4b42-9eab-b0084e0c54d9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/37a72755-4890-4b42-9eab-b0084e0c54d9.png
--------------------------------------------------------------------------------
/pics/386cd64f-7a9d-40e6-8c55-22b90ee2d258.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/386cd64f-7a9d-40e6-8c55-22b90ee2d258.png
--------------------------------------------------------------------------------
/pics/390c913b-5f31-444f-bbdb-2b88b688e7ce.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/390c913b-5f31-444f-bbdb-2b88b688e7ce.jpg
--------------------------------------------------------------------------------
/pics/3939369b-3a4a-48a0-b9eb-3efae26dd400.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3939369b-3a4a-48a0-b9eb-3efae26dd400.png
--------------------------------------------------------------------------------
/pics/395a9e83-b1a1-4a1d-b170-d081e7bb5bab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/395a9e83-b1a1-4a1d-b170-d081e7bb5bab.png
--------------------------------------------------------------------------------
/pics/39ccb299-ee99-4dd1-b8b4-2f9ec9495cb4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/39ccb299-ee99-4dd1-b8b4-2f9ec9495cb4.png
--------------------------------------------------------------------------------
/pics/3b0d1aa8-d0e0-46c2-8fd1-736bf08a11aa.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3b0d1aa8-d0e0-46c2-8fd1-736bf08a11aa.jpg
--------------------------------------------------------------------------------
/pics/3b49dd67-2c40-4b81-8ad2-7bbb1fe2fcbd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3b49dd67-2c40-4b81-8ad2-7bbb1fe2fcbd.png
--------------------------------------------------------------------------------
/pics/3cd630ea-017c-488d-ad1d-732b4efeddf5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3cd630ea-017c-488d-ad1d-732b4efeddf5.png
--------------------------------------------------------------------------------
/pics/3f5bba4b-7813-4aea-b578-970c7e3f6bf3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/3f5bba4b-7813-4aea-b578-970c7e3f6bf3.jpg
--------------------------------------------------------------------------------
/pics/41392d76-dd1d-4712-85d9-e8bb46b04a2d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/41392d76-dd1d-4712-85d9-e8bb46b04a2d.png
--------------------------------------------------------------------------------
/pics/423f2a40-bee1-488e-b460-8e76c48ee560.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/423f2a40-bee1-488e-b460-8e76c48ee560.png
--------------------------------------------------------------------------------
/pics/426df589-6f97-4622-b74d-4a81fcb1da8e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/426df589-6f97-4622-b74d-4a81fcb1da8e.png
--------------------------------------------------------------------------------
/pics/43f2cafa-3568-4a89-a895-4725666b94a6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/43f2cafa-3568-4a89-a895-4725666b94a6.png
--------------------------------------------------------------------------------
/pics/44e4a7ab-215c-41a1-8e34-f55f6c09e517.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/44e4a7ab-215c-41a1-8e34-f55f6c09e517.jpg
--------------------------------------------------------------------------------
/pics/44edefb7-4b58-4519-b8ee-4aca01697b78.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/44edefb7-4b58-4519-b8ee-4aca01697b78.jpg
--------------------------------------------------------------------------------
/pics/450px-HTTP_persistent_connection.svg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/450px-HTTP_persistent_connection.svg.png
--------------------------------------------------------------------------------
/pics/4583e24f-424b-4d50-8a14-2c38a1827d4a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4583e24f-424b-4d50-8a14-2c38a1827d4a.png
--------------------------------------------------------------------------------
/pics/45e0e0bf-386d-4280-a341-a0b9496c7674.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/45e0e0bf-386d-4280-a341-a0b9496c7674.png
--------------------------------------------------------------------------------
/pics/4628274c-25b6-4053-97cf-d1239b44c43d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4628274c-25b6-4053-97cf-d1239b44c43d.png
--------------------------------------------------------------------------------
/pics/46cec213-3048-4a80-aded-fdd577542801.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/46cec213-3048-4a80-aded-fdd577542801.jpg
--------------------------------------------------------------------------------
/pics/46f66e88-e65a-4ad0-a060-3c63fe22947c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/46f66e88-e65a-4ad0-a060-3c63fe22947c.png
--------------------------------------------------------------------------------
/pics/47358f87-bc4c-496f-9a90-8d696de94cee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/47358f87-bc4c-496f-9a90-8d696de94cee.png
--------------------------------------------------------------------------------
/pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/47d98583-8bb0-45cc-812d-47eefa0a4a40.jpg
--------------------------------------------------------------------------------
/pics/485fdf34-ccf8-4185-97c6-17374ee719a0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/485fdf34-ccf8-4185-97c6-17374ee719a0.png
--------------------------------------------------------------------------------
/pics/4885d0bc-1441-460f-bd75-a2088aa7f2d4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4885d0bc-1441-460f-bd75-a2088aa7f2d4.png
--------------------------------------------------------------------------------
/pics/48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg
--------------------------------------------------------------------------------
/pics/4bb7ed45-ec14-4d31-9da4-94024d9d3b05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4bb7ed45-ec14-4d31-9da4-94024d9d3b05.png
--------------------------------------------------------------------------------
/pics/4d741402-344d-4b7c-be01-e57184bcad0e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4d741402-344d-4b7c-be01-e57184bcad0e.png
--------------------------------------------------------------------------------
/pics/4e760981-a0c5-4dbf-9fbf-ce963e0629fb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4e760981-a0c5-4dbf-9fbf-ce963e0629fb.png
--------------------------------------------------------------------------------
/pics/4f48e806-f90b-4c09-a55f-ac0cd641c047.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4f48e806-f90b-4c09-a55f-ac0cd641c047.png
--------------------------------------------------------------------------------
/pics/4fc032e0-ac6f-4b42-9182-ee104a25e7a1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4fc032e0-ac6f-4b42-9182-ee104a25e7a1.png
--------------------------------------------------------------------------------
/pics/4ff355cf-9a7f-4468-af43-e5b02038facc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/4ff355cf-9a7f-4468-af43-e5b02038facc.jpg
--------------------------------------------------------------------------------
/pics/50d38e84-238f-4081-8876-14ef6d7938b5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/50d38e84-238f-4081-8876-14ef6d7938b5.jpg
--------------------------------------------------------------------------------
/pics/518f16f2-a9f7-499a-98e1-f1dbb37b5a9a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/518f16f2-a9f7-499a-98e1-f1dbb37b5a9a.png
--------------------------------------------------------------------------------
/pics/51e2ed95-65b8-4ae9-8af3-65602d452a25.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/51e2ed95-65b8-4ae9-8af3-65602d452a25.jpg
--------------------------------------------------------------------------------
/pics/51fb761d-8ce0-4472-92ff-2f227ac7888a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/51fb761d-8ce0-4472-92ff-2f227ac7888a.png
--------------------------------------------------------------------------------
/pics/5292faa6-0141-4638-bf0f-bb95b081dcba.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5292faa6-0141-4638-bf0f-bb95b081dcba.jpg
--------------------------------------------------------------------------------
/pics/52e1af6f-3a7a-4bee-aa8f-fcb5dacebe40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/52e1af6f-3a7a-4bee-aa8f-fcb5dacebe40.jpg
--------------------------------------------------------------------------------
/pics/5341d726-ffde-4d2a-a000-46597bcc9c5a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5341d726-ffde-4d2a-a000-46597bcc9c5a.png
--------------------------------------------------------------------------------
/pics/536c6dfd-305a-4b95-b12c-28ca5e8aa043.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/536c6dfd-305a-4b95-b12c-28ca5e8aa043.png
--------------------------------------------------------------------------------
/pics/540631a4-6018-40a5-aed7-081e2eeeaeea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/540631a4-6018-40a5-aed7-081e2eeeaeea.png
--------------------------------------------------------------------------------
/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/54cb3f21-485b-4159-8bf5-dcde1c4d4c36.png
--------------------------------------------------------------------------------
/pics/55dc4e84-573d-4c13-a765-52ed1dd251f9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/55dc4e84-573d-4c13-a765-52ed1dd251f9.png
--------------------------------------------------------------------------------
/pics/58e57a21-6b6b-40b6-af85-956dd4e0f55a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/58e57a21-6b6b-40b6-af85-956dd4e0f55a.jpg
--------------------------------------------------------------------------------
/pics/5930aeb8-847d-4e9f-a168-9334d7dec744.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5930aeb8-847d-4e9f-a168-9334d7dec744.png
--------------------------------------------------------------------------------
/pics/5942debd-fc00-477a-b390-7c5692cc8070.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5942debd-fc00-477a-b390-7c5692cc8070.jpg
--------------------------------------------------------------------------------
/pics/5999e5de-7c16-4b52-b3aa-6dc7b58c7894.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5999e5de-7c16-4b52-b3aa-6dc7b58c7894.png
--------------------------------------------------------------------------------
/pics/5aa82b89-f266-44da-887d-18f31f01d8ef.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5aa82b89-f266-44da-887d-18f31f01d8ef.png
--------------------------------------------------------------------------------
/pics/5aac64d3-2c7b-4f32-9e9a-1df2186f588b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5aac64d3-2c7b-4f32-9e9a-1df2186f588b.png
--------------------------------------------------------------------------------
/pics/5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5acf7550-86c5-4c5b-b912-8ce70ef9c34e.png
--------------------------------------------------------------------------------
/pics/5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg
--------------------------------------------------------------------------------
/pics/5d4a5181-65fb-4bf2-a9c6-899cab534b44.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5d4a5181-65fb-4bf2-a9c6-899cab534b44.png
--------------------------------------------------------------------------------
/pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5e8d3c04-d93b-48a7-875e-41ababed00e0.jpg
--------------------------------------------------------------------------------
/pics/5e9b10f3-9504-4483-9667-d4770adebf9f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5e9b10f3-9504-4483-9667-d4770adebf9f.png
--------------------------------------------------------------------------------
/pics/5ed71283-a070-4b21-85ae-f2cbfd6ba6e1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5ed71283-a070-4b21-85ae-f2cbfd6ba6e1.jpg
--------------------------------------------------------------------------------
/pics/5f5ef0b6-98ea-497c-a007-f6c55288eab1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5f5ef0b6-98ea-497c-a007-f6c55288eab1.png
--------------------------------------------------------------------------------
/pics/5f96e565-0693-47df-80f1-29e4271057b7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/5f96e565-0693-47df-80f1-29e4271057b7.png
--------------------------------------------------------------------------------
/pics/600e9c75-5033-4dad-ae2b-930957db638e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/600e9c75-5033-4dad-ae2b-930957db638e.png
--------------------------------------------------------------------------------
/pics/600px-Sharedmem.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/600px-Sharedmem.jpg
--------------------------------------------------------------------------------
/pics/6019b2db-bc3e-4408-b6d8-96025f4481d6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/6019b2db-bc3e-4408-b6d8-96025f4481d6.png
--------------------------------------------------------------------------------
/pics/61942711-45a0-4e11-bbc9-434e31436f33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/61942711-45a0-4e11-bbc9-434e31436f33.png
--------------------------------------------------------------------------------
/pics/62e0dd4f-44c3-43ee-bb6e-fedb9e068519.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/62e0dd4f-44c3-43ee-bb6e-fedb9e068519.png
--------------------------------------------------------------------------------
/pics/62e77997-6957-4b68-8d12-bfd609bb2c68.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/62e77997-6957-4b68-8d12-bfd609bb2c68.jpg
--------------------------------------------------------------------------------
/pics/63cd5b50-d6d8-4df6-8912-ef4a1dd5ba13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/63cd5b50-d6d8-4df6-8912-ef4a1dd5ba13.jpg
--------------------------------------------------------------------------------
/pics/654acfed-a6a5-4fc7-8f40-3fdcae57bae8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/654acfed-a6a5-4fc7-8f40-3fdcae57bae8.jpg
--------------------------------------------------------------------------------
/pics/658fc5e7-79c0-4247-9445-d69bf194c539.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/658fc5e7-79c0-4247-9445-d69bf194c539.png
--------------------------------------------------------------------------------
/pics/66192382-558b-4b05-a35d-ac4a2b1a9811.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/66192382-558b-4b05-a35d-ac4a2b1a9811.jpg
--------------------------------------------------------------------------------
/pics/67bf5487-c45d-49b6-b9c0-a058d8c68902.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/67bf5487-c45d-49b6-b9c0-a058d8c68902.png
--------------------------------------------------------------------------------
/pics/68778c1b-15ab-4826-99c0-3b4fd38cb9e9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/68778c1b-15ab-4826-99c0-3b4fd38cb9e9.png
--------------------------------------------------------------------------------
/pics/688dacfe-1057-412f-b3a1-86abb5b0f914.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/688dacfe-1057-412f-b3a1-86abb5b0f914.png
--------------------------------------------------------------------------------
/pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/699b4f96-d63f-46ea-a581-2b3d95eceb6a.jpg
--------------------------------------------------------------------------------
/pics/69f16984-a66f-4288-82e4-79b4aa43e835.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/69f16984-a66f-4288-82e4-79b4aa43e835.jpg
--------------------------------------------------------------------------------
/pics/6c0f4afb-20ab-49fd-837d-8144f4e38bfd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/6c0f4afb-20ab-49fd-837d-8144f4e38bfd.png
--------------------------------------------------------------------------------
/pics/6f4abf41-3728-4a6b-9b94-85eed7ca8163.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/6f4abf41-3728-4a6b-9b94-85eed7ca8163.png
--------------------------------------------------------------------------------
/pics/7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7.gif
--------------------------------------------------------------------------------
/pics/71363383-2d06-4c63-8b72-c01c2186707d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/71363383-2d06-4c63-8b72-c01c2186707d.png
--------------------------------------------------------------------------------
/pics/72f0ff69-138d-4e54-b7ac-ebe025d978dc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/72f0ff69-138d-4e54-b7ac-ebe025d978dc.png
--------------------------------------------------------------------------------
/pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/72fe492e-f1cb-4cfc-92f8-412fb3ae6fec.png
--------------------------------------------------------------------------------
/pics/73b73189-9e95-47e5-91d0-9378b8462e15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/73b73189-9e95-47e5-91d0-9378b8462e15.png
--------------------------------------------------------------------------------
/pics/76a49594323247f21c9b3a69945445ee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/76a49594323247f21c9b3a69945445ee.png
--------------------------------------------------------------------------------
/pics/76b48b4c-8999-4967-893b-832602e73285.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/76b48b4c-8999-4967-893b-832602e73285.png
--------------------------------------------------------------------------------
/pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/76dc7769-1aac-4888-9bea-064f1caa8e77.jpg
--------------------------------------------------------------------------------
/pics/7779232-1e8ed39548081a1f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7779232-1e8ed39548081a1f.png
--------------------------------------------------------------------------------
/pics/7779232-96822582feb08651.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7779232-96822582feb08651.png
--------------------------------------------------------------------------------
/pics/77f81379-3987-4036-8d7c-93a4dcf7b05d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/77f81379-3987-4036-8d7c-93a4dcf7b05d.jpg
--------------------------------------------------------------------------------
/pics/79b12431-6d9d-4a7d-985b-1b79bc5bf5fb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/79b12431-6d9d-4a7d-985b-1b79bc5bf5fb.png
--------------------------------------------------------------------------------
/pics/7a29acce-f243-4914-9f00-f2988c528412.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7a29acce-f243-4914-9f00-f2988c528412.jpg
--------------------------------------------------------------------------------
/pics/7b038838-c75b-4538-ae84-6299386704e5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7b038838-c75b-4538-ae84-6299386704e5.jpg
--------------------------------------------------------------------------------
/pics/7b281b1e-0595-402b-ae35-8c91084c33c1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7b281b1e-0595-402b-ae35-8c91084c33c1.png
--------------------------------------------------------------------------------
/pics/7b3efa99-d306-4982-8cfb-e7153c33aab4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7b3efa99-d306-4982-8cfb-e7153c33aab4.png
--------------------------------------------------------------------------------
/pics/7b68b142-9489-44f6-87b0-4cb5c6431e63.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7b68b142-9489-44f6-87b0-4cb5c6431e63.jpg
--------------------------------------------------------------------------------
/pics/7bd202a7-93d4-4f3a-a878-af68ae25539a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7bd202a7-93d4-4f3a-a878-af68ae25539a.png
--------------------------------------------------------------------------------
/pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7be0abf9-687c-4451-becd-626b0be7ec22.jpg
--------------------------------------------------------------------------------
/pics/7c54de21-e2ff-402e-bc42-4037de1c1592.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7c54de21-e2ff-402e-bc42-4037de1c1592.png
--------------------------------------------------------------------------------
/pics/7c98e1b6-c446-4cde-8513-5c11b9f52aea.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7c98e1b6-c446-4cde-8513-5c11b9f52aea.jpg
--------------------------------------------------------------------------------
/pics/7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg
--------------------------------------------------------------------------------
/pics/7f38a583-2f2e-4738-97af-510e6fb403a7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7f38a583-2f2e-4738-97af-510e6fb403a7.png
--------------------------------------------------------------------------------
/pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7f642a65-b167-4c8f-b382-8322c6322b2c.jpg
--------------------------------------------------------------------------------
/pics/7fffa4b8-b36d-471f-ad0c-a88ee763bb76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/7fffa4b8-b36d-471f-ad0c-a88ee763bb76.png
--------------------------------------------------------------------------------
/pics/8006a450-6c2f-498c-a928-c927f758b1d0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8006a450-6c2f-498c-a928-c927f758b1d0.png
--------------------------------------------------------------------------------
/pics/81538cd5-1bcf-4e31-86e5-e198df1e013b.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/81538cd5-1bcf-4e31-86e5-e198df1e013b.jpg
--------------------------------------------------------------------------------
/pics/8229e8e7-a183-4d29-94e6-e8d8537c6ce5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8229e8e7-a183-4d29-94e6-e8d8537c6ce5.png
--------------------------------------------------------------------------------
/pics/823cdab7-3779-4e3a-a951-dc2d154e0ee6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/823cdab7-3779-4e3a-a951-dc2d154e0ee6.jpg
--------------------------------------------------------------------------------
/pics/836a4eaf-4798-4e48-b52a-a3dab9435ace.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/836a4eaf-4798-4e48-b52a-a3dab9435ace.png
--------------------------------------------------------------------------------
/pics/8433fbb2-c35c-45ef-831d-e3ca42aebd51.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8433fbb2-c35c-45ef-831d-e3ca42aebd51.png
--------------------------------------------------------------------------------
/pics/85583359-1b45-45f2-9811-4f7bb9a64db7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/85583359-1b45-45f2-9811-4f7bb9a64db7.jpg
--------------------------------------------------------------------------------
/pics/85c05fb1-5546-4c50-9221-21f231cdc8c5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/85c05fb1-5546-4c50-9221-21f231cdc8c5.jpg
--------------------------------------------------------------------------------
/pics/88ff46b3-028a-4dbb-a572-1f062b8b96d3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/88ff46b3-028a-4dbb-a572-1f062b8b96d3.png
--------------------------------------------------------------------------------
/pics/8a4c6ad4-a816-47d1-b93f-7ca4f78ab67a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8a4c6ad4-a816-47d1-b93f-7ca4f78ab67a.png
--------------------------------------------------------------------------------
/pics/8adb2591-d3f1-4632-84cb-823fb9c5eb09.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8adb2591-d3f1-4632-84cb-823fb9c5eb09.jpg
--------------------------------------------------------------------------------
/pics/8ae4550b-f0cb-4e4d-9e2b-c550538bf230.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8ae4550b-f0cb-4e4d-9e2b-c550538bf230.png
--------------------------------------------------------------------------------
/pics/8af348d0-4d72-4f76-b56c-0a440ed4673d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8af348d0-4d72-4f76-b56c-0a440ed4673d.png
--------------------------------------------------------------------------------
/pics/8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg
--------------------------------------------------------------------------------
/pics/8b798007-e0fb-420c-b981-ead215692417.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8b798007-e0fb-420c-b981-ead215692417.jpg
--------------------------------------------------------------------------------
/pics/8cc671f0-7134-44b1-a7b5-6d24fe55e1c1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8cc671f0-7134-44b1-a7b5-6d24fe55e1c1.jpg
--------------------------------------------------------------------------------
/pics/8dfb4cc9-26da-45e7-b820-4576fa1cbb0e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8dfb4cc9-26da-45e7-b820-4576fa1cbb0e.png
--------------------------------------------------------------------------------
/pics/8f0cc500-5994-4c7a-91a9-62885d658662.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8f0cc500-5994-4c7a-91a9-62885d658662.png
--------------------------------------------------------------------------------
/pics/8f3b9519-d705-48fe-87ad-2e4052fc81d2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8f3b9519-d705-48fe-87ad-2e4052fc81d2.png
--------------------------------------------------------------------------------
/pics/8f64e9c5-7682-4feb-9312-dea09514e160.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8f64e9c5-7682-4feb-9312-dea09514e160.jpg
--------------------------------------------------------------------------------
/pics/8f6f9dc9-9ecd-47c8-b50e-2814f0219056.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8f6f9dc9-9ecd-47c8-b50e-2814f0219056.png
--------------------------------------------------------------------------------
/pics/8fe838e3-ef77-4f63-bf45-417b6bc5c6bb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/8fe838e3-ef77-4f63-bf45-417b6bc5c6bb.png
--------------------------------------------------------------------------------
/pics/9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9.gif
--------------------------------------------------------------------------------
/pics/902b83ab-8054-4bd2-898f-9a4a0fe52830.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/902b83ab-8054-4bd2-898f-9a4a0fe52830.jpg
--------------------------------------------------------------------------------
/pics/910f613f-514f-4534-87dd-9b4699d59d31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/910f613f-514f-4534-87dd-9b4699d59d31.png
--------------------------------------------------------------------------------
/pics/9110c1a0-8a54-4145-a814-2477d0128114.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9110c1a0-8a54-4145-a814-2477d0128114.png
--------------------------------------------------------------------------------
/pics/91ef04e4-923a-4277-99c0-6be4ce81e5ac.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/91ef04e4-923a-4277-99c0-6be4ce81e5ac.jpg
--------------------------------------------------------------------------------
/pics/920c034c-c212-4f79-9ddb-84e4bb6cd088.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/920c034c-c212-4f79-9ddb-84e4bb6cd088.png
--------------------------------------------------------------------------------
/pics/92ad9bae-7d02-43ba-8115-a9d6f530ca28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/92ad9bae-7d02-43ba-8115-a9d6f530ca28.png
--------------------------------------------------------------------------------
/pics/94589319-975f-490b-8bae-90b3a4953559.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/94589319-975f-490b-8bae-90b3a4953559.png
--------------------------------------------------------------------------------
/pics/952afa9a-458b-44ce-bba9-463e60162945.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/952afa9a-458b-44ce-bba9-463e60162945.png
--------------------------------------------------------------------------------
/pics/952e06bd-5a65-4cab-82e4-dd1536462f38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/952e06bd-5a65-4cab-82e4-dd1536462f38.png
--------------------------------------------------------------------------------
/pics/955af054-8872-4569-82e7-2e10b66bc38e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/955af054-8872-4569-82e7-2e10b66bc38e.png
--------------------------------------------------------------------------------
/pics/96b63e13-e2d8-4ddb-9aa1-a38959ca96e5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/96b63e13-e2d8-4ddb-9aa1-a38959ca96e5.jpg
--------------------------------------------------------------------------------
/pics/992faced-afcf-414d-b801-9c16d6570fec.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/992faced-afcf-414d-b801-9c16d6570fec.jpg
--------------------------------------------------------------------------------
/pics/9b829410-86c4-40aa-ba8d-9e8e26c0eeb8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9b829410-86c4-40aa-ba8d-9e8e26c0eeb8.jpg
--------------------------------------------------------------------------------
/pics/9cd0ae20-4fb5-4017-a000-f7d3a0eb3529.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9cd0ae20-4fb5-4017-a000-f7d3a0eb3529.png
--------------------------------------------------------------------------------
/pics/9d0a637c-6a8f-4f5a-99b9-fdcfa26793ff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9d0a637c-6a8f-4f5a-99b9-fdcfa26793ff.png
--------------------------------------------------------------------------------
/pics/9d549816-60b7-4899-9877-23b01503ab13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9d549816-60b7-4899-9877-23b01503ab13.png
--------------------------------------------------------------------------------
/pics/9e80f75a-b12b-4344-80c8-1f9ccc2d5246.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/9e80f75a-b12b-4344-80c8-1f9ccc2d5246.jpg
--------------------------------------------------------------------------------
/pics/ClienteServidorSockets1521731145260.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ClienteServidorSockets1521731145260.jpg
--------------------------------------------------------------------------------
/pics/CountdownLatch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/CountdownLatch.png
--------------------------------------------------------------------------------
/pics/CyclicBarrier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/CyclicBarrier.png
--------------------------------------------------------------------------------
/pics/DP-Decorator-java.io.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/DP-Decorator-java.io.png
--------------------------------------------------------------------------------
/pics/GUID_Partition_Table_Scheme.svg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/GUID_Partition_Table_Scheme.svg.png
--------------------------------------------------------------------------------
/pics/HTTP_RequestMessageExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/HTTP_RequestMessageExample.png
--------------------------------------------------------------------------------
/pics/HTTP_ResponseMessageExample.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/HTTP_ResponseMessageExample.png
--------------------------------------------------------------------------------
/pics/How-HTTPS-Works.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/How-HTTPS-Works.png
--------------------------------------------------------------------------------
/pics/Iterator-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/Iterator-1.jpg
--------------------------------------------------------------------------------
/pics/JNIFigure1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/JNIFigure1.gif
--------------------------------------------------------------------------------
/pics/JVM-Stack.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/JVM-Stack.png
--------------------------------------------------------------------------------
/pics/JVM-runtime-data-area.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/JVM-runtime-data-area.jpg
--------------------------------------------------------------------------------
/pics/MultiNode-SessionReplication.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/MultiNode-SessionReplication.jpg
--------------------------------------------------------------------------------
/pics/MultiNode-SpringSession.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/MultiNode-SpringSession.jpg
--------------------------------------------------------------------------------
/pics/MultiNode-StickySessions.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/MultiNode-StickySessions.jpg
--------------------------------------------------------------------------------
/pics/PPjwP.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/PPjwP.png
--------------------------------------------------------------------------------
/pics/ProcessState.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ProcessState.png
--------------------------------------------------------------------------------
/pics/Semaphore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/Semaphore.png
--------------------------------------------------------------------------------
/pics/Technology-ComputerNetworking-Internet-ISPs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/Technology-ComputerNetworking-Internet-ISPs.png
--------------------------------------------------------------------------------
/pics/ZnJvbT1jc2RuJnVybD15VkdkdVYyUXZ.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ZnJvbT1jc2RuJnVybD15VkdkdVYyUXZ.jpg
--------------------------------------------------------------------------------
/pics/a01d1516-8168-461a-a24b-620b9cfc40f4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a01d1516-8168-461a-a24b-620b9cfc40f4.png
--------------------------------------------------------------------------------
/pics/a1198642-9159-4d88-8aec-c3b04e7a2563.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a1198642-9159-4d88-8aec-c3b04e7a2563.jpg
--------------------------------------------------------------------------------
/pics/a2d13178-f1ef-4811-a240-1fe95b55b1eb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a2d13178-f1ef-4811-a240-1fe95b55b1eb.png
--------------------------------------------------------------------------------
/pics/a314bb79-5b18-4e63-a976-3448bffa6f1b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a314bb79-5b18-4e63-a976-3448bffa6f1b.png
--------------------------------------------------------------------------------
/pics/a3253deb-8d21-40a1-aae4-7d178e4aa319.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a3253deb-8d21-40a1-aae4-7d178e4aa319.jpg
--------------------------------------------------------------------------------
/pics/a3da4342-078b-43e2-b748-7e71bec50dc4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a3da4342-078b-43e2-b748-7e71bec50dc4.png
--------------------------------------------------------------------------------
/pics/a3f34241-bb80-4879-8ec9-dff2d81b514e.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a3f34241-bb80-4879-8ec9-dff2d81b514e.jpg
--------------------------------------------------------------------------------
/pics/a4248c4b-6c1d-4fb8-a557-86da92d3a294.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a4248c4b-6c1d-4fb8-a557-86da92d3a294.jpg
--------------------------------------------------------------------------------
/pics/a4b162e5-db2a-4a27-b213-1fe481c5a06a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a4b162e5-db2a-4a27-b213-1fe481c5a06a.png
--------------------------------------------------------------------------------
/pics/a4c17d43-fa5e-4935-b74e-147e7f7e782c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a4c17d43-fa5e-4935-b74e-147e7f7e782c.png
--------------------------------------------------------------------------------
/pics/a57a6fc8-c5e9-456c-80ff-a5139dda4b6e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a57a6fc8-c5e9-456c-80ff-a5139dda4b6e.png
--------------------------------------------------------------------------------
/pics/a6026bb4-3daf-439f-b1ec-a5a24e19d2fb.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a6026bb4-3daf-439f-b1ec-a5a24e19d2fb.jpg
--------------------------------------------------------------------------------
/pics/a6ac2b08-3861-4e85-baa8-382287bfee9f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a6ac2b08-3861-4e85-baa8-382287bfee9f.png
--------------------------------------------------------------------------------
/pics/a74b70ac-323a-4b31-b4d5-90569b8a944b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a74b70ac-323a-4b31-b4d5-90569b8a944b.png
--------------------------------------------------------------------------------
/pics/a9077f06-7584-4f2b-8c20-3a8e46928820.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/a9077f06-7584-4f2b-8c20-3a8e46928820.jpg
--------------------------------------------------------------------------------
/pics/aa29cc88-7256-4399-8c7f-3cf4a6489559.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/aa29cc88-7256-4399-8c7f-3cf4a6489559.png
--------------------------------------------------------------------------------
/pics/aa42f9c6-ad7a-48f4-8e8b-f3b6de3feaec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/aa42f9c6-ad7a-48f4-8e8b-f3b6de3feaec.png
--------------------------------------------------------------------------------
/pics/ab77240d-7338-4547-9183-00215e7220ec.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ab77240d-7338-4547-9183-00215e7220ec.png
--------------------------------------------------------------------------------
/pics/ac106e7e-489a-4082-abd9-dabebe48394c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ac106e7e-489a-4082-abd9-dabebe48394c.jpg
--------------------------------------------------------------------------------
/pics/ac9b31ec-cef1-4880-a875-fc4571ca10e1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ac9b31ec-cef1-4880-a875-fc4571ca10e1.png
--------------------------------------------------------------------------------
/pics/ace830df-9919-48ca-91b5-60b193f593d2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ace830df-9919-48ca-91b5-60b193f593d2.png
--------------------------------------------------------------------------------
/pics/ae3fc93a-44d5-4beb-b05a-874bd9c0a657.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ae3fc93a-44d5-4beb-b05a-874bd9c0a657.png
--------------------------------------------------------------------------------
/pics/af4639f9-af54-4400-aaf5-4e261d96ace7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/af4639f9-af54-4400-aaf5-4e261d96ace7.png
--------------------------------------------------------------------------------
/pics/b0e8ef47-2f23-4379-8c64-10d5cb44d438.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b0e8ef47-2f23-4379-8c64-10d5cb44d438.jpg
--------------------------------------------------------------------------------
/pics/b1fa0453-a4b0-4eae-a352-48acca8fff74.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b1fa0453-a4b0-4eae-a352-48acca8fff74.png
--------------------------------------------------------------------------------
/pics/b29f8971-9cb8-480d-b986-0e60c2ece069.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b29f8971-9cb8-480d-b986-0e60c2ece069.png
--------------------------------------------------------------------------------
/pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b396d726-b75f-4a32-89a2-03a7b6e19f6f.jpg
--------------------------------------------------------------------------------
/pics/b418ca51-f005-4510-b7ad-f092eb6aeb24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b418ca51-f005-4510-b7ad-f092eb6aeb24.png
--------------------------------------------------------------------------------
/pics/b4252c85-6fb0-4995-9a68-a1a5925fbdb1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b4252c85-6fb0-4995-9a68-a1a5925fbdb1.png
--------------------------------------------------------------------------------
/pics/b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b4b29aa9-dd2c-467b-b75f-ca6541cb25b5.jpg
--------------------------------------------------------------------------------
/pics/b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png
--------------------------------------------------------------------------------
/pics/b84ba6fb-312b-4e69-8c77-fb6eb6fb38d4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b84ba6fb-312b-4e69-8c77-fb6eb6fb38d4.png
--------------------------------------------------------------------------------
/pics/b9a39d2a-618c-468b-86db-2e851f1a0057.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b9a39d2a-618c-468b-86db-2e851f1a0057.jpg
--------------------------------------------------------------------------------
/pics/b9d79a5a-e7af-499b-b989-f10483e71b8b.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/b9d79a5a-e7af-499b-b989-f10483e71b8b.jpg
--------------------------------------------------------------------------------
/pics/bc775758-89ab-4805-9f9c-78b8739cf780.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/bc775758-89ab-4805-9f9c-78b8739cf780.jpg
--------------------------------------------------------------------------------
/pics/be7dca03-12ec-456b-8b54-b1b3161f5531.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/be7dca03-12ec-456b-8b54-b1b3161f5531.png
--------------------------------------------------------------------------------
/pics/bee1ff1d-c80f-4b3c-b58c-7073a8896ab2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/bee1ff1d-c80f-4b3c-b58c-7073a8896ab2.jpg
--------------------------------------------------------------------------------
/pics/bf0ff9fc-467e-4a3f-8922-115ba2c55bde.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/bf0ff9fc-467e-4a3f-8922-115ba2c55bde.png
--------------------------------------------------------------------------------
/pics/bfbb11e2-d208-4efa-b97b-24cd40467cd8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/bfbb11e2-d208-4efa-b97b-24cd40467cd8.png
--------------------------------------------------------------------------------
/pics/c037c901-7eae-4e31-a1e4-9d41329e5c3e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c037c901-7eae-4e31-a1e4-9d41329e5c3e.png
--------------------------------------------------------------------------------
/pics/c2117f61-1177-4768-bf33-cf4f950d911c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c2117f61-1177-4768-bf33-cf4f950d911c.png
--------------------------------------------------------------------------------
/pics/c23957e9-a572-44f8-be15-f306c8b92722.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c23957e9-a572-44f8-be15-f306c8b92722.jpg
--------------------------------------------------------------------------------
/pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c2d343f7-604c-4856-9a3c-c71d6f67fecc.png
--------------------------------------------------------------------------------
/pics/c3369072-c740-43b0-b276-202bd1d3960d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c3369072-c740-43b0-b276-202bd1d3960d.jpg
--------------------------------------------------------------------------------
/pics/c5022dd3-be22-4250-b9f6-38ae984a04d7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c5022dd3-be22-4250-b9f6-38ae984a04d7.jpg
--------------------------------------------------------------------------------
/pics/c625baa0-dde6-449e-93df-c3a67f2f430f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c625baa0-dde6-449e-93df-c3a67f2f430f.jpg
--------------------------------------------------------------------------------
/pics/c7d4956c-9988-4a10-a704-28fdae7f3d28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c7d4956c-9988-4a10-a704-28fdae7f3d28.png
--------------------------------------------------------------------------------
/pics/c812c28a-1513-4a82-bfda-ab6a40981aa0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c812c28a-1513-4a82-bfda-ab6a40981aa0.png
--------------------------------------------------------------------------------
/pics/c8d18ca9-0b09-441a-9a0c-fb063630d708.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c8d18ca9-0b09-441a-9a0c-fb063630d708.png
--------------------------------------------------------------------------------
/pics/c9a1de44-b1c0-4d13-a654-827d4ef8a723.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c9a1de44-b1c0-4d13-a654-827d4ef8a723.png
--------------------------------------------------------------------------------
/pics/c9cfcd20-c901-435f-9a07-3e46830c359f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/c9cfcd20-c901-435f-9a07-3e46830c359f.jpg
--------------------------------------------------------------------------------
/pics/cb0ed469-27ab-471b-a830-648b279103c8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cb0ed469-27ab-471b-a830-648b279103c8.png
--------------------------------------------------------------------------------
/pics/cbf50eb8-22b4-4528-a2e7-d187143d57f7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cbf50eb8-22b4-4528-a2e7-d187143d57f7.png
--------------------------------------------------------------------------------
/pics/cd5fbcff-3f35-43a6-8ffa-082a93ce0f0e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cd5fbcff-3f35-43a6-8ffa-082a93ce0f0e.png
--------------------------------------------------------------------------------
/pics/cdbe1d12-5ad9-4acb-a717-bbc822c2acf3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cdbe1d12-5ad9-4acb-a717-bbc822c2acf3.png
--------------------------------------------------------------------------------
/pics/ce039f03-6588-4f0c-b35b-a494de0eac47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ce039f03-6588-4f0c-b35b-a494de0eac47.png
--------------------------------------------------------------------------------
/pics/cf4386a1-58c9-4eca-a17f-e12b1e9770eb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cf4386a1-58c9-4eca-a17f-e12b1e9770eb.png
--------------------------------------------------------------------------------
/pics/class_loader_hierarchy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/class_loader_hierarchy.png
--------------------------------------------------------------------------------
/pics/cookiedata.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/cookiedata.png
--------------------------------------------------------------------------------
/pics/d160ec2e-cfe2-4640-bda7-62f53e58b8c0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d160ec2e-cfe2-4640-bda7-62f53e58b8c0.png
--------------------------------------------------------------------------------
/pics/d1f81ac3-9fdb-4371-a49d-ca84917aa89f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d1f81ac3-9fdb-4371-a49d-ca84917aa89f.jpg
--------------------------------------------------------------------------------
/pics/d2d34239-e7c1-482b-b33e-3170c5943556.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d2d34239-e7c1-482b-b33e-3170c5943556.jpg
--------------------------------------------------------------------------------
/pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d49466db-fdd3-4d36-8a86-47dc45c07a1e.jpg
--------------------------------------------------------------------------------
/pics/d4c3a4a1-0846-46ec-9cc3-eaddfca71254.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d4c3a4a1-0846-46ec-9cc3-eaddfca71254.jpg
--------------------------------------------------------------------------------
/pics/d4eef1e2-5703-4ca4-82ab-8dda93d6b81f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d4eef1e2-5703-4ca4-82ab-8dda93d6b81f.png
--------------------------------------------------------------------------------
/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png
--------------------------------------------------------------------------------
/pics/d7f6dec1-02b6-4969-b3ab-e01ee78659b9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d7f6dec1-02b6-4969-b3ab-e01ee78659b9.png
--------------------------------------------------------------------------------
/pics/d99dc9e2-197c-4085-813d-7195da1c6762.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/d99dc9e2-197c-4085-813d-7195da1c6762.png
--------------------------------------------------------------------------------
/pics/db4921d4-184b-48ba-a3cf-1d1141e3ba2d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/db4921d4-184b-48ba-a3cf-1d1141e3ba2d.png
--------------------------------------------------------------------------------
/pics/db54db2f-82b2-4222-8d63-e49a8a7fc966.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/db54db2f-82b2-4222-8d63-e49a8a7fc966.png
--------------------------------------------------------------------------------
/pics/dbb8516d-37ba-4e2c-b26b-eefd7de21b45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dbb8516d-37ba-4e2c-b26b-eefd7de21b45.png
--------------------------------------------------------------------------------
/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dbc5c9f1-c13c-4d06-86ba-7cc949eb4c8f.jpg
--------------------------------------------------------------------------------
/pics/dbd60b1f-b700-4da6-a993-62578e892333.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dbd60b1f-b700-4da6-a993-62578e892333.jpg
--------------------------------------------------------------------------------
/pics/dc00f70e-c5c8-4d20-baf1-2d70014a97e3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dc00f70e-c5c8-4d20-baf1-2d70014a97e3.jpg
--------------------------------------------------------------------------------
/pics/dd15a984-e977-4644-b127-708cddb8ca99.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dd15a984-e977-4644-b127-708cddb8ca99.png
--------------------------------------------------------------------------------
/pics/dd782132-d830-4c55-9884-cfac0a541b8e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dd782132-d830-4c55-9884-cfac0a541b8e.png
--------------------------------------------------------------------------------
/pics/dd78a1fe-1ff3-4bcf-a56f-8c003995beb6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dd78a1fe-1ff3-4bcf-a56f-8c003995beb6.jpg
--------------------------------------------------------------------------------
/pics/dda1608d-26e0-4f10-8327-a459969b150a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/dda1608d-26e0-4f10-8327-a459969b150a.png
--------------------------------------------------------------------------------
/pics/ddcf2327-8d84-425d-8535-121a94bcb88d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ddcf2327-8d84-425d-8535-121a94bcb88d.jpg
--------------------------------------------------------------------------------
/pics/de9b9ea0-1327-4865-93e5-6f805c48bc9e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/de9b9ea0-1327-4865-93e5-6f805c48bc9e.png
--------------------------------------------------------------------------------
/pics/e026c24d-00fa-4e7c-97a8-95a98cdc383a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e026c24d-00fa-4e7c-97a8-95a98cdc383a.png
--------------------------------------------------------------------------------
/pics/e0900bb2-220a-43b7-9aa9-1d5cd55ff56e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e0900bb2-220a-43b7-9aa9-1d5cd55ff56e.png
--------------------------------------------------------------------------------
/pics/e143f6da-d114-4ba4-8712-f65299047fa2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e143f6da-d114-4ba4-8712-f65299047fa2.png
--------------------------------------------------------------------------------
/pics/e1eda3d5-5ec8-4708-8e25-1a04c5e11f48.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e1eda3d5-5ec8-4708-8e25-1a04c5e11f48.png
--------------------------------------------------------------------------------
/pics/e2f0d889-2330-424c-8193-198edebecff7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e2f0d889-2330-424c-8193-198edebecff7.png
--------------------------------------------------------------------------------
/pics/e3124763-f75e-46c3-ba82-341e6c98d862.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e3124763-f75e-46c3-ba82-341e6c98d862.jpg
--------------------------------------------------------------------------------
/pics/e31abb94-9201-4e06-9902-61101b92f475.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e31abb94-9201-4e06-9902-61101b92f475.png
--------------------------------------------------------------------------------
/pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e41405a8-7c05-4f70-8092-e961e28d3112.jpg
--------------------------------------------------------------------------------
/pics/e6723b94-1a33-4605-b775-f6813352d383.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e6723b94-1a33-4605-b775-f6813352d383.png
--------------------------------------------------------------------------------
/pics/e6b733ad-606d-4028-b3e8-83c3a73a3797.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e6b733ad-606d-4028-b3e8-83c3a73a3797.jpg
--------------------------------------------------------------------------------
/pics/e800b001-7779-495b-8459-d33a7440d7b8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e800b001-7779-495b-8459-d33a7440d7b8.jpg
--------------------------------------------------------------------------------
/pics/e92d0ebc-7d46-413b-aec1-34a39602f787.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/e92d0ebc-7d46-413b-aec1-34a39602f787.png
--------------------------------------------------------------------------------
/pics/ea5f3efe-d5e6-499b-b278-9e898af61257.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ea5f3efe-d5e6-499b-b278-9e898af61257.jpg
--------------------------------------------------------------------------------
/pics/eb4a7007-d437-4740-865d-672973effe25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/eb4a7007-d437-4740-865d-672973effe25.png
--------------------------------------------------------------------------------
/pics/eb859228-c0f2-4bce-910d-d9f76929352b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/eb859228-c0f2-4bce-910d-d9f76929352b.png
--------------------------------------------------------------------------------
/pics/ed523051-608f-4c3f-b343-383e2d194470.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ed523051-608f-4c3f-b343-383e2d194470.png
--------------------------------------------------------------------------------
/pics/ed5522bb-3a60-481c-8654-43e7195a48fe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ed5522bb-3a60-481c-8654-43e7195a48fe.png
--------------------------------------------------------------------------------
/pics/ed7b96ac-6428-4bd5-9986-674c54c2a959.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ed7b96ac-6428-4bd5-9986-674c54c2a959.png
--------------------------------------------------------------------------------
/pics/eebdeb57-8efb-4848-9bb6-97512990897c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/eebdeb57-8efb-4848-9bb6-97512990897c.jpg
--------------------------------------------------------------------------------
/pics/ef280699-da36-4b38-9735-9b048a3c7fe0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ef280699-da36-4b38-9735-9b048a3c7fe0.png
--------------------------------------------------------------------------------
/pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png
--------------------------------------------------------------------------------
/pics/f0e35b7a-2948-488a-a5a9-97d3f6b5e2d7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f0e35b7a-2948-488a-a5a9-97d3f6b5e2d7.png
--------------------------------------------------------------------------------
/pics/f3080f83-6239-459b-8e9c-03b6641f7815.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f3080f83-6239-459b-8e9c-03b6641f7815.png
--------------------------------------------------------------------------------
/pics/f3bfe11f-9cba-4ff2-8cc6-629068408a80.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f3bfe11f-9cba-4ff2-8cc6-629068408a80.jpg
--------------------------------------------------------------------------------
/pics/f3d3e072-e947-43e9-b999-22385fd569a0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f3d3e072-e947-43e9-b999-22385fd569a0.jpg
--------------------------------------------------------------------------------
/pics/f42443e0-208d-41ea-be44-c7fd97d2e3bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f42443e0-208d-41ea-be44-c7fd97d2e3bf.png
--------------------------------------------------------------------------------
/pics/f48e2b92-2c2a-48cb-a443-bd313e187a25.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f48e2b92-2c2a-48cb-a443-bd313e187a25.jpg
--------------------------------------------------------------------------------
/pics/f4cdda3e-324c-49b5-8c14-08a3db634b29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f4cdda3e-324c-49b5-8c14-08a3db634b29.png
--------------------------------------------------------------------------------
/pics/f50a8e52-a683-444c-8e32-63c1890fe84a.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f50a8e52-a683-444c-8e32-63c1890fe84a.jpg
--------------------------------------------------------------------------------
/pics/f5477abd-c246-4851-89ab-6b1cde2549b1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f5477abd-c246-4851-89ab-6b1cde2549b1.png
--------------------------------------------------------------------------------
/pics/f5757d09-88e7-4bbd-8cfb-cecf55604854.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f5757d09-88e7-4bbd-8cfb-cecf55604854.png
--------------------------------------------------------------------------------
/pics/f61b5419-c94a-4df1-8d4d-aed9ae8cc6d5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f61b5419-c94a-4df1-8d4d-aed9ae8cc6d5.png
--------------------------------------------------------------------------------
/pics/f716427a-94f2-4875-9c86-98793cf5dcc3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f716427a-94f2-4875-9c86-98793cf5dcc3.jpg
--------------------------------------------------------------------------------
/pics/f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg
--------------------------------------------------------------------------------
/pics/f7d170a3-e446-4a64-ac2d-cb95028f81a8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f7d170a3-e446-4a64-ac2d-cb95028f81a8.png
--------------------------------------------------------------------------------
/pics/f7ecbb8d-bb8b-4d45-a3b7-f49425d6d83d.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f7ecbb8d-bb8b-4d45-a3b7-f49425d6d83d.jpg
--------------------------------------------------------------------------------
/pics/f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png
--------------------------------------------------------------------------------
/pics/f87afe72-c2df-4c12-ac03-9b8d581a8af8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f87afe72-c2df-4c12-ac03-9b8d581a8af8.jpg
--------------------------------------------------------------------------------
/pics/f8b16d1e-7363-4544-94d6-4939fdf849dc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f8b16d1e-7363-4544-94d6-4939fdf849dc.png
--------------------------------------------------------------------------------
/pics/f900f266-a323-42b2-bc43-218fdb8811a8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f900f266-a323-42b2-bc43-218fdb8811a8.jpg
--------------------------------------------------------------------------------
/pics/f99ee771-c56f-47fb-9148-c0036695b5fe.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f99ee771-c56f-47fb-9148-c0036695b5fe.jpg
--------------------------------------------------------------------------------
/pics/f9f9f993-8ece-4da7-b848-af9b438fad76.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/f9f9f993-8ece-4da7-b848-af9b438fad76.png
--------------------------------------------------------------------------------
/pics/fa568fac-ac58-48dd-a9bb-23b3065bf2dc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/fa568fac-ac58-48dd-a9bb-23b3065bf2dc.png
--------------------------------------------------------------------------------
/pics/fb327611-7e2b-4f2f-9f5b-38592d408f07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/fb327611-7e2b-4f2f-9f5b-38592d408f07.png
--------------------------------------------------------------------------------
/pics/fb546e12-e1fb-4b72-a1fb-8a7f5000dce6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/fb546e12-e1fb-4b72-a1fb-8a7f5000dce6.jpg
--------------------------------------------------------------------------------
/pics/fbe54203-c005-48f0-8883-b05e564a3173.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/fbe54203-c005-48f0-8883-b05e564a3173.png
--------------------------------------------------------------------------------
/pics/fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg
--------------------------------------------------------------------------------
/pics/ff0c019c-6461-467d-a266-0455341fd4f4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ff0c019c-6461-467d-a266-0455341fd4f4.png
--------------------------------------------------------------------------------
/pics/ff396233-1bb1-4e74-8bc2-d7c90146f5dd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ff396233-1bb1-4e74-8bc2-d7c90146f5dd.png
--------------------------------------------------------------------------------
/pics/flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/flow.png
--------------------------------------------------------------------------------
/pics/hashMap_u54C8_u5E0C_u7B97_u6CD5_u4F8B_u56FE.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/hashMap_u54C8_u5E0C_u7B97_u6CD5_u4F8B_u56FE.png
--------------------------------------------------------------------------------
/pics/image005.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/image005.jpg
--------------------------------------------------------------------------------
/pics/image007.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/image007.jpg
--------------------------------------------------------------------------------
/pics/image008.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/image008.jpg
--------------------------------------------------------------------------------
/pics/image009.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/image009.jpg
--------------------------------------------------------------------------------
/pics/java-collections.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/java-collections.png
--------------------------------------------------------------------------------
/pics/java-collections1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/java-collections1.png
--------------------------------------------------------------------------------
/pics/linux-filesystem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/linux-filesystem.png
--------------------------------------------------------------------------------
/pics/monitor-lock-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/monitor-lock-rule.png
--------------------------------------------------------------------------------
/pics/mutualssl_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/mutualssl_small.png
--------------------------------------------------------------------------------
/pics/n2U3N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/n2U3N.png
--------------------------------------------------------------------------------
/pics/network-of-networks.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/network-of-networks.gif
--------------------------------------------------------------------------------
/pics/pcrypt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/pcrypt.gif
--------------------------------------------------------------------------------
/pics/ppt_img.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ppt_img.gif
--------------------------------------------------------------------------------
/pics/scrypt.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/scrypt.gif
--------------------------------------------------------------------------------
/pics/single-thread-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/single-thread-rule.png
--------------------------------------------------------------------------------
/pics/ssl-offloading.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/ssl-offloading.jpg
--------------------------------------------------------------------------------
/pics/tGPV0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/tGPV0.png
--------------------------------------------------------------------------------
/pics/thread-join-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/thread-join-rule.png
--------------------------------------------------------------------------------
/pics/thread-start-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/thread-start-rule.png
--------------------------------------------------------------------------------
/pics/url_diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/url_diagram.png
--------------------------------------------------------------------------------
/pics/volatile-variable-rule.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/crossoverJie/Interview-Notebook/a5b98f2ab8e2475965c98ab257281c54f4c6a6d5/pics/volatile-variable-rule.png
--------------------------------------------------------------------------------