-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
437 lines (256 loc) · 151 KB
/
Copy pathatom.xml
File metadata and controls
437 lines (256 loc) · 151 KB
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
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
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>vic的博客</title>
<subtitle>vic的博客</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://fuyong.net.cn/"/>
<updated>2020-03-29T12:59:55.371Z</updated>
<id>http://fuyong.net.cn/</id>
<author>
<name>[object Object]</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>代码审查流程</title>
<link href="http://fuyong.net.cn/2020/03/29/%E4%BB%A3%E7%A0%81%E5%AE%A1%E6%9F%A5%E6%B5%81%E7%A8%8B/"/>
<id>http://fuyong.net.cn/2020/03/29/代码审查流程/</id>
<published>2020-03-29T12:23:39.000Z</published>
<updated>2020-03-29T12:59:55.371Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">st=>start: 开始</span><br><span class="line">op1=>operation: 作者发起代码审查请求(设置审查人Reviewer和观察人Watcher)</span><br><span class="line">op2=>operation: 审查人审查代码</span><br><span class="line">op3=>operation: 提交评论与作者讨论</span><br><span class="line">op4=>operation: 得出审查结论</span><br><span class="line">op5=>operation: 作者修订代码</span><br><span class="line">con1=>condition: Accepting Or Raising concern?</span><br><span class="line">op7=>operation: 关闭审核流程(Close Review)</span><br><span class="line">e=>end: 结束</span><br><span class="line">st->op1->op2->op3->op4->op5->con1</span><br><span class="line">con1(no)->op2</span><br><span class="line">con1(yes)->op7->e</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
</entry>
<entry>
<title>Python包管理</title>
<link href="http://fuyong.net.cn/2020/03/01/Python%E5%8C%85%E7%AE%A1%E7%90%86/"/>
<id>http://fuyong.net.cn/2020/03/01/Python包管理/</id>
<published>2020-03-01T11:30:55.000Z</published>
<updated>2020-03-15T12:25:42.453Z</updated>
<content type="html"><![CDATA[<p>大家都知道每个项目都是由很多个不同功能的依赖库组合而成的,那么对项目而言,对这些依赖的包的管理显得尤为重要了。</p><a id="more"></a><h2 id="什么是包依赖管理"><a href="#什么是包依赖管理" class="headerlink" title="什么是包依赖管理"></a>什么是包依赖管理</h2><p><strong>包管理器</strong>主要是管理<strong>库</strong>的集合,这样能够一次下载某一个包,而不是单独下载所有的库。</p><p><strong>依赖关系管理</strong>用来帮助一个应用管理所有的库依赖。当你在多个环境中工作,这能够提供很大的好处。并且依赖管理能够让你注重库版本,更快更简单的更新库,当然也会处理类如一个包依赖另一个包的情况。</p><p>目前团队项目主要是Java和Python语言开发,对比发现Java有很成熟的项目构建工具,例如:有使用xml的Maven,有使用groovy的Gradle,这样的构建工具能够快速的处理项目的依赖和构建问题,那对于Python而言,在依赖管理这方面,有哪些做法呢?</p><h2 id="当下比较流行的包依赖管理工具"><a href="#当下比较流行的包依赖管理工具" class="headerlink" title="当下比较流行的包依赖管理工具"></a>当下比较流行的包依赖管理工具</h2><ol><li>在包管理方面,现在在役的包管理工具有 distutils、 setuptools、 distribute、 distlib、 pip,不过最流行的,应该还是<strong>pip</strong>了,它能够帮助开发者升级、安装、查看和卸载库。</li><li>在项目依赖隔离方面,Python主要使用虚拟环境,而关于虚拟环境的模块主要有:pyenv、 venv、 virtualenv、 virtualenvwrapper、<strong>pipenv</strong></li></ol><h2 id="pip日常使用"><a href="#pip日常使用" class="headerlink" title="pip日常使用"></a>pip日常使用</h2><p>pip常用的命令,可以是用<code>pip help</code> 查看:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">➜ ~ pip help</span><br><span class="line"></span><br><span class="line">Usage:</span><br><span class="line"> pip <command> [options]</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line"> install Install packages.</span><br><span class="line"> download Download packages.</span><br><span class="line"> uninstall Uninstall packages.</span><br><span class="line"> freeze Output installed packages in requirements format.</span><br><span class="line"> list List installed packages.</span><br><span class="line"> show Show information about installed packages.</span><br><span class="line"> check Verify installed packages have compatible dependencies.</span><br><span class="line"> config Manage local and global configuration.</span><br><span class="line"> search Search PyPI for packages.</span><br><span class="line"> wheel Build wheels from your requirements.</span><br><span class="line"> hash Compute hashes of package archives.</span><br><span class="line"> completion A helper command used for command completion.</span><br><span class="line"> debug Show information useful for debugging.</span><br><span class="line"> help Show help for commands.</span><br></pre></td></tr></table></figure><p>主要介绍下几个常用的命令:</p><p><code>install</code> : 安装包;pip install <package> 例如:pip install Flask==0.10.1(不指定版本号默认安装最新版本);升级包:pip install -U <package> 或:pip install <package> –upgrade</package></package></package></p><p><code>download</code>:下载包,与 <code>install</code>的区别就是,<code>download</code>只下载不安装。例如:pip download Flask,将下载Flask相关依赖到当前目录,主要用于非在线机器的包安装,后面进行介绍。</p><p><code>uninstall</code>:卸载包;例如:pip uninstall Flask</p><p><code>show</code>:显示包所在目录及信息;例如:pip show Flask</p><p><code>search</code>:搜索包;例如:pip search Flask</p><h2 id="requirement-txt文件使用"><a href="#requirement-txt文件使用" class="headerlink" title="requirement.txt文件使用"></a>requirement.txt文件使用</h2><p>requirement.txt文件主要是用来记录程序中需要的第三方依赖,以方便快速重构项目环境。格式如下:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">requests==1.2.0 </span><br><span class="line">Flask==0.10.1</span><br></pre></td></tr></table></figure><p>requirement.txt文件是通过pip命令生成的,具体命令为:<code>pip freeze > requirement.txt</code></p><p>需要注意的是,pip freeze这个命令生成的requirement.txt文件是当前Python环境下所有类库,包括那些你没有在当前项目中使用的库。 (如果没有使用虚拟环境,后面专题讲述)。</p><p>如果只想将当前项目使用的类库导出生成为 requirements.txt,可以使用<code>pipreqs</code>。使用方法如下:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install pipreqs</span><br><span class="line">pipreqs .</span><br></pre></td></tr></table></figure><p>基于requirement.txt文件快速安装项目所需要的依赖,命令为:<code>pip install -r requirements.txt</code></p><h2 id="离线安装包"><a href="#离线安装包" class="headerlink" title="离线安装包"></a>离线安装包</h2><p>在生产环境中,往往线上主机与外网是隔离的,那直接使用<code>pip install</code>是无法完成的。这就需要使用前面提到的<code>download</code>来离线下载相关依赖包了。主要流程如下:</p><p>1、在有网络的机器,通过<code>download</code>命令下载离线安装包。假如需要离线安装Flask包,新建<code>flask_offline</code>目录,通过<code>pip download Flask</code>命令将Flask相关的依赖下载到该目录。可以看到Flask相关的依赖包都已经下载到<code>flask_offline</code>目录。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">➜ flask_offline pip download Flask</span><br><span class="line">Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple</span><br><span class="line">Collecting Flask</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl (94 kB)</span><br><span class="line"> |████████████████████████████████| 94 kB 805 kB/s</span><br><span class="line"> Saved ./Flask-1.1.1-py2.py3-none-any.whl</span><br><span class="line">Collecting itsdangerous>=0.24</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)</span><br><span class="line"> Saved ./itsdangerous-1.1.0-py2.py3-none-any.whl</span><br><span class="line">Collecting Jinja2>=2.10.1</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/27/24/4f35961e5c669e96f6559760042a55b9bcfcdb82b9bdb3c8753dbe042e35/Jinja2-2.11.1-py2.py3-none-any.whl (126 kB)</span><br><span class="line"> |████████████████████████████████| 126 kB 3.0 MB/s</span><br><span class="line"> Saved ./Jinja2-2.11.1-py2.py3-none-any.whl</span><br><span class="line">Collecting Werkzeug>=0.15</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/ba/a5/d6f8a6e71f15364d35678a4ec8a0186f980b3bd2545f40ad51dd26a87fb1/Werkzeug-1.0.0-py2.py3-none-any.whl (298 kB)</span><br><span class="line"> |████████████████████████████████| 298 kB 4.3 MB/s</span><br><span class="line"> Saved ./Werkzeug-1.0.0-py2.py3-none-any.whl</span><br><span class="line">Collecting click>=5.1</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/dd/c0/4d8f43a9b16e289f36478422031b8a63b54b6ac3b1ba605d602f10dd54d6/click-7.1.1-py2.py3-none-any.whl (82 kB)</span><br><span class="line"> |████████████████████████████████| 82 kB 1.1 MB/s</span><br><span class="line"> Saved ./click-7.1.1-py2.py3-none-any.whl</span><br><span class="line">Collecting MarkupSafe>=0.23</span><br><span class="line"> Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f0/00/a6aea33f5598b080b86d6b6d1214b51afe3ffa6100b902d5aa465080083f/MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl (18 kB)</span><br><span class="line"> Saved ./MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl</span><br><span class="line">Successfully downloaded Flask itsdangerous Jinja2 Werkzeug click MarkupSafe</span><br><span class="line">➜ flask_offline ls</span><br><span class="line">Flask-1.1.1-py2.py3-none-any.whl Werkzeug-1.0.0-py2.py3-none-any.whl</span><br><span class="line">Jinja2-2.11.1-py2.py3-none-any.whl click-7.1.1-py2.py3-none-any.whl</span><br><span class="line">MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl itsdangerous-1.1.0-py2.py3-none-any.whl</span><br></pre></td></tr></table></figure><ol><li><p>将<code>flask_offline</code>目录拷贝到无外网的线上机器上,执行命令:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install --no-index --find-links=file:/flask_offline flask</span><br></pre></td></tr></table></figure></li></ol><p><strong>需要注意的是,线上机器和线下机器的环境需要完全一致,一样的OS架构、python版本等。</strong>那么问题来了,如果线上线下机器环境不完全一致,就没有办法了吗?当然肯定不是这样的。其中第一种做法是,修改download的参数,让他能够适配不同的环境。方法二就是使用虚拟环境。</p><p>download参数如下:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">Download Options:</span><br><span class="line"> -c, --constraint <file> Constrain versions using the given constraints file. This option can be used</span><br><span class="line"> multiple times.</span><br><span class="line"> -r, --requirement <file> Install from the given requirements file. This option can be used multiple times.</span><br><span class="line"> -b, --build <dir> Directory to unpack packages into and build in. Note that an initial build still</span><br><span class="line"> takes place in a temporary directory. The location of temporary directories can</span><br><span class="line"> be controlled by setting the TMPDIR environment variable (TEMP on Windows)</span><br><span class="line"> appropriately. When passed, build directories are not cleaned in case of</span><br><span class="line"> failures.</span><br><span class="line"> --no-deps Don't install package dependencies.</span><br><span class="line"> --global-option <options> Extra global options to be supplied to the setup.py call before the install</span><br><span class="line"> command.</span><br><span class="line"> --no-binary <format_control></span><br><span class="line"> Do not use binary packages. Can be supplied multiple times, and each time adds to</span><br><span class="line"> the existing value. Accepts either :all: to disable all binary packages, :none:</span><br><span class="line"> to empty the set, or one or more package names with commas between them (no</span><br><span class="line"> colons). Note that some packages are tricky to compile and may fail to install</span><br><span class="line"> when this option is used on them.</span><br><span class="line"> --only-binary <format_control></span><br><span class="line"> Do not use source packages. Can be supplied multiple times, and each time adds to</span><br><span class="line"> the existing value. Accepts either :all: to disable all source packages, :none:</span><br><span class="line"> to empty the set, or one or more package names with commas between them. Packages</span><br><span class="line"> without binary distributions will fail to install when this option is used on</span><br><span class="line"> them.</span><br><span class="line"> --prefer-binary Prefer older binary packages over newer source packages.</span><br><span class="line"> --src <dir> Directory to check out editable projects into. The default in a virtualenv is</span><br><span class="line"> "<venv path>/src". The default for global installs is "<current dir>/src".</span><br><span class="line"> --pre Include pre-release and development versions. By default, pip only finds stable</span><br><span class="line"> versions.</span><br><span class="line"> --no-clean Don't clean up build directories.</span><br><span class="line"> --require-hashes Require a hash to check each requirement against, for repeatable installs. This</span><br><span class="line"> option is implied when any package in a requirements file has a --hash option.</span><br><span class="line"> --progress-bar <progress_bar></span><br><span class="line"> Specify type of progress to be displayed [off|on|ascii|pretty|emoji] (default:</span><br><span class="line"> on)</span><br><span class="line"> --no-build-isolation Disable isolation when building a modern source distribution. Build dependencies</span><br><span class="line"> specified by PEP 518 must be already installed if this option is used.</span><br><span class="line"> --use-pep517 Use PEP 517 for building source distributions (use --no-use-pep517 to force</span><br><span class="line"> legacy behaviour).</span><br><span class="line"> -d, --dest <dir> Download packages into <dir>.</span><br><span class="line"> --platform <platform> Only use wheels compatible with <platform>. Defaults to the platform of the</span><br><span class="line"> running system.</span><br><span class="line"> --python-version <python_version></span><br><span class="line"> The Python interpreter version to use for wheel and "Requires-Python"</span><br><span class="line"> compatibility checks. Defaults to a version derived from the running interpreter.</span><br><span class="line"> The version can be specified using up to three dot-separated integers (e.g. "3"</span><br><span class="line"> for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor version can also be given</span><br><span class="line"> as a string without dots (e.g. "37" for 3.7.0).</span><br><span class="line"> --implementation <implementation></span><br><span class="line"> Only use wheels compatible with Python implementation <implementation>, e.g.</span><br><span class="line"> 'pp', 'jy', 'cp', or 'ip'. If not specified, then the current interpreter</span><br><span class="line"> implementation is used. Use 'py' to force implementation-agnostic wheels.</span><br><span class="line"> --abi <abi> Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. If not</span><br><span class="line"> specified, then the current interpreter abi tag is used. Generally you will need</span><br><span class="line"> to specify --implementation, --platform, and --python-version when using this</span><br><span class="line"> option.</span><br></pre></td></tr></table></figure><p>常用的有如下参数:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">--only-binary=:all: \ # 只下载二进制package(即wheel或egg)</span><br><span class="line">--platform linux_x86_64 \ # 指定linux架构为linux 64位架构</span><br><span class="line">--python-version 27 \ # 指定python版本为Python 2.7</span><br><span class="line">--abi cp27mu</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>大家都知道每个项目都是由很多个不同功能的依赖库组合而成的,那么对项目而言,对这些依赖的包的管理显得尤为重要了。</p>
</summary>
<category term="python" scheme="http://fuyong.net.cn/tags/python/"/>
</entry>
<entry>
<title>Intellij IDEA快捷键介绍-常用篇</title>
<link href="http://fuyong.net.cn/2018/03/28/Intellij%20IDEA%E5%BF%AB%E6%8D%B7%E9%94%AE%E4%BB%8B%E7%BB%8D-%E5%B8%B8%E7%94%A8%E7%AF%87/"/>
<id>http://fuyong.net.cn/2018/03/28/Intellij IDEA快捷键介绍-常用篇/</id>
<published>2018-03-28T14:59:59.614Z</published>
<updated>2018-08-16T05:03:15.351Z</updated>
<content type="html"><![CDATA[<p>Intellij IDEA快捷键介绍-常用篇</p><a id="more"></a><h3 id="跳转"><a href="#跳转" class="headerlink" title="跳转"></a>跳转</h3><ul><li><code>command</code> + E : 列出最近编辑的文件</li><li><code>command</code> + F11 :添加带符号的标记 1,2,3,4</li><li><code>control</code> + 标记符号 :对应跳转到标记</li><li><code>shift + option</code> + F:收藏夹</li></ul>]]></content>
<summary type="html">
<p>Intellij IDEA快捷键介绍-常用篇</p>
</summary>
<category term="工具" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="Intellij IDEA" scheme="http://fuyong.net.cn/tags/Intellij-IDEA/"/>
</entry>
<entry>
<title>Nginx系列<一> 配置介绍</title>
<link href="http://fuyong.net.cn/2018/03/18/Nginx%E7%B3%BB%E5%88%97%20%E4%B8%80%20%20%20%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D/"/>
<id>http://fuyong.net.cn/2018/03/18/Nginx系列 一 配置介绍/</id>
<published>2018-03-18T02:08:33.286Z</published>
<updated>2018-08-16T05:08:51.206Z</updated>
<content type="html"><![CDATA[<p>Nginx安装部署和常用基本命令介绍。介绍平滑重启、平滑升级等操作。<br><a id="more"></a></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文主要记录nginx的学习笔记,方便自己和他人使用时查阅~</p><h2 id="Nginx安装部署"><a href="#Nginx安装部署" class="headerlink" title="Nginx安装部署"></a>Nginx安装部署</h2><h3 id="下载Nginx源代码"><a href="#下载Nginx源代码" class="headerlink" title="下载Nginx源代码"></a>下载Nginx源代码</h3><p>根据系统类型从官网下载对应版本的Nginx<a href="https://nginx.org/en/download.html" target="_blank" rel="noopener">点我下载</a>。Window版本的Nginx服务器在效率上比Linux差一些,并且通常Nginx在实际生产环境中都是基于Linux/Unix系统,所以本文使用Linux系统,Nginx版本为1.10.1。下载Nginx后解压,主要的目录描述如下:</p><ul><li><strong>conf</strong> 目录中存放的nginx的配置文件,主要的nginx.cnf文件就在此目录</li><li><strong>man</strong> 目录存放的nginx服务器的文档资料,包含nginx服务器的LICENSE、OpenSSL的LICENSE等,以及Nginx等帮助文档和readme。</li><li><strong>logs</strong> 目录存放的nginx服务器的运行日志文件。</li><li><strong>html</strong> 目录存放两个.html后缀结尾的默认文件。</li><li><strong>sbin</strong> 目录存放nginx的运行程序</li><li><strong>src</strong> 目录存放Nginx所有的源代码</li><li><strong>auto</strong> 目录中存放大量的自动脚本</li><li><strong>configure</strong> 文件是Nginx软件的自动脚本程序</li></ul><h3 id="Linux下编译和安装Nginx"><a href="#Linux下编译和安装Nginx" class="headerlink" title="Linux下编译和安装Nginx"></a>Linux下编译和安装Nginx</h3><p>一般Nginx有两种安装方式,yum安装和源码包安装<br>这里先说明下 <code>yum</code> 和 <code>源码包</code> 安装的 区别:</p><ol><li><code>yum</code> 安装是在线安装,好处是:安装方式简单,不易出错;直接使用命令 <code>yum -y install nginx</code> 安装即可</li><li><code>源码包</code> 安装是先将 <code>nginx</code> 的源码下载下来,自己编译生成可执行文件,然后执行,好处是:因为是在自己的系统上编译的,更符合自己系统的性能,也就是说在自己的系统上执行 <code>nginx</code> 服务性能效率更好。</li></ol><p>所以下文主要介绍用源码包安装方式Nginx,源代码的编译需要使用configure自动脚本生产Makefile文件。在生成makefile文件之前,需要先了解configure脚本支持的几个常用选项。(图片来源:Nginx高性能web服务器详解)</p><p><img src="/img/20180318/1521385446741.jpg" alt="图片来源“Nginx高性能web服务器详解”"><br><img src="/img/20180318/1521385451730.jpg" alt="图片来源“Nginx高性能web服务器详解”"><br><img src="/img/20180318/1521385778478.jpg" alt="图片来源“Nginx高性能web服务器详解”"><br><img src="/img/20180318/1521385877714.jpg" alt="图片来源“Nginx高性能web服务器详解”"><br><img src="/img/20180318/1521385883463.jpg" alt="图片来源“Nginx高性能web服务器详解”"></p><p>了解了configure的常用选项后,就可以按照你的具体需求生成Makefile文件了。一般使用最多的就是--prefix啦,用于指定Nginx的安装目录,默认为/usr/local/nginx,其他参数一般都默认。<br>这里将使用以下命令将Nginx编译在/data/nginx目录。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./configure --prefix=/data/nginx</span><br></pre></td></tr></table></figure><p>这时会输出一堆日志,基本上没报错就ok,这里会根据您系统的性能编译nginx,生成Makefile文件。<br>使用make && make install 编译安装Nginx。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make && make install</span><br></pre></td></tr></table></figure></p><p>输入/data/nginx/sbin/nginx -v 查看nginx版本号即安装成功。</p><h3 id="Nginx服务的启动和停止"><a href="#Nginx服务的启动和停止" class="headerlink" title="Nginx服务的启动和停止"></a>Nginx服务的启动和停止</h3><p>安装完Nginx后,下面接着就可以启动了,启动的方式有很多。如果你使用yum安装的话,会安装成server,使用<code>service nginx start</code>即可启动。本文介绍使用源码方式安装,启动方式为:<code>/data/nginx/sbin nginx</code>启动没报错就ok了。这里需要注意的是,如果你是非root用户启动,可能会出现这个问题:<br></p><p><img src="/img/20180318/1521557771276.jpg" alt="1521557771276"><br><code>nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)</code><br> 这是因为非root用户无权限监听80端口。解决办法有两种:</p><ol><li>通过sudo启动<code>sudo /data/nginx/sbin nginx</code></li><li>修改nginx.conf配置文件中监听的端口为1024以上。</li></ol><blockquote><p>通过<code>/data/nginx/sbin nginx -h</code>可以查看到nginx的相关用法;<br><img src="/img/20180318/1521557524987.jpg" alt="1521557524987"></p></blockquote><p>关于nginx的停止,我觉得有必要强调一下。<br>停止Nginx的方法有两种:一种是快速停止,一种是平缓停止。快速停止是指立即停止当前所有网络请求(包含正在处理中的)。平缓停止允许Nginx将处理完当前所有请求,但是不再接受新请求,之后再关闭连接。<br><code>/data/nginx/sbin nginx -g TERM | INT | QUIT</code><br><em>TERM</em> 和<em>INT</em>是快速停止,<em>QUIT</em>是用于平缓停止</p><h2 id="Nginx-nginx-conf配置文件详解"><a href="#Nginx-nginx-conf配置文件详解" class="headerlink" title="Nginx nginx.conf配置文件详解"></a>Nginx nginx.conf配置文件详解</h2><h3 id="nginx-conf文件的结构"><a href="#nginx-conf文件的结构" class="headerlink" title="nginx.conf文件的结构"></a>nginx.conf文件的结构</h3><ul><li>全局块<br>顾名思义全局块是在全局范围生效的,通常包含的配置有nginx访问用户,pid存放目录,日志存放目录,允许生成的work process数量等。</li><li>events块<br>events块通常配置nginx服务器的用户、生成的worker process数量、日志及PID存放的目录等等。</li><li>http块<br>http块主要配置文件引入、MIME-Type定义,日志格式定义、超时设置、最大请求数等等。</li><li>server块<br>定义localhost结构为:localhost [ = | ~ | ~<em> | ^~ ] uri ( … )<br>uri为待匹配的字符串,可以包含有正则表达式的字符串,成为正则uri,不包含正则表达式的uri为标准uri。<br>方括号里面为可选项,用来确定uri的匹配方式。主要含义是:</em><code>=</code>:用于标准uri,表示对uri进行严格匹配,如果匹配成功,就停止继续向下搜索。<br><em><code>~</code>:用于正则uri,表示uri中包含正则表达式,并且区分大小写</em><code>~*</code>:用于正则uri,表示uri中包含正则表达式,并且<strong>不</strong>区分大小写<br>*<code>^~</code>:用于标准uri前,表示Nginx服务器找到标识uri和请求字符串匹配度最高的localhost后,立即使用此localhost处理请求,不在继续向下搜索<blockquote><p>注意,如果uri中有正则表达式,必须使用~或~*标识</p></blockquote></li></ul><p>下图nginx.conf文件示例:</p><p><img src="/img/20180318/1522420074494.jpg" alt="1522420074494"></p><blockquote><p>参考文档:Nginx高性能web服务器详解</p></blockquote>]]></content>
<summary type="html">
<p>Nginx安装部署和常用基本命令介绍。介绍平滑重启、平滑升级等操作。<br>
</summary>
<category term="工作记录" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BD%95/"/>
<category term="Nginx" scheme="http://fuyong.net.cn/tags/Nginx/"/>
</entry>
<entry>
<title>Neo4j-Cypher语言语法</title>
<link href="http://fuyong.net.cn/2018/03/15/Neo4j-Cypher%E8%AF%AD%E8%A8%80%E8%AF%AD%E6%B3%95/"/>
<id>http://fuyong.net.cn/2018/03/15/Neo4j-Cypher语言语法/</id>
<published>2018-03-15T15:14:10.855Z</published>
<updated>2018-03-15T15:17:37.421Z</updated>
<content type="html"><![CDATA[<p>本文是记录Neo4j图数据库中实用的Cypher语言语法。</p><h2 id="Cypher是什么"><a href="#Cypher是什么" class="headerlink" title="Cypher是什么"></a>Cypher是什么</h2><p>“Cypher”是一个描述性的类Sql的图操作语言。相当于关系数据库的Sql,可见其重要性。其语法针对图的特点而设计,非常方便和灵活。</p><ul><li>Cypher是一个申明式查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询。</li><li>Cypher通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如</li><li>like和order by是受SQL的启发。正则表达式匹配实现模仿Scala 语言。<br>学好Cypher是学好Neo4j的关键,也是核心所在!</li></ul><h2 id="Cypher语法"><a href="#Cypher语法" class="headerlink" title="Cypher语法"></a>Cypher语法</h2><h3 id="Create"><a href="#Create" class="headerlink" title="Create"></a>Create</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">CREATE (erzi:Person {id:‘erzi’}), //erzi是别名</span><br><span class="line">(baba:Person {id:'baba'}),</span><br><span class="line">(yeye:Person {id:'yeye',name:'zhangsan'}),</span><br><span class="line">(nainai:Person {id:'nainai'}),</span><br><span class="line">(mama:Person {id:'mama'}),</span><br><span class="line">(bozi:Person {id:'bozi'}),</span><br><span class="line">// 创建关系</span><br><span class="line">(erzi)-[:fathor]->(baba),</span><br><span class="line">(baba)-[:fathor]->(yeye),</span><br><span class="line">(baba)-[:mother]->(nainai),</span><br><span class="line">(erzi)-[:mother]->(mama),</span><br><span class="line">(erzi)-[:girlFrend]->(bozi)</span><br></pre></td></tr></table></figure><h3 id="Match"><a href="#Match" class="headerlink" title="Match"></a>Match</h3><p><code>match</code>相当于sql中的select<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MATCH (n:Person) RETURN n limit 25</span><br></pre></td></tr></table></figure></p><p>等价于:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Select * from Person limit 25</span><br></pre></td></tr></table></figure></p><h3 id="Merge"><a href="#Merge" class="headerlink" title="Merge"></a>Merge</h3><p><code>merge</code> 相当于Match or Create 有则match,无则Create<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MERGE (n:Person { name: 'Ann' }) RETURN n</span><br></pre></td></tr></table></figure></p><p>下面这两条语句的对比?<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">match (n:Person {id:'mama'}),(m:Person {id:'nainai'}) merge (n)-[:poxi]->(m) return n,m</span><br><span class="line">和</span><br><span class="line">match (n:Person {id:'mama'}) with n match (m:Person {id:'nainai'}) merge (n)-[:poxi]->(m) return n,m</span><br></pre></td></tr></table></figure></p><h3 id="Delete-和-Remove"><a href="#Delete-和-Remove" class="headerlink" title="Delete 和 Remove"></a>Delete 和 Remove</h3><p>DELETE和REMOVE主要区别 :<br>DELETE操作用于删除节点和relation。<br>REMOVE操作用于删除标签label和属性。<br>Remove label 等同于drop table<br>两个命令都应该与MATCH命令一起使用。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Match (n:Person {id:'baba'}) remove n.age return n</span><br><span class="line">MATCH (s:Teacher)-[r:teach]->(d:Student) delete r,s,d //删除与该关系相关的老师和学生及label</span><br><span class="line">MATCH (n:Test) remove n:Test //删除label</span><br></pre></td></tr></table></figure><p>如何仅仅删除一个relation?<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Match (a:Person),(b:Person) where a.id='erzi' and b.id='bozi' merge (a)-[r:FUQI]->(b) DELETE r</span><br></pre></td></tr></table></figure></p><h3 id="order-by"><a href="#order-by" class="headerlink" title="order by"></a>order by</h3><p><code>order by</code> 同sql</p><h3 id="Limit-和-Skip"><a href="#Limit-和-Skip" class="headerlink" title="Limit 和 Skip"></a>Limit 和 Skip</h3><p><code>limit</code>:显示多少行<br><code>skip</code>:从最前面开始,跳过多少行</p><h3 id="Union-和-Union-all"><a href="#Union-和-Union-all" class="headerlink" title="Union 和 Union all"></a>Union 和 Union all</h3><p><code>Union</code>:把多段Match的return结果 上线组合成一个结果集,会自动去掉重复行;<br><code>Union all</code>:作用同union,但不去重;</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MATCH (n:Person) where n.age>20 RETURN n.id,n.age</span><br><span class="line">union all</span><br><span class="line">MATCH (n:Person) where n.id='erzi' RETURN n.id,n.age</span><br></pre></td></tr></table></figure><h3 id="In"><a href="#In" class="headerlink" title="In"></a>In</h3><p>和sql的区别就是使用[]中括号,而不是()括弧号<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">MATCH (n:Person) where n.age>20 RETURN n.id,n.age union all MATCH (n:Person) where n.id in ['erzi','bozi','baba'] RETURN n.id,n.age</span><br></pre></td></tr></table></figure></p><h2 id="Cypher-索引"><a href="#Cypher-索引" class="headerlink" title="Cypher 索引"></a>Cypher 索引</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">create index on:Person(id)</span><br><span class="line">drop index on:Person(id)</span><br></pre></td></tr></table></figure><p>注意:</p><ul><li>创建索引时不需要给索引起名称,只需要设置索引的字段即可</li><li>通过该字段的查询都走索引 where in = </li></ul><h2 id="唯一约束-Constraint"><a href="#唯一约束-Constraint" class="headerlink" title="唯一约束 Constraint"></a>唯一约束 Constraint</h2><p>给某个属性设置唯一约束<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">create constraint on (n:Person) assert n.id is unique</span><br><span class="line">drop constraint on (n:Person) assert n.id is unique</span><br></pre></td></tr></table></figure></p><h2 id="执行计划-explain"><a href="#执行计划-explain" class="headerlink" title="执行计划 explain"></a>执行计划 explain</h2><p>类似sql</p><p><img src="$res/1512897788760.jpg" alt="1512897788760"></p><h2 id="常用函数"><a href="#常用函数" class="headerlink" title="常用函数"></a>常用函数</h2><blockquote><p> Neo4j无 group by</p><ul><li><code>UPPER</code> 它用于将所有字母更改为大写字母。</li><li><code>LOWER</code> 它用于将所有字母改为小写字母。</li><li><code>SUBSTRING</code> 它用于获取给定String的子字符串。 </li><li><code>REPLACE</code> 它用于替换一个字符串的子字符串。<br>Match (n:Person) return SUBSTRING(n.id,2,0),n.id</li></ul></blockquote><p><strong>聚集函数</strong> </p><ul><li><code>COUNT</code> 它返回由MATCH命令返回的行数。</li><li><code>MAX</code> 它从MATCH命令返回的一组行返回最大值。</li><li><code>MIN</code> 它返回由MATCH命令返回的一组行的最小值。</li><li><code>SUM</code> 它返回由MATCH命令返回的所有行的求和值。</li><li><code>AVG</code> 它返回由MATCH命令返回的所有行的平均值。<br>Match (n:Person) return count(*)<br>Match (n:Person) return avg(n.age) 只包含age不为空的node</li></ul><p><strong>查询最短路径</strong></p><blockquote><p>查询最短路径的必要性:6层关系理论:任何两个事物之间的关系都不会超过6层。<br>关系链路越短,代表这两个节点的关系越密切!</p></blockquote><p><code>allShortestPaths</code> [*..n] 用于表示获取n层关系,显示所有的链路关系(Single shortest path)<br><code>shortestPath</code> 显示最短的链路(Single shortest path)</p><p><code>match p=allshortestPaths((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return pmatch p=shortestPath((n:Person {id:'mama'})-[*..3]-(b:Person {id:'nainai'})) return p</code>-</p>]]></content>
<summary type="html">
<p>本文是记录Neo4j图数据库中实用的Cypher语言语法。</p>
<h2 id="Cypher是什么"><a href="#Cypher是什么" class="headerlink" title="Cypher是什么"></a>Cypher是什么</h2><p>“Cyph
</summary>
<category term="工作记录" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BD%95/"/>
<category term="Neo4j" scheme="http://fuyong.net.cn/tags/Neo4j/"/>
</entry>
<entry>
<title>Hello Hexo!</title>
<link href="http://fuyong.net.cn/2018/03/15/hexo-readme/"/>
<id>http://fuyong.net.cn/2018/03/15/hexo-readme/</id>
<published>2018-03-15T15:13:07.776Z</published>
<updated>2020-03-01T11:32:15.616Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ hexo s -g</span><br><span class="line">$ hexo d -g</span><br></pre></td></tr></table></figure><blockquote><p>参考手册:<a href="https://hexo.io/zh-cn/docs/writing.html" target="_blank" rel="noopener">https://hexo.io/zh-cn/docs/writing.html</a></p></blockquote>]]></content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.
</summary>
</entry>
<entry>
<title>银行等额本息还款算法</title>
<link href="http://fuyong.net.cn/2018/03/14/%E9%93%B6%E8%A1%8C%E7%AD%89%E9%A2%9D%E6%9C%AC%E6%81%AF%E8%BF%98%E6%AC%BE%E7%AE%97%E6%B3%95/"/>
<id>http://fuyong.net.cn/2018/03/14/银行等额本息还款算法/</id>
<published>2018-03-14T14:42:14.243Z</published>
<updated>2018-03-18T02:22:37.382Z</updated>
<content type="html"><![CDATA[<p> 等额本息还款,也称定期付息,即借款人每月按相等的金额偿还贷款本息,其中每月贷款利息按月初剩余贷款本金计算并逐月结清。把按揭贷款的本金总额与利息总额相加,然后平均分摊到还款期限的每个月中。作为还款人,每个月还给银行固定金额,但每月还款额中的本金比重逐月递增、利息比重逐月递减。</p><a id="more"></a><p>每月还款额计算公式如下:</p><p>每月还款额=[贷款本金×月利率×(1+月利率)^还款月数]÷[(1+月利率)^还款月数-1]</p><p>java代码如下:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.math.BigDecimal;</span><br><span class="line"> </span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 等额本息还款算法</span></span><br><span class="line"><span class="comment"> * Created by FuYung on 2015/8/3.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">PrincipalAndInterestEquals</span> </span>{</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> args</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> BigDecimal invest = <span class="keyword">new</span> BigDecimal(<span class="number">139000</span>); <span class="comment">// 本金</span></span><br><span class="line"> <span class="keyword">double</span> yearRate = <span class="number">0.059</span>; <span class="comment">// 年利率</span></span><br><span class="line"> <span class="keyword">int</span> year = <span class="number">15</span>;<span class="comment">//期限</span></span><br><span class="line"> <span class="keyword">double</span> monthRate = yearRate / <span class="number">12</span>;</span><br><span class="line"> <span class="keyword">int</span> month = year * <span class="number">12</span>;</span><br><span class="line"> <span class="comment">// 每月本息金额 = (本金×月利率×(1+月利率)^还款月数)÷ ((1+月利率)^还款月数-1)</span></span><br><span class="line"> BigDecimal monthIncome = invest.multiply(<span class="keyword">new</span> BigDecimal(monthRate * Math.pow(<span class="number">1</span> +</span><br><span class="line"> monthRate, month))).divide(<span class="keyword">new</span> BigDecimal(Math.pow(<span class="number">1</span> + monthRate, month) - <span class="number">1</span>), <span class="number">2</span>,</span><br><span class="line"> BigDecimal.ROUND_HALF_UP);</span><br><span class="line"> System.out.println(<span class="string">"每月本息金额 : "</span> + monthIncome);</span><br><span class="line"> System.out.println(<span class="string">"---------------------------------------------------"</span>);</span><br><span class="line"> <span class="comment">// 每月本金 = 本金×月利率×(1+月利率)^(还款月序号-1)÷((1+月利率)^还款月数-1)</span></span><br><span class="line"> BigDecimal monthCapital;</span><br><span class="line"> BigDecimal sumCapital = BigDecimal.ZERO;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i < month + <span class="number">1</span>; i++) {</span><br><span class="line"> monthCapital = invest.multiply(<span class="keyword">new</span> BigDecimal(monthRate * (Math.pow((<span class="number">1</span> + monthRate),</span><br><span class="line"> i - <span class="number">1</span>)))).divide(<span class="keyword">new</span> BigDecimal(Math.pow(<span class="number">1</span> + monthRate, month) - <span class="number">1</span>), <span class="number">2</span>,</span><br><span class="line"> BigDecimal.ROUND_HALF_UP);</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + i + <span class="string">"月本金: "</span> + monthCapital);</span><br><span class="line"> sumCapital = sumCapital.add(monthCapital);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"---------------------------------------------------"</span>);</span><br><span class="line"> <span class="comment">// 每月利息 = 剩余本金 x 贷款月利率</span></span><br><span class="line"> BigDecimal monthInterest;</span><br><span class="line"> BigDecimal capital = invest;</span><br><span class="line"> BigDecimal tmpCapital = BigDecimal.ZERO;</span><br><span class="line"> BigDecimal sumInterest = BigDecimal.ZERO;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i < month + <span class="number">1</span>; i++) {</span><br><span class="line"> capital = capital.subtract(tmpCapital);</span><br><span class="line"> monthInterest = capital.multiply(<span class="keyword">new</span> BigDecimal(monthRate)).setScale(<span class="number">2</span>, BigDecimal</span><br><span class="line"> .ROUND_HALF_UP);</span><br><span class="line"> tmpCapital = invest.multiply(<span class="keyword">new</span> BigDecimal(monthRate * (Math.pow((<span class="number">1</span> + monthRate), i</span><br><span class="line"> - <span class="number">1</span>)))).divide(<span class="keyword">new</span> BigDecimal(Math.pow(<span class="number">1</span> + monthRate, month) - <span class="number">1</span>), <span class="number">2</span>,</span><br><span class="line"> BigDecimal.ROUND_HALF_UP);</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + i + <span class="string">"月利息: "</span> + monthInterest);</span><br><span class="line"> </span><br><span class="line"> sumInterest = sumInterest.add(monthInterest);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"本金总和:"</span> + sumCapital + <span class="string">" 利息总和:"</span> + sumInterest);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p> 等额本息还款,也称定期付息,即借款人每月按相等的金额偿还贷款本息,其中每月贷款利息按月初剩余贷款本金计算并逐月结清。把按揭贷款的本金总额与利息总额相加,然后平均分摊到还款期限的每个月中。作为还款人,每个月还给银行固定金额,但每月还款额中的本金比重逐月递增、利息比重逐月递减。</p>
</summary>
<category term="工作记录" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BD%95/"/>
<category term="金融" scheme="http://fuyong.net.cn/tags/%E9%87%91%E8%9E%8D/"/>
</entry>
<entry>
<title>使用Jasypt对数据库配置文件进行加密</title>
<link href="http://fuyong.net.cn/2018/03/14/%E4%BD%BF%E7%94%A8Jasypt%E5%AF%B9%E6%95%B0%E6%8D%AE%E5%BA%93%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E5%8A%A0%E5%AF%86/"/>
<id>http://fuyong.net.cn/2018/03/14/使用Jasypt对数据库配置文件进行加密/</id>
<published>2018-03-14T14:42:14.242Z</published>
<updated>2018-03-18T02:22:23.270Z</updated>
<content type="html"><![CDATA[<p>在Spring配置文件中常使用占位符(placeholder )来加载资源文件,常常一些资源文件都是已明文形式存放的,比如jdbc配置信息等,从系统安全角度来说,这些信息已明文形式显示总是不好。今天接触Jasypt,查了一些资料学习了下。<br><a id="more"></a><br>Jasypt 是sourceforge.net上的一个开源项目,是一个Java库。更多介绍自行google吧。</p><h2 id="加入Jasypt依赖"><a href="#加入Jasypt依赖" class="headerlink" title="加入Jasypt依赖"></a>加入Jasypt依赖</h2><p>这里我们使用maven<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.jasypt<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jasypt<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.8<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></p><h2 id="加密"><a href="#加密" class="headerlink" title="加密"></a>加密</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">encrypt</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="comment">// 创建加密器</span></span><br><span class="line"> StandardPBEStringEncryptor encryptor = <span class="keyword">new</span> StandardPBEStringEncryptor();</span><br><span class="line"> <span class="comment">// 配置</span></span><br><span class="line"> EnvironmentStringPBEConfig config = <span class="keyword">new</span> EnvironmentStringPBEConfig();</span><br><span class="line"> config.setAlgorithm(<span class="string">"PBEWithMD5AndDES"</span>);<span class="comment">// 加密算法</span></span><br><span class="line"> config.setPassword(<span class="string">"fuyung"</span>);<span class="comment">// 系统属性值</span></span><br><span class="line"> encryptor.setConfig(config);</span><br><span class="line"></span><br><span class="line"> String plaintext = <span class="string">"root"</span>; <span class="comment">//明文</span></span><br><span class="line"> String ciphertext = encryptor.encrypt(plaintext); <span class="comment">// 加密</span></span><br><span class="line"> System.out.println(plaintext + <span class="string">" : "</span> + ciphertext);<span class="comment">// 运行结果:root : 8y9G4kIZQuCHB78mMJNkHw==</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="解密"><a href="#解密" class="headerlink" title="解密"></a>解密</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">decrypt</span><span class="params">()</span> </span>{</span><br><span class="line"> StandardPBEStringEncryptor encryptor = <span class="keyword">new</span> StandardPBEStringEncryptor();</span><br><span class="line"> EnvironmentStringPBEConfig config = <span class="keyword">new</span> EnvironmentStringPBEConfig();</span><br><span class="line"> config.setAlgorithm(<span class="string">"PBEWithMD5AndDES"</span>);</span><br><span class="line"> config.setPassword(<span class="string">"fuyung"</span>);</span><br><span class="line"> encryptor.setConfig(config);</span><br><span class="line"> String ciphertext = <span class="string">"8y9G4kIZQuCHB78mMJNkHw=="</span>;<span class="comment">// 密文</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//解密</span></span><br><span class="line"> String plaintext = encryptor.decrypt(ciphertext); <span class="comment">// 解密</span></span><br><span class="line"> System.out.println(ciphertext + <span class="string">" : "</span> + plaintext);<span class="comment">// 运行结果:8y9G4kIZQuCHB78mMJNkHw== : root</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="与Spring集成"><a href="#与Spring集成" class="headerlink" title="与Spring集成"></a>与Spring集成</h2><p>在Spring的配置文件里面加入如下代码:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"propertyConfigure"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"org.jasypt.spring.properties.EncryptablePropertyPlaceholderConfigurer"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">constructor-arg</span> <span class="attr">ref</span>=<span class="string">"configurationEncryptor"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"systemPropertiesModeName"</span> <span class="attr">value</span>=<span class="string">"SYSTEM_PROPERTIES_MODE_OVERRIDE"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"ignoreResourceNotFound"</span> <span class="attr">value</span>=<span class="string">"true"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"locations"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">list</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>classpath:jdbc.properties<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">list</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"><span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"configurationEncryptor"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"org.jasypt.encryption.pbe.StandardPBEStringEncryptor"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"config"</span> <span class="attr">ref</span>=<span class="string">"environmentVariablesConfiguration"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"environmentVariablesConfiguration"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"algorithm"</span> <span class="attr">value</span>=<span class="string">"PBEWithMD5AndDES"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"clm"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">bean</span>></span></span><br></pre></td></tr></table></figure></p><p>在看一下jdbc.properties文件:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">jdbc.username=ENC(kpKWmxAX2LMUqqkKPCulpTimxznTDxXw)</span><br><span class="line">jdbc.password=ENC(Wg/U1YMQOznH4WyP7HpTTJL0v1KGFLIC)</span><br></pre></td></tr></table></figure><p>注意在你的密文前加上ENC前缀,并用()包起来。为什么要这样写,查看源码便知:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">PropertyValueEncryptionUtils</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String ENCRYPTED_VALUE_PREFIX = <span class="string">"ENC("</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String ENCRYPTED_VALUE_SUFFIX = <span class="string">")"</span>;</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> <span class="title">isEncryptedValue</span><span class="params">(<span class="keyword">final</span> String value)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (value == <span class="keyword">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">final</span> String trimmedValue = value.trim();</span><br><span class="line"> <span class="keyword">return</span> (trimmedValue.startsWith(ENCRYPTED_VALUE_PREFIX) && </span><br><span class="line"> trimmedValue.endsWith(ENCRYPTED_VALUE_SUFFIX));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>这样子在启动Spring容器的时候就会读取到加密的值就会自动进行解密了。</p>]]></content>
<summary type="html">
<p>在Spring配置文件中常使用占位符(placeholder )来加载资源文件,常常一些资源文件都是已明文形式存放的,比如jdbc配置信息等,从系统安全角度来说,这些信息已明文形式显示总是不好。今天接触Jasypt,查了一些资料学习了下。<br>
</summary>
<category term="工作记录" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BD%95/"/>
<category term="Jasypt" scheme="http://fuyong.net.cn/tags/Jasypt/"/>
</entry>
<entry>
<title>成长——就是不断地挣扎</title>
<link href="http://fuyong.net.cn/2018/03/14/%E6%88%90%E9%95%BF%E2%80%94%E2%80%94%E5%B0%B1%E6%98%AF%E4%B8%8D%E6%96%AD%E5%9C%B0%E6%8C%A3%E6%89%8E/"/>
<id>http://fuyong.net.cn/2018/03/14/成长——就是不断地挣扎/</id>
<published>2018-03-14T14:42:14.242Z</published>
<updated>2018-03-18T02:22:29.976Z</updated>
<content type="html"><![CDATA[<p>十年前你是谁,一年前你是谁,甚至昨天你是谁,都不重要。<br>重要的是,今天你是谁,以及明天你将成为谁。<br><a id="more"></a></p><p>人生是很累的,你现在不累,以后就会更累;</p><p>人生是很苦的,你现在不苦,以后就会更苦。</p><p>万物相生相克,无下则无上,无低则无高,无苦则无甜。</p><p>唯累过,方得闲;唯苦过,方知甜。趁着年轻,大胆地走出去,去迎接风霜雨雪的洗礼,练就一颗忍耐、豁达、睿智的心,幸福才会来。</p><p>这世界上除了你自己,没谁可以真正帮到你,就算帮也是暂时的。</p><p>很多人应该都吃过“茶叶蛋”,蛋壳破裂最多的,才是最入味。<br> <br>同样,人生经历愈丰富,挫折愈多,愈有味道。苦难可以帮助一个人成长,而之后的快乐是你想象不到的。</p><p>鸡蛋,从外打破是食物,从内打破是生命。人生亦是,从外打破是压力,从内打破是成长。如果你等待别人从外打破你,那么你注定成为别人的食物;如果能让自己从内打破,那么你会发现自己的成长相当于一种重生。<br> <br>有人看到一只蝴蝶挣扎着想从蛹里脱离出来,他出于好心地帮蝴蝶剪开了蛹。但没想到蝴蝶出来以后,翅膀却张不开,最后死了。</p><p>挣扎的过程正是蝴蝶需要的成长过程,你让它当时舒服了,可是未来它却没有力量去面对生命中更多的挑战。</p><p>如果你希望能化身成蝶,那你就得忍受在蛹里挣扎的痛苦过程,这样才能展翅高飞。</p><p>这世界上,最富有的人,是跌倒最多的人;最勇敢的人,是每次跌倒都能站起来的人;最成功的人,是那些每次跌倒,不单能站起来,还能够坚持走下去的人。</p><p>一生中,你能尊重多少人,就有多少人尊重你。</p><p>你能信任多少人,就有多少人信任你!</p><p>你能让多少人成功,就有多少人帮助你成功!</p>]]></content>
<summary type="html">
<p>十年前你是谁,一年前你是谁,甚至昨天你是谁,都不重要。<br>重要的是,今天你是谁,以及明天你将成为谁。<br>
</summary>
<category term="感悟" scheme="http://fuyong.net.cn/categories/%E6%84%9F%E6%82%9F/"/>
<category term="感悟" scheme="http://fuyong.net.cn/tags/%E6%84%9F%E6%82%9F/"/>
</entry>
<entry>
<title>如何使用Intellij IDEA 推送项目到远程Git仓库</title>
<link href="http://fuyong.net.cn/2018/03/14/%E4%BD%BF%E7%94%A8Intellij%20IDEA%E6%8E%A8%E9%80%81%E9%A1%B9%E7%9B%AE%E5%88%B0%E8%BF%9C%E7%A8%8BGit%E4%BB%93%E5%BA%93/"/>
<id>http://fuyong.net.cn/2018/03/14/使用Intellij IDEA推送项目到远程Git仓库/</id>
<published>2018-03-14T14:42:14.242Z</published>
<updated>2018-03-18T02:22:16.833Z</updated>
<content type="html"><![CDATA[<p>Window下将Intellj IDEA 推送项目到远程Git仓库</p><a id="more"></a><p>在intellij IDEA中 VCS——Import into Version Control——Create Git Repository——选择你的本地项目</p><p>然后cmd进入到你的项目根目录(需要把git配置到环境变量中)</p><p>依次输入以下命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin https://coding.net/FuYung/****.git <span class="comment">#给项目设置远程远程仓库</span></span><br><span class="line">git pull origin master <span class="comment">#抓取远程仓库数据,并自动合并远程分支</span></span><br><span class="line">git push origin master <span class="comment"># 把本地项目推送到远程Git仓库</span></span><br></pre></td></tr></table></figure><p>然后就可以在intellij IDEA中进行update、commit、push等操作了。</p>]]></content>
<summary type="html">
<p>Window下将Intellj IDEA 推送项目到远程Git仓库</p>
</summary>
<category term="工具" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="Intellij IDEA" scheme="http://fuyong.net.cn/tags/Intellij-IDEA/"/>
</entry>
<entry>
<title>一张图教你如何学习新技术</title>
<link href="http://fuyong.net.cn/2018/03/14/%E4%B8%80%E5%BC%A0%E5%9B%BE%E6%95%99%E4%BD%A0%E5%A6%82%E4%BD%95%E5%AD%A6%E4%B9%A0%E6%96%B0%E6%8A%80%E6%9C%AF/"/>
<id>http://fuyong.net.cn/2018/03/14/一张图教你如何学习新技术/</id>
<published>2018-03-14T14:42:14.241Z</published>
<updated>2018-03-18T02:22:04.440Z</updated>
<content type="html"><![CDATA[<p>一张图教你如何学习新技术.<br><a id="more"></a><br><img src="/img/20150916/如何学习新技术.jpg" alt=""></p>]]></content>
<summary type="html">
<p>一张图教你如何学习新技术.<br>
</summary>
<category term="学习记录" scheme="http://fuyong.net.cn/categories/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/"/>
<category term="学习方法" scheme="http://fuyong.net.cn/tags/%E5%AD%A6%E4%B9%A0%E6%96%B9%E6%B3%95/"/>
</entry>
<entry>
<title>Upsource 一个新的代码审查工具</title>
<link href="http://fuyong.net.cn/2018/03/14/upsource-guide/"/>
<id>http://fuyong.net.cn/2018/03/14/upsource-guide/</id>
<published>2018-03-14T14:42:14.241Z</published>
<updated>2018-03-18T02:21:48.955Z</updated>
<content type="html"><![CDATA[<p>Upsource 一个新的代码审查工具(Polyglot code review tool),Upsource安装、配置及使用介绍……<br><a id="more"></a></p><h2 id="写在前面的话"><a href="#写在前面的话" class="headerlink" title="写在前面的话"></a>写在前面的话</h2><p>最近因项目组需要,在寻找一款比较好用的代码审查工具,作为Intellj IDEA重度粉丝,所以优先找的还是能支持Intellij IDEA的工具,正好在JetBrains官网上看到这款Upsource工具,于是打算花了一周时间研究下,于是各种baidu,Google找资料,发现这款工具的中文介绍少之又少,所有就有了这篇文章,此文仅供需要的同仁,如有问题欢迎指正。</p><ul><li>另外在网上也找到<a href="http://www.codeceo.com/article/17-best-code-review-tools.html" target="_blank" rel="noopener">17款最佳的代码审查工具</a>,供大家参考。</li></ul><h2 id="安装与配置"><a href="#安装与配置" class="headerlink" title="安装与配置"></a>安装与配置</h2><h3 id="下载解压"><a href="#下载解压" class="headerlink" title="下载解压"></a>下载解压</h3><p>下载合适版本的Upsource安装程序<a href="https://www.jetbrains.com/upsource/download/" target="_blank" rel="noopener">点击下载</a>,我用的版本为<strong>Upsource-3.5.3550</strong>,将其解压到任意磁盘,进入Upsource根目录(下面统称<code>upsource_home</code>),准备进行安装,</p><h3 id="Win下启动安装配置"><a href="#Win下启动安装配置" class="headerlink" title="Win下启动安装配置"></a>Win下启动安装配置</h3><ul><li>Upsource对比较耗内存,建议机器内存在4G以上</li><li>在Windows环境,为了避免碰到各种奇奇怪怪的问题,最好关闭所有杀毒软件 </li></ul><p>Upsource两种启动方式:作为后台进程进行启动、作为Windows Service安装</p><p>1.运行Upsource作为后台进程进行安装 </p><p><strong>以管理员身份运行</strong>打开cmd,切换到<upsource_home>目录,执行命令<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">upsource_home\bin\upsource.bat start</span><br></pre></td></tr></table></figure></p><p><img src="/img/20161123/upsource/1-1.png" alt=""><br>2.运行Upsource安装为Windows Service<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">upsource_home\bin\upsource.bat service install /runAsSystem</span><br></pre></td></tr></table></figure></p><p>启动完成后会打开默认浏览器网址<strong>http://机器名:80/welcome</strong> 页面,注意在3.5版本中windows默认端口为80,在以前的版本端口默认是8080。这是你会看到如下页面:<br><img src="/img/20161123/upsource/1-2.png" alt=""><br>点击<code>Set up</code>进行安装,这时我们可以修改访问域名和端口<br><img src="/img/20161123/upsource/1-3.png" alt=""><br>点击<code>Next</code>进入用户管理,设置管理员用户名密码<br><img src="/img/20161123/upsource/1-4.png" alt=""><br>点击<code>Next</code>,这里会提示免费版支持10个免费用户,如果你有License Key的话,在这里可以输入。<br><img src="/img/20161123/upsource/1-5.png" alt=""><br>点击<code>Finish</code>,静候安装<br><img src="/img/20161123/upsource/1-6.png" alt=""><br><img src="/img/20161123/upsource/1-7.png" alt=""><br>启动完成后,会默认打开欢迎页面,到这步安装大功告成。<br><img src="/img/20161123/upsource/1-8.png" alt=""></p><h2 id="创建-管理项目"><a href="#创建-管理项目" class="headerlink" title="创建/管理项目"></a>创建/管理项目</h2><p>使用admin账户登录,点击<code>Create Project</code>创建项目<br><img src="/img/20161123/upsource/3-1.png" alt=""><br><img src="/img/20161123/upsource/3-2.png" alt=""><br>点击<code>Create project</code>完成项目创建,接下来就等待代码clone完成。</p><h2 id="设置用户-组-角色权限"><a href="#设置用户-组-角色权限" class="headerlink" title="设置用户/组/角色权限"></a>设置用户/组/角色权限</h2><p>代码下载完成之后,就开始设置用户权限<br><img src="/img/20161123/upsource/2-1.png" alt=""><br>点击<code>Users</code>进行用户/组/角色权限设置,Upsource安装完成之后默认添加了admin和guest用户。<br><img src="/img/20161123/upsource/2-2.png" alt=""><br>设置用户时可以指定用户组,每个项目有三个用户组,分别为<code>Code Viewers</code>、<code>Developers</code>、<code>Project Admin</code>。同一个用户可以拥有多个用户组。<br><img src="/img/20161123/upsource/2-3.png" alt=""><br>角色权限可以设置全局角色和对应某个项目的角色,总共有五种,分别是:<code>Code Viewer</code>、<code>Developer</code>、<code>Observer</code>、<code>Project Admin</code>、<code>System Admin</code>,每个角色所拥有的权限都可以根据自己需求灵活进行配置<br><img src="/img/20161123/upsource/2-4.png" alt=""><br>这里我们为<code>cms</code>项目添加两个用户:<code>Lucy</code>为<code>Project Admin</code>角色,<code>tom</code>为<code>Developer</code>角色</p><h2 id="代码审查(Code-Review)"><a href="#代码审查(Code-Review)" class="headerlink" title="代码审查(Code Review)"></a>代码审查(Code Review)</h2><h3 id="Upsource能为代码审查提供哪些便利"><a href="#Upsource能为代码审查提供哪些便利" class="headerlink" title="Upsource能为代码审查提供哪些便利"></a>Upsource能为代码审查提供哪些便利</h3><ul><li>对多种类型的代码库与软件开发语言进行代码浏览</li><li>对同一个代码库的多个修订版本进行浏览,并且通过一个图形化工具显示多个修订版本之间的关系</li><li>对代码变更进行跟踪,包括提交历史、变更差异比较,以及分支与合并的操作</li><li>对团队的代码进行审查,包括代码的讨论、跟踪代码评论以及最终的结论</li></ul><h3 id="如何进行代码审查"><a href="#如何进行代码审查" class="headerlink" title="如何进行代码审查"></a>如何进行代码审查</h3><p>当开发者<code>tom</code>提交完代码之后,项目管理员<code>Lucy</code>登录到Upsource,可以看到所有项目的索引,每个项目都有对应一个特定的VCS仓库。<br><img src="/img/20161123/upsource/4-1.png" alt=""><br>单击项目名称列出每一次提交的版本,每一次提交的代码罗列,这里你可以浏览代码,创建代码审核,分支列表,分支与分支代码比较,代码提交代码审核分析(可视化图表)……等等你想要的功能。<br><img src="/img/20161123/upsource/4-2.png" alt=""><br>拖动滚动条,将光标移动到需要进行审核的修订版本上,点击<code>Create review</code>创建一次新的代码审查<br><img src="/img/20161123/upsource/4-3.png" alt=""><br><img src="/img/20161123/upsource/4-4.png" alt=""></p><h3 id="代码对比"><a href="#代码对比" class="headerlink" title="代码对比"></a>代码对比</h3><p>点击左边修订版中提交的文件名显示嵌入差异:<br><img src="/img/20161123/upsource/4-5.png" alt=""><br>点击<code>Side-by-side diff</code>可以查看整个文件在提交前后的变化<br><img src="/img/20161123/upsource/4-6.png" alt=""></p><h3 id="关于代码评论"><a href="#关于代码评论" class="headerlink" title="关于代码评论"></a>关于代码评论</h3><p>无论你是作为一个<code>author</code>、<code>reviewer</code>或<code>watcher</code>,你都可以发表评论,发表的评论所有参与的人都可以看得见<br>有三种类型的评论: </p><ul><li>审查意见:这种类型的评论是不是捆绑到任何代码特定文件或部分。</li><li>行级评论:这种类型的注释与特定的代码行相关联。</li><li>代码块评论:这种类型的评论是为了找出一个特定的代码片段中的一个文件进行审查。</li></ul><p>行级评论<br><img src="/img/20161123/upsource/4-7.png" alt=""></p><p>代码块评论<br><img src="/img/20161123/upsource/4-8.png" alt=""></p><h3 id="参与评论"><a href="#参与评论" class="headerlink" title="参与评论"></a>参与评论</h3><p><code>Lucy</code>进行评论后,开发者<code>tom</code>会收到邮件通知,登录<code>tom</code>账户,可以清晰的看到<code>Lucy</code>的评论的代码,可以进行回复。<br><img src="/img/20161123/upsource/4-9.png" alt=""><br>当点击<code>Accept</code>时,表示接受此次修订,此次审查被视为完成。<br><img src="/img/20161123/upsource/4-10.png" alt=""></p><h2 id="Upsource分析功能"><a href="#Upsource分析功能" class="headerlink" title="Upsource分析功能"></a>Upsource分析功能</h2><p>Upsource提供了例如代码提交分析、代码审查分析等功能。<br><img src="/img/20161123/upsource/5-1.png" alt=""></p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>JetBrains提供的Upsource授权计划是根据用户的数量所决定的,不超过10人(去掉admin、guest其实就只有8个用户)的团队可以免费使用。同样,教育机构及非盈利的开源项目也可以免费使用。</p>]]></content>
<summary type="html">
<p>Upsource 一个新的代码审查工具(Polyglot code review tool),Upsource安装、配置及使用介绍……<br>
</summary>
<category term="工具" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="Intellij IDEA" scheme="http://fuyong.net.cn/tags/Intellij-IDEA/"/>
</entry>
<entry>
<title>mysql中my-small.ini、my-medium.ini、my-large.ini、my-huge.ini的作用</title>
<link href="http://fuyong.net.cn/2018/03/14/mysql%E4%B8%ADmy-small.ini%E3%80%81my-medium.ini%E3%80%81my-large.ini%E3%80%81my-huge.ini%E7%9A%84%E4%BD%9C%E7%94%A8/"/>
<id>http://fuyong.net.cn/2018/03/14/mysql中my-small.ini、my-medium.ini、my-large.ini、my-huge.ini的作用/</id>
<published>2018-03-14T14:42:14.241Z</published>
<updated>2018-03-14T14:42:14.241Z</updated>
<content type="html"><![CDATA[<p>相信大家在查询一些关于mysql相关配置问题的时候经常会提到my.ini文件,在默认安装的情况下mysql是不会生成my.ini文件的,在MySQL的安装目录可以看到my-small.ini、my-medium.ini、my-large.ini、my-huge.ini这几个文件,那么这几个文件有什么用呢?<br><a id="more"></a></p><ul><li>1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。</li><li>2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。</li><li>3、my-large.ini是为专用于一个SQL数据库的计算机而设计的。由于它可以为该数据库使用多达512MB的内存,所以在这种类型的系统上将需要至少1GB的RAM,以便它能够同时处理操作系统与数据库应用程序。</li><li>4、my-huge.ini是为企业中的数据库而设计的。这样的数据库要求专用服务器和1GB或1GB以上的RAM。</li></ul><p>这些选择高度依赖于内存的数量、计算机的运算速度、数据库的细节大小、访问数据库的用户数量以及在数据库中装入并访问数据的用户数量。随着数据库和用户的不断增加,数据库的性能可能会发生变化。</p><p>可以根据自己的情况,选择某一个文件中配置复制到my.ini中,my.ini文件当然需要自己创建,直接新建这个文件就行了,然后复制进去配置信息。注意这几个文件是MySQL针对不同的应用推荐不同的环境配置,但是这些配置只有放到my.ini文件中才会生效。</p>]]></content>
<summary type="html">
<p>相信大家在查询一些关于mysql相关配置问题的时候经常会提到my.ini文件,在默认安装的情况下mysql是不会生成my.ini文件的,在MySQL的安装目录可以看到my-small.ini、my-medium.ini、my-large.ini、my-huge.ini这几个文件,那么这几个文件有什么用呢?<br>
</summary>
<category term="工作记录" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E4%BD%9C%E8%AE%B0%E5%BD%95/"/>
<category term="MySQL" scheme="http://fuyong.net.cn/tags/MySQL/"/>
</entry>
<entry>
<title>Upsource 与Intellij IDEA集成</title>
<link href="http://fuyong.net.cn/2018/03/14/upsource-Intellij-IDEA-Integrate/"/>
<id>http://fuyong.net.cn/2018/03/14/upsource-Intellij-IDEA-Integrate/</id>
<published>2018-03-14T14:42:14.241Z</published>
<updated>2018-03-18T02:21:56.597Z</updated>
<content type="html"><![CDATA[<p>本文介绍Upsource 与Intellij IDEA集成、配置及使用介绍……<br><a id="more"></a></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>关于Upsource的基本操作在上篇文章已经介绍了,需要的可以参考这里<a href="http://dreamfy.cn/2016/11/28/upsource-guide/" target="_blank" rel="noopener">点我</a><br>Upsource作为jetbrains家的产品,没理由不支持自家产品Intellij IDEA呢,在这里就介绍一下在Intellij IDEA下如何来操作Upsource进行Code Review吧。</p><ul><li>官方说明是IDEA需<strong>IntelliJ IDEA 15.0.5+</strong>版本。</li></ul><h2 id="安装与配置"><a href="#安装与配置" class="headerlink" title="安装与配置"></a>安装与配置</h2><ul><li>安装之前需确保下载的Upsource插件与你的IDEA是兼容的,相关<a href="https://plugins.jetbrains.com/plugin/7431" target="_blank" rel="noopener">点击查阅</a><br>打开你的开发神器IDEA,为IDEA安装Upsource插件,这里你可以选择去jetbrains官网下载离线安装包进行安装,<a href="https://plugins.jetbrains.com/plugin/7431" target="_blank" rel="noopener">更多版本看这里</a>,也可以在IDEA内在线安装。<br><img src="/img/20161209/Upsource/1-1.png" alt=""></li></ul><p>设置有效的Upsource链接,这里指向的是你的Upsource服务,填入url,测试连接,这时会自动打开浏览器让你输入Upsource的用户名和密码。<br><img src="/img/20161209/Upsource/1-2.png" alt=""></p><p>另外这里可以设置IDEA内提醒功能,当你收到Review信息后会主动提示你。<br><img src="/img/20161209/Upsource/1-3.png" alt=""></p><p>到这基本上就完成了Upsource的安装,你可以在右下角看到这个图标,并且可以选择<code>Switch Project</code>进行项目切换,<code>Change User</code>用户修改,<code>rescan</code>重新扫描项目review记录等等操作<br><img src="/img/20161209/Upsource/1-4.png" alt=""></p><h2 id="代码审核"><a href="#代码审核" class="headerlink" title="代码审核"></a>代码审核</h2><p>开始进行代码审核,为了方便在IDEA里面更好的演示效果,我首先在浏览器上创建一些<code>Code Review</code>。<br><img src="/img/20161209/Upsource/2-1.png" alt=""><br>查看个人首页时是可以查看到所有的<code>Code Review</code>列表,这里可以进行筛选,打开的,关闭的,分配到我的等等<br><img src="/img/20161209/Upsource/2-2.png" alt=""><br>这个时候切换到我们的IDEA工具,点开右侧Upsource小图标bar,可以看到和浏览器上看到的效果一模一样,这也就是意味着,整个<code>Code Review</code>的过程可以在IDEA中完美的完成,相当的优雅。<br><img src="/img/20161209/Upsource/2-3.png" alt=""><br>现在切换到刚刚Review过的<code>BannerController.java</code>类,可以很清楚的看到有一条<code>Code Review</code>的记录,在这里我们可以进行评论,回复,操作等等浏览器可以进行操作的一切。<br><img src="/img/20161209/Upsource/2-4.png" alt=""><br>另外,还可以对<code>Code Review</code>进行标签管理,打标签,新建标签等等。<br><img src="/img/20161209/Upsource/2-5.png" alt=""><br>那么如果一个类出现多处<code>Code Review</code>时又会如何展示呢。下面就在浏览器对<code>BannerController.java</code>类在编写一条Comment。<br><img src="/img/20161209/Upsource/2-6.png" alt=""><br>这时在IDEA里面就可以看到有两条Comment<br><img src="/img/20161209/Upsource/2-7.png" alt=""><br><img src="/img/20161209/Upsource/2-8.png" alt=""></p><h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h2><p>Intellij IDEA与Upsource集成之后,基本上你可以丢弃基于浏览器的操作,这样你可以更加专注的在IDEA里面进行开发,是不是显得非常优雅呢?</p>]]></content>
<summary type="html">
<p>本文介绍Upsource 与Intellij IDEA集成、配置及使用介绍……<br>
</summary>
<category term="工具" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="Intellij IDEA Upsource" scheme="http://fuyong.net.cn/tags/Intellij-IDEA-Upsource/"/>
</entry>
<entry>
<title>Java异常处理及应用</title>
<link href="http://fuyong.net.cn/2018/03/14/java-exception-apply/"/>
<id>http://fuyong.net.cn/2018/03/14/java-exception-apply/</id>
<published>2018-03-14T14:42:14.240Z</published>
<updated>2018-03-18T02:21:05.535Z</updated>
<content type="html"><![CDATA[<p>Java 异常处理是使用 Java语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到软件的稳定性和健壮性。<br><a id="more"></a></p><h3 id="Java异常的层次结构"><a href="#Java异常的层次结构" class="headerlink" title="Java异常的层次结构"></a>Java异常的层次结构</h3><p>在使用Java异常处理之前我们需要先了解一下Java异常类的层次结构。在Java中,所有的异常类都有一个共同的祖先Throwable(可抛出),Throwable有两个非常重要的子类Exception(异常)、Error(错误)。这两个类各自又包含了各自众多的之类。</p><h3 id="Exception"><a href="#Exception" class="headerlink" title="Exception"></a>Exception</h3><p>Exception是应用程序中可能的可预测、可恢复的问题,异常一般是在特定的环境下出现。它有一个重要的子类RuntimeException(运行时异常),RuntimeException类及其子类表示<em>JVM常用操作</em>引发的错误。例如,若试图使用空值对象引用、除数为零或数组越界,则分别引发运行时异常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。</p><h3 id="Error"><a href="#Error" class="headerlink" title="Error"></a>Error</h3><p>Error是应用程序中发生了较严重的错误,大多数的错误与代码编写操作的执行无关,而是代码运行时JVM出现的问题,比如,但JVM没有持续操作所需的资源时会抛出OutOfMemoryError。</p><h3 id="Java异常处理的分类"><a href="#Java异常处理的分类" class="headerlink" title="Java异常处理的分类"></a>Java异常处理的分类</h3><p>Java异常处理可分为三类:可检测异常(checked exception)、非检测异常(unchecked exception)和自定义异常</p><h4 id="可检测异常(checked-exception)"><a href="#可检测异常(checked-exception)" class="headerlink" title="可检测异常(checked exception)"></a>可检测异常(checked exception)</h4><p>可检测异常经编译器验证,对于声明抛出异常的任何方法,编译器将强制执行处理或声明规则,例如:sqlExecption 这个异常就是一个检测异常。你连接 JDBC 时,不捕捉这个异常,编译器就通不过,不允许编译。</p><h4 id="非检测异常"><a href="#非检测异常" class="headerlink" title="非检测异常"></a>非检测异常</h4><p>非检测异常不遵循处理或声明规则。在产生此类异常时,不一定非要采取任何适当操作,编译器不会检查是否已解决了这样一个异常。例如:一个数组为 3 个长度,当你使用下标为3时,就会产生数组下标越界异常。这个异常 JVM 不会进行检测,要靠程序员来判断。有两个主要类定义非检测异常:RuntimeException 和 Error。<br>Error 子类属于非检测异常,因为无法预知它们的产生时间。若 Java 应用程序内存不足,则随时可能出现 OutOfMemoryError;起因一般不是应用程序的特殊调用,而是 JVM 自身的问题。另外,Error 一般表示应用程序无法解决的严重问题。<br>RuntimeException 类也属于非检测异常,因为普通 JVM 操作引发的运行时异常随时可能发生,此类异常一般是由特定操作引发。但这些操作在 Java 应用程序中会频繁出现。因此,它们不受编译器检查与处理或声明规则的限制。</p><h4 id="自定义异常"><a href="#自定义异常" class="headerlink" title="自定义异常"></a>自定义异常</h4><p>自定义异常是为了表示应用程序的一些错误类型,为代码可能发生的一个或多个问题提供新含义。可以显示代码多个位置之间的错误的相似性,也可以区分代码运行时可能出现的相似问题的一个或者多个错误,或给出应用程序中一组错误的特定含义。例如,对队列进行操作时,有可能出现两种情况:空队列时试图删除一个元素;满队列时试图添加一个元素。则需要自定义两个异常来处理这两种情况。</p><h3 id="Java异常的处理"><a href="#Java异常的处理" class="headerlink" title="Java异常的处理"></a>Java异常的处理</h3><p>在Java中,异常处理的方式有两种:异常处理和声明异常</p><h4 id="处理异常:try、catch-和-finally"><a href="#处理异常:try、catch-和-finally" class="headerlink" title="处理异常:try、catch 和 finally"></a>处理异常:try、catch 和 finally</h4><ul><li>try 块:将一个或者多个语句放入try时,则表示这些语句可能抛出异常。</li><li>catch 块:当问题出现时,一种选择是定义代码块来处理问题,catch 块的目的便在于此。catch 块是 try 块所产生异常的接收者。基本原理是:一旦生成异常,则 try 块的执行中止,JVM 将查找相应的 JVM。</li><li>finally 块:还可以定义 finally 块,无论运行 try 块代码的结果如何,该块里面的代码一定运行。在常见的所有环境中,finally 块都将运行。无论 try 块是否运行完,无论是否产生异常,也无论是否在 catch 块中得到处理,finally 块都将执行。<br><strong>try-catch-finally 规则:</strong></li><li>必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。</li><li>必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。catch 块与相应的异常类的类型相关。</li><li>一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。</li><li>可嵌套 try-catch-finally 结构。</li><li>在 try-catch-finally 结构中,可重新抛出异常。</li><li>除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。<h4 id="声明异常"><a href="#声明异常" class="headerlink" title="声明异常"></a>声明异常</h4>声明异常必须将throws关键字添加至方法签名快的最后位置。<br><strong>声明异常的规则:</strong></li><li>必须声明方法可抛出的任何可检测异常(checked exception)。</li><li>非检测性异常(unchecked exception)不是必须的,可声明,也可不声明。</li><li>调用方法必须遵循任何可检测异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。</li></ul><h3 id="Java-异常处理的应用"><a href="#Java-异常处理的应用" class="headerlink" title="Java 异常处理的应用"></a>Java 异常处理的应用</h3><p>说到异常处理的应用,银行取钱这个场景非常适合,在定义银行类时,若取钱数大于余额时需要做异常处理。<br>定义一个异常类 insufficientFundsException。取钱(withdrawal)方法中可能产生异常,条件是余额小于取额。<br>处理异常在调用 withdrawal 的时候,因此 withdrawal 方法要声明抛出异常,由上一级方法调用。<br>异常类:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">InsufficientFundsException</span> <span class="keyword">extends</span> <span class="title">Exception</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> Bank excepbank; <span class="comment">// 银行对象</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">double</span> excepAmount; <span class="comment">// 要取的钱</span></span><br><span class="line"> InsufficientFundsException(Bank ba, <span class="keyword">double</span> dAmount) { </span><br><span class="line"> excepbank=ba;</span><br><span class="line"> excepAmount=dAmount;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">excepMessage</span><span class="params">()</span> </span>{</span><br><span class="line"> String str=<span class="string">"The balance is"</span>+excepbank.balance + <span class="string">"\n"</span>+<span class="string">"The withdrawal was"</span>+excepAmount;</span><br><span class="line"> <span class="keyword">return</span> str;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>银行类:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bank</span> </span>{</span><br><span class="line"> <span class="keyword">double</span> balance;<span class="comment">// 存款数</span></span><br><span class="line"> Bank (<span class="keyword">double</span> balance) {</span><br><span class="line"> <span class="keyword">this</span>.balance=balance;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">deposite</span><span class="params">(<span class="keyword">double</span> dAmount)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(dAmount > <span class="number">0.0</span>) {</span><br><span class="line"> balance += dAmount;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">withdrawal</span><span class="params">(<span class="keyword">double</span> dAmount)</span> <span class="keyword">throws</span> InsufficientFundsException</span>{</span><br><span class="line"> <span class="keyword">if</span> (balance < dAmount) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> InsufficientFundsException(<span class="keyword">this</span>, dAmount);</span><br><span class="line"> }</span><br><span class="line"> balance = balance - dAmount;</span><br><span class="line"> }</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">showBalance</span><span class="params">()</span></span>{</span><br><span class="line"> System.out.println(<span class="string">"The balance is "</span>+(<span class="keyword">int</span>)balance);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>调用:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ExceptionDemo</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span> </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Bank ba = <span class="keyword">new</span> Bank(<span class="number">50</span>);</span><br><span class="line"> ba.withdrawal(<span class="number">100</span>);</span><br><span class="line"> System.out.println(<span class="string">"Withdrawal successful!"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (InsufficientFundsException e) { </span><br><span class="line"> System.out.println(e.toString());</span><br><span class="line"> System.out.println(e.excepMessage());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>Java 异常处理是使用 Java语言进行软件开发和测试脚本开发时不容忽视的问题之一,是否进行异常处理直接关系到软件的稳定性和健壮性。<br>
</summary>
<category term="Java" scheme="http://fuyong.net.cn/categories/Java/"/>
<category term="Java" scheme="http://fuyong.net.cn/tags/Java/"/>
</entry>
<entry>
<title>Java解惑</title>
<link href="http://fuyong.net.cn/2018/03/14/java-disabuse/"/>
<id>http://fuyong.net.cn/2018/03/14/java-disabuse/</id>
<published>2018-03-14T14:42:14.240Z</published>
<updated>2018-03-18T02:21:16.587Z</updated>
<content type="html"><![CDATA[<p>收集实际开发项目中常见的Java问题,持续更新…</p><a id="more"></a><h3 id="三元操作的类型必须一致。"><a href="#三元操作的类型必须一致。" class="headerlink" title="三元操作的类型必须一致。"></a>三元操作的类型必须一致。</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Integer i = <span class="number">80</span>;</span><br><span class="line"> String s1 = String.valueOf(i < <span class="number">100</span> ? <span class="number">90</span> : <span class="number">110</span>);</span><br><span class="line"> String s2 = String.valueOf(i < <span class="number">100</span> ? <span class="number">90</span> : <span class="number">110.0</span>);</span><br><span class="line"></span><br><span class="line"> System.out.println(s.equals(s1));</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>请看上面这段程序,i=80,小于100肯定成立,s1=90,s2=90,此题毋庸置疑肯定是返回true。运行结果刚好相反,返回false。仔细一分析s2中90为int类型,而110.0为float类型。在三元操作中对于两个类型不一致的时候会这么处理呢。s1中90为int类型,110也为int类型。返回值为int类型,然后转换为String类型<br>s1=90,s2中,90为int类型110.0为float类型,结果会int类型会转为float类型为90.0,然后转为String类型。那么90和90.0肯定就不想等了。那么为什么是int类型转float类型而不是float转int呢。这就要看三元操作的类型转换规则了:</p><ul><li>如果两个操作数不可转换,那么就不进行转换,返回Object类型。</li><li>如果两个操作数是明确类型的表达式,则按照正常的二进制数字来转换,int转long,long转float</li><li>如果两个操作数都是直接量数字,则返回范围较大的。</li><li>如果两个操作数中有一个是数字S,另外一个是表达式,且其类型示为T,如果数字S在T的范围内,则转换为T,反之则T转换为S<br>所以我们在实际开发中还是尽量保证三元操作的类型保持一致。</li></ul>]]></content>
<summary type="html">
<p>收集实际开发项目中常见的Java问题,持续更新…</p>
</summary>
<category term="Java" scheme="http://fuyong.net.cn/categories/Java/"/>
<category term="Java" scheme="http://fuyong.net.cn/tags/Java/"/>
</entry>
<entry>
<title>vim学习笔记</title>
<link href="http://fuyong.net.cn/2018/03/14/linux-vim/"/>
<id>http://fuyong.net.cn/2018/03/14/linux-vim/</id>
<published>2018-03-14T14:42:14.240Z</published>
<updated>2018-03-20T14:18:39.190Z</updated>
<content type="html"><![CDATA[<p>vim学习笔记(不要强行记忆,在使用中学习……)<br><a id="more"></a></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><h3 id="为什么写这篇文章"><a href="#为什么写这篇文章" class="headerlink" title="为什么写这篇文章"></a>为什么写这篇文章</h3><p>近日频频在linux上查询各种日志,经常会用到vim命令,遇到一些不常用的vim命令时,第一想法就是去百度、谷歌,每次找一个命令都得花费不少时间,这里把所有常用的vim命令做一个整理,也分享给同样经历的同学,也方便自己以后查阅。</p><h3 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h3><p>为了方便在window下进行学习,先下载一个gvim的编辑器。</p><ul><li>软件 <img src="/img/20161123/gvim.jpg" alt=""> <a href="http://www.vim.org/download.php" target="_blank" rel="noopener">点击下载</a></li><li>注意:vim有两种模式,编辑模式和命令/正常(Normal)模式,编辑模式到命令/正常(Normal)模式通过<code>Esc</code>键进行切换。</li></ul><h3 id="光标移动"><a href="#光标移动" class="headerlink" title="光标移动"></a>光标移动</h3><ul><li><code>k</code>:k 向上移动</li><li><code>h</code>:h 向左边移动</li><li><code>l</code>:l 向右边移动</li><li><code>j</code>:j 向下移动<pre><code> ^ k < h l > j v</code></pre></li><li><code>G</code> :Shift+g 跳转到文本的最后一行</li><li><code>Ctrl + f</code>:下一页<br><em><code>Ctrl + b</code>:上一页</em><code>/ 关键字</code>从前往后搜索,<code>n</code>搜索往下下一条,<code>N</code> 搜索往上一条<br>*<code>? 关键字</code>从后往前搜索,<code>n</code>搜索往下下一条,<code>N</code> 搜索往上一条</li></ul><h3 id="插入和退出"><a href="#插入和退出" class="headerlink" title="插入和退出"></a>插入和退出</h3><ul><li><code>i</code>:在光标所在位置<strong>左边</strong>开始插入文本</li><li><code>a</code>:在光标所在位置<strong>右边</strong>开始插入文本</li><li><code>q</code>:退出vim编辑,不保存</li><li><code>q!</code>:强行退出vim编辑,不保存</li><li><code>wq</code>:保存所有修改</li><li><code>wq!</code>:强制保存所有修改</li></ul><h3 id="删除类操作"><a href="#删除类操作" class="headerlink" title="删除类操作"></a>删除类操作</h3><ul><li><code>x</code>:删除光标所在位置的字符</li><li><code>dw</code>:删除从光标处至一个单字/单词的末尾,包括空格</li><li><code>de</code>:删除从光标处至一个单字/单词的末尾,<strong>不</strong>包括空格</li><li><code>d$</code>:删除从光标处至行末</li><li><code>dd</code>:删除光标所在的整行</li><li><code>2dd</code>:删除光标及光标下一行两行</li></ul><h3 id="撤销类操作"><a href="#撤销类操作" class="headerlink" title="撤销类操作"></a>撤销类操作</h3><ul><li><code>u</code>:小写u,撤销上一次操作</li><li><code>U</code>:大写U,撤销光标所在行所做的改动</li></ul><h3 id="置入类操作"><a href="#置入类操作" class="headerlink" title="置入类操作"></a>置入类操作</h3><ul><li><code>p</code>:小写p,将最后一次删除的内容放置光标之<strong>后</strong></li><li><code>P</code>:大写P,将最后一次删除的内容放置光标之<strong>前</strong></li></ul><h3 id="更改类操作"><a href="#更改类操作" class="headerlink" title="更改类操作"></a>更改类操作</h3><ul><li><code>cw</code>:替换光标所在字符</li></ul><h3 id="搜索类操作"><a href="#搜索类操作" class="headerlink" title="搜索类操作"></a>搜索类操作</h3><ul><li><code>/</code>:输入 / 以及尾随的字符串可以用以在当前文件中<strong>从前往后</strong>查找该字符串,要查找同上一次的字符串,只需要按 n 键。要向相反方向查找同上一次的字符串,请输入 Shift-N 即可。</li><li><code>?</code>:和 / 类似,只是检索的方式是你逆向的,<strong>从后往前</strong>。</li><li><code>%</code>:按 % 可以查找配对的括号 )、]、}</li><li><code>:nohl</code>:取消搜索高亮显示</li><li><code>:set nu</code>:显示行号</li></ul><h3 id="替换类操作"><a href="#替换类操作" class="headerlink" title="替换类操作"></a>替换类操作</h3><ul><li><code>r</code>:输入r和一个字符,将替换光标所在位置的字符</li><li><code>:s/old/new</code>:在光标所在行内替换<strong>头一个</strong>字符串 old 为新的字符串 new</li><li><code>:s/old/new/g</code>:在光标所在行内替换<strong>所有</strong>的字符串 old 为新的字符串 new,请输入</li><li><code>:#,#s/old/new/g</code>:在两行内替换所有的字符串 old 为新的字符串 new</li><li><code>%s/old/new/g</code>:在文件内替换所有的字符串 old 为新的字符串 new</li><li><code>%s/old/new/gc</code>:进行全文替换时询问用户确认每个替换需添加 c 选项</li><li><code>10,20s/old/new</code>:把第 10 行到 20 行之间所有 old 替换为 new</li></ul>]]></content>
<summary type="html">
<p>vim学习笔记(不要强行记忆,在使用中学习……)<br>
</summary>
<category term="学习记录" scheme="http://fuyong.net.cn/categories/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/"/>
<category term="Linux vim" scheme="http://fuyong.net.cn/tags/Linux-vim/"/>
</entry>
<entry>
<title>Intellij IDEA快捷键介绍</title>
<link href="http://fuyong.net.cn/2018/03/14/Intellij%20IDEA%E5%BF%AB%E6%8D%B7%E9%94%AE%E4%BB%8B%E7%BB%8D/"/>
<id>http://fuyong.net.cn/2018/03/14/Intellij IDEA快捷键介绍/</id>
<published>2018-03-14T14:42:14.239Z</published>
<updated>2018-03-18T02:21:35.302Z</updated>
<content type="html"><![CDATA[<p>Intellij IDEA快捷键介绍</p><a id="more"></a><h2 id="Ctrl"><a href="#Ctrl" class="headerlink" title="Ctrl"></a>Ctrl</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Ctrl + F</td><td style="text-align:left">在当前文件进行文本查找 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + R</td><td style="text-align:left">在当前文件进行文本替换 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Z</td><td style="text-align:left">撤销 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Y</td><td style="text-align:left">删除光标所在行 或 删除选中的行 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + X</td><td style="text-align:left">剪切光标所在行 或 剪切选择内容</td></tr><tr><td style="text-align:left">Ctrl + C</td><td style="text-align:left">复制光标所在行 或 复制选择内容</td></tr><tr><td style="text-align:left">Ctrl + D</td><td style="text-align:left">复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + W</td><td style="text-align:left">递进式选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展选中范围 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + E</td><td style="text-align:left">显示最近打开的文件记录列表</td></tr><tr><td style="text-align:left">Ctrl + N</td><td style="text-align:left">根据输入的 <strong>类名</strong> 查找类文件</td></tr><tr><td style="text-align:left">Ctrl + G</td><td style="text-align:left">在当前文件跳转到指定行处</td></tr><tr><td style="text-align:left">Ctrl + J</td><td style="text-align:left">插入自定义动态代码模板</td></tr><tr><td style="text-align:left">Ctrl + P</td><td style="text-align:left">方法参数提示显示</td></tr><tr><td style="text-align:left">Ctrl + Q</td><td style="text-align:left">光标所在的变量 / 类名 / 方法名等上面(也可以在提示补充的时候按),显示文档内容</td></tr><tr><td style="text-align:left">Ctrl + U</td><td style="text-align:left">前往当前光标所在的方法的父类的方法 / 接口定义</td></tr><tr><td style="text-align:left">Ctrl + B</td><td style="text-align:left">进入光标所在的方法/变量的接口或是定义出,等效于 <code>Ctrl + 左键单击</code></td></tr><tr><td style="text-align:left">Ctrl + K</td><td style="text-align:left">版本控制提交项目,需要此项目有加入到版本控制才可用</td></tr><tr><td style="text-align:left">Ctrl + T</td><td style="text-align:left">版本控制更新项目,需要此项目有加入到版本控制才可用</td></tr><tr><td style="text-align:left">Ctrl + H</td><td style="text-align:left">显示当前类的层次结构</td></tr><tr><td style="text-align:left">Ctrl + O</td><td style="text-align:left">选择可重写的方法</td></tr><tr><td style="text-align:left">Ctrl + I</td><td style="text-align:left">选择可继承的方法</td></tr><tr><td style="text-align:left">Ctrl + +</td><td style="text-align:left">展开代码</td></tr><tr><td style="text-align:left">Ctrl + -</td><td style="text-align:left">折叠代码</td></tr><tr><td style="text-align:left">Ctrl + /</td><td style="text-align:left">注释光标所在行代码,会根据当前不同文件类型使用不同的注释符号 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + [</td><td style="text-align:left">移动光标到当前所在代码的花括号开始位置</td></tr><tr><td style="text-align:left">Ctrl + ]</td><td style="text-align:left">移动光标到当前所在代码的花括号结束位置</td></tr><tr><td style="text-align:left">Ctrl + F1</td><td style="text-align:left">在光标所在的错误代码出显示错误信息</td></tr><tr><td style="text-align:left">Ctrl + F3</td><td style="text-align:left">调转到所选中的词的下一个引用位置</td></tr><tr><td style="text-align:left">Ctrl + F4</td><td style="text-align:left">关闭当前编辑文件</td></tr><tr><td style="text-align:left">Ctrl + F8</td><td style="text-align:left">在 Debug 模式下,切换断点</td></tr><tr><td style="text-align:left">Ctrl + F9</td><td style="text-align:left">执行 Make Project 操作</td></tr><tr><td style="text-align:left">Ctrl + F11</td><td style="text-align:left">选中文件 / 文件夹,使用助记符设定 / 取消书签</td></tr><tr><td style="text-align:left">Ctrl + F12</td><td style="text-align:left">弹出当前文件结构层,可以在弹出的层上直接输入,进行筛选</td></tr><tr><td style="text-align:left">Ctrl + Tab</td><td style="text-align:left">编辑窗口切换,如果在切换的过程又加按上delete,则是关闭对应选中的窗口</td></tr><tr><td style="text-align:left">Ctrl + Enter</td><td style="text-align:left">智能分隔行</td></tr><tr><td style="text-align:left">Ctrl + End</td><td style="text-align:left">跳到文件尾</td></tr><tr><td style="text-align:left">Ctrl + Home</td><td style="text-align:left">跳到文件头</td></tr><tr><td style="text-align:left">Ctrl + Space</td><td style="text-align:left">基础代码补全,默认在 Windows 系统上被输入法占用,需要进行修改 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Delete</td><td style="text-align:left">删除光标后面的单词或是中文句</td></tr><tr><td style="text-align:left">Ctrl + BackSpace</td><td style="text-align:left">删除光标前面的单词或是中文句</td></tr><tr><td style="text-align:left">Ctrl + 1,2,3…9</td><td style="text-align:left">定位到对应数值的书签位置</td></tr><tr><td style="text-align:left">Ctrl + 左键单击</td><td style="text-align:left">在打开的文件标题上,弹出该文件路径</td></tr><tr><td style="text-align:left">Ctrl + 光标定位</td><td style="text-align:left">按 Ctrl 不要松开,会显示光标所在的类信息摘要</td></tr><tr><td style="text-align:left">Ctrl + 左方向键</td><td style="text-align:left">光标跳转到当前单词 / 中文句的左侧开头位置</td></tr><tr><td style="text-align:left">Ctrl + 右方向键</td><td style="text-align:left">光标跳转到当前单词 / 中文句的右侧开头位置</td></tr><tr><td style="text-align:left">Ctrl + 前方向键</td><td style="text-align:left">等效于鼠标滚轮向前效果</td></tr><tr><td style="text-align:left">Ctrl + 后方向键</td><td style="text-align:left">等效于鼠标滚轮向后效果</td></tr></tbody></table><h2 id="Alt"><a href="#Alt" class="headerlink" title="Alt"></a>Alt</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Alt + `</td><td style="text-align:left">显示版本控制常用操作菜单弹出层</td></tr><tr><td style="text-align:left">Alt + Q</td><td style="text-align:left">弹出一个提示,显示当前类的声明 / 上下文信息</td></tr><tr><td style="text-align:left">Alt + F1</td><td style="text-align:left">显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择</td></tr><tr><td style="text-align:left">Alt + F2</td><td style="text-align:left">对于前面页面,显示各类浏览器打开目标选择弹出层</td></tr><tr><td style="text-align:left">Alt + F3</td><td style="text-align:left">选中文本,逐个往下查找相同文本,并高亮显示</td></tr><tr><td style="text-align:left">Alt + F7</td><td style="text-align:left">查找光标所在的方法 / 变量 / 类被调用的地方</td></tr><tr><td style="text-align:left">Alt + F8</td><td style="text-align:left">在 Debug 的状态下,选中对象,弹出可输入计算表达式调试框,查看该输入内容的调试结果</td></tr><tr><td style="text-align:left">Alt + Home</td><td style="text-align:left">定位 / 显示到当前文件的 <code>Navigation Bar</code></td></tr><tr><td style="text-align:left">Alt + Enter</td><td style="text-align:left">IntelliJ IDEA 根据光标所在问题,提供快速修复选择,光标放在的位置不同提示的结果也不同 <code>(必备)</code></td></tr><tr><td style="text-align:left">Alt + Insert</td><td style="text-align:left">代码自动生成,如生成对象的 set / get 方法,构造函数,toString() 等</td></tr><tr><td style="text-align:left">Alt + 左方向键</td><td style="text-align:left">按左方向切换当前已打开的文件视图</td></tr><tr><td style="text-align:left">Alt + 右方向键</td><td style="text-align:left">按右方向切换当前已打开的文件视图</td></tr><tr><td style="text-align:left">Alt + 前方向键</td><td style="text-align:left">当前光标跳转到当前文件的前一个方法名位置</td></tr><tr><td style="text-align:left">Alt + 后方向键</td><td style="text-align:left">当前光标跳转到当前文件的后一个方法名位置</td></tr><tr><td style="text-align:left">Alt + 1,2,3…9</td><td style="text-align:left">显示对应数值的选项卡,其中 1 是 Project 用得最多</td></tr></tbody></table><h2 id="Shift"><a href="#Shift" class="headerlink" title="Shift"></a>Shift</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Shift + F1</td><td style="text-align:left">如果有外部文档可以连接外部文档</td></tr><tr><td style="text-align:left">Shift + F2</td><td style="text-align:left">跳转到上一个高亮错误 或 警告位置</td></tr><tr><td style="text-align:left">Shift + F3</td><td style="text-align:left">在查找模式下,查找匹配上一个</td></tr><tr><td style="text-align:left">Shift + F6</td><td style="text-align:left">对文件 / 文件夹 重命名</td></tr><tr><td style="text-align:left">Shift + F7</td><td style="text-align:left">在 Debug 模式下,智能步入</td></tr><tr><td style="text-align:left">Shift + F8</td><td style="text-align:left">在 Debug 模式下,跳出</td></tr><tr><td style="text-align:left">Shift + F9</td><td style="text-align:left">等效于点击工具栏的 <code>Debug</code> 按钮</td></tr><tr><td style="text-align:left">Shift + F10</td><td style="text-align:left">等效于点击工具栏的 <code>Run</code> 按钮</td></tr><tr><td style="text-align:left">Shift + F11</td><td style="text-align:left">弹出书签显示层</td></tr><tr><td style="text-align:left">Shift + Tab</td><td style="text-align:left">取消缩进</td></tr><tr><td style="text-align:left">Shift + ESC</td><td style="text-align:left">隐藏当前 或 最后一个激活的工具窗口</td></tr><tr><td style="text-align:left">Shift + End</td><td style="text-align:left">选中光标到当前行尾位置</td></tr><tr><td style="text-align:left">Shift + Home</td><td style="text-align:left">选中光标到当前行头位置</td></tr><tr><td style="text-align:left">Shift + Enter</td><td style="text-align:left">开始新一行。光标所在行下空出一行,光标定位到新行位置</td></tr><tr><td style="text-align:left">Shift + 左键单击</td><td style="text-align:left">在打开的文件名上按此快捷键,可以关闭当前打开文件</td></tr><tr><td style="text-align:left">Shift + 滚轮前后滚动</td><td style="text-align:left">当前文件的横向滚动轴滚动</td></tr></tbody></table><h2 id="Ctrl-Alt"><a href="#Ctrl-Alt" class="headerlink" title="Ctrl + Alt"></a>Ctrl + Alt</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Ctrl + Alt + L</td><td style="text-align:left">格式化代码,可以对当前文件和整个包目录使用 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Alt + O</td><td style="text-align:left">优化导入的类,可以对当前文件和整个包目录使用 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Alt + I</td><td style="text-align:left">光标所在行 或 选中部分进行自动代码缩进,有点类似格式化</td></tr><tr><td style="text-align:left">Ctrl + Alt + T</td><td style="text-align:left">对选中的代码弹出环绕选项弹出层</td></tr><tr><td style="text-align:left">Ctrl + Alt + J</td><td style="text-align:left">弹出模板选择窗口,讲选定的代码加入动态模板中</td></tr><tr><td style="text-align:left">Ctrl + Alt + H</td><td style="text-align:left">调用层次</td></tr><tr><td style="text-align:left">Ctrl + Alt + B</td><td style="text-align:left">在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口</td></tr><tr><td style="text-align:left">Ctrl + Alt + V</td><td style="text-align:left">快速引进变量</td></tr><tr><td style="text-align:left">Ctrl + Alt + Y</td><td style="text-align:left">同步、刷新</td></tr><tr><td style="text-align:left">Ctrl + Alt + S</td><td style="text-align:left">打开 IntelliJ IDEA 系统设置</td></tr><tr><td style="text-align:left">Ctrl + Alt + F7</td><td style="text-align:left">显示使用的地方。寻找被该类或是变量被调用的地方,用弹出框的方式找出来</td></tr><tr><td style="text-align:left">Ctrl + Alt + F11</td><td style="text-align:left">切换全屏模式</td></tr><tr><td style="text-align:left">Ctrl + Alt + Enter</td><td style="text-align:left">光标所在行上空出一行,光标定位到新行</td></tr><tr><td style="text-align:left">Ctrl + Alt + Home</td><td style="text-align:left">弹出跟当前文件有关联的文件弹出层</td></tr><tr><td style="text-align:left">Ctrl + Alt + Space</td><td style="text-align:left">类名自动完成</td></tr><tr><td style="text-align:left">Ctrl + Alt + 左方向键</td><td style="text-align:left">退回到上一个操作的地方 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Alt + 右方向键</td><td style="text-align:left">前进到上一个操作的地方 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Alt + 前方向键</td><td style="text-align:left">在查找模式下,跳到上个查找的文件</td></tr><tr><td style="text-align:left">Ctrl + Alt + 后方向键</td><td style="text-align:left">在查找模式下,跳到下个查找的文件</td></tr></tbody></table><h2 id="Ctrl-Shift"><a href="#Ctrl-Shift" class="headerlink" title="Ctrl + Shift"></a>Ctrl + Shift</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Ctrl + Shift + F</td><td style="text-align:left">根据输入内容查找整个项目 或 指定目录内文件 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + R</td><td style="text-align:left">根据输入内容替换对应内容,范围为整个项目 或 指定目录内文件 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + J</td><td style="text-align:left">自动将下一行合并到当前行末尾 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + Z</td><td style="text-align:left">取消撤销 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + W</td><td style="text-align:left">递进式取消选择代码块。可选中光标所在的单词或段落,连续按会在原有选中的基础上再扩展取消选中范围 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + N</td><td style="text-align:left">通过文件名定位 / 打开文件 / 目录,打开目录需要在输入的内容后面多加一个正斜杠 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + U</td><td style="text-align:left">对选中的代码进行大 / 小写轮流转换 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + T</td><td style="text-align:left">对当前类生成单元测试类,如果已经存在的单元测试类则可以进行选择</td></tr><tr><td style="text-align:left">Ctrl + Shift + C</td><td style="text-align:left">复制当前文件磁盘路径到剪贴板</td></tr><tr><td style="text-align:left">Ctrl + Shift + V</td><td style="text-align:left">弹出缓存的最近拷贝的内容管理器弹出层</td></tr><tr><td style="text-align:left">Ctrl + Shift + E</td><td style="text-align:left">显示最近修改的文件列表的弹出层</td></tr><tr><td style="text-align:left">Ctrl + Shift + H</td><td style="text-align:left">显示方法层次结构</td></tr><tr><td style="text-align:left">Ctrl + Shift + B</td><td style="text-align:left">跳转到类型声明处</td></tr><tr><td style="text-align:left">Ctrl + Shift + I</td><td style="text-align:left">快速查看光标所在的方法 或 类的定义</td></tr><tr><td style="text-align:left">Ctrl + Shift + A</td><td style="text-align:left">查找动作 / 设置</td></tr><tr><td style="text-align:left">Ctrl + Shift + /</td><td style="text-align:left">代码块注释 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + [</td><td style="text-align:left">选中从光标所在位置到它的顶部中括号位置</td></tr><tr><td style="text-align:left">Ctrl + Shift + ]</td><td style="text-align:left">选中从光标所在位置到它的底部中括号位置</td></tr><tr><td style="text-align:left">Ctrl + Shift + +</td><td style="text-align:left">展开所有代码</td></tr><tr><td style="text-align:left">Ctrl + Shift + -</td><td style="text-align:left">折叠所有代码</td></tr><tr><td style="text-align:left">Ctrl + Shift + F7</td><td style="text-align:left">高亮显示所有该选中文本,按Esc高亮消失</td></tr><tr><td style="text-align:left">Ctrl + Shift + F8</td><td style="text-align:left">在 Debug 模式下,查看断点</td></tr><tr><td style="text-align:left">Ctrl + Shift + F9</td><td style="text-align:left">编译选中的文件 / 包 / Module</td></tr><tr><td style="text-align:left">Ctrl + Shift + F12</td><td style="text-align:left">编辑器最大化</td></tr><tr><td style="text-align:left">Ctrl + Shift + Space</td><td style="text-align:left">智能代码提示</td></tr><tr><td style="text-align:left">Ctrl + Shift + Enter</td><td style="text-align:left">自动结束代码,行末自动添加分号 <code>(必备)</code></td></tr><tr><td style="text-align:left">Ctrl + Shift + Backspace</td><td style="text-align:left">退回到上次修改的地方</td></tr><tr><td style="text-align:left">Ctrl + Shift + 1,2,3…9</td><td style="text-align:left">快速添加指定数值的书签</td></tr><tr><td style="text-align:left">Ctrl + Shift + 左方向键</td><td style="text-align:left">在代码文件上,光标跳转到当前单词 / 中文句的左侧开头位置,同时选中该单词 / 中文句</td></tr><tr><td style="text-align:left">Ctrl + Shift + 右方向键</td><td style="text-align:left">在代码文件上,光标跳转到当前单词 / 中文句的右侧开头位置,同时选中该单词 / 中文句</td></tr><tr><td style="text-align:left">Ctrl + Shift + 左方向键</td><td style="text-align:left">在光标焦点是在工具选项卡上,缩小选项卡区域</td></tr><tr><td style="text-align:left">Ctrl + Shift + 右方向键</td><td style="text-align:left">在光标焦点是在工具选项卡上,扩大选项卡区域</td></tr><tr><td style="text-align:left">Ctrl + Shift + 前方向键</td><td style="text-align:left">光标放在方法名上,将方法移动到上一个方法前面,调整方法排序</td></tr><tr><td style="text-align:left">Ctrl + Shift + 后方向键</td><td style="text-align:left">光标放在方法名上,将方法移动到下一个方法前面,调整方法排序</td></tr></tbody></table><h2 id="Alt-Shift"><a href="#Alt-Shift" class="headerlink" title="Alt + Shift"></a>Alt + Shift</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Alt + Shift + N</td><td style="text-align:left">选择 / 添加 task</td></tr><tr><td style="text-align:left">Alt + Shift + F</td><td style="text-align:left">显示添加到收藏夹弹出层</td></tr><tr><td style="text-align:left">Alt + Shift + C</td><td style="text-align:left">查看最近操作项目的变化情况列表</td></tr><tr><td style="text-align:left">Alt + Shift + F</td><td style="text-align:left">添加到收藏夹</td></tr><tr><td style="text-align:left">Alt + Shift + I</td><td style="text-align:left">查看项目当前文件</td></tr><tr><td style="text-align:left">Alt + Shift + F9</td><td style="text-align:left">弹出 <code>Debug</code> 的可选择菜单</td></tr><tr><td style="text-align:left">Alt + Shift + F10</td><td style="text-align:left">弹出 <code>Run</code> 的可选择菜单</td></tr><tr><td style="text-align:left">Alt + Shift + 左键双击</td><td style="text-align:left">选择被双击的单词 / 中文句,按住不放,可以同时选择其他单词 / 中文句</td></tr><tr><td style="text-align:left">Alt + Shift + 前方向键</td><td style="text-align:left">移动光标所在行向上移动</td></tr><tr><td style="text-align:left">Alt + Shift + 后方向键</td><td style="text-align:left">移动光标所在行向下移动</td></tr></tbody></table><h2 id="Ctrl-Shift-Alt"><a href="#Ctrl-Shift-Alt" class="headerlink" title="Ctrl + Shift + Alt"></a>Ctrl + Shift + Alt</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">Ctrl + Shift + Alt + V</td><td style="text-align:left">无格式黏贴</td></tr><tr><td style="text-align:left">Ctrl + Shift + Alt + N</td><td style="text-align:left">前往指定的变量 / 方法</td></tr><tr><td style="text-align:left">Ctrl + Shift + Alt + S</td><td style="text-align:left">打开当前项目设置</td></tr><tr><td style="text-align:left">Ctrl + Shift + Alt + C</td><td style="text-align:left">复制参考信息</td></tr></tbody></table><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><table><thead><tr><th style="text-align:left">快捷键</th><th style="text-align:left">介绍</th></tr></thead><tbody><tr><td style="text-align:left">F2</td><td style="text-align:left">跳转到下一个高亮错误 或 警告位置 <code>(必备)</code></td></tr><tr><td style="text-align:left">F3</td><td style="text-align:left">在查找模式下,定位到下一个匹配处</td></tr><tr><td style="text-align:left">F4</td><td style="text-align:left">编辑源</td></tr><tr><td style="text-align:left">F7</td><td style="text-align:left">在 Debug 模式下,进入</td></tr><tr><td style="text-align:left">F8</td><td style="text-align:left">在 Debug 模式下,跳过,进入下一步</td></tr><tr><td style="text-align:left">F9</td><td style="text-align:left">在 Debug 模式下,恢复程序运行</td></tr><tr><td style="text-align:left">F11</td><td style="text-align:left">添加书签</td></tr><tr><td style="text-align:left">F12</td><td style="text-align:left">回到前一个工具窗口</td></tr><tr><td style="text-align:left">Tab</td><td style="text-align:left">缩进</td></tr><tr><td style="text-align:left">ESC</td><td style="text-align:left">从工具窗口进入代码文件窗口</td></tr></tbody></table><h2 id="官网快捷键资料"><a href="#官网快捷键资料" class="headerlink" title="官网快捷键资料"></a>官网快捷键资料</h2><blockquote><ul><li>Windows / Linux:<a href="https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard.pdf" target="_blank" rel="noopener">https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard.pdf</a></li><li>Mac OS X:<a href="https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf" target="_blank" rel="noopener">https://www.jetbrains.com/idea/docs/IntelliJIDEA_ReferenceCard_Mac.pdf</a></li></ul></blockquote><h2 id="第三方快捷键资料"><a href="#第三方快捷键资料" class="headerlink" title="第三方快捷键资料"></a>第三方快捷键资料</h2><blockquote><ul><li>来自 eta02913:<a href="http://xinyuwu.iteye.com/blog/1005454" target="_blank" rel="noopener">http://xinyuwu.iteye.com/blog/1005454</a></li></ul></blockquote><h2 id="版本"><a href="#版本" class="headerlink" title="版本"></a>版本</h2><blockquote><ul><li>版本1.0 2015年07月</li><li>来源 Judas.n:<a href="http://www.YouMeek.com" target="_blank" rel="noopener">http://www.YouMeek.com</a></li></ul></blockquote>]]></content>
<summary type="html">
<p>Intellij IDEA快捷键介绍</p>
</summary>
<category term="工具" scheme="http://fuyong.net.cn/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="Intellij IDEA" scheme="http://fuyong.net.cn/tags/Intellij-IDEA/"/>
</entry>
<entry>
<title>Java基础知识归档</title>
<link href="http://fuyong.net.cn/2018/03/14/java-base/"/>
<id>http://fuyong.net.cn/2018/03/14/java-base/</id>
<published>2018-03-14T14:42:14.239Z</published>
<updated>2018-03-18T02:21:39.163Z</updated>
<content type="html"><![CDATA[<p>Java基础知识归档</p><a id="more"></a><h2 id="基础语法"><a href="#基础语法" class="headerlink" title="基础语法"></a>基础语法</h2><h3 id="Java数据类型"><a href="#Java数据类型" class="headerlink" title="Java数据类型"></a>Java数据类型</h3><p>Java是一种强类型的语言,每个变量都必须声明其类型<br>Java数据类型分为:<strong>基本数据类型</strong>和<strong>引用数据类型</strong><br>基本数据类型中整数类型(byte,short,int,long),浮点类型(float,double),字符类型(char),布尔类型(boolean);<br>引用数据类型为类(class),接口(interface),数组;<br><strong> Java语言整数的三种形式:</strong></p><ul><li>十进制整型 如:1,3,5,7,9</li><li>八进制整型 以0开头,如010</li><li>十六进制整型 以0x开头,如0x14</li><li>二进制 以0b开头,下划线分割,如0b0000_0000_0000_0000_0000_0000_0000_0011 (<em>jdk7新特性</em>)</li></ul><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">占用存储空间</th><th style="text-align:left">表数范围</th></tr></thead><tbody><tr><td style="text-align:left">byte</td><td style="text-align:left">1字节</td><td style="text-align:left">-128~127</td></tr><tr><td style="text-align:left">short</td><td style="text-align:left">2字节</td><td style="text-align:left">-2^15~2^15-1(-32768~32767)</td></tr><tr><td style="text-align:left">int</td><td style="text-align:left">4字节</td><td style="text-align:left">约21亿</td></tr><tr><td style="text-align:left">long</td><td style="text-align:left">8字节</td><td style="text-align:left">-2^63~2^63-1</td></tr><tr><td style="text-align:left">float</td><td style="text-align:left">4字节</td><td style="text-align:left">-3.403E38~3.403E38</td></tr><tr><td style="text-align:left">double</td><td style="text-align:left">8字节</td><td style="text-align:left">-1.798E308~1.798E308</td></tr><tr><td style="text-align:left">char</td><td style="text-align:left">2字节</td><td style="text-align:left">0~65535</td></tr><tr><td style="text-align:left">boolean</td><td style="text-align:left"><strong>1位</strong></td><td style="text-align:left">0,1</td></tr></tbody></table><h3 id="Java中的类型转型"><a href="#Java中的类型转型" class="headerlink" title="Java中的类型转型"></a>Java中的类型转型</h3><p><strong>自动类型转换</strong><br>容量小的类型可以直接转为容量大的类型<br>如:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> i = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">float</span> f = i;</span><br><span class="line"><span class="keyword">double</span> d = f;</span><br></pre></td></tr></table></figure></p><p>特例:将整型数据直接赋值给byte,short等类型的变量时,如果不超出其表数范围,即不需要进行强制转换。<br>如:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">byte</span> b = <span class="number">100</span>;</span><br></pre></td></tr></table></figure></p><p>此处的100为int类型,int占4字节,而byte只占1字节,4字节转1字节为什么会编译通过呢?由于byte表数范围在-128~127,所以此处编译通过,反之byte=200即报错。<br><strong>强制类型转换</strong><br>强制类型转换又称造型,用于显式的转换一个数值的类型,在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或者溢出。<br><strong>如果将一种类型强制转换为另外一种类型,而又超出了目标类型的表数范围,就会被截取成为一个完全不同的值</strong><br>例如:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> i = -<span class="number">100</span>;</span><br><span class="line"><span class="keyword">char</span> c = (<span class="keyword">char</span>)i;<span class="comment">// -100不在0~65535范围内</span></span><br></pre></td></tr></table></figure></p><p><strong>表达式的类型提升问题</strong><br>例如:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> a = <span class="number">3</span>;</span><br><span class="line"><span class="keyword">long</span> b = <span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> c = a + b;</span><br></pre></td></tr></table></figure></p><p>编译报错,因为a+b类型提升为long类型。如需编译通过,需要(int)(a+b);</p><h3 id="Java访问级别"><a href="#Java访问级别" class="headerlink" title="Java访问级别"></a>Java访问级别</h3><p>在java中共有4种访问级别,按访问权限由<strong>高</strong>到<strong>低</strong>为:public(公有的)、protected(受保护的)、友好的(default没有任何访问权限关键字修饰)和private(私有的)。</p><table><thead><tr><th style="text-align:left">级别</th><th style="text-align:left">同类</th><th style="text-align:left">同包</th><th style="text-align:left">子类</th><th style="text-align:left">不同包</th></tr></thead><tbody><tr><td style="text-align:left">public</td><td style="text-align:left">√</td><td style="text-align:left">√</td><td style="text-align:left">√</td><td style="text-align:left">√</td></tr><tr><td style="text-align:left">protected</td><td style="text-align:left">√</td><td style="text-align:left">√</td><td style="text-align:left">√</td><td style="text-align:left">×</td></tr><tr><td style="text-align:left">default</td><td style="text-align:left">√</td><td style="text-align:left">√</td><td style="text-align:left">×</td><td style="text-align:left">×</td></tr><tr><td style="text-align:left">private</td><td style="text-align:left">√</td><td style="text-align:left">×</td><td style="text-align:left">×</td><td style="text-align:left">×</td></tr></tbody></table><h3 id="Java中的位运算符"><a href="#Java中的位运算符" class="headerlink" title="Java中的位运算符"></a>Java中的位运算符</h3><p>经典面试题:最有效率的方式算出2乘以8等于多少,答案是2 << 3 。<br>我们知道:<br>位运算:m << n 等于 m × 2^n<br>位运算:m >> n 等于 m / n × 2<br>即将一个数 <code>m</code> 左移 <code>n</code> 位,就相当于 <code>m</code>乘以2的 <code>n</code> 次方;<br>相反将一个数 <code>m</code> 右移 <code>n</code> 位,就相当于 <code>m</code> 除以<code>(n×2)</code>。<br>那么,一个数乘以8只要将其左移3位,即2 << 3</p>]]></content>
<summary type="html">
<p>Java基础知识归档</p>
</summary>
<category term="Java" scheme="http://fuyong.net.cn/categories/Java/"/>
<category term="Java" scheme="http://fuyong.net.cn/tags/Java/"/>
</entry>
</feed>