-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1084 lines (850 loc) · 218 KB
/
Copy pathindex.html
File metadata and controls
1084 lines (850 loc) · 218 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
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hexo</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Hexo">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Hexo">
<link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">Hexo</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" results="0" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-hexo-tips" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/09/04/hexo-tips/" class="article-date">
<time datetime="2017-09-04T09:31:56.000Z" itemprop="datePublished">2017-09-04</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/09/04/hexo-tips/">从 CSDN 博客迁移到个人 Hexo 站点的一点坑</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>最近把 原来 CSDN 博客迁移到了个人博客。</p>
<p>原先 CSDN 博客:<a href="http://blog.csdn.net/never_cxb" target="_blank" rel="external">http://blog.csdn.net/never_cxb</a></p>
<p>独立个人博客:<a href="http://www.alijava.com/" target="_blank" rel="external">http://www.alijava.com/</a></p>
<h2 id="配置信息"><a href="#配置信息" class="headerlink" title="配置信息"></a>配置信息</h2><ul>
<li>由 Hexo 强力驱动 </li>
<li>主题 - NexT.Mist</li>
<li>图片存储于七牛云 </li>
<li>服务器 nginx</li>
<li>部署于阿里云</li>
<li>已备案</li>
<li>评论: 多说</li>
<li>统计阅读次数:LeanCloud</li>
<li>搜索引擎优化:百度站长</li>
</ul>
<p>如果您还没有注册七牛,可以通过我的邀请链接注册 <a href="https://portal.qiniu.com/signup?code=3lpzf1unpyr0y" target="_blank" rel="external">https://portal.qiniu.com/signup?code=3lpzf1unpyr0y</a>,可以享受特有优惠以及免费空间。</p>
<h2 id="nginx-常用命令"><a href="#nginx-常用命令" class="headerlink" title="nginx 常用命令"></a>nginx 常用命令</h2><ul>
<li><code>sudo service nginx restart</code> 重启服务器nginx</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">sudo service nginx start</div><div class="line">sudo service nginx stop</div><div class="line">sudo service nginx restart</div></pre></td></tr></table></figure>
<p>安装 <code>next</code> 官网教程配置<strong>腾讯404 页面</strong>,发现总是无法显示</p>
<p>后来发现是因为<code>nginx</code>的问题,需要配置 <code>404</code>路径,</p>
<p>设 404 为 <code>hexo</code> 的 <code>public</code> 目录 <code>/usr/local/hexo/blog/public</code></p>
<p>加上 <code>fastcgi_intercept_errors on</code>,现在就可以正常访问了</p>
<p><a href="http://www.alijava.com/404.html" target="_blank" rel="external">http://www.alijava.com/404.html</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">error_page 404 /404.html;</div><div class="line"></div><div class="line">location = /404.html {</div><div class="line"> root /usr/local/hexo/blog/public;</div><div class="line">}</div><div class="line"></div><div class="line">fastcgi_intercept_errors on;</div></pre></td></tr></table></figure>
<h2 id="Todo-List"><a href="#Todo-List" class="headerlink" title="Todo List"></a>Todo List</h2><ul>
<li>git 版本控制,备份</li>
<li>推广,搜索引擎优化</li>
</ul>
<h2 id="Hexo-常用命令"><a href="#Hexo-常用命令" class="headerlink" title="Hexo 常用命令"></a>Hexo 常用命令</h2><ul>
<li><p><code>hexo new "java-basics" 或者 hexo n "java-basics"</code></p>
</li>
<li><p><code>hexo generate 或者 hexo g</code> 生成静态文件至<code>public</code>目录</p>
</li>
<li><p><code>hexo server 或者 hexo s</code> 启动服务预览</p>
</li>
<li><p><code>hexo s -p 5000</code> 将默认端口<code>4000</code>修改为<code>5000</code></p>
</li>
</ul>
<h2 id="保持ssh连接不断线"><a href="#保持ssh连接不断线" class="headerlink" title="保持ssh连接不断线"></a>保持ssh连接不断线</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ssh -o ServerAliveInterval=60 root@115.**.**.**</div></pre></td></tr></table></figure>
<p>意思是每60秒发送一个信号重连</p>
<h1 id="搜索引擎优化"><a href="#搜索引擎优化" class="headerlink" title="搜索引擎优化"></a>搜索引擎优化</h1><p>主要是通过百度站长平台,希望能够提升博客在搜索引擎的收录数量及排序位置</p>
<h2 id="主动推送-实时"><a href="#主动推送-实时" class="headerlink" title="主动推送(实时)"></a>主动推送(实时)</h2><p>官方文档这么说:</p>
<p>将要提交的链接按照每行一条的格式写入一个文本文件中,命名此文件为urls.txt,<br>然后进入该文件所在目录,执行如下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=www.alijava.com&token=2FncXBwaZ5iVh5oT"</div></pre></td></tr></table></figure></p>
<p>为了方便提交,写了一个脚本,方便 <code>curl</code> 提交链接。</p>
<p>(1)<code>ls source/_posts | grep ".md$"</code> ,输出<code>source/_posts</code>以<code>.md</code>结尾的文件名<br>(2)笔者的文章 <code>url</code> 为 <code>http://www.alijava.com/</code> + 文件名,利用 <code>sed -e 's/\.md$//'</code>去掉后缀 <code>.md</code><br>(3)<code>sed -e 's/^/http:\/\/www.alijava.com\//'</code>加上网站前缀</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">ls source/_posts | grep ".md$" | sed -e 's/\.md$//' -e 's/^/http:\/\/www.alijava.com\//' > urls.txt</div><div class="line">echo `curl -H 'Content-Type:text/plain' --data-binary @urls.txt "http://data.zz.baidu.com/urls?site=www.alijava.com&token=你的token"`</div></pre></td></tr></table></figure>
<h2 id="sitemap"><a href="#sitemap" class="headerlink" title="sitemap"></a>sitemap</h2><p>注意在你的<strong>hexo 博客目录</strong>,执行下面命令</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">npm install hexo-generator-sitemap --save</div><div class="line">npm install hexo-generator-baidu-sitemap --save</div></pre></td></tr></table></figure>
<p><strong>站点配置文件</strong> 增加<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">sitemap:</div><div class="line"> path: sitemap.xml</div><div class="line">baidusitemap:</div><div class="line"> path: baidusitemap.xml</div></pre></td></tr></table></figure></p>
<p>然后重新编译并部署</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">hexo clean</div><div class="line">hexo g</div></pre></td></tr></table></figure>
<p>站点地图就可以通过下面链接访问了</p>
<ul>
<li><a href="http://alijava.com/sitemap.xml" target="_blank" rel="external">http://alijava.com/sitemap.xml</a></li>
<li><a href="http://alijava.com/baidusitemap.xml" target="_blank" rel="external">http://alijava.com/baidusitemap.xml</a></li>
</ul>
<h2 id="sitemap-的坑"><a href="#sitemap-的坑" class="headerlink" title="sitemap 的坑"></a>sitemap 的坑</h2><p>把生成的<code>sitemap</code>提交百度站长之家后,发现状态为<code>主域校验失败</code></p>
<p>原因是生成的 <code>sitemap.xml</code> 里面的是 <code>http://yoursite.com/common-tools/</code>,前缀不是网站真实网址</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">url</span>></span></div><div class="line"><span class="tag"><<span class="name">loc</span>></span>http://yoursite.com/common-tools/<span class="tag"></<span class="name">loc</span>></span></div><div class="line"><span class="tag"><<span class="name">lastmod</span>></span>2016-09-03T08:28:25.843Z<span class="tag"></<span class="name">lastmod</span>></span></div><div class="line"><span class="tag"></<span class="name">url</span>></span></div></pre></td></tr></table></figure>
<p>目前的方法是手动修改 <code>sitemap.xml</code> 和<code>baidusitemap.xml</code>,但是每次<code>hexo g</code>部署之后都需要修改,<strong>不知道有没有其他方法</strong>?</p>
<p>可以利用 <code>vim</code> 修改文件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">:%s/yoursite/www.alijava/g</div></pre></td></tr></table></figure>
<p>将<code>yoursite.com</code>替换为<code>www.alijava.com</code>,<code>g</code>表示替换所有</p>
<h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><ul>
<li><a href="http://oakland.github.io/2016/05/02/hexo-%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90%E4%B8%80%E7%AF%87%E6%96%B0%E7%9A%84post/" target="_blank" rel="external">http://oakland.github.io/2016/05/02/hexo-%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90%E4%B8%80%E7%AF%87%E6%96%B0%E7%9A%84post/</a></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/09/04/hexo-tips/" data-id="ciyyds55n000fbuxbfn2yw5hw" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/工具/">工具</a></li></ul>
</footer>
</div>
</article>
<article id="post-hello-world" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/02/09/hello-world/" class="article-date">
<time datetime="2017-02-09T12:16:16.000Z" itemprop="datePublished">2017-02-09</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/02/09/hello-world/">Hello World</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">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="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">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><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new <span class="string">"My New Post"</span></div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">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><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">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><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">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><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/02/09/hello-world/" data-id="ciyyds561000rbuxb5dsfryji" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-campus-interview" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/11/25/campus-interview/" class="article-date">
<time datetime="2016-11-25T12:49:35.000Z" itemprop="datePublished">2016-11-25</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/11/25/campus-interview/">2017互联网校园招聘的一些面试题</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>参加了2017年校招,面试了阿里、百度、腾讯、滴滴、美团、网易、去哪儿等公司,个人是客户端 Android 方向,总结了面试过程中频率出现较高的题目,希望对大家有所帮助。</p>
<h2 id="Java-一些知识点"><a href="#Java-一些知识点" class="headerlink" title="Java 一些知识点"></a>Java 一些知识点</h2><h3 id="Object-有哪些方法"><a href="#Object-有哪些方法" class="headerlink" title="Object 有哪些方法"></a>Object 有哪些方法</h3><ul>
<li><code>public</code> 方法:<code>getClass</code>、<code>equals</code>、<code>hashCode</code>、<code>toString</code>、<code>wait</code>、<code>notify</code></li>
<li><code>protected</code> 方法:<code>clone</code>、<code>finalize</code></li>
<li><code>private</code> 方法:<code>registerNatives</code>,该方法作用是将不同平台C/C++实现的方法映射到Java中的<code>native</code>方法</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Object</span> </span>{</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">native</span> <span class="keyword">void</span> <span class="title">registerNatives</span><span class="params">()</span></span>;</div><div class="line"> <span class="comment">// 声明后有紧接静态代码块</span></div><div class="line"> <span class="keyword">static</span> {</div><div class="line"> registerNatives();</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h3 id="自动装箱"><a href="#自动装箱" class="headerlink" title="自动装箱"></a>自动装箱</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div 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>{</div><div class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</div><div class="line"> Integer j = <span class="keyword">new</span> Integer(<span class="number">0</span>);</div><div class="line"> System.out.println(j == i);</div><div class="line"> System.out.println(j.equals(i));</div><div class="line">}</div></pre></td></tr></table></figure>
<p>上述代码的输出是<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">true</span></div><div class="line"><span class="keyword">true</span></div></pre></td></tr></table></figure></p>
<h3 id="Java-虚拟机-GC-根节点的选择"><a href="#Java-虚拟机-GC-根节点的选择" class="headerlink" title="Java 虚拟机 GC 根节点的选择"></a>Java 虚拟机 GC 根节点的选择</h3><p>Java通过<strong>可达性分析</strong>来判断对象是否存活。基本思想是通过一系列称为”GC roots”的对象作为起始点,可以作为根节点的是:</p>
<ul>
<li>虚拟机栈(栈帧中的本地变量表)中引用的对象</li>
<li>本地方法栈中 JNI(即一般说的 Native 方法)引用的对象</li>
<li>方法区中类静态属性引用的对象</li>
<li>方法区中常量引用的对象</li>
</ul>
<p>笔者这么理解,作为GC Roots的节点主要在<strong>全局性</strong>的引用(例如常量或类静态属性)与<strong>执行上下文</strong>(例如栈帧中的本地变量表)中。<br>虚拟机栈、本地方法栈这都是局部变量,某个方法执行完,某些局部使用的对象可以被回收。</p>
<h3 id="类加载机制"><a href="#类加载机制" class="headerlink" title="类加载机制"></a>类加载机制</h3><ul>
<li><p>启动类加载器( Bootstrap ClassLoader)</p>
<p> 启动类加载器无法被 java 程序员直接引用, 这个类加载器负责把存放在<code><JAVA_HOME>\lib</code>目录中的, 或者被<code>-Xbootclasspath</code>参数指定路径中的, 并且是被虚拟机识别的类库加载到虚拟机内存中.</p>
</li>
<li><p>扩展类加载器(Extension ClassLoader)</p>
<p> 负责加载在<code><JAVA_HOME>\lib\ext</code>目录中的, 或者被<code>java.ext.dirs</code>系统变量所指定的路径中的所有类库。</p>
</li>
<li><p>应用程序类加载器( Application ClassLoader )</p>
<p> 这个类加载器是<code>ClassLoader</code> 中的 <code>getSystemClassLoader()</code>方法的返回值, 一般称其为系统类加载器, 它负责加载用户类路径( <code>ClassPath</code> )上所指定的类库</p>
</li>
</ul>
<p>从 java 虚拟机的角度而降, 只存在两种不同的类加载器:</p>
<ul>
<li><p>一个是启动类加载器( <code>Bootstrap ClassLoader</code> ), 这个类加载使用 C++ 语言实现, 是虚拟机自身的一部分;</p>
</li>
<li><p>另一种是其他所有的类加载器, 他们由 java 语言实现, 独立于虚拟机之外, 并且全部继承自<code>java.lang.ClassLoader</code></p>
</li>
</ul>
<p>加载类的寻找范围就是 JVM 默认路径加上<code>Classpath</code>, 类具体是使用哪个类加载器不确定。</p>
<h3 id="类加载主要步骤"><a href="#类加载主要步骤" class="headerlink" title="类加载主要步骤"></a>类加载主要步骤</h3><ul>
<li>加载 把 class 文件的二进制字节流加载到 jvm 里面</li>
<li>验证 确保 class 文件的字节流包含的信息符合当前 jvm 的要求 有文件格式验证, 元数据验证, 字节码验证, 符号引用验证等</li>
<li>准备 正式为类变量分配内存并设置类变量初始值的阶段, 初始化为各数据类型的零值</li>
<li>解析 把常量值内的符号引用替换为直接引用的过程</li>
<li>初始化 执行类构造器<code><clinit>()</code>方法</li>
<li>使用 根据相应的业务逻辑代码使用该类</li>
<li>卸载 类从方法区移除</li>
</ul>
<h3 id="双亲委派模型"><a href="#双亲委派模型" class="headerlink" title="双亲委派模型"></a>双亲委派模型</h3><p>除了顶层的启动类加载器之外, 其余的类加载器都应当有自己的父类加载器, 父子关系这儿一般都是以组合来实现。</p>
<p>工作过程: 如果一个类加载器收到了类加载的请求, 它首先不会自己去尝试加载这个类, 而是把这个请求委派给父类加载器去完成, 最终所有的加载请求都会传送到顶层的启动类加载器中, 只有当父类加载器反馈自己无法完成这个请求时候, 才由子加载器来加载。</p>
<p>例如类<code>Object</code>,它放在<code>rt.jar</code>中,无论哪一个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此<code>Object</code>类在程序的各种类加载器环境中都是同一个类。</p>
<p>对于任何一个类, 都需要由加载它的类加载器和这个类本身一同确定其在 java 虚拟机中的唯一性。</p>
<p><code>ClassLoader.loadClass()</code>的代码如下,先检查是否已经被加载过,如果没有则<code>parent.loadClass()</code>调用父加载器的<code>loadClass()</code>方法,如果父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载器加载失败,抛出<code>ClassNotFoundException</code>,再调用自己的<code>findClass()</code>方法进行加载。</p>
<p>另外,如果我们自己实现类加载器,一般是<code>Override</code>复写 <code>findClass</code>方法,而不是<code>loadClass</code>方法。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line">protected Class<?> loadClass(String name, boolean resolve)</div><div class="line">throws ClassNotFoundException {</div><div class="line"> synchronized (getClassLoadingLock(name)) {</div><div class="line"> // First, check if the class has already been loaded</div><div class="line"> Class c = findLoadedClass(name);</div><div class="line"> if (c == null) {</div><div class="line"> long t0 = System.nanoTime();</div><div class="line"> try {</div><div class="line"> if (parent != null) {</div><div class="line"> c = parent.loadClass(name, false);</div><div class="line"> } else {</div><div class="line"> c = findBootstrapClassOrNull(name);</div><div class="line"> }</div><div class="line"> } catch (ClassNotFoundException e) {</div><div class="line"> // ClassNotFoundException thrown if class not found</div><div class="line"> // from the non-null parent class loader</div><div class="line"> }</div><div class="line"></div><div class="line"> if (c == null) {</div><div class="line"> // If still not found, then invoke findClass in order</div><div class="line"> // to find the class.</div><div class="line"> long t1 = System.nanoTime();</div><div class="line"> c = findClass(name); //可以Override该方法</div><div class="line"> }</div><div class="line"> }</div><div class="line"> if (resolve) {</div><div class="line"> resolveClass(c);</div><div class="line"> }</div><div class="line"> return c;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="Java-后台的一点知识"><a href="#Java-后台的一点知识" class="headerlink" title="Java 后台的一点知识"></a>Java 后台的一点知识</h2><h3 id="JSP-与-Servlet-的关系"><a href="#JSP-与-Servlet-的关系" class="headerlink" title="JSP 与 Servlet 的关系"></a>JSP 与 Servlet 的关系</h3><ul>
<li>Tomcat 等 Web 容器最终会把 JSP转化为 Servlet</li>
<li>Jsp更擅长表现于页面显示, Servlet更擅长于逻辑控制</li>
<li>Servlet是利用 <code>System.out.println()</code>来输出 html 代码,由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率低下</li>
<li>JSP通过在标准的HTML页面中嵌入Java代码,其静态的部分无须Java程序控制,Java 代码只控制那些动态生成的信息</li>
<li>最终 JSP 被容器解释为 Servlet,其中Html 代码也是用 <code>System.out.println()</code>等拼接输出的</li>
<li>JSP 第一次访问的时候,要转化为 java 文件,然后编译为 class 文件,所以第一次访问 JSP 速度会比较慢,后面会快很多</li>
</ul>
<h3 id="Servlet-生命周期"><a href="#Servlet-生命周期" class="headerlink" title="Servlet 生命周期"></a>Servlet 生命周期</h3><p>主要是<code>java.servlet.Servlet</code>接口中的<code>init()</code> 、<code>service()</code> 、和<code>destroy()</code> 3个方法。</p>
<ul>
<li>初始化阶段,web容器通过调用<code>init()</code>方法来初始化<code>Servlet</code>实例,在Servlet的整个生命周期类,<code>init()</code>方法只被调用一次</li>
<li>客户请求到来时,容器会开始一个新线程,并调用servlet的 <code>service()</code>方法,<code>service()</code> 方法根据请求的http方法来调用 <code>doget()</code> 或<code>dopost()</code></li>
<li>终止阶段调用<code>destroy()</code>方法,销毁一些资源</li>
</ul>
<h3 id="GET-请求-vs-POST-请求"><a href="#GET-请求-vs-POST-请求" class="headerlink" title="GET 请求 vs POST 请求"></a>GET 请求 vs POST 请求</h3><ul>
<li><code>GET</code>用于信息获取,是安全的和幂等的,<code>GET</code>一般是对后台数据库的信息进行查询</li>
<li><code>POST</code>表示可能修改变服务器上的资源的请求,一般是对后台数据库进行增、删、改的操作</li>
<li><code>GET</code>请求的参数会跟在URL后进行传递,请求的数据会附在URL之后,以<code>?</code>分割URL和传输数据,参数之间以<code>&</code>相连,一般浏览器对 URL 的长度会有限制</li>
<li><code>POST</code>请求,提交的数据则放置在是HTTP包的包体中,用类似<code>Key-Value</code>的格式发送一些数据,相对来说,<code>GET</code>请求会把请求的参数暴露在 URL 中,安全性比<code>POST</code>差一些</li>
</ul>
<h3 id="HTTP-请求的基本格式"><a href="#HTTP-请求的基本格式" class="headerlink" title="HTTP 请求的基本格式"></a>HTTP 请求的基本格式</h3><ul>
<li><<code>request line></code> 请求行</li>
<li><code><headers></code> 请求头(参数头)</li>
<li><code><blank line></code> 空白行</li>
<li><code>[<request-body>]</code> 请求实体(<code>GET没有, POST有</code>)</li>
</ul>
<h2 id="数据库"><a href="#数据库" class="headerlink" title="数据库"></a>数据库</h2><h3 id="索引的分类"><a href="#索引的分类" class="headerlink" title="索引的分类"></a>索引的分类</h3><p>主要分为聚集索引和非聚集索引:</p>
<ul>
<li>聚集索引存储记录物理上连续,而非聚集索引是逻辑上的连续,物理存储并不连续</li>
<li>聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个</li>
</ul>
<h3 id="ResultSet-统计记录数目"><a href="#ResultSet-统计记录数目" class="headerlink" title="ResultSet 统计记录数目"></a>ResultSet 统计记录数目</h3><p>Java 中使用<code>JDBC</code>连接数据库,最后都会得到一个 ResultSet,比如如下的代码<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Connection con = DriverManager.getConnection(url, username, password);</div><div class="line">Statement sta = con.createStatement();</div><div class="line">String sql = <span class="string">"select * from student"</span>;</div><div class="line">ResultSet resultSet = sta.executeQuery(sql);</div></pre></td></tr></table></figure></p>
<p>那么如何根据得到的<code>ResultSet</code>统计一共有多少条记录呢?注意:<code>ResultSet</code>没有提供类似<code>size()</code>、<code>length</code>的 API 来直接获取总记录数。</p>
<p>方法1:利用循环<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span> sum = <span class="number">0</span>; </div><div class="line"><span class="keyword">while</span>(resultSet.next()){ </div><div class="line"> sum++; </div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>方法2:利用ResultSet的getRow方法来获得ResultSet的总行数</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">resultSet.last(); //移到最后一行 </div><div class="line">int rowCount = resultSet.getRow(); //得到当前行号,也就是记录数 </div><div class="line">``` </div><div class="line"> </div><div class="line"></div><div class="line">## 设计模式 ##</div><div class="line"></div><div class="line">### 单例模式 ###</div><div class="line"></div><div class="line">单例模式中必须保证只有一个实例存在。有时候单例是为了避免重复创建多个实例造成资源浪费,有时候也是为了避免多个不同的实例导致系统不一致的行为。</div><div class="line"></div><div class="line">Android 中,App启动时系统会创建一个`Application`对象,用来存储系统的一些信息,这儿的`Application` 就是是单例模式的应用。可以通过`Context.getApplicationContext()`获取唯一的`Application`实例。</div><div class="line"></div><div class="line">```java</div><div class="line">class Singleton { </div><div class="line"> private volatile static Singleton instance; </div><div class="line"> </div><div class="line"> private Singleton() { } </div><div class="line"> </div><div class="line"> public static Singleton getInstance() { </div><div class="line"> //第一重判断 </div><div class="line"> if (instance == null) { </div><div class="line"> //锁定代码块 </div><div class="line"> synchronized (Singleton.class) { </div><div class="line"> //第二重判断 </div><div class="line"> if (instance == null) { </div><div class="line"> instance = new Singleton(); //创建单例实例 </div><div class="line"> } </div><div class="line"> } </div><div class="line"> } </div><div class="line"> return instance; </div><div class="line"> } </div><div class="line">}</div></pre></td></tr></table></figure>
<p>为什么<code>synchronized</code>里面需要加一次判断<code>if (instance == null)</code>,是考虑这样的特殊情形:比如线程A、B都到达<strong>第一个</strong><code>if (instance == null)</code>,线程A进入<code>synchronized</code>代码中创建实例,线程B排队等待。但当A执行完毕时,线程B进入<code>synchronized</code>锁定代码,它并不知道实例已经创建,将继续创建新的实例,导致产生多个单例对象。</p>
<p>也可以用内部类的方式创建,</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> class <span class="title">Singleton</span><span class="params">()</span></span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">Inner</span> </span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Singleton instance = <span class="keyword">new</span> Singleton();</div><div class="line"> }</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="title">Singleton</span><span class="params">()</span> </span>{</div><div class="line"> }</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Singleton <span class="title">getInstance</span><span class="params">()</span></span>{</div><div class="line"> <span class="keyword">return</span> Inner.instance;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h3 id="模板方法模式"><a href="#模板方法模式" class="headerlink" title="模板方法模式"></a>模板方法模式</h3><p>在父类中实现一个算法不变的部分,并将可变的行为留给子类来实现。</p>
<p>比如<code>AsyncTask</code> 里面的四个方法<code>onPreExecute</code>、<code>doInBackground</code>、<code>onProgressUpdate</code>、<code>onPostExecute</code></p>
<p>还有<code>Activity</code>也应用了模板方法模式<br><code>onCreate</code>、<code>onStart</code>、<code>onResume</code>、<code>onPause</code>、<code>onStop</code>、<code>onDestroy</code>、<code>onRestart</code></p>
<h3 id="适配器模式"><a href="#适配器模式" class="headerlink" title="适配器模式"></a>适配器模式</h3><p>分为两种:类的适配器模式、对象的适配器模式</p>
<p>Android 里的 <code>ListView</code> 和 <code>RecyclerView</code>的<code>setAdapter()</code>方法就是使用了适配器模式。</p>
<h3 id="观察者模式"><a href="#观察者模式" class="headerlink" title="观察者模式"></a>观察者模式</h3><p>在 GUI 中,不管是 Windows 桌面应用、或者 Android、IOS,都会给某个按钮 Button 设置监听事件,这儿就是使用了观察者模式。Android 中设置 Button 的监听事件代码如下:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">final</span> Button button = (Button) findViewById(R.id.button_id);</div><div class="line">button.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</div><div class="line"> <span class="comment">// Perform action on click</span></div><div class="line"> }</div><div class="line">});</div></pre></td></tr></table></figure></p>
<h2 id="笔试编程题"><a href="#笔试编程题" class="headerlink" title="笔试编程题"></a>笔试编程题</h2><h3 id="线程-VS-进程"><a href="#线程-VS-进程" class="headerlink" title="线程 VS 进程"></a>线程 VS 进程</h3><p>关于线程和进程,不正确的描述是<em>__</em>。(选 D 栈是线程私有, 保存其运行状态和局部变量 )<br> A. 进程的隔离性要好于线程<br> B. 线程在资源消耗上通常要比进程轻量<br> C. 不同进程间不会共享逻辑地址空间<br> D. 同一个进程的线程之间共享内存,包括堆和栈<br> E. 进程间有途径共享大量内存中的数据<br> F. 线程间通讯可以通过直接访问全局变量,或者使用进程间通讯的机制(IPC)</p>
<h3 id="找出未打卡的员工"><a href="#找出未打卡的员工" class="headerlink" title="找出未打卡的员工"></a>找出未打卡的员工</h3><p>题目:输入两行数据,第一行为全部员工的 id,第二行为某一天打卡的员工 id,已知只有一个员工没有打卡,求出未打卡员工的 id。(员工 id 不重复,每行输入的 id 未排序)<br>输入:<br>1001 1003 1002 1005 1004<br>1002 1003 1001 1004<br>输出:<br>1005</p>
<p>分析:可以用两个 List,第一个 List 保存所有员工的 id,第二个 List 保存打卡员工的 id,从第一个List 中把第二个 List 的数据都删除,最终剩下的就是未打卡员工的 id。</p>
<p><strong>更好的方法</strong>:异或,两行数据中未打卡员工的 id 出现了一次,其余员工的 id 都出现了2次,两个相同的数异或为0。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">public static void main(String[] args) {</div><div class="line"> Scanner scan = new Scanner(System.in);</div><div class="line"> while (scan.hasNext()) {</div><div class="line"></div><div class="line"> String[] ids = scan.nextLine().split(" ");</div><div class="line"> String[] marks = scan.nextLine().split(" ");</div><div class="line"> int result = 0;</div><div class="line"> for (int i = 0; i < ids.length; i++) {</div><div class="line"> result ^= Integer.parseInt(ids[i]);</div><div class="line"> }</div><div class="line"> for (int i = 0; i < marks.length; i++) {</div><div class="line"> result ^= Integer.parseInt(marks[i]);</div><div class="line"> }</div><div class="line"> System.out.println(result);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="手写代码题"><a href="#手写代码题" class="headerlink" title="手写代码题"></a>手写代码题</h2><h3 id="快速排序"><a href="#快速排序" class="headerlink" title="快速排序"></a>快速排序</h3><p>排序是经典面试题,公司也希望通过手写快排来考察面试者的编程习惯和基本功。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line">// 排序范围 [start, end], 包含 end</div><div class="line">public void sort(int[] arr, int start, int end) {</div><div class="line"> if (start < end) {</div><div class="line"> int p = partition(arr, start, end);</div><div class="line"> quickSort(arr, start, p - 1);</div><div class="line"> quickSort(arr, p + 1, end);</div><div class="line"> }</div><div class="line">}</div><div class="line">// 一次划分代码,返回被划分后的基准位置</div><div class="line">public static int partition(int[] arr, int left, int right) {</div><div class="line"> int pivot = arr[left];</div><div class="line"> while (left < right) {</div><div class="line"> while (left < right && arr[right] >= pivot)</div><div class="line"> right--;</div><div class="line"> if (left < right)</div><div class="line"> arr[left++] = arr[right];</div><div class="line"> while (left < right && arr[left] <= pivot)</div><div class="line"> left++;</div><div class="line"> if (left < right)</div><div class="line"> arr[right--] = arr[left];</div><div class="line"> }</div><div class="line"> arr[left] = pivot;</div><div class="line"> return left;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>Note:快排是不稳定的,常见的稳定排序是:冒泡、插入、归并</p>
<h3 id="括号字符串是否合法"><a href="#括号字符串是否合法" class="headerlink" title="括号字符串是否合法"></a>括号字符串是否合法</h3><p>某个字符串只包括<code>(</code>和<code>)</code>,判断其中的括号是否匹配正确,比如<code>(()())</code>正确,<code>((())()</code>错误,<code>不允许使用栈</code>。</p>
<p>这种类似题的常见思路是栈,对于左括号入栈,如果遇到右括号,判断此时栈顶是不是左括号,是则将其出栈,不是则该括号序列不合法。</p>
<p>面试官要求不能使用栈,可以使用计数器,利用<code>int count</code>字段。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">public static boolean checkBrackets(String str) {</div><div class="line"> char[] cs = str.toCharArray();</div><div class="line"> int count = 0;</div><div class="line"> for (int i = 0; i < cs.length; i++) {</div><div class="line"> if (cs[i] == '(')</div><div class="line"> count++;</div><div class="line"> else {</div><div class="line"> count--;</div><div class="line"> if (count < 0) {</div><div class="line"> return false;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> return count == 0;</div><div class="line">}</div></pre></td></tr></table></figure>
<h3 id="扑克牌随机发牌"><a href="#扑克牌随机发牌" class="headerlink" title="扑克牌随机发牌"></a>扑克牌随机发牌</h3><p>对于52张牌,实现一个随机打算扑克牌顺序的程序。52张牌使用 <code>int</code> 数组模拟。</p>
<p>该算法的难点是如何保证随机性?有个经典算法<code>shuffle</code>,思路就是遍历数组,在剩下的元素里再随机取一个元素,然后再在剩下的元素里再随机取一个元素。每次取完元素后,我们就不会让这个元素参与下一次的选取。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">To shuffle an array a of n elements (indices 0..n-1):</div><div class="line"> for i from n − 1 downto 1 do</div><div class="line"> j ← random integer with 0 ≤ j ≤ i</div><div class="line"> exchange a[j] and a[i]</div></pre></td></tr></table></figure>
<p>注意这儿是<code>0 ≤ j ≤ i</code>,包括<code>j=i</code>的情况,因为可能洗牌后某个牌未发生交换,比如第51张牌还是原来的第51张牌。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">randomCards</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">int</span>[] data = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">52</span>];</div><div class="line"> Random random= <span class="keyword">new</span> Random();</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < data.length; i++)</div><div class="line"> data[i] = i;</div><div class="line"></div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = data.length - <span class="number">1</span>; i > <span class="number">0</span>; i--) {</div><div class="line"> <span class="keyword">int</span> temp = random.nextInt(i+<span class="number">1</span>); <span class="comment">//产生 [0,i] 之间的随机数</span></div><div class="line"> swap(data,i,temp);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="智力题"><a href="#智力题" class="headerlink" title="智力题"></a>智力题</h2><h3 id="金条付费"><a href="#金条付费" class="headerlink" title="金条付费"></a>金条付费</h3><p>你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条,如果只允许你两次把金条弄断,你如何给你的工人付费?</p>
<p>答案:切成一段,两段,和四段.</p>
<p>第1天: 给出1.<br>第2天: 给出2,还回1.<br>第3天: 给出1.<br>第4天: 给出4,还回1+2.<br>第5天: 给出1.<br>第6天: 给出2,还回1.<br>第7天: 给出1.</p>
<h3 id="赛马"><a href="#赛马" class="headerlink" title="赛马"></a>赛马</h3><p>25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?</p>
<p>答案:</p>
<ul>
<li>25匹马分成5组,先进行<strong>5场</strong>比赛</li>
<li>再将刚才5场的冠军进行<strong>第6场</strong>比赛,得到第一名。按照第6场比赛的名词把前面5场比赛所在的组命名为 A、B、C、D、E 组,即 A 组的冠军是第6场第一名,B 组的冠军是第二名 …</li>
<li>分析第2名和第3名的可能性,如果确定有多于3匹马比某匹马快,那它可以被淘汰了。因为 D 组是第6场的第四名,整个D 组被淘汰了,同意整个 E 组被淘汰。剩下可能是整体的第2、3名的就是C组的第1名、B组的1、2名、A组的第2、3名。取这5匹马进行<strong>第7场</strong>比赛<br>-所以,一共需要7场比赛</li>
</ul>
<p>本文链接:<a href="http://www.codeceo.com/article/it-interview-question-2017.html" target="_blank" rel="external">http://www.codeceo.com/article/it-interview-question-2017.html</a></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/11/25/campus-interview/" data-id="ciyyds55c0007buxbefkrn7yd" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/面试/">面试</a></li></ul>
</footer>
</div>
</article>
<article id="post-javac-error" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/10/03/javac-error/" class="article-date">
<time datetime="2016-10-03T03:41:38.000Z" itemprop="datePublished">2016-10-03</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/10/03/javac-error/">javac、javap命令行执行 java 程序的一点小坑</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>2016校园招聘季,正在复习 java,想使用 <code>javac</code> 、 <code>java</code> 、<code>javap</code>等命令分析<code>String s = "a" + "b" + "c" + "d"</code> 会创建几个对象,没想到执行<code>java</code> 命令总是报错。</p>
<p>本文链接 <a href="http://www.alijava.com/javac-error/" target="_blank" rel="external">http://www.alijava.com/javac-error/</a> 转载请注明出处</p>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">TomChens-MBP:util tomchen$ pwd</div><div class="line">/Users/tomchen/Documents/javaEclipse/workspaceJava/OnlineOJ/src/util</div><div class="line">TomChens-MBP:util tomchen$ ls</div><div class="line">Main.java</div><div class="line">TomChens-MBP:util tomchen$ cat Main.java </div><div class="line"><span class="keyword">package</span> util; <span class="comment">//包名</span></div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>{</div><div 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>{</div><div class="line"> String s = <span class="string">"a"</span> + <span class="string">"b"</span> + <span class="string">"c"</span> + <span class="string">"d"</span>;</div><div class="line"> System.out.println(s);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p><code>Main.java</code> 是在 Eclipse 工程下的<code>util</code>包里(<strong>注意就是这个 <code>util</code>包的影响</strong>!!)</p>
<h2 id="javac"><a href="#javac" class="headerlink" title="javac"></a>javac</h2><p>在目录<code>src/util</code> 执行 <code>javac</code>,没有问题</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">TomChens-MBP:util tomchen$ javac Main.java </div><div class="line">TomChens-MBP:util tomchen$ ls</div><div class="line">Main.class Main.java</div></pre></td></tr></table></figure>
<ul>
<li><code>javac</code> 命令的使用方式是 <code>javac [文件名(带后缀名 .java)]</code></li>
<li><code>java</code> 命令是 <code>java [文件名(不带后缀名)]</code> </li>
</ul>
<h2 id="javap-字节码反编译"><a href="#javap-字节码反编译" class="headerlink" title="javap 字节码反编译"></a>javap 字节码反编译</h2><p>依然在目录<code>src/util</code>下执行<code>javap</code></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div></pre></td><td class="code"><pre><div class="line">TomChens-MBP:util tomchen$ javap -c -v Main.class </div><div class="line">Classfile /Users/tomchen/Documents/javaEclipse/workspaceJava/OnlineOJ/src/util/Main.class</div><div class="line"> Last modified Oct 3, 2016; size 421 bytes</div><div class="line"> MD5 checksum 0700e51efd4656898d4c1c136394661f</div><div class="line"> Compiled from "Main.java"</div><div class="line">public class util.Main</div><div class="line"> SourceFile: "Main.java"</div><div class="line"> minor version: 0</div><div class="line"> major version: 51</div><div class="line"> flags: ACC_PUBLIC, ACC_SUPER</div><div class="line">Constant pool:</div><div class="line"> #1 = Methodref #6.#15 // java/lang/Object."<init>":()V</div><div class="line"> #2 = String #16 // abcd</div><div class="line"> #3 = Fieldref #17.#18 // java/lang/System.out:Ljava/io/PrintStream;</div><div class="line"> #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V</div><div class="line"> #5 = Class #21 // util/Main</div><div class="line"> #6 = Class #22 // java/lang/Object</div><div class="line"> #7 = Utf8 <init></div><div class="line"> #8 = Utf8 ()V</div><div class="line"> #9 = Utf8 Code</div><div class="line"> #10 = Utf8 LineNumberTable</div><div class="line"> #11 = Utf8 main</div><div class="line"> #12 = Utf8 ([Ljava/lang/String;)V</div><div class="line"> #13 = Utf8 SourceFile</div><div class="line"> #14 = Utf8 Main.java</div><div class="line"> #15 = NameAndType #7:#8 // "<init>":()V</div><div class="line"> #16 = Utf8 abcd</div><div class="line"> #17 = Class #23 // java/lang/System</div><div class="line"> #18 = NameAndType #24:#25 // out:Ljava/io/PrintStream;</div><div class="line"> #19 = Class #26 // java/io/PrintStream</div><div class="line"> #20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V</div><div class="line"> #21 = Utf8 util/Main</div><div class="line"> #22 = Utf8 java/lang/Object</div><div class="line"> #23 = Utf8 java/lang/System</div><div class="line"> #24 = Utf8 out</div><div class="line"> #25 = Utf8 Ljava/io/PrintStream;</div><div class="line"> #26 = Utf8 java/io/PrintStream</div><div class="line"> #27 = Utf8 println</div><div class="line"> #28 = Utf8 (Ljava/lang/String;)V</div><div class="line">{</div><div class="line"> public util.Main();</div><div class="line"> flags: ACC_PUBLIC</div><div class="line"> Code:</div><div class="line"> stack=1, locals=1, args_size=1</div><div class="line"> 0: aload_0 </div><div class="line"> 1: invokespecial #1 // Method java/lang/Object."<init>":()V</div><div class="line"> 4: return </div><div class="line"> LineNumberTable:</div><div class="line"> line 3: 0</div><div class="line"></div><div class="line"> public static void main(java.lang.String[]);</div><div class="line"> flags: ACC_PUBLIC, ACC_STATIC</div><div class="line"> Code:</div><div class="line"> stack=2, locals=2, args_size=1</div><div class="line"> 0: ldc #2 // String abcd</div><div class="line"> 2: astore_1 </div><div class="line"> 3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;</div><div class="line"> 6: aload_1 </div><div class="line"> 7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V</div><div class="line"> 10: return </div><div class="line"> LineNumberTable:</div><div class="line"> line 5: 0</div><div class="line"> line 6: 3</div><div class="line"> line 7: 10</div><div class="line">}</div></pre></td></tr></table></figure>
<p>反编译主要是分析上面的<code>String s = "a" + "b" + "c" + "d";</code></p>
<p>由上面的<code>#2 = String #16 // abcd</code><br>可知:<code>"a" + "b" + "c" + "d"</code>只创建了一个对象,因为<code>"a""b""c""d"</code>等都是字符串常量,对于常量,在编译时候直接存储这几个常量拼接后的结果。</p>
<h2 id="java"><a href="#java" class="headerlink" title="java"></a>java</h2><p> 用惯了 Eclipse,想试下命令行输出,没想到执行<code>java</code>命令却老是报错</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">TomChens-MBP:util tomchen$ pwd</div><div class="line">/Users/tomchen/Documents/javaEclipse/workspaceJava/OnlineOJ/src/util</div><div class="line">TomChens-MBP:util tomchen$ java Main</div><div class="line">Exception in thread <span class="string">"main"</span> java.lang.NoClassDefFoundError: Main (wrong name: util/Main)</div><div class="line"> at java.lang.ClassLoader.defineClass1(Native Method)</div><div class="line"> at java.lang.ClassLoader.defineClass(ClassLoader.java:<span class="number">791</span>)</div><div class="line"> at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:<span class="number">142</span>)</div><div class="line"> at java.net.URLClassLoader.defineClass(URLClassLoader.java:<span class="number">449</span>)</div><div class="line"> at java.net.URLClassLoader.access$<span class="number">100</span>(URLClassLoader.java:<span class="number">71</span>)</div><div class="line"> at java.net.URLClassLoader$<span class="number">1</span>.run(URLClassLoader.java:<span class="number">361</span>)</div><div class="line"> at java.net.URLClassLoader$<span class="number">1</span>.run(URLClassLoader.java:<span class="number">355</span>)</div><div class="line"> at java.security.AccessController.doPrivileged(Native Method)</div><div class="line"> at java.net.URLClassLoader.findClass(URLClassLoader.java:<span class="number">354</span>)</div><div class="line"> at java.lang.ClassLoader.loadClass(ClassLoader.java:<span class="number">423</span>)</div><div class="line"> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:<span class="number">308</span>)</div><div class="line"> at java.lang.ClassLoader.loadClass(ClassLoader.java:<span class="number">356</span>)</div><div class="line"> at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:<span class="number">482</span>)</div></pre></td></tr></table></figure>
<p>报了一堆问题,看网上的答案说可能是 CLASSPATH 的问题。</p>
<p>试验 <code>TomChens-MBP:util tomchen$ java -classpath . Main</code>还是不行。</p>
<p>怀疑可能是环境变量的问题,mac 的环境变量和 windows 有区别。</p>
<h2 id="Mac-设置-JAVA-HOME-和-PATH"><a href="#Mac-设置-JAVA-HOME-和-PATH" class="headerlink" title="Mac 设置 JAVA_HOME 和 PATH"></a>Mac 设置 JAVA_HOME 和 PATH</h2><p>设置 <code>JAVA_HOME</code>,网上找到一个方法,该方法的优点是没有把<code>JAVA_HOME</code>写死:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">// 编辑文件'~/.zshrc'或'~/.bash_profile',加入下面两行:</div><div class="line">// 对于Java 1.7:</div><div class="line"></div><div class="line">export JAVA_HOME=`/usr/libexec/java_home -v 1.7`</div><div class="line">export PATH=${JAVA_HOME}/bin:$PATH</div></pre></td></tr></table></figure>
<p>对于 <code>CLASSPATH</code> ,网上大多意见是:不要设置全局的环境变量,每个应用会自己设置。有点疑惑?</p>
<ul>
<li>Mac OS X (Unix/Linux)中,路径分隔符是冒号(:)</li>
<li>Windows是分号(;)</li>
</ul>
<p>但是设置了环境变量还是没能解决上述的问题。</p>
<h2 id="package-的原因"><a href="#package-的原因" class="headerlink" title="package 的原因"></a>package 的原因</h2><p>后来看到一篇文章,发现要在 <code>src</code> 目录下执行 java 命令,而不是在<code>/src/util</code> 下执行。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">TomChens-MBP:util tomchen$ cd ..</div><div class="line">TomChens-MBP:src tomchen$ pwd</div><div class="line">/Users/tomchen/Documents/javaEclipse/workspaceJava/OnlineOJ/src</div><div class="line">TomChens-MBP:src tomchen$ java util.Main</div><div class="line">abcd</div><div class="line">TomChens-MBP:src tomchen$ java util/Main</div><div class="line">abcd</div></pre></td></tr></table></figure>
<p>可以看到,用<code>util.Main</code>或者<code>util/Main</code>指定包名都可以。</p>
<p>如果不是在<code>src</code>执行,而是在 <code>src/util</code>执行<code>java util/Main</code>,还是会报错</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">TomChens-MacBook-Pro:util tomchen$ pwd</div><div class="line">/Users/tomchen/Documents/javaEclipse/workspaceJava/OnlineOJ/src/util</div><div class="line">TomChens-MacBook-Pro:util tomchen$ java util/Main</div><div class="line">Error: Could not find or load main class util.Main</div></pre></td></tr></table></figure>
<h2 id="总结与思考"><a href="#总结与思考" class="headerlink" title="总结与思考"></a>总结与思考</h2><p> <code>javac</code> 命令与 <code>java</code> 命令的区别</p>
<ul>
<li><code>javac</code> 命令,在 <code>src</code>下执行<code>javac util/Main.java</code>可以,在<code>src/util</code>下执行<code>javac Main.java</code>也可以。</li>
<li>执行 <code>java</code> 命令需在 包的上层目录(比如包<code>util</code>的上层目录: <code>src</code>),并且类名前面要带上包名。因为Java存在类名相同但包名不同的情况,比如 <code>java.awt.List</code> 和<code>java.util.List</code>,包名+类名才能唯一识别某个类。</li>
<li>javac是一个<strong>平台命令</strong>,它对具体的平台文件进行操作,要指明<strong>被编译的文件路径</strong>。</li>
<li>java是一个<strong>虚拟机命令</strong>,它对类操作,即对类的描述要用点分的描述形式,并且不能加扩展名,还要注意类名的大小写。</li>
</ul>
<h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><ul>
<li><a href="http://www.raychase.net/1647" target="_blank" rel="external">常用的JDK自带命令行工具</a></li>
<li><a href="http://www.cnblogs.com/wangrui-techbolg/archive/2012/12/29/2839047.html" target="_blank" rel="external">Mac 终端命令运行java</a></li>
<li><a href="https://github.com/pubyun/macdev/blob/master/java.md" target="_blank" rel="external">Java开发环境的设置</a></li>
<li><a href="http://www.cnblogs.com/haolujun/archive/2013/03/02/2939698.html" target="_blank" rel="external">自己动手编译、运行Java程序</a></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/10/03/javac-error/" data-id="ciyyds55y000nbuxb6b3n661k" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/命令行/">命令行</a></li></ul>
</footer>
</div>
</article>
<article id="post-sort-summary" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/10/02/sort-summary/" class="article-date">
<time datetime="2016-10-02T01:52:40.000Z" itemprop="datePublished">2016-10-02</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/10/02/sort-summary/">经典排序算法总结--冒泡、快排、插入、希尔、归并、选择</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>互联网面试,排序是经典问题,总结几种经典排序代码,方便后期查阅。</p>
<p>本文链接 <a href="http://www.alijava.com/sort-summary/" target="_blank" rel="external">http://www.alijava.com/sort-summary/</a> 转载请注明出处。</p>
<p>如何测试编写的排序代码? 可以利用在线编程OJ系统 ,比如牛客网的<br><a href="http://www.nowcoder.com/questionTerminal/508f66c6c93d4191ab25151066cb50ef" target="_blank" rel="external">http://www.nowcoder.com/questionTerminal/508f66c6c93d4191ab25151066cb50ef</a></p>
<h2 id="冒泡排序"><a href="#冒泡排序" class="headerlink" title="冒泡排序"></a>冒泡排序</h2><p>对纵向排列的关键字序列,按照自下而上的扫描方向对两两相邻的关键字进行比较,<br>若为逆序(k_j < k_j-1 ),则将两个记录交换位置;<br>重复上述扫描排序过程,直至没有记录需要交换为止。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">bubbleSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> size)</span> </span>{</div><div class="line"> <span class="keyword">boolean</span> swap = <span class="keyword">false</span>;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < size - <span class="number">1</span>; i++) { <span class="comment">//最多进行 n-1 趟</span></div><div class="line"> swap = <span class="keyword">false</span>;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = size - <span class="number">1</span>; j > i; j--) { <span class="comment">//从下往上扫描</span></div><div class="line"> <span class="keyword">if</span> (arr[j] < arr[j - <span class="number">1</span>]) {</div><div class="line"> swap(arr, j, j - <span class="number">1</span>);</div><div class="line"> swap = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keyword">if</span> (!swap) {</div><div class="line"> <span class="keyword">break</span>; <span class="comment">// 未发生交换,终止算法</span></div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>冒泡排序的优化:<br>至多需要 n-1 趟扫描,如果在某趟扫描后,待排序记录已是有序,可以在此趟扫描后终止。<br>可引入布尔量<code>swap</code>,每次扫描前值为<code>false</code>,若排序过程中发生了交换,置为<code>true</code>。<br>在一趟扫描后,如果<code>swap</code>仍为<code>false</code>,表示本次未曾交换记录,可以终止算法。</p>
<h3 id="交换函数"><a href="#交换函数" class="headerlink" title="交换函数"></a>交换函数</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">swap</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> one, <span class="keyword">int</span> two)</span> </span>{</div><div class="line"> <span class="keyword">int</span> temp = arr[one];</div><div class="line"> arr[one] = arr[two];</div><div class="line"> arr[two] = temp;</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="快速排序"><a href="#快速排序" class="headerlink" title="快速排序"></a>快速排序</h2><p>通过一趟排序将记录序列分成两个子序列,<br>再分别对这两个子序列进行排序以达到整个序列有序。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 排序范围 [start, end], 包含 end </span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">quickSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> start, <span class="keyword">int</span> end)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (start < end) {</div><div class="line"> <span class="keyword">int</span> p = partition(arr, start, end);</div><div class="line"> quickSort(arr, start, p - <span class="number">1</span>);</div><div class="line"> quickSort(arr, p + <span class="number">1</span>, end);</div><div class="line"> }</div><div class="line">}</div><div class="line"></div><div class="line"><span class="comment">// 一次划分代码,返回被划分后的基准位置</span></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">partition</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> left, <span class="keyword">int</span> right)</span> </span>{</div><div class="line"> <span class="keyword">int</span> pivot = arr[left];</div><div class="line"> <span class="keyword">while</span> (left < right) {</div><div class="line"> <span class="keyword">while</span> (left < right && arr[right] >= pivot)</div><div class="line"> right--;</div><div class="line"> <span class="keyword">if</span> (left < right)</div><div class="line"> arr[left++] = arr[right];</div><div class="line"> <span class="keyword">while</span> (left < right && arr[left] <= pivot)</div><div class="line"> left++;</div><div class="line"> <span class="keyword">if</span> (left < right)</div><div class="line"> arr[right--] = arr[left];</div><div class="line"> }</div><div class="line"> arr[left] = pivot;</div><div class="line"> <span class="keyword">return</span> left;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>快速排序的优化:<br>基准的选择影响快速排序的性能,最理想的情况是:选择的基准恰好能把待排序序列分成两个等长的子序列。</p>
<p>上文选择基准是固定使用序列的第1个元素,改进思路是:使用左端、右端和中间位置上的三个元素的<strong>中位数</strong>作为基准。</p>
<h2 id="非递归实现-快速排序"><a href="#非递归实现-快速排序" class="headerlink" title="非递归实现 快速排序"></a>非递归实现 快速排序</h2><p>思路就是用<strong>栈</strong>模拟递归</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">quickSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> start, <span class="keyword">int</span> end)</span> </span>{</div><div class="line"> <span class="keyword">int</span>[] stack = <span class="keyword">new</span> <span class="keyword">int</span>[end - start + <span class="number">1</span>]; <span class="comment">// 数组模拟栈</span></div><div class="line"> <span class="keyword">int</span> len = <span class="number">0</span>;</div><div class="line"> stack[len++] = start; <span class="comment">// 入栈</span></div><div class="line"> stack[len++] = end;</div><div class="line"> <span class="keyword">while</span> (len > <span class="number">0</span>) { <span class="comment">// 栈中还有元素</span></div><div class="line"> <span class="keyword">int</span> right = stack[--len]; <span class="comment">// 注意是 --len</span></div><div class="line"> <span class="keyword">int</span> left = stack[--len];</div><div class="line"> <span class="keyword">int</span> p = partition(arr, left, right);</div><div class="line"> <span class="keyword">if</span> (p - <span class="number">1</span> > left) {</div><div class="line"> stack[len++] = left;</div><div class="line"> stack[len++] = p - <span class="number">1</span>;</div><div class="line"> }</div><div class="line"> <span class="keyword">if</span> (p + <span class="number">1</span> < right) {</div><div class="line"> stack[len++] = p + <span class="number">1</span>;</div><div class="line"> stack[len++] = right;</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="插入排序"><a href="#插入排序" class="headerlink" title="插入排序"></a>插入排序</h2><p>把关键字<code>k_i</code>依次与有序区的关键字<code>k_i-1</code>、<code>k_i-2</code>、··· 、<code>k_1</code>比较<br>找到应该插入的位置,将<code>k_i</code>插入,后面的序列要往后移动</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">insertSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> size)</span> </span>{</div><div class="line"> <span class="keyword">int</span> temp = arr[<span class="number">0</span>];</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i < size; i++) {</div><div class="line"> <span class="comment">// 若 arr[i] 不小于有序区的最后一个元素,直接扩大有序区</span></div><div class="line"> <span class="keyword">if</span> (arr[i] < arr[i - <span class="number">1</span>]) { </div><div class="line"> temp = arr[i];</div><div class="line"> <span class="keyword">int</span> j = i - <span class="number">1</span>;</div><div class="line"> <span class="keyword">while</span> (j >= <span class="number">0</span> && temp < arr[j]) {</div><div class="line"> arr[j + <span class="number">1</span>] = arr[j--];</div><div class="line"> }</div><div class="line"> arr[j + <span class="number">1</span>] = temp;</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="希尔排序"><a href="#希尔排序" class="headerlink" title="希尔排序"></a>希尔排序</h2><p>插入排序当 n 较小时效率较高;当一组记录有序时,插入排序的算法复杂度可达到最优,即 O(n)。<br>希尔排序正是基于这两点对插入排序进行改进的。</p>
<p>希尔排序的基本思想:设置 t 个整数增量:<code>d_1</code>、<code>d_2</code>、···、<code>d_t</code>,其中<code>d_1 < n</code>, <code>d_t=1</code><br>以<code>d_1</code>为增量,将所有距离为<code>d_1</code>的记录放到同一个组,可以得到<code>d_1</code>个组,在各组内进行直接插入排序;<br>然后取第二个增量<code>d_2</code>,重复上述的分组和排序,直至增量<code>d_t=1</code></p>
<p>设置增量序列时,要使得增量值没有除 1 之外的公因子,最后一个增量值必须为 1。<br>希尔排序的时间复杂度取决于增量序列的选取。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">// shellSort(origins, origins.length, new int[] { 5, 3, 1 });</div><div class="line">public static void shellSort(int[] arr, int size, int[] d) {</div><div class="line"> for (int k = 0; k < d.length; k++) {</div><div class="line"> int gap = d[k];</div><div class="line"> for (int j = 0; j < gap; j++) { // 对于增量值 gap,一共 gap 组,0~gap-1</div><div class="line"> for (int i = j + gap; i < size; i++) {</div><div class="line"> if (arr[i] < arr[i - gap]) { // 如果大于,不需要插入排序</div><div class="line"> int pivot = arr[i];</div><div class="line"> int t = i - gap;</div><div class="line"> while (t >= 0 && pivot < arr[t]) {</div><div class="line"> arr[t + gap] = arr[t];</div><div class="line"> t = t - gap;</div><div class="line"> }</div><div class="line"> arr[t + gap] = pivot;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="归并排序"><a href="#归并排序" class="headerlink" title="归并排序"></a>归并排序</h2><p>归并的含义是:将两个或两个以上的有序表合并成一个新的有序表。<br>归并排序的思路是:<br>假设初始表含有 n 个记录,可看成是 n 个有序的子表,每个子表的长度为1,然后两两归并,<br>得到 n/2 个长度为 2 的有序子表,再两两归并,如此重复,直至得到长度为 n 的有序子表为止。</p>
<p>合并两个有序表:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">// 将arr[low]~arr[center]与arr[center+1]~arr[right]合并成有序表</div><div class="line">public static void merge(int[] arr, int left, int center, int right) {</div><div class="line"> int[] result = new int[right - left + 1];</div><div class="line"> int i = left, j = center + 1, k = 0;</div><div class="line"> while (i <= center && j <= right) {</div><div class="line"> if (arr[i] < arr[j])</div><div class="line"> result[k++] = arr[i++];</div><div class="line"> else</div><div class="line"> result[k++] = arr[j++];</div><div class="line"> }</div><div class="line"> while (i <= center)</div><div class="line"> result[k++] = arr[i++];</div><div class="line"> while (j <= right)</div><div class="line"> result[k++] = arr[j++];</div><div class="line"> System.arraycopy(result, 0, arr, left, right - left + 1);</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>一趟归并:<br>假设长度为<code>n</code>的待排序序列中,每个<strong>有序表</strong>的长度为 <code>step</code>,归并前共有<code>n/step</code>个子序列:<br><code>arr[0]~arr[step-1], arr[step]~arr[step*2-1], ···</code> ,一趟归并将相邻的一对有序表进行归并。<br>需要考虑三种情况:</p>
<ul>
<li>有序表的个数为偶数,且长度均为<code>step</code></li>
<li>有序表的个数为偶数,但最后一个有序表的长度小于<code>step</code></li>
<li>有序表的个数为奇数(轮空,不需要归并)</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">// 子表的长度为 step,对数组进行一趟归并</div><div class="line">public static void mergePass(int[] arr, int step) {</div><div class="line"> int length = arr.length;</div><div class="line"> int i = 0;</div><div class="line"> // 循环,归并长度为 step 的两个有序表</div><div class="line"> for (; i + step * 2 - 1 < length; i += step * 2) {</div><div class="line"> merge(arr, i, i + step - 1, i + step * 2 - 1);</div><div class="line"> }</div><div class="line"> if (i + step < length)</div><div class="line"> merge(arr, i, i + step - 1, length - 1);</div><div class="line"> // 注意: 若 i + step >= length, 最后一个子表轮空,无需归并</div><div class="line">}</div></pre></td></tr></table></figure>
<p>归并排序时,有序表的初始长度为1,每趟归并后有序表长度增大一倍;<br>若干趟归并后,有序表的长度<code>>=n</code>,排序结束。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">public static void mergeSort(int[] arr, int size) {</div><div class="line"> for (int i = 1; i < size; i *= 2) {</div><div class="line"> mergePass(arr, i);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="直接选择排序"><a href="#直接选择排序" class="headerlink" title="直接选择排序"></a>直接选择排序</h2><p>算法思路:第一趟排序将待排序记录 <code>arr[0]~arr[n-1]</code>作为无序区,从中找出最小的记录并与无序区<br>第1个记录<code>arr[0]</code>交换,此时得到有序区为<code>arr[0]</code>,无序区为<code>arr[1]~arr[n-1]</code>。<br>第二趟排序从<code>arr[1]~arr[n-1]</code>选出最小的记录,与<code>arr[1]</code>交换。<br>重复上述过程…</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">public static void selectSort(int[] arr, int size) {</div><div class="line"> for (int i = 0; i < size; i++) {</div><div class="line"> int min = i;</div><div class="line"> for (int j = i + 1; j < size; j++) {</div><div class="line"> if (arr[j] < arr[min])</div><div class="line"> min = j;</div><div class="line"> }</div><div class="line"> if (min != i)</div><div class="line"> swap(arr, min, i);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="堆排序"><a href="#堆排序" class="headerlink" title="堆排序"></a>堆排序</h2><p>堆排序需要建立最小堆,参见这篇文章 <a href="http://www.alijava.com/heap-sort/" target="_blank" rel="external">http://www.alijava.com/heap-sort/</a></p>
<h2 id="排序汇总"><a href="#排序汇总" class="headerlink" title="排序汇总"></a>排序汇总</h2><table>
<thead>
<tr>
<th>排序算法</th>
<th style="text-align:center">平均时间复杂度</th>
<th style="text-align:center">最坏时间复杂度</th>
<th style="text-align:center">空间复杂度</th>
<th style="text-align:center">是否稳定</th>
</tr>
</thead>
<tbody>
<tr>
<td>冒泡</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(1)</td>
<td style="text-align:center">稳定</td>
</tr>
<tr>
<td>快排</td>
<td style="text-align:center">O(nlogn)</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(logn)</td>
<td style="text-align:center">不稳定</td>
</tr>
<tr>
<td>插入</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(1)</td>
<td style="text-align:center">稳定</td>
</tr>
<tr>
<td>希尔</td>
<td style="text-align:center">O(n1.3)</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(1)</td>
<td style="text-align:center">不稳定</td>
</tr>
<tr>
<td>归并</td>
<td style="text-align:center">O(nlogn)</td>
<td style="text-align:center">O(nlogn)</td>
<td style="text-align:center">O(n)</td>
<td style="text-align:center">稳定</td>
</tr>
<tr>
<td>选择</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(n2)</td>
<td style="text-align:center">O(1)</td>
<td style="text-align:center">不稳定</td>
</tr>
<tr>
<td>堆排序</td>
<td style="text-align:center">O(nlogn)</td>
<td style="text-align:center">O(nlogn)</td>
<td style="text-align:center">O(1)</td>
<td style="text-align:center">不稳定</td>
</tr>
</tbody>
</table>
<hr>
<p>利用递归实现快速排序,需要O(logn)的辅助空间;<br>归并排序大多数实现方法是O(logn)的辅助空间,少数是 O(1);<br>常见的稳定的排序为:冒泡、插入、归并。</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/10/02/sort-summary/" data-id="ciyyds56i001cbuxbcw1edimh" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/排序/">排序</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/面试/">面试</a></li></ul>
</footer>
</div>
</article>
<article id="post-heap-sort" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/09/22/heap-sort/" class="article-date">
<time datetime="2016-09-22T09:29:13.000Z" itemprop="datePublished">2016-09-22</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/09/22/heap-sort/">经典排序之 堆排序(附两种建堆思路及代码)</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="堆排序"><a href="#堆排序" class="headerlink" title="堆排序"></a>堆排序</h2><p>先做下记录,后序加上讲解<br>两种建立堆,一种就地,一种是插入</p>
<h2 id="buildMaxHeap"><a href="#buildMaxHeap" class="headerlink" title="buildMaxHeap"></a>buildMaxHeap</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div></pre></td><td class="code"><pre><div class="line">import java.util.*;</div><div class="line"></div><div class="line">public class Main {</div><div class="line"></div><div class="line"> public static void main(String[] args) {</div><div class="line"></div><div class="line"> Scanner scan = new Scanner(System.in);</div><div class="line"> while (scan.hasNext()) {</div><div class="line"> int num = Integer.parseInt(scan.nextLine());</div><div class="line"> String[] inputs = scan.nextLine().split(" ");</div><div class="line"> int[] origins = new int[num];</div><div class="line"> int i = 0;</div><div class="line"> for (String s : inputs) {</div><div class="line"> origins[i++] = Integer.parseInt(s);</div><div class="line"> }</div><div class="line"></div><div class="line"> heapSort(origins, num);</div><div class="line"> for (int oi = num - 1; oi >= 0; oi--)</div><div class="line"> System.out.print(origins[oi] + " ");</div><div class="line"></div><div class="line"> System.out.println();</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> public static void heapSort(int[] arr, int length) {</div><div class="line"> buildHeapInPlace(arr, length);</div><div class="line"> for (int i = 0; i < length; i++) {</div><div class="line"> swap(arr, 0, length - 1 - i);</div><div class="line"> minHeap(arr, 0, length - 1 - i);</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> public static void buildHeapInPlace(int[] arr, int length) {</div><div class="line"> for (int i = (length - 1 - 1) >>> 1; i >= 0; i--)</div><div class="line"> minHeap(arr, i, length);</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> public static void minHeap(int[] arr, int mark, int length) {</div><div class="line"> int left = (mark << 1) + 1;</div><div class="line"> int right = (mark << 1) + 2;</div><div class="line"></div><div class="line"> while (left < length) {</div><div class="line"> int min = left;</div><div class="line"> if (right < length && arr[right] < arr[left])</div><div class="line"> min = right;</div><div class="line"></div><div class="line"> if (arr[min] < arr[mark]) {</div><div class="line"> swap(arr, min, mark);</div><div class="line"> mark = min;</div><div class="line"> left = (mark << 1) + 1;</div><div class="line"> right = (mark << 1) + 2;</div><div class="line"> } else {</div><div class="line"> break;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> public static void swap(int[] arr, int one, int two) {</div><div class="line"> int temp = arr[one];</div><div class="line"> arr[one] = arr[two];</div><div class="line"> arr[two] = temp;</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="maxHeapInsert"><a href="#maxHeapInsert" class="headerlink" title="maxHeapInsert"></a>maxHeapInsert</h2><p>逐个插入,建立堆</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div></pre></td><td class="code"><pre><div class="line">import java.util.*;</div><div class="line"></div><div class="line">public class Main {</div><div class="line"></div><div class="line"> public static void main(String[] args) {</div><div class="line"></div><div class="line"> Scanner scan = new Scanner(System.in);</div><div class="line"> while (scan.hasNext()) {</div><div class="line"> int num = Integer.parseInt(scan.nextLine());</div><div class="line"> String[] inputs = scan.nextLine().split(" ");</div><div class="line"> int[] origins = new int[num];</div><div class="line"> int i = 0;</div><div class="line"> for (String s : inputs) {</div><div class="line"> origins[i++] = Integer.parseInt(s);</div><div class="line"> }</div><div class="line"></div><div class="line"> heapSortTwo(origins, num);</div><div class="line"> for (int oi = num - 1; oi >= 0; oi--)</div><div class="line"> System.out.print(origins[oi] + " ");</div><div class="line"></div><div class="line"> System.out.println();</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> public static void heapSortTwo(int[] arr, int length) {</div><div class="line"> int[] copy = buildHeapInsert(arr, length);</div><div class="line"> for (int i = 0; i < length; i++) {</div><div class="line"> swap(copy, 0, length - 1 - i);</div><div class="line"> minHeapDown(copy, 0, length - 1 - i);</div><div class="line"> }</div><div class="line"> System.arraycopy(copy, 0, arr, 0, length);</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 逐个插入建立最小堆</div><div class="line"> * @param arr</div><div class="line"> * @param length</div><div class="line"> */</div><div class="line"> public static int[] buildHeapInsert(int[] arr, int length) {</div><div class="line"> int[] heapArr = new int[length];</div><div class="line"> int heapLength = 0;</div><div class="line"> for (int i = 0; i < length; i++) {</div><div class="line"> heapArr[i] = arr[i];</div><div class="line"> minHeapUp(heapArr, i, ++heapLength);</div><div class="line"> }</div><div class="line"> return heapArr;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> /**</div><div class="line"> * 维持堆的性质 上溯</div><div class="line"> * @param arr</div><div class="line"> * @param mark</div><div class="line"> * @param length</div><div class="line"> */</div><div class="line"> public static void minHeapUp(int[] arr, int mark, int length) {</div><div class="line"> int parent = (mark - 1) >> 1;</div><div class="line"> while (parent >= 0) {</div><div class="line"> if (arr[parent] > arr[mark]) {</div><div class="line"> swap(arr, parent, mark);</div><div class="line"> mark = parent;</div><div class="line"> parent = (mark - 1) >> 1;</div><div class="line"> } else {</div><div class="line"> break;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> </div><div class="line"> public static void heapSortOne(int[] arr, int length) {</div><div class="line"> buildHeapInPlace(arr, length);</div><div class="line"> for (int i = 0; i < length; i++) {</div><div class="line"> swap(arr, 0, length - 1 - i);</div><div class="line"> minHeapDown(arr, 0, length - 1 - i);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> </div><div class="line"> /**</div><div class="line"> * 就地改变数组,建立堆</div><div class="line"> * @param arr</div><div class="line"> * @param length</div><div class="line"> */</div><div class="line"> public static void buildHeapInPlace(int[] arr, int length) {</div><div class="line"> for (int i = (length - 1 - 1) >>> 1; i >= 0; i--)</div><div class="line"> minHeapDown(arr, i, length);</div><div class="line"> }</div><div class="line"></div><div class="line"> /**</div><div class="line"> * 维持堆的性质 下溯</div><div class="line"> * @param arr</div><div class="line"> * @param mark</div><div class="line"> * @param length</div><div class="line"> */</div><div class="line"> public static void minHeapDown(int[] arr, int mark, int length) {</div><div class="line"> int left = (mark << 1) + 1;</div><div class="line"> int right = (mark << 1) + 2;</div><div class="line"></div><div class="line"> while (left < length) {</div><div class="line"> int min = left;</div><div class="line"> if (right < length && arr[right] < arr[left])</div><div class="line"> min = right;</div><div class="line"></div><div class="line"> if (arr[min] < arr[mark]) {</div><div class="line"> swap(arr, min, mark);</div><div class="line"> mark = min;</div><div class="line"> left = (mark << 1) + 1;</div><div class="line"> right = (mark << 1) + 2;</div><div class="line"> } else {</div><div class="line"> break;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> public static void swap(int[] arr, int one, int two) {</div><div class="line"> int temp = arr[one];</div><div class="line"> arr[one] = arr[two];</div><div class="line"> arr[two] = temp;</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="备注"><a href="#备注" class="headerlink" title="备注"></a>备注</h2><p>可以通过这个牛客网 在线排序 OJ 检测自己排序算法</p>
<p><a href="http://www.nowcoder.com/questionTerminal/508f66c6c93d4191ab25151066cb50ef" target="_blank" rel="external">http://www.nowcoder.com/questionTerminal/508f66c6c93d4191ab25151066cb50ef</a></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/09/22/heap-sort/" data-id="ciyyds55k000cbuxbfzv7gl90" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li></ul>
</footer>
</div>
</article>
<article id="post-asynctask-analysis" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/09/09/asynctask-analysis/" class="article-date">
<time datetime="2016-09-09T02:47:01.000Z" itemprop="datePublished">2016-09-09</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/09/09/asynctask-analysis/">asynctask-analysis</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/09/09/asynctask-analysis/" data-id="ciyyds5550004buxb8tjghw4y" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-array-copy" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/09/03/array-copy/" class="article-date">
<time datetime="2016-09-03T12:23:46.000Z" itemprop="datePublished">2016-09-03</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/09/03/array-copy/">深入解析 Java 数组 Arrays.copyOf 、Arrays.asList</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>java 数组定义和 C 语言中有些区别, <code>Arrays</code> 类提供了一些工具方法,本文总结了<code>copyOf()</code>、<code>asList()</code>使用过程中的一些注意点。</p>
<p>本文链接 <a href="http://www.alijava.com/array-copy/" target="_blank" rel="external">http://www.alijava.com/array-copy/</a> 转载请注明出处</p>
<h1 id="数组基础"><a href="#数组基础" class="headerlink" title="数组基础"></a>数组基础</h1><h2 id="定义数组"><a href="#定义数组" class="headerlink" title="定义数组"></a>定义数组</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span>[] a1 = { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> }; <span class="comment">//Java 风格</span></div><div class="line"><span class="keyword">int</span> a1[] = { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> }; <span class="comment">//C语言风格</span></div></pre></td></tr></table></figure>
<p><code>int[] a1</code>把<code>[]</code> 写在前面,更强调类型信息:数组<code>int[]</code></p>
<p><code>int[]</code> 也是继承了<code>Object</code>类, 而不是 <code>Object[]</code></p>
<p>数组可以创建时赋值,或者创建后再赋值</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span>[] a2 = <span class="keyword">new</span> <span class="keyword">int</span>[] { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> };</div><div class="line"></div><div class="line"><span class="keyword">int</span> a3[] = <span class="keyword">new</span> <span class="keyword">int</span>[] { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> };</div><div class="line"></div><div class="line"><span class="keyword">int</span>[] a4 = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">3</span>];</div><div class="line"></div><div class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i< a4.length; i++) </div><div class="line"> a4[i] = i;</div></pre></td></tr></table></figure>
<p>数组长度是 <code>length</code>,而字符串<code>String</code>获取长度是<code>length()</code></p>
<h2 id="foreach-循环"><a href="#foreach-循环" class="headerlink" title="foreach 循环"></a>foreach 循环</h2><p>JDK 5.0 引进了被称为<code>foreach</code>循环来遍历数组</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">for</span>(<span class="keyword">int</span> element: a4) </div><div class="line"> System.out.println(element);</div></pre></td></tr></table></figure>
<p>输出</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="number">0</span></div><div class="line"><span class="number">1</span></div><div class="line"><span class="number">2</span></div></pre></td></tr></table></figure>
<h2 id="数组作为方法的参数"><a href="#数组作为方法的参数" class="headerlink" title="数组作为方法的参数"></a>数组作为方法的参数</h2><p>如果方法的参数是 <code>int[]</code> </p>
<ul>
<li>一是将变量传进去</li>
<li>二是匿名格式 <code>new int[] { 1, 2, 3 }</code>, 传<code>{ 1, 2, 3 }</code>是错误的</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div 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>{</div><div class="line"> <span class="comment">// testArr(a4); // 传入数组的引用,正确</span></div><div class="line"> </div><div class="line"> testArr(<span class="keyword">new</span> <span class="keyword">int</span>[] { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> });</div><div class="line"></div><div class="line"> <span class="comment">// compile error</span></div><div class="line"> <span class="comment">// testArr({ 1, 2, 3 });</span></div><div class="line"></div><div class="line"> <span class="comment">// compile error</span></div><div class="line"> <span class="comment">// testArr(1, 2, 3);</span></div><div class="line">}</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">testArr</span><span class="params">(<span class="keyword">int</span>[] nums)</span> </span>{</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> element : nums)</div><div class="line"> System.out.println(element);</div><div class="line">}</div></pre></td></tr></table></figure>
<p>输出</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="number">1</span></div><div class="line"><span class="number">2</span></div><div class="line"><span class="number">3</span></div></pre></td></tr></table></figure>
<p>对于可变长参数的方法</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">testVariPara</span><span class="params">(<span class="keyword">int</span>... nums)</span> </span>{</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> element : nums)</div><div class="line"> System.out.println(element);</div><div class="line">}</div></pre></td></tr></table></figure>
<p>下面这两种传递参数方法都可以正常运行</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">testVariPara(<span class="keyword">new</span> <span class="keyword">int</span>[] { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> });</div><div class="line">testVariPara(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>);</div></pre></td></tr></table></figure>
<h1 id="Arrays-工具类"><a href="#Arrays-工具类" class="headerlink" title="Arrays 工具类"></a>Arrays 工具类</h1><h2 id="toString-NaN"><a href="#toString-NaN" class="headerlink" title="toString"></a>toString</h2><p>Java 没有覆盖(<code>override</code>) 数组<code>int[]</code> 的toString()方法, 所以</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">System.out.println(a1.toString());</div></pre></td></tr></table></figure>
<p>得到结果 </p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[I@<span class="number">182</span>da3d</div></pre></td></tr></table></figure>
<p>可以使用工具类 <code>Arrays</code> 输出数组</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">System.out.println(Arrays.toString(a1));</div></pre></td></tr></table></figure>
<p>输出</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</div></pre></td></tr></table></figure>
<h2 id="copyOf"><a href="#copyOf" class="headerlink" title="copyOf"></a>copyOf</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span>[] arr = {<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>};</div><div class="line"> </div><div class="line"><span class="keyword">int</span>[] copied = Arrays.copyOf(arr, <span class="number">10</span>); <span class="comment">//10 是数组的长度</span></div><div class="line">System.out.println(Arrays.toString(copied));</div><div class="line"> </div><div class="line">copied = Arrays.copyOf(arr, <span class="number">3</span>);</div><div class="line">System.out.println(Arrays.toString(copied));</div></pre></td></tr></table></figure>
<p>输出</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>]</div><div class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</div></pre></td></tr></table></figure>
<h2 id="区别-System-arraycopy"><a href="#区别-System-arraycopy" class="headerlink" title="区别 System.arraycopy()"></a>区别 System.arraycopy()</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span>[] arr = {<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>};</div><div class="line"> </div><div class="line"><span class="keyword">int</span>[] copied = <span class="keyword">new</span> <span class="keyword">int</span>[<span class="number">10</span>];</div><div class="line">System.arraycopy(arr, <span class="number">0</span>, copied, <span class="number">1</span>, <span class="number">5</span>);<span class="comment">// 5是需复制的元素个数</span></div><div class="line"> </div><div class="line">System.out.println(Arrays.toString(copied));</div></pre></td></tr></table></figure>
<p>输出<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>]</div><div class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>]</div></pre></td></tr></table></figure></p>
<p>查看 <code>Arrays.copyOf</code> 源码可知,它是新建了一个数组,然后利用<code>System.arraycopy</code> 将源数组复制到新数组中</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span>[] copyOf(<span class="keyword">int</span>[] original, <span class="keyword">int</span> newLength) { </div><div class="line"> <span class="keyword">int</span>[] copy = <span class="keyword">new</span> <span class="keyword">int</span>[newLength]; </div><div class="line"> System.arraycopy(original, <span class="number">0</span>, copy, <span class="number">0</span>, Math.min(original.length, newLength)); </div><div class="line"> <span class="keyword">return</span> copy; </div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="asList-使用"><a href="#asList-使用" class="headerlink" title="asList 使用"></a>asList 使用</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">int</span>[] a1 = { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> }; </div><div class="line">List<<span class="keyword">int</span>[]> list = Arrays.asList(a1); <span class="comment">// eclipse 提示修改为这样可以编译通过</span></div></pre></td></tr></table></figure>
<p>上面的很奇怪, <code>List<int></code> 和 <code>List<Integer></code> 会编译不通过,只能改为 <code>List<int[]></code> </p>
<p>转为 <code>List<int[]></code> 可以通过这样访问数组 <code>list.get(0)</code></p>
<p>为什么会这样呢?</p>
<p><code>List<int></code>编译错误,说明没有自动装箱和拆箱,<code>Arrays.asList</code>常见用法如下</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">List<Object> objList = Arrays.asList(obj1, obj2, obj3);</div></pre></td></tr></table></figure>
<p>上面代码将多个输入参数转化为 <code>List</code>,你也可以传入单个参数</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">List<Object> objList = Arrays.asList(obj1);</div></pre></td></tr></table></figure>
<p>而前面也提到了 <code>int[]</code>是一个对象,继承自<code>Object</code> , 所以返回了类型参数为 <code>int[]</code>的 <code>List</code></p>
<p>推荐 <code>Apache Commons ArrayUtils</code><br>下载地址 <a href="https://commons.apache.org/proper/commons-lang/download_lang.cgi" target="_blank" rel="external">https://commons.apache.org/proper/commons-lang/download_lang.cgi</a></p>
<p>它提供了很多工具方法,可以使用下面的代码处理 <code>int</code> 数组</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">List<Integer> exampleList = Arrays.asList(ArrayUtils.toObject(array));</div></pre></td></tr></table></figure>
<p>看下 API,<code>public static Integer[] toObject(int[] array)</code> 是将 <code>int[]</code> 转为 <code>Integer[]</code></p>
<p>也可以这么使用 <code>Arrays.asList</code> 来转化数组</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Integer[] a1 = { <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span> }; </div><div class="line">List<Integer> list = Arrays.asList(a1);</div><div class="line">System.out.println(list);</div></pre></td></tr></table></figure>
<p>或者这样</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">List<Integer> list = Arrays.asList(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>);</div><div class="line">System.out.println(list);</div></pre></td></tr></table></figure>
<h2 id="asList-定长"><a href="#asList-定长" class="headerlink" title="asList 定长"></a>asList 定长</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">List<Integer> list = Arrays.asList(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>);</div><div class="line">list.add(<span class="number">44</span>); <span class="comment">// 抛出 UnsupportedOperationException</span></div></pre></td></tr></table></figure>
<p>上面的代码会抛出<code>java.lang.UnsupportedOperationException</code>异常</p>
<p>注意:<code>Arrays.asList</code>返回的是 <code>Arrays.ArrayList</code>,不是我们常用的<code>ArrayList</code></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// Arrays.ArrayList 源码</span></div><div class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">ArrayList</span><<span class="title">E</span>> <span class="keyword">extends</span> <span class="title">AbstractList</span><<span class="title">E</span>> </span>{</div><div class="line"> <span class="function"><span class="keyword">public</span> E <span class="title">get</span><span class="params">(<span class="keyword">int</span> index)</span> </span>{</div><div class="line"> <span class="keyword">return</span> a[index];</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> E <span class="title">set</span><span class="params">(<span class="keyword">int</span> index, E element)</span> </span>{</div><div class="line"> E oldValue = a[index];</div><div class="line"> a[index] = element;</div><div class="line"> <span class="keyword">return</span> oldValue;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">indexOf</span><span class="params">(Object o)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (o==<span class="keyword">null</span>) {</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i<a.length; i++)</div><div class="line"> <span class="keyword">if</span> (a[i]==<span class="keyword">null</span>)</div><div class="line"> <span class="keyword">return</span> i;</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">0</span>; i<a.length; i++)</div><div class="line"> <span class="keyword">if</span> (o.equals(a[i]))</div><div class="line"> <span class="keyword">return</span> i;</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">contains</span><span class="params">(Object o)</span> </span>{</div><div class="line"> <span class="keyword">return</span> indexOf(o) != -<span class="number">1</span>;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p><code>Arrays.asList</code> 不支持改变数组长度的操作(<code>add</code>、 <code>remove</code>等),看下源码,<code>Arrays.ArrayList</code>只实现了 <code>get</code>、 <code>set</code>、<code>indexOf</code>、<code>contains</code>等方法。</p>
<p><code>Arrays.ArrayList</code>的父类是<code>AbstractList</code>,它的 <code>add</code> 和 <code>set</code>都是<code>throw new UnsupportedOperationException()</code></p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// AbstractList 源码</span></div><div class="line"><span class="keyword">public</span> <span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">AbstractList</span><<span class="title">E</span>> <span class="keyword">extends</span> <span class="title">AbstractCollection</span><<span class="title">E</span>> <span class="keyword">implements</span> <span class="title">List</span><<span class="title">E</span>> </span>{</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> index, E element)</span> </span>{</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> UnsupportedOperationException();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> E <span class="title">remove</span><span class="params">(<span class="keyword">int</span> index)</span> </span>{</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> UnsupportedOperationException();</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>如果需要得到支持<code>add</code>、<code>remove</code>的 <code>ArrayList</code>,可以这样</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ArrayList<Integer> list = <span class="keyword">new</span> ArrayList<Integer>(Arrays.asList(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>));</div></pre></td></tr></table></figure>
<h2 id="集合转为数组"><a href="#集合转为数组" class="headerlink" title="集合转为数组"></a>集合转为数组</h2><p>ArrayList 可以转化为数组,有两个重载的方法</p>
<ul>
<li><code>Object[] toArray()</code></li>
<li><code><T> T[] toArray(T[] a)</code></li>
</ul>
<p>注意 <code>toArray()</code> 只能得到 <code>Object[]</code>,无法转型为具体数组类型,比如下面的代码会抛出<code>java.lang.ClassCastException</code>异常</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">List<Integer> list = <span class="keyword">new</span> ArrayList<>(Arrays.asList(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>));</div><div class="line">Integer[] arr = (Integer[]) list.toArray(); <span class="comment">// 抛出ClassCastException</span></div></pre></td></tr></table></figure>
<p>如果需要得到具体类型,需要使用<code>toArray(T[] a)</code>,传入参数<code>T[] a</code></p>
<ul>
<li><p>若<code>T[] a</code>长度<code><</code> 原来<code>list</code>的长度,则新建一个<code>list</code>的长度数组,填充元素并返回</p>
</li>
<li><p>若长度 <code>>=</code> <code>list</code>的长度,则把<code>list</code>元素填充<code>T[] a</code>,并返回<code>T[] a</code>的引用</p>
</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">ArrayList<Integer> list = <span class="keyword">new</span> ArrayList<>(Arrays.asList(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>));</div><div class="line"></div><div class="line">Integer[] a1 = <span class="keyword">new</span> Integer[<span class="number">2</span>];</div><div class="line">list.toArray(a1);</div><div class="line">System.out.println(Arrays.toString(a1));</div><div class="line"></div><div class="line">Integer[] a2 = <span class="keyword">new</span> Integer[<span class="number">3</span>];</div><div class="line">list.toArray(a2);</div><div class="line">System.out.println(Arrays.toString(a2));</div><div class="line"></div><div class="line">Integer[] a3 = <span class="keyword">new</span> Integer[<span class="number">4</span>];</div><div class="line">list.toArray(a3);</div><div class="line">System.out.println(Arrays.toString(a3));</div></pre></td></tr></table></figure>
<p>输出</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[null, null]</div><div class="line">[1, 2, 3]</div><div class="line">[1, 2, 3, null]</div></pre></td></tr></table></figure>
<p>也可以这么使用<code>String[] a = list.toArray(new String[0]);</code>,<code>new String[0]</code>只是为了类型信息</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// toArray(T[] a) 源码</span></div><div class="line"><span class="keyword">public</span> <T> T[] toArray(T[] a) {</div><div class="line"> <span class="keyword">if</span> (a.length < size)</div><div class="line"> <span class="comment">// Make a new array of a's runtime type, but my contents:</span></div><div class="line"> <span class="keyword">return</span> (T[]) Arrays.copyOf(elementData, size, a.getClass());</div><div class="line"> System.arraycopy(elementData, <span class="number">0</span>, a, <span class="number">0</span>, size);</div><div class="line"> <span class="keyword">if</span> (a.length > size)</div><div class="line"> a[size] = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">return</span> a;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="keyword">static</span> <T,U> T[] copyOf(U[] original, <span class="keyword">int</span> newLength, Class<? extends T[]> newType) {</div><div class="line"> T[] copy = ((Object)newType == (Object)Object[].class)</div><div class="line"> ? (T[]) <span class="keyword">new</span> Object[newLength]</div><div class="line"> : (T[]) Array.newInstance(newType.getComponentType(), newLength);</div><div class="line"> System.arraycopy(original, <span class="number">0</span>, copy, <span class="number">0</span>,</div><div class="line"> Math.min(original.length, newLength));</div><div class="line"> <span class="keyword">return</span> copy;</div><div class="line">}</div></pre></td></tr></table></figure>
<h1 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h1><ul>
<li><a href="http://stackoverflow.com/questions/12020886/how-arrays-aslistint-can-return-listint" target="_blank" rel="external">http://stackoverflow.com/questions/12020886/how-arrays-aslistint-can-return-listint</a></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/09/03/array-copy/" data-id="ciyyds5540003buxba15mqnt1" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Java/">Java</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/数组/">数组</a></li></ul>
</footer>
</div>
</article>
<article id="post-recyclerview-basics" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/09/03/recyclerview-basics/" class="article-date">
<time datetime="2016-09-03T03:31:52.000Z" itemprop="datePublished">2016-09-03</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/09/03/recyclerview-basics/">Android Material Design 之路之 RecyclerView 学习笔记</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>Android Material Design越来越流行,以前很常用的 ListView 现在也用RecyclerView代替了,实现原理还是相似的。笔者实现一下 RecyclerView,代码比较简单,适合初学者,如有错误,欢迎指出。</p>
<p>源码地址(欢迎star) <a href="https://github.com/studychen/SeeNewsV2" target="_blank" rel="external">https://github.com/studychen/SeeNewsV2</a></p>
<p>本文链接 <a href="http://www.alijava.com/recyclerview-basics/" target="_blank" rel="external">http://www.alijava.com/recyclerview-basics/</a> 转载请注明出处</p>
<h1 id="复习-ListView"><a href="#复习-ListView" class="headerlink" title="复习 ListView"></a>复习 ListView</h1><p>ListView 实现过程中需要复写BaseAdapter,主要是这4个方法</p>
<ul>
<li><code>public int getCount()</code> :适配器中数据集中 数据的个数,即ListView需要显示的数据个数</li>
<li><code>public Object getItem(int position)</code> : 获取数据集中与指定索引对应的数据项 </li>
<li><code>public long getItemId(int position)</code> : 获取指定行对应的ID </li>
<li><code>public View getView(int position, View convertView, ViewGroup parent)</code> :获取每一个Item的显示内容</li>
</ul>
<blockquote>
<p>一般 <code>ListView</code> 每一项都是相同的布局,若想各个项实现不同的布局,可复写 <code>getItemViewType</code> 和 <code>getViewTypeCount</code>实现</p>
</blockquote>
<h1 id="RecyclerView-实现"><a href="#RecyclerView-实现" class="headerlink" title="RecyclerView 实现"></a>RecyclerView 实现</h1><h2 id="xml-布局"><a href="#xml-布局" class="headerlink" title="xml 布局"></a>xml 布局</h2><p><code>RecyclerView</code>中每一项的布局 <code>item_article_type_1.xml</code></p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="utf-8"?></div><div class="line"><span class="tag"><<span class="name">android.support.v7.widget.CardView</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></div><div class="line"> <span class="attr">xmlns:card_view</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span></div><div class="line"> <span class="attr">xmlns:app</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span></div><div class="line"> <span class="attr">xmlns:fresco</span>=<span class="string">"http://schemas.android.com/apk/res-auto"</span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/cv_item"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:foreground</span>=<span class="string">"?android:attr/selectableItemBackground"</span></div><div class="line"> <span class="attr">app:cardCornerRadius</span>=<span class="string">"5dp"</span></div><div class="line"> <span class="attr">app:cardElevation</span>=<span class="string">"5dp"</span></div><div class="line"> <span class="attr">app:contentPadding</span>=<span class="string">"2dp"</span>></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">LinearLayout</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span>></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">com.facebook.drawee.view.SimpleDraweeView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_photo"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"100dp"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"100dp"</span></div><div class="line"> <span class="attr">android:layout_centerVertical</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">fresco:actualImageScaleType</span>=<span class="string">"centerInside"</span></div><div class="line"> <span class="attr">fresco:roundAsCircle</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">fresco:roundingBorderColor</span>=<span class="string">"@color/lightslategray"</span></div><div class="line"> <span class="attr">fresco:roundingBorderWidth</span>=<span class="string">"1dp"</span> /></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">LinearLayout</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"0dp"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_weight</span>=<span class="string">"1"</span></div><div class="line"> <span class="attr">android:orientation</span>=<span class="string">"vertical"</span>></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_title"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginLeft</span>=<span class="string">"10dp"</span></div><div class="line"> <span class="attr">android:layout_marginTop</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:gravity</span>=<span class="string">"center"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span></div><div class="line"> <span class="attr">android:textColor</span>=<span class="string">"@color/primary_text"</span> /></div><div class="line"> <span class="comment"><!-- 新闻 发布时间 来源 阅读次数--></span></div><div class="line"> <span class="tag"><<span class="name">LinearLayout</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginTop</span>=<span class="string">"5dp"</span></div><div class="line"> <span class="attr">android:gravity</span>=<span class="string">"center"</span></div><div class="line"> <span class="attr">android:orientation</span>=<span class="string">"horizontal"</span>></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_date"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginLeft</span>=<span class="string">"10dp"</span></div><div class="line"> <span class="attr">android:layout_marginRight</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"2015-01-09"</span> /></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_source"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginLeft</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:layout_marginRight</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"科学研究院"</span> /></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_readtimes"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginLeft</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:layout_marginRight</span>=<span class="string">"2dp"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"1129次"</span> /></div><div class="line"></div><div class="line"> <span class="tag"></<span class="name">LinearLayout</span>></span></div><div class="line"></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">TextView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article_preview"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"wrap_content"</span></div><div class="line"> <span class="attr">android:layout_marginLeft</span>=<span class="string">"10dp"</span></div><div class="line"> <span class="attr">android:layout_marginTop</span>=<span class="string">"5dp"</span></div><div class="line"> <span class="attr">android:ellipsize</span>=<span class="string">"end"</span></div><div class="line"> <span class="attr">android:maxLines</span>=<span class="string">"2"</span></div><div class="line"> <span class="attr">android:text</span>=<span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span> /></div><div class="line"></div><div class="line"> <span class="tag"></<span class="name">LinearLayout</span>></span></div><div class="line"> <span class="tag"></<span class="name">LinearLayout</span>></span></div><div class="line"></div><div class="line"><span class="tag"></<span class="name">android.support.v7.widget.CardView</span>></span></div></pre></td></tr></table></figure>
<p>布局思路就是 <code>CardView</code>里面嵌入了一个<code>LinearLayout</code>。图片部分用固定宽度<code>100dp</code>,文字部分利用<code>android:layout_weight="1"</code>占据了其他部分。</p>
<p><code>TextView</code>利用<code>android:gravity="center"</code>使得标题的文字居中。</p>
<p><code>LinearLayout</code>里面利用<code>android:gravity="center"</code>使得<code>"2015-01-09 科学研究院 1129次"</code>居中,</p>
<p>新闻详情内容的<code>TextView</code>利用</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">android:maxLines="2"</div><div class="line">android:ellipsize="end"</div></pre></td></tr></table></figure>
<p>将文章内容限定为2行,超出部分用省略号显示。</p>
<p>预览效果</p>
<p><img src="http://img.blog.csdn.net/20160112111012393" alt="这里写图片描述"></p>
<p>新闻列表的 <code>xml</code> 文件,<code>fragment_article.xml</code></p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="utf-8"?></div><div class="line"><span class="tag"><<span class="name">LinearLayout</span> <span class="attr">xmlns:android</span>=<span class="string">"http://schemas.android.com/apk/res/android"</span></span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:orientation</span>=<span class="string">"vertical"</span>></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">android.support.v7.widget.RecyclerView</span></span></div><div class="line"> <span class="attr">android:id</span>=<span class="string">"@+id/rcv_article"</span></div><div class="line"> <span class="attr">android:layout_width</span>=<span class="string">"match_parent"</span></div><div class="line"> <span class="attr">android:layout_height</span>=<span class="string">"0dp"</span></div><div class="line"> <span class="attr">android:layout_weight</span>=<span class="string">"1"</span> /></div><div class="line"><span class="tag"></<span class="name">LinearLayout</span>></span></div></pre></td></tr></table></figure>
<h2 id="实现-Adapter"><a href="#实现-Adapter" class="headerlink" title="实现 Adapter"></a>实现 Adapter</h2><p>主要步骤是:</p>
<ul>
<li>根据上面的 <code>item_article_type_1.xml</code>实现一个 <code>class ImageItemArticleViewHolder extends RecyclerView.ViewHolder</code></li>
<li>实现<code>ItemArticleListAdapter extends RecyclerView.Adapter <></code><br>重写三个方法<ul>
<li><code>public int getItemCount()</code> </li>
<li><code>public TestAdapter.ImageItemArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType)</code> </li>
<li><code>public void onBindViewHolder(ImageItemArticleViewHolder holder, int position)</code> </li>
</ul>
</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ItemArticleAdapter</span> <span class="keyword">extends</span> <span class="title">RecyclerView</span>.<span class="title">Adapter</span><<span class="title">ItemArticleAdapter</span>.<span class="title">ImageItemArticleViewHolder</span>> </span>{</div><div class="line"></div><div class="line"> <span class="comment">//新闻列表</span></div><div class="line"> <span class="keyword">private</span> List<ItemArticle> articleList;</div><div class="line"></div><div class="line"> <span class="comment">//context</span></div><div class="line"> <span class="keyword">private</span> Context context;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> LayoutInflater mLayoutInflater;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">ItemArticleAdapter</span><span class="params">(Context context,List<ItemArticle> articleList)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.context = context;</div><div class="line"> <span class="keyword">this</span>.articleList = articleList;</div><div class="line"> mLayoutInflater = LayoutInflater.from(context);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="keyword">public</span> ItemArticleAdapter.<span class="function">ImageItemArticleViewHolder <span class="title">onCreateViewHolder</span><span class="params">(ViewGroup parent, <span class="keyword">int</span> viewType)</span> </span>{</div><div class="line"> View view = mLayoutInflater.inflate(</div><div class="line"> R.layout.item_article_type_1, parent, <span class="keyword">false</span>);</div><div class="line"> <span class="keyword">return</span> <span class="keyword">new</span> ImageItemArticleViewHolder(view);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onBindViewHolder</span><span class="params">(ImageItemArticleViewHolder holder, <span class="keyword">int</span> position)</span> </span>{</div><div class="line"> ItemArticle article = articleList.get(position);</div><div class="line"> holder.rcvArticlePhoto.setImageURI(Uri.parse(article.getImageUrl()));</div><div class="line"> holder.rcvArticleTitle.setText(article.getTitle());</div><div class="line"> holder.rcvArticleDate.setText(article.getPublishDate());</div><div class="line"> holder.rcvArticleSource.setText(article.getSource());</div><div class="line"> <span class="comment">//注意这个阅读次数是 int 类型,需要转化为 String 类型</span></div><div class="line"> holder.rcvArticleReadtimes.setText(article.getReadTimes()+<span class="string">"次"</span>);</div><div class="line"> holder.rcvArticlePreview.setText(article.getPreview());</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getItemCount</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> articleList.size();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="class"><span class="keyword">class</span> <span class="title">ImageItemArticleViewHolder</span> <span class="keyword">extends</span> <span class="title">RecyclerView</span>.<span class="title">ViewHolder</span> </span>{</div><div class="line"></div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_photo)</div><div class="line"> SimpleDraweeView rcvArticlePhoto;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_title)</div><div class="line"> TextView rcvArticleTitle;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_date)</div><div class="line"> TextView rcvArticleDate;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_source)</div><div class="line"> TextView rcvArticleSource;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_readtimes)</div><div class="line"> TextView rcvArticleReadtimes;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article_preview)</div><div class="line"> TextView rcvArticlePreview;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">ImageItemArticleViewHolder</span><span class="params">(View itemView)</span> </span>{</div><div class="line"> <span class="keyword">super</span>(itemView);</div><div class="line"> ButterKnife.inject(<span class="keyword">this</span>, itemView);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="新闻实体类-javabean"><a href="#新闻实体类-javabean" class="headerlink" title="新闻实体类 javabean"></a>新闻实体类 javabean</h2><p>有新闻的 index,图片 url,标题,发布时间,来源,阅读次数,新闻内容预览<br><figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"> * 新闻类,这是在 RecycleView 使用的新闻 javabean</div><div class="line"> * 还有一个新闻详情javabean</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ItemArticle</span> </span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> index;</div><div class="line"> <span class="keyword">private</span> String imageUrl;</div><div class="line"> <span class="keyword">private</span> String title;</div><div class="line"> <span class="keyword">private</span> String publishDate;</div><div class="line"> <span class="keyword">private</span> String source;</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> readTimes;</div><div class="line"> <span class="keyword">private</span> String preview;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">ItemArticle</span><span class="params">(<span class="keyword">int</span> index, String imageUrl, String title, String publishDate, String source, <span class="keyword">int</span> readTimes, String preview)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.index = index;</div><div class="line"> <span class="keyword">this</span>.imageUrl = imageUrl;</div><div class="line"> <span class="keyword">this</span>.title = title;</div><div class="line"> <span class="keyword">this</span>.publishDate = publishDate;</div><div class="line"> <span class="keyword">this</span>.source = source;</div><div class="line"> <span class="keyword">this</span>.readTimes = readTimes;</div><div class="line"> <span class="keyword">this</span>.preview = preview;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getIndex</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> index;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setIndex</span><span class="params">(<span class="keyword">int</span> index)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.index = index;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getImageUrl</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> imageUrl;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setImageUrl</span><span class="params">(String imageUrl)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.imageUrl = imageUrl;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getTitle</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> title;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setTitle</span><span class="params">(String title)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.title = title;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getPublishDate</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> publishDate;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setPublishDate</span><span class="params">(String publishDate)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.publishDate = publishDate;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getSource</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> source;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setSource</span><span class="params">(String source)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.source = source;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getReadTimes</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> readTimes;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setReadTimes</span><span class="params">(<span class="keyword">int</span> readTimes)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.readTimes = readTimes;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getPreview</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> preview;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setPreview</span><span class="params">(String preview)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.preview = preview;</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<h2 id="fragment-里面使用-RecyclerView"><a href="#fragment-里面使用-RecyclerView" class="headerlink" title="fragment 里面使用 RecyclerView"></a>fragment 里面使用 RecyclerView</h2><p>思路就是开启一个异步线程,读取多条新闻,加入<code>List<ItemArticle></code>,由这个<code>List</code>构造<code>ItemArticleAdapter</code>,最后利用<code>setAdapter()</code>方法给<code>RecyclerView</code>加上适配器。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ArticleFragment</span> <span class="keyword">extends</span> <span class="title">Fragment</span> </span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String STORE_PARAM = <span class="string">"param"</span>;</div><div class="line"> <span class="meta">@InjectView</span>(R.id.rcv_article)</div><div class="line"> RecyclerView rcvArticle;</div><div class="line"></div><div class="line"> <span class="keyword">private</span> String mParam;</div><div class="line"> <span class="comment">//新闻列表数据</span></div><div class="line"> <span class="keyword">private</span> List<ItemArticle> itemArticleList = <span class="keyword">new</span> ArrayList<ItemArticle>();</div><div class="line"></div><div class="line"> <span class="comment">//获取 fragment 依赖的 Activity,方便使用 Context</span></div><div class="line"> <span class="keyword">private</span> Activity mAct;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Fragment <span class="title">newInstance</span><span class="params">(String param)</span> </span>{</div><div class="line"> ArticleFragment fragment = <span class="keyword">new</span> ArticleFragment();</div><div class="line"> Bundle args = <span class="keyword">new</span> Bundle();</div><div class="line"> args.putString(STORE_PARAM, param);</div><div class="line"> fragment.setArguments(args);</div><div class="line"> <span class="keyword">return</span> fragment;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</div><div class="line"> <span class="keyword">if</span> (getArguments() != <span class="keyword">null</span>) {</div><div class="line"> mParam = getArguments().getString(STORE_PARAM);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Nullable</span></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> View <span class="title">onCreateView</span><span class="params">(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)</span> </span>{</div><div class="line"> View view = inflater.inflate(R.layout.fragment_article, <span class="keyword">null</span>);</div><div class="line"> Log.i(STORE_PARAM, <span class="string">"in StoreFragment"</span>);</div><div class="line"> mAct = getActivity();</div><div class="line"> ButterKnife.inject(<span class="keyword">this</span>, view);</div><div class="line"> <span class="keyword">return</span> view;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onActivityCreated</span><span class="params">(@Nullable Bundle savedInstanceState)</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onActivityCreated(savedInstanceState);</div><div class="line"> rcvArticle.setLayoutManager(<span class="keyword">new</span> LinearLayoutManager(mAct));<span class="comment">//这里用线性显示 类似于listview</span></div><div class="line"><span class="comment">// rcvArticle.setLayoutManager(new GridLayoutManager(mAct, 2));//这里用线性宫格显示 类似于grid view</span></div><div class="line"><span class="comment">// rcvArticle.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//这里用线性宫格显示 类似于瀑布流</span></div><div class="line"></div><div class="line"> <span class="keyword">new</span> LatestArticleTask().execute();</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDestroyView</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onDestroyView();</div><div class="line"> ButterKnife.reset(<span class="keyword">this</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="class"><span class="keyword">class</span> <span class="title">LatestArticleTask</span> <span class="keyword">extends</span> <span class="title">AsyncTask</span><<span class="title">String</span>, <span class="title">Void</span>, <span class="title">List</span><<span class="title">ItemArticle</span>>> </span>{</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onPreExecute</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onPreExecute();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> List<ItemArticle> <span class="title">doInBackground</span><span class="params">(String... params)</span> </span>{</div><div class="line"> ItemArticle storeInfo1 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> ItemArticle storeInfo2 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> ItemArticle storeInfo3 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> ItemArticle storeInfo4 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> ItemArticle storeInfo5 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> ItemArticle storeInfo6 =</div><div class="line"> <span class="keyword">new</span> ItemArticle(<span class="number">20123</span>, <span class="string">"http://i2.sinaimg.cn/ent/j/2012-05-20/U5912P28T3D3634984F328DT20120520152700.JPG"</span>, <span class="string">"关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</span>, <span class="string">"2015-01-09"</span>, <span class="string">"科学研究院"</span>, <span class="number">1129</span>,</div><div class="line"> <span class="string">"讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..."</span>);</div><div class="line"> itemArticleList.add(storeInfo1);</div><div class="line"> itemArticleList.add(storeInfo2);</div><div class="line"> itemArticleList.add(storeInfo3);</div><div class="line"> itemArticleList.add(storeInfo4);</div><div class="line"> itemArticleList.add(storeInfo5);</div><div class="line"> itemArticleList.add(storeInfo6);</div><div class="line"> <span class="keyword">return</span> itemArticleList;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onPostExecute</span><span class="params">(List<ItemArticle> data)</span> </span>{</div><div class="line"> <span class="keyword">super</span>.onPostExecute(data);</div><div class="line"> ItemArticleAdapter adapter = <span class="keyword">new</span> ItemArticleAdapter(mAct, data);</div><div class="line"> rcvArticle.setAdapter(adapter);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<h2 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h2><p>利用修改布局,线性显示或者宫格显示 (以前宫格显示很麻烦,现在一条命令就好了)<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">rcvArticle.setLayoutManager(new LinearLayoutManager(mAct));//这里用线性显示 类似于listview</div><div class="line">// rcvArticle.setLayoutManager(new GridLayoutManager(mAct, 2));//这里用线性宫格显示 类似于grid view</div><div class="line">// rcvArticle.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//这里用线性宫格显示 类似于瀑布流</div></pre></td></tr></table></figure></p>
<h2 id="效果图-1"><a href="#效果图-1" class="headerlink" title="效果图"></a>效果图</h2><p>线性布局</p>
<p><img src="http://img.blog.csdn.net/20160112101011378" width="300" height="550" alt="统计结果1" align="center"></p>
<p>线性宫格布局</p>
<p><img src="http://img.blog.csdn.net/20160112100848338" width="300" height="550" alt="统计结果1" align="center"></p>
<h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><h2 id="int-转化为-String"><a href="#int-转化为-String" class="headerlink" title="int 转化为 String"></a>int 转化为 String</h2><p><code>TextView</code> 有<code>setText(int resid)</code> 方法,但是这儿 <code>int</code> 表示 <code>resourceId</code>,如果我想把阅读次数(<code>int 1123</code>)赋给这个 <code>TextView</code>,不能使用这个方法。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//int 转 String 有三种方法</span></div><div class="line"><span class="keyword">int</span> i =<span class="number">8</span>;</div><div class="line">String s =Integer.toString(i);</div><div class="line">String g =String.valueOf(i);</div><div class="line">String h =i+<span class="string">""</span>;</div><div class="line">holder.rcvArticleReadtimes.setText(String.valueOf(article.getReadTimes()));</div></pre></td></tr></table></figure>
<h2 id="Todo-List"><a href="#Todo-List" class="headerlink" title="Todo List"></a>Todo List</h2><ul>
<li>Picasso 图片缓存库的学习</li>
<li>实现 RecyclerView 每个项各自的布局</li>
</ul>
<p>源码地址(欢迎star) <a href="https://github.com/studychen/SeeNewsV2" target="_blank" rel="external">https://github.com/studychen/SeeNewsV2</a> </p>
<h2 id="参考文章"><a href="#参考文章" class="headerlink" title="参考文章"></a>参考文章</h2><p><a href="http://javatechig.com/android/android-recyclerview-example" target="_blank" rel="external">Android RecyclerView Example | Java Techig</a></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/09/03/recyclerview-basics/" data-id="ciyyds56e0017buxb9pky5f2i" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android/">Android</a></li></ul>
</footer>
</div>
</article>
<article id="post-layout-gravity" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/09/03/layout-gravity/" class="article-date">
<time datetime="2016-09-03T03:13:07.000Z" itemprop="datePublished">2016-09-03</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/09/03/layout-gravity/">Android UI布局之区分 android:gravity 和 android:layout_gravity</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在进行UI布局的时候,可能经常会用到 <code>android:gravity</code> 和 <code>android:layout_Gravity</code> 这两个属性。</p>
<p>本文链接 <a href="http://www.alijava.com/layout-gravity/" target="_blank" rel="external">http://www.alijava.com/layout-gravity/</a> 转载请注明出处</p>
<p><strong>一言以蔽之</strong></p>
<ul>
<li><p><code>android:gravity</code> 组件的子组件在组件中的位置</p>
</li>
<li><p><code>android:layout_gravity</code> 组件自身在父组件中的位置</p>
</li>
</ul>
<p>《第一行代码里》里的解释</p>
<ul>
<li><code>android:gravity</code>用于指定文字在控件中的对齐方式</li>
<li><code>android:layout_gravity</code>用于指定控件在布局中的对齐方式</li>
</ul>
<p>其实个人觉得两种说法并不矛盾,文字也可以理解为TextView的子组件,下面我们会看到<code>android:gravity</code>分别用于设置子组件或者文字。</p>
<p>网上还有一种总结是:</p>
<ul>
<li><p>名称不以layout_开头的属性作用于组件本身,组件生成时,会调用某个方法按照属性及属性值进行自我配置。</p>
</li>
<li><p>名称以layout_开头的属性作用于组件的父组件,称这些属性为<strong>布局参数</strong>,它们会告知父布局如何在内部安排自己的子元素。</p>
</li>
</ul>
<h1 id="android-gravity"><a href="#android-gravity" class="headerlink" title="android:gravity"></a>android:gravity</h1><p><code>android:gravity</code>用于指定<strong>文字在控件中的对齐方式</strong>(这儿将文字看作是子控件)</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="match_parent"</div><div class="line"> android:orientation="vertical" ></div><div class="line"> </div><div class="line"> <TextView</div><div class="line"> android:layout_width = "match_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> <!-- gravity 作用于文字 --></div><div class="line"> android:gravity="center"</div><div class="line"> android:textSize="24sp"</div><div class="line"> android:padding = "24dp"</div><div class="line"> android:text="this is text" /></div><div class="line"></div><div class="line"></LinearLayout></div></pre></td></tr></table></figure>
<p>效果见下图:</p>
<p><img src="http://img.blog.csdn.net/20150730213046307" width="300" height="450" alt="统计结果1" align="center"></p>
<hr>
<p>当然 <code>android:gravity="center"</code>也可以指定控件 <code>TextView</code> 在<code>LinearLayout</code>中居中,比如:</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="match_parent"</div><div class="line"> <!-- gravity 作用于子控件 TextView --></div><div class="line"> android:gravity="center"</div><div class="line"> android:orientation="vertical" ></div><div class="line"> </div><div class="line"> <TextView</div><div class="line"> android:layout_width = "match_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:gravity="center"</div><div class="line"> android:textSize="24sp"</div><div class="line"> android:padding = "24dp"</div><div class="line"> android:text="this is text" /></div><div class="line"></LinearLayout></div></pre></td></tr></table></figure>
<p>再看效果图:</p>
<p><img src="http://img.blog.csdn.net/20150730213328625" width="300" height="450" alt="统计结果1" align="center"></p>
<p><code>TextView</code>就居于<code>LinearLayout</code>的正中了。</p>
<ul>
<li><code>LinearLayout</code> 中<code>android:gravity="center"</code>表示<code>TextView</code>居于LinearLayout的正中间</li>
<li>而<code>TextView</code>的<code>android:gravity="center"</code>表示文字处于TextView的中间</li>
</ul>
<h1 id="android-layout-gravity"><a href="#android-layout-gravity" class="headerlink" title="android:layout_gravity"></a>android:layout_gravity</h1><p><code>android:layout_gravity</code>用于指定控件在布局中的对齐方式。注意,当<code>LinearLayout</code>是<code>vertical</code>时,只有水平方向上的对齐才会生效。</p>
<figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="match_parent"</div><div class="line"> android:gravity="center"</div><div class="line"> android:orientation="vertical" ></div><div class="line"> </div><div class="line"> <TextView</div><div class="line"> android:layout_width = "match_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:gravity="center"</div><div class="line"> android:textSize="24sp"</div><div class="line"> android:padding = "24dp"</div><div class="line"> android:text="this is text" /></div><div class="line"> </div><div class="line"> <TextView</div><div class="line"> android:layout_width = "wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:gravity="center"</div><div class="line"> android:textSize="24sp"</div><div class="line"> android:padding = "24dp"</div><div class="line"> <!-- layout_gravity 作用于水平方向上 end --></div><div class="line"> android:layout_gravity="end"</div><div class="line"> android:text="another text" /></div><div class="line"></div><div class="line"></LinearLayout></div></pre></td></tr></table></figure>
<p>效果图:<br><img src="http://img.blog.csdn.net/20150730213924353" width="300" height="450" alt="统计结果1" align="center"></p>
<p>第2个<code>TextView</code>中,<code>android:gravity</code>表示这个<code>TextView</code>处于<code>LinearLayout</code>的中间,而<code>android:layout_gravity="end"</code>表示处于水平end的位置。</p>
<h1 id="最佳实践-完整示例"><a href="#最佳实践-完整示例" class="headerlink" title="最佳实践 完整示例"></a>最佳实践 完整示例</h1><figure class="highlight"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="utf-8"?></div><div class="line"><android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"</div><div class="line"> xmlns:card_view="http://schemas.android.com/apk/res-auto"</div><div class="line"> xmlns:app="http://schemas.android.com/apk/res-auto"</div><div class="line"> xmlns:fresco="http://schemas.android.com/apk/res-auto"</div><div class="line"> android:id="@+id/cv_item"</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:foreground="?android:attr/selectableItemBackground"</div><div class="line"> app:cardCornerRadius="5dp"</div><div class="line"> app:cardElevation="5dp"</div><div class="line"> app:contentPadding="2dp"></div><div class="line"></div><div class="line"> <LinearLayout</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="wrap_content"></div><div class="line"></div><div class="line"> <com.facebook.drawee.view.SimpleDraweeView</div><div class="line"> android:id="@+id/rcv_article_photo"</div><div class="line"> android:layout_width="100dp"</div><div class="line"> android:layout_height="100dp"</div><div class="line"> android:layout_centerVertical="true"</div><div class="line"> fresco:actualImageScaleType="centerInside"</div><div class="line"> fresco:roundAsCircle="true"</div><div class="line"> fresco:roundingBorderColor="@color/lightslategray"</div><div class="line"> fresco:roundingBorderWidth="1dp" /></div><div class="line"></div><div class="line"> <LinearLayout</div><div class="line"> android:layout_width="0dp"</div><div class="line"> android:layout_height="match_parent"</div><div class="line"> android:layout_weight="1"</div><div class="line"> android:orientation="vertical"></div><div class="line"></div><div class="line"> <TextView</div><div class="line"> android:id="@+id/rcv_article_title"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginLeft="10dp"</div><div class="line"> android:layout_marginTop="2dp"</div><div class="line"> <!-- gravity 文字居中 --></div><div class="line"> android:gravity="center"</div><div class="line"> android:text="关于举办《经典音乐作品欣赏与人文审美》讲座的通知"</div><div class="line"> android:textColor="@color/primary_text" /></div><div class="line"> <!-- 新闻 发布时间 来源 阅读次数--></div><div class="line"> <LinearLayout</div><div class="line"> android:layout_width="match_parent"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginTop="5dp"</div><div class="line"> <!-- 3个TextView居中 --></div><div class="line"> android:gravity="center"</div><div class="line"> android:orientation="horizontal"></div><div class="line"></div><div class="line"> <TextView</div><div class="line"> android:id="@+id/rcv_article_date"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginLeft="10dp"</div><div class="line"> android:layout_marginRight="2dp"</div><div class="line"> android:text="2015-01-09" /></div><div class="line"></div><div class="line"> <TextView</div><div class="line"> android:id="@+id/rcv_article_source"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginLeft="2dp"</div><div class="line"> android:layout_marginRight="2dp"</div><div class="line"> android:text="科学研究院" /></div><div class="line"></div><div class="line"> <TextView</div><div class="line"> android:id="@+id/rcv_article_readtimes"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginLeft="2dp"</div><div class="line"> android:layout_marginRight="2dp"</div><div class="line"> android:text="1129次" /></div><div class="line"></div><div class="line"> </LinearLayout></div><div class="line"></div><div class="line"></div><div class="line"> <TextView</div><div class="line"> android:id="@+id/rcv_article_preview"</div><div class="line"> android:layout_width="wrap_content"</div><div class="line"> android:layout_height="wrap_content"</div><div class="line"> android:layout_marginLeft="10dp"</div><div class="line"> android:layout_marginTop="5dp"</div><div class="line"> android:ellipsize="end"</div><div class="line"> android:maxLines="2"</div><div class="line"> android:text="讲座主要内容:以中、西方音乐历史中经典音乐作品为基础,通过作曲家及作品创作背景、相关音乐文化史知识及音乐欣赏常识..." /></div><div class="line"></div><div class="line"> </LinearLayout></div><div class="line"> </LinearLayout></div><div class="line"></div><div class="line"></android.support.v7.widget.CardView></div></pre></td></tr></table></figure>
<p>效果图<br><img src="http://img.blog.csdn.net/20160112111012393" alt="这里写图片描述" title=""></p>
<h1 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h1><p>这是自己项目中的一个记录,具体可参照这篇文章<br>Android Material Design学习之RecyclerView代替 ListView <a href="http://www.alijava.com/recyclerview-basics/" target="_blank" rel="external">http://www.alijava.com/recyclerview-basics/</a></p>
<hr>
<p>布局思路就是 <code>CardView</code>里面嵌入了一个<code>LinearLayout</code>。</p>
<p>图片部分用固定宽度<code>100dp</code>,文字部分利用<code>android:layout_weight="1"</code>占据了其他部分。</p>
<p><code>TextView</code>利用<code>android:gravity=”center”</code>使得标题的文字居中。</p>
<p><code>LinearLayout</code>里面利用<code>android:gravity="center"</code>使得<code>"2015-01-09 科学研究院 1129次"</code>居中,</p>
<p>新闻详情内容的<code>TextView</code>利用</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">android:maxLines="2"</div><div class="line">android:ellipsize="end"</div></pre></td></tr></table></figure>
<p>将文章内容限定为2行,超出部分用省略号显示。</p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2016/09/03/layout-gravity/" data-id="ciyyds55v000kbuxbb39azoid" class="article-share-link">Share</a>
<ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Android/">Android</a></li></ul>
</footer>
</div>
</article>
<nav id="page-nav">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="page-number" href="/page/3/">3</a><a class="extend next" rel="next" href="/page/2/">__('next') »</a>
</nav>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Tags</h3>
<div class="widget">
<ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/Android/">Android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Java/">Java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux/">Linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/MaterialDesign/">MaterialDesign</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Python/">Python</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/七牛/">七牛</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/命令行/">命令行</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/工具/">工具</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/排序/">排序</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/数组/">数组</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/爬虫/">爬虫</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/网络/">网络</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/面试/">面试</a></li></ul>
</div>
</div>